Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: uhuru en 3 Mayo 2010, 06:48 am



Título: lvalue required as left operand of assignment
Publicado por: uhuru en 3 Mayo 2010, 06:48 am
Hola. Estoy intentando usar un puntero de doble indirección (es la primera vez que lo uso), y me da un error (lvalue required as left operand of assignment).

Tengo 3 variables: num1, num2 y num3, de tipo int, luego 3 punteros *n1, *n2 y *n3 que apuntan a cada una de estas variables. Finalmente un puntero doble **numero que pretendo que apunte a cada uno de esos anteriores punteros. Copio las lineas en cuestión:
Código
  1. int num1, num2, num3, i, **numeros, int *n1=&num1, *n2=&num2, *n3=&num3;
  2. numeros=(int **)malloc(3*sizeof(int *));
  3.  
  4. numeros=&n1;
  5.  
  6.        //Las dos siguientes lineas son las que me devuelven el error:
  7. numeros+1=&n2;
  8.  
  9. numeros+2=&n3;

¿Alguien me puede explicar qué hago mal? Gracias.


Título: Re: lvalue required as left operand of assignment
Publicado por: do-while en 3 Mayo 2010, 07:06 am
No lo he probado, pero...
Código:
numeros + i = &numeros[i] --------> tipo int**, pero es la direccion de numeros[i], por lo que no puedes
modifcarlo, ya que es la posicion de un elemento del vector.

Por lo tanto:
Código:
*(numeros + i) = numeros[i] ----------> tipo int*, y se puede modificar, ya que el elemento i-esimo del
vector es una variable de tipo int*

Y tendras que hacer:
Código
  1. *numeros = n1; /* en numeros[0] guardamos n1 */
  2. *(numeros + 1) = n2; /* ... */
  3. *(numeros + 2) = n3; /* ... */
  4.  

Espero que te sirva, si no es asi avisa.

¡Saludos!


Título: Re: lvalue required as left operand of assignment
Publicado por: Og. en 3 Mayo 2010, 07:09 am
No lo he probado, pero...
Código:
numeros + i = &numeros[i] --------> tipo int**, pero es la direccion de numeros[0], por lo que no puedes
modifcarlo, ya que es la posicion de un elemento del vector.

Por lo tanto:
Código:
*(numeros + i) = numeros[i] ----------> tipo int*, y se puede modificar, ya que el elemento i-esimo del
vector es una variable de tipo int*

Y tendras que hacer:
Código
  1. *numeros = n1; /* en numeros[0] guardamos n1 */
  2. *(numeros + 1) = n2; /* ... */
  3. *(numeros + 2) = n3; /* ... */
  4.  

Espero que te sirva, si no es asi avisa.

¡Saludos!

nop, eso es hacer un arreglo de punteros, lo que el quiere hacer es un arreglo de punteros que apunten a punteros.

por lo tanto:
Código
  1.        int num1, num2, num3, i, ***numeros, *n1=&num1, *n2=&num2, *n3=&num3;
  2. numeros=(int ***)malloc(3*sizeof(int *));
  3. numeros[0]=&n1;
  4. numeros[1]=&n2;
  5.        numeros[2]=&n3;
  6.  

Saludos!


Título: Re: lvalue required as left operand of assignment
Publicado por: do-while en 3 Mayo 2010, 07:12 am
Cierto.

:-[

Eso me pasa por leer deprisa.  :silbar:

Solo un detalle:
Código
  1. numeros=(int ***)malloc(3*sizeof(int **));
  2.  

¡Saludos!


Título: Re: lvalue required as left operand of assignment
Publicado por: uhuru en 3 Mayo 2010, 12:51 pm
Ahora con lo que habéis dicho ya no me da ese error, pero no acabo de entender la necesidad de usar 3 asteriscos en lugar de 2. Yo solo quería un vector de punteros que apuntaran a un tipo int. ¿Eso no se puede con **?

Por otra parte, ¿cómo escanearía una posición luego? éste es el for dónde los pido:
Código
  1. for(i=0;i<N;i++){
  2. printf("Introduce el numero\n");
  3. scanf("%d",&*(*(*numeros+i)));
  4. }

Pero si ejecuto eso, después de introducir el 2º número, me peta el programa con: "segmentation fault"

Gracias


Título: Re: lvalue required as left operand of assignment
Publicado por: biribau en 3 Mayo 2010, 14:35 pm
El operador & sólo funciona con nombres, o con posiciones de array, no puedes hacer &*a, pero sí &a, puesto que no funciona con expresiones.
creo que lo que buscas es
Código
  1. scanf("%d", *numeros[i]);
Recuerda que *numeros[i] es la direccion a un entero que es lo que necesita el scanf

P.D.: Cómo puedo escapar corchetes en el mensaje?
Corrijo, tenía un nivel de indireccion mas
y te falta un * en el cast al retorno del malloc


Título: Re: lvalue required as left operand of assignment
Publicado por: Gallu en 3 Mayo 2010, 15:25 pm
Pienso que con
Código
  1. numeros=(int **)malloc(3*sizeof(int *));
ya va bien ..!


Título: Re: lvalue required as left operand of assignment
Publicado por: Og. en 4 Mayo 2010, 01:39 am
Cierto.

:-[

Eso me pasa por leer deprisa.  :silbar:

Solo un detalle:
Código
  1. numeros=(int ***)malloc(3*sizeof(int **));
  2.  

¡Saludos!
realmente es lo mismo que si pones
Código
  1. sizeof(int *)

debido a que en aspectos de memoria ocupa el mismo espacio un puntero que apunta a un puntero que un puntero que apunta a un entero.