ERROR en C process returned -10737441819

Iniciado por matiri90, 14 Abril 2016, 14:22 PM

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

matiri90

Buenas gente.. Soy nuevo en esto, hace poco empece a usar C para programas simples..
Tengo un problema "process returned -10737441819"
Esto al terminar todo, no se que sera..
Desde ya, muchas gracias..

DEJO EL CODIGO (espero se entienda), no tiene nada de interesante el programa, pero no quiero que salga ese error..




[i]
#include<stdio.h>
#define Max 255

void EjDiez (int num[],int lim);
void CargarDatos (int num[], int lim);
void MostrarDatos (int num[],int lim);
void ordenarMenAMay(int num[], int lim);
void ordenarMayAMen (int num[],int lim);
void intercambiar(int *a, int *b);
void organizarParEImpar (int num[],int lim);

int main(){
   int numero[Max];
   int marca,largo,cant;
   printf("ingrese el maximo de numeros: ");
   scanf("%i",&cant);
   CargarDatos(numero[Max], cant);
   EjDiez(numero[Max],cant);
//    system("pause");
   ordenarMenAMay(numero[Max],cant);
   MostrarDatos(numero[Max], cant);
//    system("pause");
   ordenarMayAMen(numero[Max],cant);
   MostrarDatos(numero[Max], cant);
//   system("pause");
   organizarParEImpar(numero[Max], cant);
   MostrarDatos(numero[Max], cant);
   printf("Paso por aca?");
//    system("pause");
}


void CargarDatos (int num[],int lim){ //Carga el arreglo desde el teclado
   int a,i;
   for(i=0;i<lim;i++){
       printf("\n\nIngrese un numero: ");
       scanf("%i",&a);
       num[i]=a;
   }
   printf("\n");
}


void EjDiez (int num[],int lim){     //Si la cantidad de elemtos es par, muestra el 1er num del arreglo
   int i=0;                           //sino, muestra el numero que esta en la mitad del arreglo
   if ((lim % 2)==0){ //Se fija si es PAR
       printf("\n\nEl numero es PAR: (muestro el primer num del arreglo)  %i",num[i]);
   }
   else{
       i = (lim / 2); //Busca la mitad del arreglo
//       printf("\n\n el div %i",i);
       printf("\n\nEl numero es IMPAR: (muestro el num de la mitad del arreglo) %i",num[i]);
   }
}

void MostrarDatos (int num[],int lim){  //Muestra los datos del arreglo
   int i;
   for(i=0;i<lim;i++){
       printf("\n\nMostrar un numero:%i \n",num[i]);
   }
}



void ordenarMayAMen (int num[],int lim){ //Ordena los elem del arreglo de Mayor a Menor
   int j,i;
   for (i=0;i<lim;i++){
       for (j=i;j<lim;j++){
           if (num[i]<num[j]){
               intercambiar(&num[i],&num[j]);
           }
       }
   }
}

void intercambiar(int *a, int *b){ //Intercambia 2 valores
   *b=*a+*b;
   *a=*b-*a;
   *b=*b-*a;
}

void ordenarMenAMay(int num[],int lim){ ////Ordena los elem del arreglo de Mayor a Menor
   int j,i;
   for (i=0;i<lim;i++){
       for (j=i;j<lim;j++){
           if (num[i]>num[j]){
               intercambiar(&num[i],&num[j]);
           }
       }
   }
}

void organizarParEImpar (int num[],int lim){ //Organiza la lista, primero los numeros pares y despues los impares
   int i=0,j=0,k=0;
   int cantPar,cantImpar;
   int par[Max];
   int impar[Max];
   for (i=0;i<lim;i++){
       if ((num[i] % 2)==0){
           par[j]=num[i];
           j++;
           printf("\nPAR\n");
       }
       else {
           impar[k]=num[i];
           k++;
           printf("\nIMPAR\n");
       }
   }

   cantImpar=k;
   cantPar=j;
   i=0;
   for(j=0;j<cantPar;j++){
       num[i]=par[j];
       i++;
   }
   for (k=0;k<cantImpar;k++){
       num[i]=impar[k];
       i++;
   }
//   system("pause");
}
[/i]

