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.

David8

Muy buenas de nuevo. Estoy haciendo un programa ( muy básico ) en el que se debe introducir un número de alumnos, luego pedir una calificación a cada uno en el intervalo [0, 10], y por último clasificar el número de aprobados, notables, etc. TODO CON ENTEROS.
De momento llevo lo siguiente:


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

#define TAMANIO 10

int verificarEntrada(const char *ptrX);

int verificarEntrada(const char *ptrX)
{
for(; *ptrX != '\0'; ptrX++){
if(isdigit(*ptrX) == 0){
puts("->Entrada no permitida.");
return 0;
}
}

return 1;
}

int main(void)
{
char nAlumnos[TAMANIO];
int alumnos;
int longitud;
int x;   // valor que devuelve la función verificarEntrada()
int i;
char *notas[alumnos];
int notasEnteras[alumnos];


do{
printf("Numero de alumnos: ");

fgets(nAlumnos, TAMANIO, stdin);   // si introducimos 9 o más caracteres se produce OVERFLOW en el buffer

longitud = strlen(nAlumnos);

if(nAlumnos[longitud-1] == '\n'){   // si la cadena tiene una longitud menor a TAMANIO-1 evitamos la "impresión de '\n'
nAlumnos[longitud-1] = '\0';
}

x = verificarEntrada(nAlumnos);

puts("");

if(x == 1){
alumnos = atoi(nAlumnos);
}

} while(x == 0);

for (i = 0; i < alumnos; i++){
do{
notas[i] = malloc (TAMANIO * sizeof (char));

      printf("Nota alumno %d : ", i + 1);
      scanf("%[^\n]", notas[i]);
      while(getchar() != '\n');
     
      x = verificarEntrada(notas[i]);

if(x == 1){
int n = atoi(notas[i]);

if(n < 0 || n > 10){   // cada nota debe estar comprendida en el intervalor [0, 10]
x = 0;
}
else{
notasEnteras[i] = atoi(notas[i]);
}
}

} while(x == 0);
  }


return EXIT_SUCCESS;
}


El problema es que compila pero en cuanto se abre la consola se termina el proceso.
No encuentro que puede estar mal.
Agradecería mucho indicaciones de cómo mejorar un poco el código (ya que lo veo un poco desastroso, sobre todo en la declaración de variables  ;D )

Gracias.

amchacon

¿Que IDE usas?

En el codeblocks si pulsas F8 activas el depurador, y puedes avanzando el programa línea a línea. Así ves donde el programa "estalla".

Otra opción es ir poniendo printfs por el código y ver cuantos printfs llega a escribir antes de que de error, pero el depurador es una tecnica un poco chapucera xD
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

Uso el dev c++
Pero el problema es que no ejecuta nada, es decir, doy a compilar y bien, pero al ejecutar en cuanto aparece la consola sale un mensaje de error de Windows

No ves nada que pueda estar mal en el código? Estoy casi seguro de que falla en alguna parte dentro del for, pero no sé el qué...

Un saludo

amchacon

Cita de: David8 en 10 Abril 2014, 13:20 PM
Uso el dev c++
Pero el problema es que no ejecuta nada, es decir, doy a compilar y bien, pero al ejecutar en cuanto aparece la consola sale un mensaje de error de Windows

No ves nada que pueda estar mal en el código? Estoy casi seguro de que falla en alguna parte dentro del for, pero no sé el qué...

Un saludo
Te lo he dicho, tienes que averiguar en que línea te da el problema.

Hazme caso y pon printfs cada 3-4 líneas de código:

Código (cpp) [Seleccionar]

