¿AYUDA por que este programa crashea?

Iniciado por Mozzard, 5 Octubre 2018, 19:33 PM

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

Mozzard

Es un trabajillo para el insti por si veis alguna parte inecesaria o forzada, la cosa es pone nota a cada alumno y guardar la nota de estos en un array:
Ej: El alumno 1 tiene la nota 9.
Pero al poner nota al 3r alumno me crashea, alguien sabe por que? Ni mi profe sabe que pasa no estoy de broma lol.
Código (cpp) [Seleccionar]

#include <stdio.h>
#include <stdlib.h>
int comparador(int n ){
if(n<=15 and n>0){
return n;
}else{
printf("NUMERO INCORRECTO!\n");
return 0;
}
}



int main(){
printf("Cuantos alumnos hay? MAX 15 MIN 1: ");
int num, v,i=0;
scanf("%i", &num);
v=num;
int array[v];
if(comparador(num) != 0){
for(i;i<=v;i++){
printf("Que nota ha sacado el alumno %i ?", i+1);
scanf("%i", array[i]);
}
for (i=0;i<=v;i++){
printf("El alumno %i ha sacado %i", i+1, array[i]);
}
}
}
Programalo... sin miedo...

OmarHack

#1
Haces overflow.
Por culpa de scanf (&num)

No programo en C así que no sé indicarte la solución, busca en google.
I like to test things.

Mozzard

Segun he visto overflow es que le metemos a la variable un valor mas alto del que puede, pero metemos como mucho 15, no deberia de dar error no?
Programalo... sin miedo...

OmarHack

&num no te da el valor de num. Lo que te da es la dirección de memoria en donde se guarda num.
La dirección de memoria es algo del tipo: 0x6fabcb73b484
En todo caso usa scanf("%s",num)

Cual es tu intención con scanf &sum?
No programo en C asique puede que lo que estoy diciendo no se aplique a C pero en C++ eso sería intentar sobrescribir la dirección de memoria en la que se almacena la variable por un numero que de el usuario. Lo cual no tiene sentido en este tipo de programas.

I like to test things.

Mozzard

&num en scanf es poner el valor que introducimos en la direccion de memoria de num, por eso se pone &, ya entra en la sintaxi
Programalo... sin miedo...

MAFUS

No se puede dimensionar un array con una variable. Para eso está malloc y similares.

Si tú array tiene 15 elementos lo recorres desde 0 hasta 14, si llegas al 15 te has pasado.

OmarHack

Ya, pero parece que estas escribiendo en el propio puntero. No te lo puedo asegurar.

Si lo que pienso es cierto...
Prueba así a ver si no te crashea.
int i=0;
int *num=&i;
scanf("%d", num);
I like to test things.

Beginner Web

Simples errores de sintaxis, pero la logica esta bien
Código (cpp) [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
int comparador(int n ){
if(n>0 and n<=15){
  return n;
}else{
  printf("NUMERO INCORRECTO!\n");
  return 0;
}
}

int main(){
int num, v,i;
printf("Cuantos alumnos hay? MAX 15 MIN 1: ");
scanf("%i", &num);
v=num;
int array[v];
if(comparador(num) != 0){
  for(i=0;i<v;i++){
   printf("Que nota ha sacado el alumno %d?:", i+1);
scanf("%d",&array[i]);
  }
  for (i=0;i<v;i++){
  printf("El alumno %i ha sacado %i\n",i+1, array[i]);
  }
}
}
7w7

Mozzard

Ya he visto que has cambiado i<=v por i<v y el %d, por aprender y no volver a fallar me podrias decir por que pls?
El programa funciona perfectament ahora gracias!
Programalo... sin miedo...

Beginner Web

Porque en C/C++ la primera posicion inicial de un arreglo/vector es 0,
Por ejemplo si declaras un arreglo de 4 elementos , este contendra elementos desde la osicion 0 a la 3 solamente, es decir las posiciones 0,1,2 y 3
7w7