MAFUS

Un programa en C siempre debe devolver un valor entero comprendido entre 0 y 255 cuando termina.

Tu programa termina cuando termina main pero no retorna nada, de forma controlada. Para solventar esto pon como última instrucción en main return 0; así retornarás el valor 0, que según el estándar quiere decir que el programa ha finalizado sin problemas.

matiri90

Cita de: MAFUS en 14 Abril 2016, 14:56 PM
Un programa en C siempre debe devolver un valor entero comprendido entre 0 y 255 cuando termina.

Tu programa termina cuando termina main pero no retorna nada, de forma controlada. Para solventar esto pon como última instrucción en main return 0; así retornarás el valor 0, que según el estándar quiere decir que el programa ha finalizado sin problemas.

Gracias por la rapida respuesta.. Probe esa solucion, pero igualmente me sigue dando ese error.. Lo revise varias veces, pero no encuentro el problema..
Lo raro?. Es que hace todo bien, ordena los numeros de menor a mayor, y viceversa, los ordena primero los pares y despues impares.. Pero al final, retorna eso..

ivancea96

-10737441819, en hexadecimal C0000005 es un error, violación en acceso a la memoria. Tienes algún problema con punteros y memoria, ya sea leer como escribir donde no es. Revisa los punteros. Localiza el problema.

matiri90

Cita de: ivancea96 en 14 Abril 2016, 15:16 PM
-10737441819, en hexadecimal C0000005 es un error, violación en acceso a la memoria. Tienes algún problema con punteros y memoria, ya sea leer como escribir donde no es. Revisa los punteros. Localiza el problema.

Ahi revise todo.. El "error" o no se, es que pasaba todos los parametros con el valor Max

ordenarMenAMay(numero[Max],cant);



Al sacar eso del parametro y dejarlo asi:


ordenarMenAMay(numero,cant);


Ahora dejo el codigo corregido..
Desde ya, gracias a todos por la ayuda y pregunto..
Fue un error haber pasado el Max como parametro?. Yo cree la variable
int numero[Max];

Al hacer eso, dejo claro que el maximo de elementos va a ser "Max" y por eso no hace falta pasarlo como parametro en alguna funcion?.

Pregunto, porque no entendi el "error" en cuestion.. Disculpen las molestias.. Dejo el codigo..

Codigo funcionando:
#include<stdio.h>
#define Max 255

void EjDiez (int num[],int lim);
void CargarDatos (int num[], int lim);
void MostrarDatos (int num[],int lim);
void ordenarMenAMay(int num[], int lim);
void ordenarMayAMen (int num[],int lim);
void intercambiar(int *a, int *b);
void organizarParEImpar (int num[],int lim);

int main(){
   int numero[Max];
   int marca,largo,cant;
   printf("ingrese el maximo de numeros: ");
   scanf("%i",&cant);
   CargarDatos(numero, cant);
   printf("\nSi la cantidad de elementos es par, muestra el 1er num del arreglo\n");
   printf("sino, muestra el numero que esta en la mitad del arreglo\n");
   EjDiez(numero,cant);
   printf("\n");
   system("pause");
   printf("Ordena el arreglo de Menor a Mayor\n");
   ordenarMenAMay(numero,cant);
   MostrarDatos(numero, cant);
   system("pause");
   printf("Ordena el arreglo de Mayor a Menor\n");
   ordenarMayAMen(numero,cant);
   MostrarDatos(numero, cant);
   system("pause");
   printf("Ordena el arreglo de Par a Impar\n");
   organizarParEImpar(numero, cant);
   MostrarDatos(numero, cant);
   return 0;
   system("pause");
}


void CargarDatos (int num[],int lim){ //Carga el arreglo desde el teclado
   int a,i;
   for(i=0;i<lim;i++){
       printf("\n\nIngrese un numero: ");
       scanf("%i",&a);
       num[i]=a;
   }
   printf("\n");
}


