Programación General > C/C++
Arreglos de punteros.
leusss:
Hola.
Resulta que estuve leyendo lo más detenidamente el K&R y me encuentro en la parte de punteros (supongo yo la parte más importante de todo el lenguaje C).
Quiero ver si entendí bien cuál es la noción de matrices (Arreglos bidimensionales) y su relación con los punteros, porque hice un programa que por donde lo vea pienso que debería andar pero no anda.
Veamos: Sé que un puntero es una variable que indica la dirección de memoria de otra variable (a la cual "apunta"). Se también, que en los arreglos las direcciones de memoria son contiguas, es decir que si creo un puntero al primer elemento del arreglo, puedo obtener la dirección de los otros elementos del arreglo mediante sumas y, si es posible restas(por ejemplo si p es un puntero a int, p se puede tomar como la dirección del elemento 0, p+1 vendria a ser la dirección del elemento 1, etc).
Ahora bien, si cada puntero podemos considerar que comienza en "el primer elemento de un arreglo", entonces yo podria pensar en hacer un arreglo de punteros para obtener un "arreglo de arreglos", lo cual simularía una matriz. Luego tendría un puntero a puntero, que me indicaría en qué fila estoy y después según a qué se encuentre apuntando el puntero fila tendría en qué columna estoy.
En fin... resulta que busqué ejercicios para hacer en internet y uno decía "pida un número y luego imprima una matriz de nxn tal que el elemento a[j] es 1 si i y j son coprimos, y 0 de lo contrario".
Esto es lo que hice:
--- Código: C --- #include <stdio.h>#include <stdlib.h> char son_coprimos(int x, int y){ int i; if(x<=1 || y<=1) return 1; if((x%2 == 0) && (y%2 == 0)) return 0; for(i=3; 2*i<=x;i+=2) if((x%i == 0) && (y%i == 0)) return 0; return 1; } void matriz_coprimos(char **m, int n){ int i, j; m = (char**) malloc(sizeof(char*) * n); for(i=0;i<n;++i) m[i] = (char*) malloc(sizeof(char) * n); for(i=0;i<n;++i) for(j=0;j<n;++j) m[i][j] = son_coprimos(i+1, j+1); } main(){ char **a, n, i, j; scanf("%d", &n); matriz_coprimos(a, n); for(i=0;i<n;++i) { for(j=0;j<n;++j) printf("%d ", a[i][j]); printf("n"); } system("Pause");}
PD: Claramente mi SO es windows xD
Saludos y muchas gracias.
Eternal Idol:
No lo mire mucho pero al compilar (como C) el VC++ da un warning crucial:
(32) : warning C4700: uninitialized local variable 'a' used
Para poder cambiar la direccion a la que apunta la variable a desde la funcion matriz_coprimos tenes que pasar la direccion de esta variable (&a) y no su valor como estas haciendo ahora.
leusss:
Pero creo que esta bien pasar a, ya que sí indica la direccion. Es más, me tira un warning intentar pasar &a.
Eternal Idol:
Esta mal, sin duda pero no me creas a mi, hacelo simple:
--- Código: C ---a = 0;matriz_coprimos(a, n);printf("El valor de a es: %.8Xrn", a);
No podes simplemente pasar &a, tenes que cambiar la funcion tambien.
leusss:
Osea, es verdad, parece no alterar a 'a', pero sigo sin entender por qué :brickwall: y cómo arreglarlo
Navegación
[#] Página Siguiente
Ir a la versión completa