Foros del Web

Foros del Web (http://www.forosdelweb.com/)
-   C/C++ (http://www.forosdelweb.com/f96/)
-   -   Otra duda: mover a una variable un conjunto de bits (http://www.forosdelweb.com/f96/otra-duda-mover-variable-conjunto-bits-501167/)

Infrarrojo 27/06/2007 04:10

Otra duda: mover a una variable un conjunto de bits
 
Hola de nuevo.
Verán, tengo un problemilla, y es que necesito pasar una trama de unos y ceros a una variable. Mi idea es hacer un mando programable por pc, de modo que según sea el valor de la entrada analógica, el micro sabrá qué tecla estamos pulsando y enviará una de las tramas que están memorizadas. Se lo explico sólo para dos botones para simplificar, el botón On y el de subir volumen.
Las tramas sería esta por ejemplo:
bool comandoOn[13] = {1,0,1,0,1,0,0,1,0,0,0,0,0};
bool comandoVolmas[13] = {0,1,0,0,1,0,0,1,0,0,0,0,0}
Ahora, necesito que una variable genérica, que podemos llamar solamente comando[13], pase a valer una u otra según el valor de otra variable que es "k", que valdrá uno o dos según el valor que haya en la entrada analógica.
Yo lo tengo puesto así:
switch(k)
{
case 1:
comando[13] = comandoOn[13]
En el caso de que k valiera 1, querría que comando tomase el valor de la trama ComandoOn, pero haciendo ésto, lo único que hace es copiar el valor del bit número 14, que como no existe da error.
¿Hay algún modo de pasar todos los bits en una sola línea de instrucción, o tengo que recorrer todos los bits uno a uno y luego ir pasándolos?
Gracias por adelantado por vuestras respuestas, llevo ya tiempo atascado en esto, a ver si con vuestra ayuda lo puedo sacar. Saludos

_Lucifer_ 27/06/2007 09:07

Re: Otra duda: mover a una variable un conjunto de bits
 
Bueno, tienes un par de opciones, una de ellas es hacer algo asi:
Código:

bool comandoOn[13] = {1,0,1,0,1,0,0,1,0,0,0,0,0};
bool comandoVolmas[13] = {0,1,0,0,1,0,0,1,0,0,0,0,0};
bool *comando;
switch(k)
{
case 1:
comando = comandoOn;
break;
.
.
.
}

Luego usas el apuntador comando como si fuera un arreglo. O:
Código:

bool comandoOn[13] = {1,0,1,0,1,0,0,1,0,0,0,0,0};
bool comandoVolmas[13] = {0,1,0,0,1,0,0,1,0,0,0,0,0};
bool comando[13];
switch(k)
{
case 1:
memcpy(comando, comandoOn, 13*sizeof(bool));
break;
.
.
.
}

Espero te ayude...saludos

Infrarrojo 27/06/2007 09:22

Re: Otra duda: mover a una variable un conjunto de bits
 
La primera opción ya la intenté también, pero me da un error al compilarlo, exactamente pone "Link Error: L1102: Out of allocation space in segment RAM at address 0XCB"
Con la segunda me sale otro error, en la línea memcpy(comando, comandoOn, 13*sizeof(bool));
Warning: C1801: Implicit parameter-declaration

_Lucifer_ 27/06/2007 09:44

Re: Otra duda: mover a una variable un conjunto de bits
 
Debes tener algñun otro error, porque acabo de probar las dos formas que te dije y me funcionó a la perfección.

Aquí te dejo el ejemplo con el que lo probe:
Código:

#include <iostream>
#include <stdio.h>

using namespace std;

int main()
{
        bool comandoOn[13] = {1,0,1,0,1,0,0,1,0,0,0,0,0};
        bool *comando, comando2[13];
        int i;
       
        comando = comandoOn; //primera forma
       
        cout << "Arreglo original :\n";
        for(i=0; i<13; ++i)
                cout << comandoOn[i];
        cout << endl;

        cout << "Resultado del primer metodo :\n";
        for(i=0; i<13; ++i)
                cout << comando[i];
        cout << endl;

        memcpy(comando2, comandoOn, 13*sizeof(bool)); // segunda forma

        cout << "Resultado del segundo metodo :\n";
        for(i=0; i<13; ++i)
                cout << comando2[i];
        cout << endl;
       
        return 0;
}

La salida por pantalla fue:
Cita:

~$ ./test
Arreglo original :
1010100100000
Resultado del primer metodo :
1010100100000
Resultado del segundo metodo :
1010100100000
Saludos

Infrarrojo 28/06/2007 10:06

Re: Otra duda: mover a una variable un conjunto de bits
 
Vale, a ver, he probado con tu primera opción y si pongo solamente ComandoOn, no tengo ningún fallo al compilarlo. Ahora, si pongo también ComandoVolmas, me sale el error. Si quieres te pongo el código entero, el problema es que estoy haciéndolo en Codewarrior con procesador experto, y algunas cosas vienen en otros menús, pero creo que se podría entender

Infrarrojo 28/06/2007 10:13

Re: Otra duda: mover a una variable un conjunto de bits
 
extern byte err;
int i=0;
int j=0;
int k=0;

bool *comando, comando2[13];
bool comandoOn[13] = {1,0,1,0,1,0,0,1,0,0,0,0,0};
bool comandoVolmas[13] = {0,1,0,0,1,0,0,1,0,0,0,0,0};
//orden de los bits: 0 1 2 3 4... 12

static byte tecla[1]; /* Número de canales */

void main(void)

{

(void)PPG1_Disable(); /* disable the bean */

for(;;){

for(;;){
err = AD1_Measure (TRUE); /* Lee el valor */
err = AD1_GetValue((byte *)tecla);
if (tecla[0] > 63) break; /* Compara el valor con la tecla pulsada */
}



k = (tecla[0]);
k = (k / 64); // como la entrada tiene 256 niveles, 256/64 te da
// 3 niveles, para 3 teclas distintas
switch(k)
{
case 1: // {1,0,1,0,1,0,0,1,0,0,0,0,0} On/Off
comando = comandoOn;
break;

case 2: // {0,1,0,0,1,0,0,1,0,0,0,0,0}; // Volumen +
comando = comandoVolmas;
break;


case 3: // {0,1,0,0,1,0,0,1,0,0,0,0,0}; // Volumen -
comando = comandoOn;
break;

}
}
}

Infrarrojo 28/06/2007 10:19

Re: Otra duda: mover a una variable un conjunto de bits
 
Tal y como está, me sale un error. Ahora, si quito la línea bool comandoVolmas[13] = {0,1,0,0,1,0,0,1,0,0,0,0,0};
y en el caso 2 pongo comando = comandoOn; (quedaría igual que el primer caso)
entonces no me sale error, esto por qué es, el error está en la forma de calcular la variable k? porque me estoy volviendo loco. Gracias de nuevo por tu ayuda

_Lucifer_ 28/06/2007 12:25

Re: Otra duda: mover a una variable un conjunto de bits
 
No entiendo por que te da ese error, probé asignándole comandoVolmas tambien y funcionó perfecto:

Código:

#include <iostream>

using namespace std;

int main()
{
        bool comandoOn[13] = {1,0,1,0,1,0,0,1,0,0,0,0,0};
        bool comandoVolmas[13] = {0,1,0,0,1,0,0,1,0,0,0,0,0};
        bool *comando;
        int i;
       
        comando = comandoOn; //primera forma
       
        cout << "Arreglo original :\n";
        for(i=0; i<13; ++i)
                cout << comandoOn[i];
        cout << endl;

        cout << "Resultado del primer metodo :\n";
        for(i=0; i<13; ++i)
                cout << comando[i];
        cout << endl;

        comando = comandoVolmas;
       

        cout << "Resultado del primer metodo :\n";
        for(i=0; i<13; ++i)
                cout << comando[i];
        cout << endl;
       
        return 0;
}

Seguramente el error es por otra causa, trata de postear el mensaje completo de error incluyendo la línea en la que se supone que está (si es de compilación).

Saludos

Infrarrojo 28/06/2007 15:33

Re: Otra duda: mover a una variable un conjunto de bits
 
Pues el error que sale es éste:
Link Error: L1102: Out of allocation space in segment RAM at address 0XCB
Link Error: Link failed
El problema viene cuando pongo el switch(k) y pongo en el caso 2 "comando = comandoVolmas;" ahí es cuando sale el error y no entiendo por qué, es el mismo tipo de variable que ComandoOn, con los mismos bits, no sé estoy confuso porque en teoría debería de funcionar bien

_Lucifer_ 02/07/2007 07:15

Re: Otra duda: mover a una variable un conjunto de bits
 
Imprime el valor de tecla[0] a ver cuanto vale. Por lo que estoy viendo es un byte, así que supongo que es un valor entre 0 y 255. Pero si en el fondo es un char entonces el caso 2 no debería ejecutarse porque no puedes almacenar 128 en un chat, cuando mucho 127, ya que su rango es de -128 a 127 si no me equivoco.

Te recomiendo que revises eso, porque probé lo demás y no me dio error con nada, claro, comente las funciones que forman parte de la librería que estás usando. Probé lo que publicaste con varios valores de k y funcionó a la perfección.

Saludos

Infrarrojo 03/07/2007 08:54

Re: Otra duda: mover a una variable un conjunto de bits
 
Sí, es un byte, lo defino al principio: static byte tecla[1];
Además, ahora mismo lo tengo puesto a la salida de un potenciómetro, de modo que subiendo o bajando el valor del potenciómetro me cambia el valor de tecla[0]. He hecho otra programación en la que, en vez de poner comando = comandoVolmas, lo que hago es definir todos los bits de esta forma:
comando[0] = 0;
comando[1] = 1;
comando[2] = 1;
comando[3] = 0;
comando[4] = 1;
comando[5] = 0;
comando[6] = 0;
comando[7] = 1;
comando[8] = 0;
comando[9] = 0;
comando[10] = 0;
comando[11] = 0;
comando[12] = 0;

De esta forma, pongo los tres casos según el valor de k y me sale sin problemas, no da ningún error, y midiendo con el osciloscopio, la señal cambia según sea el valor de k, que se controla con el potenciómetro. Ahora, cuando quiero simplificar el código poniendo comando = comandoVolmas, me da el error. No sé si darlo por imposible, pero me da coraje, porque en teoría debería de salir, y queda el código mucho mejor.

_Lucifer_ 03/07/2007 11:23

Re: Otra duda: mover a una variable un conjunto de bits
 
Como te dije anteriormente ese código no tiene nada de malo, a mi me funcionó bien, te recomendaría que en vez de hacer:
Código:

comando[0] = 0;
comando[1] = 1;
comando[2] = 1;
comando[3] = 0;
comando[4] = 1;
comando[5] = 0;
comando[6] = 0;
comando[7] = 1;
comando[8] = 0;
comando[9] = 0;
comando[10] = 0;
comando[11] = 0;
comando[12] = 0;

Hagas un ciclo for (ya que no te funciona lo que te mencione):
Código:

bool comandoOn[13] = {1,0,1,0,1,0,0,1,0,0,0,0,0};
bool comandoVolmas[13] = {0,1,0,0,1,0,0,1,0,0,0,0,0};
bool comando[13];
int i;

for(i=0; i<13; ++i)
  comando[i]=comandoVolmas[i];

y lo adaptes a cada caso que tengas.

Saludos


La zona horaria es GMT -6. Ahora son las 22:05.

Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.