C/Visual C - Ayuda con codigo en C

   
Vista:

Ayuda con codigo en C

Publicado por des (7 intervenciones) el 05/01/2010 06:24:18
El programa es bastante simple solo que estoy aprendiendo a manejar punteros en C y dobles punteros y al compilarlo no da ningun error pero al ejecutarlo a veces va, y a veces falla entonces a ver si algun experto ve algun fallo en el codigo directamente:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

main(){
int** numeros;
int numero,columnas,filas,x,y,ok;

//Reservamos las filas que vamos a rellenar
do{
printf("Cuantas filas vas a rellenar: ");
ok=scanf("%d",&columnas);
while(getchar()!='\n');
}while(!ok);
numeros=(int**)malloc(columnas * sizeof(int*));
//Reservamos las filas que vamos a rellenar
//Rellenamos las filas con numeros, cada fila con los numeros que diga que va a poner.
for(x=0;x<columnas;x++){
printf("Cuantos numeros en la fila %d: ",x+1);
scanf("%d",&filas);
getchar();
*(numeros+x)=(int*)malloc(filas+1 * sizeof(int));
for(y=1;y<=filas;y++){
printf("Numero %d: ",y);
scanf("%d",&numero);
*(*(numeros+x)+y)=numero;
}
*(*(numeros+x))=filas;
}
//Rellenamos las filas con numeros, cada fila con los numeros que diga que va a poner.
//Mostramos cada fila con sus respectivos numeros
for(x=0;x<columnas;x++){
printf("\nNumeros fila %d: ",x+1);
for(y=1;y<=*(*(numeros+x));y++){
printf("%d ",*(*(numeros+x)+y));
}
printf("\n");
}
//Liberamos el malloc
free(numeros);
}

Por cierto si hay algun consejo sobre programacion en general tambien es bienvenido ^^
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Ayuda con codigo en C

Publicado por Tom (481 intervenciones) el 05/01/2010 13:05:00
Lo primero que debes entender de los dobles punteros en c es que casi nunca es necesario usarlos directamente.

Aunque haya gente que los use para hacer tablas dinámicas de dos dimensiones, en realidad solo suelen ser necesarios para que una función altere la dirección de uno de sus parámetros.

El código parece estar bien, así que sin probarlo me da la impresión de que tu problema está aquí:

*(*(numeros+x))=filas;

Debes hacer:
*(*(numeros+x)+y) = filas;

Yo resolvería un problema como éste usando estructuras de datos (más código, pero más claro):

struct TABLA {
int nFilas;
struct FILA {
int nColumnas;
int columnas[];
} filas[];
} tabla;

scanf(... , &tabla.nFilas);
tabla.filas = malloc(nFilas * sizeof(struct FILA));

for(x = 0; x < tabla.nFilas; x++) {
scanf(..., &tabla.filas[x].nColumnas);
tabla.filas[x].columnas = malloc(tabla.filas[x].nColumnas * sizeof(int));
for(y = 0; y < tabla.filas[x].nColumnas) {
scanf(..., &tabla.filas[x].columnas[y]);
}
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda con codigo en C

Publicado por des (7 intervenciones) el 05/01/2010 17:51:11
En realidad supongo que si no fuera un ejercicio para dobles punteros no los hubiera usado pero como estamos ahora con ellos no tengo otra jeje, por otro lado con la solucion que pusiste sigue pasando lo mismo, lo que si que me he dado cuenta es que siempre deja de funcionar por lo menos con ese cambio cuandole introduces el numero de numeros que quieres introducir en la tercera fila :S seguire probando cosas a ver si deja de decir lo de "el programa blablabla ha dejado de funcionar jeje" Gracias por los consejs igualmente los probare cuando la entregue xd por ahora me ceñire a la practica xd
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda con codigo en C

Publicado por des (7 intervenciones) el 05/01/2010 17:54:40
Por otro lado me acabo de dar cuenta que esta bien con:

*(*(numeros+x))=filas;

Ya le suma 1 a la "y" antes de salir del for y ademas que si le pones que vas a introducir 2 filas, no peta, (por que no tienes que introducir la tercera), aunque peta al terminar el programa, pero poniendo solo 2 pude probar que si pones el +y te muestra muchoas mas numeros de los que deberia, y sin el "+y" te muestra las que son, y luego se peta :S
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda con codigo en C

Publicado por des (7 intervenciones) el 05/01/2010 19:50:36
me sigo auto respondiendo jeje

El caso es que he estado haciendo algunas pruebas y añadiendo debajo de la fila:

*(*(numeros+x)+y)=numero;

esto:

printf("\nComprobacion: %d\n",*(*(numeros+0)+2));

Debe mostrarme el segundo numero, de la primera fila, vale, lo que seria la traza, metes un numero, y te dice un nomero muy largo y tal, por que aun no le hemos dado valor, OK, metes el segundo numero, y te dice ese numero, OK, ahora, pasamos a la siguiente fila, si esta primera iba a ser de 2 numeros, metes el primer numero de la segunda fila, y en esa linea, te dice otra vez un numero muy largo y sin sentido :S:S FAIL xd

No se por que cambia de valor derepente si no lo toco en ningun momento desde que le doy el valor.... :S
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda con codigo en C

Publicado por Tom (481 intervenciones) el 07/01/2010 12:05:16
Vale, no entendía del todo lo que estabas haciendo.

En tu código original, que está bien, sólo has cometido un error, de los que no son fáciles de ver porque no te los esperas:

*(numeros + x)=(int*)malloc((filas + 1) * sizeof(int));

Si te fijas, te faltan los paréntesis de (filas + 1) ... así que está haciendo mal el malloc().
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda con codigo en C

Publicado por des (7 intervenciones) el 07/01/2010 15:25:21
O.o muchas gracias pues si que era jodido de ver si, llevo dias dandole vueltas!! :S:S graacias Tom
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar