| 
	
		|  Autor | Tema: lvalue required as left operand of assignment  (Leído 11,892 veces) |  
	| 
			| 
					
						| uhuru 
								
								 Desconectado 
								Mensajes: 24
								
								
								
								
								
								   | 
 
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: 	int num1, num2, num3, i, **numeros, int *n1=&num1, *n2=&num2, *n3=&num3;	numeros=(int **)malloc(3*sizeof(int *)); 	numeros=&n1;         //Las dos siguientes lineas son las que me devuelven el error:	numeros+1=&n2; 	numeros+2=&n3;
 ¿Alguien me puede explicar qué hago mal? Gracias.
 
 |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| do-while 
								       
								
								 Desconectado 
								Mensajes: 1.276
								
								 
								¿Habra que sacarla de paseo?
								
								
								
								
								
								   | 
 
No lo he probado, pero... numeros + i = &numeros[i] --------> tipo int**, pero es la direccion de numeros[i], por lo que no puedesmodifcarlo, ya que es la posicion de un elemento del vector.
 
Por lo tanto: *(numeros + i) = numeros[i] ----------> tipo int*, y se puede modificar, ya que el elemento i-esimo delvector es una variable de tipo int*
 
Y tendras que hacer: *numeros = n1; /* en numeros[0] guardamos n1 */*(numeros + 1) = n2; /* ... */*(numeros + 2) = n3; /* ... */ 
 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 
								Mensajes: 822
								
								 
								Aprendiendo de la vida
								
								
								
								
								
								   | 
 
No lo he probado, pero... numeros + i = &numeros[i] --------> tipo int**, pero es la direccion de numeros[0], por lo que no puedesmodifcarlo, ya que es la posicion de un elemento del vector.
 
Por lo tanto: *(numeros + i) = numeros[i] ----------> tipo int*, y se puede modificar, ya que el elemento i-esimo delvector es una variable de tipo int*
 
Y tendras que hacer: *numeros = n1; /* en numeros[0] guardamos n1 */*(numeros + 1) = n2; /* ... */*(numeros + 2) = n3; /* ... */ 
 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:         int num1, num2, num3, i, ***numeros, *n1=&num1, *n2=&num2, *n3=&num3;	numeros=(int ***)malloc(3*sizeof(int *));	numeros[0]=&n1;	numeros[1]=&n2;        numeros[2]=&n3; 
 Saludos! |  
						| 
								|  |  
								|  |  En línea | 
 
 |- |  |  |  | 
			| 
					
						| do-while 
								       
								
								 Desconectado 
								Mensajes: 1.276
								
								 
								¿Habra que sacarla de paseo?
								
								
								
								
								
								   | 
 
Cierto.    Eso me pasa por leer deprisa.    Solo un detalle: numeros=(int ***)malloc(3*sizeof(int **)); 
 ¡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 
								Mensajes: 24
								
								
								
								
								
								   | 
 
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: 	for(i=0;i<N;i++){		printf("Introduce el numero\n");		scanf("%d",&*(*(*numeros+ i)));	}
 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 
								Mensajes: 181
								
								
								
								
								
								   | 
 
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 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 
								Mensajes: 247
								
								   | 
 
Pienso que con  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 
								Mensajes: 822
								
								 
								Aprendiendo de la vida
								
								
								
								
								
								   | 
 
Cierto.    Eso me pasa por leer deprisa.    Solo un detalle: numeros=(int ***)malloc(3*sizeof(int **)); 
 ¡Saludos!realmente es lo mismo que si pones  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 | 
 
 |- |  |  |  |  |  
 
	
 
   |