| |||
Fallo de segmentacion en 64 bits Sabriais decirme por que me da un fallo de segmentación al ejecutar un programa compilado para 64 bits cuando para 32 bits funcionaba perfectamente y que no he tocado? Mil gracias. |
| |||
Respuesta: Fallo de segmentacion en 64 bits Probare a depurarlo como me decís. El código es complejo como para ponerlo, pero he hecho una versión simplificada que produce los mismos errores. Básicamente lo que hace es reservar un volumen de memoria, inicializarlo y finalmente crear una esfera dentro de el. Aquí os dejo el código: #include <math.h> #include <stdlib.h> #include <stdio.h> #include "ReservaMemoria.h" void main(){ int i,j,k; int ***esfera; // Matriz de esfera int X,Y,Z; int radio; int XX,YY,ZZ; //Dimensiones de la matriz 3D printf("Lado del cubo donde se creara la esfera: "); scanf("%i",&X); Y=X; Z=X; printf("Radio de la esfera: "); scanf("%i",&radio); esfera=reserva3D(X,Y,Z); //inicializamos for(k=0;k<Z;k++){ for(j=0;j<Y;j++){ for(i=0;i<X;i++){ esfera[i][j][k]=(int)0; printf("Posicion de memoria (%i,%i,%i) => Valor %i\n",i,j,k,esfera[i][j][k]); }}} if(X%2==0) XX=X/2; else XX=(X-1)/2; if(Y%2==0) YY=Y/2; else YY=(Y-1)/2; if(Z%2==0) ZZ=Z/2; else ZZ=(Z-1)/2; //Generamos la matriz 3D esfera for (k=0;k<Z;k++){ for (j=0;j<Y;j++){ for (i=0;i<X;i++){ //esfera formado por un material homogéneo if(pow(i-XX,2)+pow(j-YY,2)+pow(k-ZZ,2)<=pow(radio,2)){ //cilindro formado por un material homogéneo //if(pow(i-XX,2)+pow(j-YY,2)<=pow(radio,2)){ esfera[i][j][k]=1; //identificamos el material con un entero } } } } printf("\n%i\n",esfera[X/2][Y/2][Z/2]); } La función reserva3D es la siguiente: int ***reserva3D(int Xm, int Ym, int Zm) { int i,j; int ***Puntero; Puntero= (int***)malloc (sizeof(int)*Xm); for (i=0; i<Xm; i++){ Puntero[i] = (int**)malloc (sizeof(int)*Ym); for(j=0;j<Ym;j++) Puntero[i][j] =(int*)malloc (sizeof(int)*Zm); } return Puntero; } Y repito que para 32 bits funcionaba a la perfección. Si os sirve de ayuda, he estado siguiendo el código y el fallo se produce cuando accede al valor ((X/2)+2,0,0) para inicializarlo (bucle en el que se ponen todos los valores de esfera a 0). Mil gracias de nuevo. |
| ||||
Respuesta: Fallo de segmentacion en 64 bits ¿Podes hacer un printf("%d\r\n", sizeof(int)); por favor? Si por casualidad te da 4 ahi debe estar el problema y usando sizeof(int*) que debe dar 8 se soluciona.
__________________ ¡Peron cumple, Evita dignifica! VIVA PERON CARAJO |
| |||
Respuesta: Fallo de segmentacion en 64 bits Muchas gracias Eternal Idol, asi funciona. Ya habia encontrado una solucion equivalente multiplicando sizeof(int) * 2, pero sigo sin comprender el porque. No entiendo el porque de tener que cambiar el codigo para que funcione en una o en otra arquitectura. Si me lo pudieras explicar te lo agradeceria enormemente. Gracias. |
| ||||
Respuesta: Fallo de segmentacion en 64 bits Estas reservando memoria para punteros y estos no tienen que tener el tamaño del tipo de dato en cuestion. En PC de 32 bits un puntero son 4 bytes y en PC de 64 bits son 8 bytes. El tipo de dato int depende del compilador pero suele ser en PC 4 bytes tanto en 32 como en 64. Como regla general siempre usa el tamaño del puntero, de esta forma sizeof(int*) te funcionara en ambas plataformas.
__________________ ¡Peron cumple, Evita dignifica! VIVA PERON CARAJO Última edición por Eternal Idol; 03/09/2008 a las 04:25 |