Ejercicio compila pero no se ejecuta

Iniciado por David8, 10 Abril 2014, 08:30 AM

0 Miembros y 1 Visitante están viendo este tema.

leosansan

Cita de: David8 en 10 Abril 2014, 20:50 PM
Funciona!!! Muchísimas gracias.
Aunque no comprendo muy bien lo de punteros a punteros, pero eso es cuestión de estudiarlo mejor.

Ya que me lo dijiste, ¿es mejor hacer int notasEnteras[alumnos]; como un array dinámico? Sólo lo uso para almacenar enteros. (perdona mi ignorancia)

Un saludo

Es otra alternativa a la que puede ponerse el pero de que algún compilador no la acepte. En general la uso para matrices normalitas. Si el tamaño es importante uso asignación dinámica de memoria.

Salu2!.

David8

Cita de: leosansan en 10 Abril 2014, 21:31 PM
Es otra alternativa a la que puede ponerse el pero de que algún compilador no la acepte. En general la uso para matrices normalitas. Si el tamaño es importante uso asignación dinámica de memoria.

Salu2!.


Una última cosa, el compilador me da (en modo estricto) el siguiente warning:
Citar54 9 [Warning] 'notas' is used uninitialized in this function [-Wuninitialized]

Respecto a:
char **notas;
*notas = malloc(alumnos * sizeof (char));


Un saludo.

amchacon

Cambia:
Código (cpp) [Seleccionar]
*notas = malloc(alumnos * sizeof (char));

Por:
Código (cpp) [Seleccionar]
notas = malloc(alumnos * sizeof (char));
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

David8

Cita de: amchacon en 10 Abril 2014, 23:13 PM
Cambia:
Código (cpp) [Seleccionar]
*notas = malloc(alumnos * sizeof (char));

Por:
Código (cpp) [Seleccionar]
notas = malloc(alumnos * sizeof (char));

Una última cosa y ya doy por solucionada la duda.
Para liberar la memoria que uso cuando reservo con malloc tendré que usar free así no?
free(notas[i]);
después del
while(x == 0);
O uso free(notas) solamente?

Un saludo.

rir3760

Como ya te comentaron el problema principal se debe a que tratas de almacenar todas las lineas cuando lo único que haces con ellas es obtener (mediante atoi) un entero. Es mejor declarar un solo array de caracteres (ya lo haces, el array "nAlumnos") y reutilizar este cada vez que debas leer una linea de la entrada estándar.

Si con todo quieres utilizar memoria dinámica debes reservar primero la memoria del bloque principal y a continuación la memoria para cada linea. Antes de terminar el programa liberas la memoria de cada linea y por ultimo la del bloque principal. De esta forma:
/* ... */

#define TAMANIO  10

/* ... */

char nAlumnos[TAMANIO];
int alumnos;
int longitud;
int x;
int i;
char **notas;

/* ... */

/* 1) Obtienes el numero de alumnos */

/* 2) Reservas el bloque de memoria principal */
notas = malloc(alumnos * sizeof *notas);

/* 3) Reservas el bloque de memoria para cada alumno */
for (i = 0; i < alumnos; i++)
   notas[i] = malloc(TAMANIO);

/* 4) Realizas las operaciones del programa */

/* 5) Liberas la memoria utilizada por cada alumno */
for (i = 0; i < alumnos; i++)
   free(notas[i]);

/* 6) Liberas el bloque principal */
free(notas);


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

David8

Cita de: rir3760 en 13 Abril 2014, 16:30 PM
Como ya te comentaron el problema principal se debe a que tratas de almacenar todas las lineas cuando lo único que haces con ellas es obtener (mediante atoi) un entero. Es mejor declarar un solo array de caracteres (ya lo haces, el array "nAlumnos") y reutilizar este cada vez que debas leer una linea de la entrada estándar.

Si con todo quieres utilizar memoria dinámica debes reservar primero la memoria del bloque principal y a continuación la memoria para cada linea. Antes de terminar el programa liberas la memoria de cada linea y por ultimo la del bloque principal. De esta forma:
/* ... */

#define TAMANIO  10

/* ... */

char nAlumnos[TAMANIO];
int alumnos;
int longitud;
int x;
int i;
char **notas;

/* ... */

/* 1) Obtienes el numero de alumnos */

/* 2) Reservas el bloque de memoria principal */
notas = malloc(alumnos * sizeof *notas);

/* 3) Reservas el bloque de memoria para cada alumno */
for (i = 0; i < alumnos; i++)
   notas[i] = malloc(TAMANIO);

/* 4) Realizas las operaciones del programa */

/* 5) Liberas la memoria utilizada por cada alumno */
for (i = 0; i < alumnos; i++)
   free(notas[i]);

/* 6) Liberas el bloque principal */
free(notas);


Un saludo

Lo voy pillando poco a poco.
Muchas gracias por curraros tanto las respuestas :)

Un saludo.