int main(void)
{
        printf("1 - Inicio \n");
char nAlumnos[TAMANIO];
int alumnos;
int longitud;
int x;   // valor que devuelve la función verificarEntrada()
int i;
char *notas[alumnos];
int notasEnteras[alumnos];
       
        printf("2 - Tras declarar las variables \n");

        // Etc...


Solo tienes que ver el último printf que escribes, y sabrás por donde falla (da igual que te salga error de Windows, los printfs los veras igual).

PD: Por cierto, usas la variable "alumnos" pero no está inicializada.
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, 13:35 PM
Te lo he dicho, tienes que averiguar en que línea te da el problema.

Hazme caso y pon printfs cada 3-4 líneas de código:

Código (cpp) [Seleccionar]

int main(void)
{
       printf("1 - Inicio \n");
char nAlumnos[TAMANIO];
int alumnos;
int longitud;
int x;   // valor que devuelve la función verificarEntrada()
int i;
char *notas[alumnos];
int notasEnteras[alumnos];
       
       printf("2 - Tras declarar las variables \n");

       // Etc...


Solo tienes que ver el último printf que escribes, y sabrás por donde falla (da igual que te salga error de Windows, los printfs los veras igual).

PD: Por cierto, usas la variable "alumnos" pero no está inicializada.


Probaré lo de los prints.

Respecto a lo de alumnos, si quiero usar correctamente
char *notas[alumnos];
int notasEnteras[alumnos];

debería de declararlos una vez que tenga alumnos definido no? Es decir, antes del for)

Muchas gracias y un saludo

amchacon

Si, cuando ya lo tengas inicializado.

Los arrays variables mejor con malloc por cierto.
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, 13:57 PM
Si, cuando ya lo tengas inicializado.

Los arrays variables mejor con malloc por cierto.


int v;
char *notas[v] = malloc(alumnos * sizeof (char));


Así?

David8

Cita de: amchacon en 10 Abril 2014, 13:57 PM
Si, cuando ya lo tengas inicializado.

Los arrays variables mejor con malloc por cierto.

Hice lo que me dijiste y el código me queda así:


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

#define TAMANIO 10

int verificarEntrada(const char *ptrX);

int verificarEntrada(const char *ptrX)
{
for(; *ptrX != '\0'; ptrX++){
if(isdigit(*ptrX) == 0){
puts("->Entrada no permitida.");
return 0;
}
}

return 1;
}

int main(void)
{
char nAlumnos[TAMANIO];
int alumnos;
int longitud;
int x;   // valor que devuelve la función verificarEntrada()
int i;

do{
printf("Numero de alumnos: ");

fgets(nAlumnos, TAMANIO, stdin);   // si introducimos 9 o más caracteres se produce OVERFLOW en el buffer

longitud = strlen(nAlumnos);

if(nAlumnos[longitud-1] == '\n'){   // si la cadena tiene una longitud menor a TAMANIO-1 evitamos la "impresión de '\n'
nAlumnos[longitud-1] = '\0';
}

x = verificarEntrada(nAlumnos);

puts("");

if(x == 1){
alumnos = atoi(nAlumnos);
}

} while(x == 0);

char *notas = malloc(alumnos * sizeof (char));
int notasEnteras[alumnos];

for (i=0; i<alumnos; i++){

do{
notas[i] = malloc(TAMANIO * sizeof (char));

      printf("Nota alumno %d : ", i + 1);
        scanf("%[^\n]", notas[i]);
       
        while(getchar() != '\n');
       
        x = verificarEntrada(notas[i]);

if(x == 1){
int n = atoi(notas[i]);

if(n < 0 || n > 10){   // cada nota debe estar comprendida en el intervalor [0, 10]
x = 0;
}
else{
notasEnteras[i] = atoi(notas[i]);
}
}

} while(x == 0);
   }


return EXIT_SUCCESS;
}


También puse los printf y todo va bien hasta que entra en el for, que no pasa de:
scanf("%[^\n]", notas[i]);

Aquí pongo los mensajes que me deja el compilador (los  que no he conseguido solucionar):
Citar
In function 'main':
57 13 [Warning] assignment makes integer from pointer without a cast [enabled by default]
60 10 [Warning] passing argument 1 of 'fgets' makes pointer from integer without a cast [enabled by default]
354 39 c:\program files (x86)\dev-cpp\mingw32\include\stdio.h expected 'char *' but argument is of type 'char'
64 10 [Warning] passing argument 1 of 'verificarEntrada' makes pointer from integer without a cast [enabled by default]
10 5 expected 'const char *' but argument is of type 'char'
67 5 [Warning] passing argument 1 of 'atoi' makes pointer from integer without a cast [enabled by default]
304 37 c:\program files (x86)\dev-cpp\mingw32\include\stdlib.h expected 'const char *' but argument is of type 'char'
73 6 [Warning] passing argument 1 of 'atoi' makes pointer from integer without a cast [enabled by default]
304 37 c:\program files (x86)\dev-cpp\mingw32\include\stdlib.h expected 'const char *' but argument is of type 'char'

No quiero la solución en código del problema si no una pista de lo que pudiese estar fallando.

Un saludo.

leosansan


Todo el mal radica en cómo declaras notas y el char que usas.

Ya que usas array de longitud variable en:


Código (cpp) [Seleccionar]
int notasEnteras[alumnos];

no sé por qué no haces lo mismo con notas:

Código (cpp) [Seleccionar]
char *notas[alumnos];

Pero si lo quieres hacer con malloc, entonces:

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


¡¡¡¡ Saluditos! ..... !!!!



David8

Cita de: leosansan en 10 Abril 2014, 20:26 PM
Todo el mal radica en cómo declaras notas y el char que usas.

Ya que usas array de longitud variable en:


Código (cpp) [Seleccionar]
int notasEnteras[alumnos];

no sé por qué no haces lo mismo con notas:

Código (cpp) [Seleccionar]
char *notas[alumnos];

Pero si lo quieres hacer con malloc, entonces:

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


¡¡¡¡ Saluditos! ..... !!!!




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