void EjDiez (int num[],int lim){     //Si la cantidad de elemtos es par, muestra el 1er num del arreglo
   int i=0;                           //sino, muestra el numero que esta en la mitad del arreglo
   if ((lim % 2)==0){ //Se fija si es PAR
       printf("\n\nEl numero es PAR: (muestro el primer num del arreglo)  %i",num[i]);
   }
   else{
       i = (lim / 2); //Busca la mitad del arreglo
//       printf("\n\n el div %i",i);
       printf("\n\nEl numero es IMPAR: (muestro el num de la mitad del arreglo) %i",num[i]);
   }
}

void MostrarDatos (int num[],int lim){  //Muestra los datos del arreglo
   int i;
   for(i=0;i<lim;i++){
       printf("\n\nMostrar un numero:%i \n",num[i]);
   }
}



void ordenarMayAMen (int num[],int lim){ //Ordena los elem del arreglo de Mayor a Menor
   int j,i;
   for (i=0;i<lim;i++){
       for (j=i;j<lim;j++){
           if (num[i]<num[j]){
               intercambiar(&num[i],&num[j]);
           }
       }
   }
}

void intercambiar(int *a, int *b){ //Intercambia 2 valores
   *b=*a+*b;
   *a=*b-*a;
   *b=*b-*a;
}


void ordenarMenAMay(int num[],int lim){ ////Ordena los elem del arreglo de Mayor a Menor
   int j,i;
   for (i=0;i<lim;i++){
       for (j=i;j<lim;j++){
           if (num[i]>num[j]){
               intercambiar(&num[i],&num[j]);
           }
       }
   }
}

void organizarParEImpar (int num[],int lim){ //Organiza la lista, primero los numeros pares y despues los impares
   int i=0,j=0,k=0;
   int cantPar,cantImpar;
   int par[Max];
   int impar[Max];
   for (i=0;i<lim;i++){
       if ((num[i] % 2)==0){
           par[j]=num[i];
           j++;
       }
       else {
           impar[k]=num[i];
           k++;
       }
   }

   cantImpar=k;
   cantPar=j;
   i=0;
   for(j=0;j<cantPar;j++){
       num[i]=par[j];
       i++;
   }
   for (k=0;k<cantImpar;k++){
       num[i]=impar[k];
       i++;
   }
//   system("pause");
}

ivancea96

ordenarMenAMay(numero[Max],cant);

Cuando declaras un array, pones entre los corchetes su tamaño, bien. A partir de ahí, cuando pones un número entre los corchetes, estás indicando un elemento del array.
"numero" -> array
"numero[0]" -> primer elemento del array
"numero[MAX-1]" -> último elemento del array
"numero[MAX]" -> elemento inexistente (lo que habría después del último elemento). Esto debió darte el error, pues accedes a un lugar de memoria incorrecto.
Aunque no solo eso:

void CargarDatos (int num[],int lim)
Ahí pides como primer parámetro un array de entero. Le estabas pasando un entero, que interpretaría como una dirección de memoria. Quizás te diera algún warning a la hora de compilar.

matiri90

Cita de: ivancea96 en 14 Abril 2016, 16:09 PM
ordenarMenAMay(numero[Max],cant);

Cuando declaras un array, pones entre los corchetes su tamaño, bien. A partir de ahí, cuando pones un número entre los corchetes, estás indicando un elemento del array.
"numero" -> array
"numero[0]" -> primer elemento del array
"numero[MAX-1]" -> último elemento del array
"numero[MAX]" -> elemento inexistente (lo que habría después del último elemento). Esto debió darte el error, pues accedes a un lugar de memoria incorrecto.
Aunque no solo eso:

void CargarDatos (int num[],int lim)
Ahí pides como primer parámetro un array de entero. Le estabas pasando un entero, que interpretaría como una dirección de memoria. Quizás te diera algún warning a la hora de compilar.

Que gran explicacion.. Gracias, por ahi no me doy cuenta de esas cosas.. Es un error que espero no cometer.. Son errores minuciosos, pero por ahi son dificiles de encontrar.. Gracias nuevamente. Un abrazo!.