Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Otra duda: mover a una variable un conjunto de bits

Estas en el tema de Otra duda: mover a una variable un conjunto de bits en el foro de C/C++ en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 27/06/2007, 04:10
 
Fecha de Ingreso: junio-2007
Mensajes: 11
Antigüedad: 17 años, 6 meses
Puntos: 0
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
  #2 (permalink)  
Antiguo 27/06/2007, 09:07
Avatar de _Lucifer_  
Fecha de Ingreso: junio-2006
Mensajes: 1.662
Antigüedad: 18 años, 7 meses
Puntos: 28
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
__________________
Si crees que no tiene sentido, etonces probablemente lo tenga... :arriba:
  #3 (permalink)  
Antiguo 27/06/2007, 09:22
 
Fecha de Ingreso: junio-2007
Mensajes: 11
Antigüedad: 17 años, 6 meses
Puntos: 0
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

Última edición por Infrarrojo; 27/06/2007 a las 09:29
  #4 (permalink)  
Antiguo 27/06/2007, 09:44
Avatar de _Lucifer_  
Fecha de Ingreso: junio-2006
Mensajes: 1.662
Antigüedad: 18 años, 7 meses
Puntos: 28
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
__________________
Si crees que no tiene sentido, etonces probablemente lo tenga... :arriba:
  #5 (permalink)  
Antiguo 28/06/2007, 10:06
 
Fecha de Ingreso: junio-2007
Mensajes: 11
Antigüedad: 17 años, 6 meses
Puntos: 0
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
  #6 (permalink)  
Antiguo 28/06/2007, 10:13
 
Fecha de Ingreso: junio-2007
Mensajes: 11
Antigüedad: 17 años, 6 meses
Puntos: 0
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;

}
}
}
  #7 (permalink)  
Antiguo 28/06/2007, 10:19
 
Fecha de Ingreso: junio-2007
Mensajes: 11
Antigüedad: 17 años, 6 meses
Puntos: 0
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
  #8 (permalink)  
Antiguo 28/06/2007, 12:25
Avatar de _Lucifer_  
Fecha de Ingreso: junio-2006
Mensajes: 1.662
Antigüedad: 18 años, 7 meses
Puntos: 28
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
__________________
Si crees que no tiene sentido, etonces probablemente lo tenga... :arriba:
  #9 (permalink)  
Antiguo 28/06/2007, 15:33
 
Fecha de Ingreso: junio-2007
Mensajes: 11
Antigüedad: 17 años, 6 meses
Puntos: 0
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
  #10 (permalink)  
Antiguo 02/07/2007, 07:15
Avatar de _Lucifer_  
Fecha de Ingreso: junio-2006
Mensajes: 1.662
Antigüedad: 18 años, 7 meses
Puntos: 28
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
__________________
Si crees que no tiene sentido, etonces probablemente lo tenga... :arriba:
  #11 (permalink)  
Antiguo 03/07/2007, 08:54
 
Fecha de Ingreso: junio-2007
Mensajes: 11
Antigüedad: 17 años, 6 meses
Puntos: 0
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.
  #12 (permalink)  
Antiguo 03/07/2007, 11:23
Avatar de _Lucifer_  
Fecha de Ingreso: junio-2006
Mensajes: 1.662
Antigüedad: 18 años, 7 meses
Puntos: 28
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
__________________
Si crees que no tiene sentido, etonces probablemente lo tenga... :arriba:
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:06.