elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  lvalue required as left operand of assignment
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: lvalue required as left operand of assignment  (Leído 11,446 veces)
uhuru

Desconectado Desconectado

Mensajes: 24


Ver Perfil
lvalue required as left operand of assignment
« 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.


En línea

do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: lvalue required as left operand of assignment
« Respuesta #1 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!


« Última modificación: 3 Mayo 2010, 07:08 am por do-while » En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
Og.


Desconectado Desconectado

Mensajes: 822


Aprendiendo de la vida


Ver Perfil
Re: lvalue required as left operand of assignment
« Respuesta #2 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!
En línea

|-
do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: lvalue required as left operand of assignment
« Respuesta #3 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!
« Última modificación: 3 Mayo 2010, 07:15 am por do-while » En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
uhuru

Desconectado Desconectado

Mensajes: 24


Ver Perfil
Re: lvalue required as left operand of assignment
« Respuesta #4 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
En línea

biribau

Desconectado Desconectado

Mensajes: 181


Ver Perfil
Re: lvalue required as left operand of assignment
« Respuesta #5 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
« Última modificación: 4 Mayo 2010, 02:41 am por biribau » En línea

Gallu

Desconectado Desconectado

Mensajes: 247



Ver Perfil
Re: lvalue required as left operand of assignment
« Respuesta #6 en: 3 Mayo 2010, 15:25 pm »

Pienso que con
Código
  1. numeros=(int **)malloc(3*sizeof(int *));
ya va bien ..!
En línea

Nadie alcanza la meta con un solo intento, ni perfecciona la vida con una sola rectificación, ni alcanza altura con un solo vuelo.
Og.


Desconectado Desconectado

Mensajes: 822


Aprendiendo de la vida


Ver Perfil
Re: lvalue required as left operand of assignment
« Respuesta #7 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.
En línea

|-
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Error en C: (Ivalue required as left...)
Programación C/C++
Constantinoplero 3 8,564 Último mensaje 13 Noviembre 2011, 14:31 pm
por DickGumshoe
required html5 y onsubmit...
Desarrollo Web
basickdagger 1 2,029 Último mensaje 9 Febrero 2014, 13:28 pm
por #!drvy
[Python 3] TypeError: an integer is required (got type str)
Python
n1sen 1 3,684 Último mensaje 16 Noviembre 2017, 01:54 am
por n1sen
ayuda! error: lvalve required as left operand of assignmet
Programación C/C++
NicoSanhueza 1 2,105 Último mensaje 1 Mayo 2018, 18:08 pm
por engel lex
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines