Ver Mensaje Individual
  #4 (permalink)  
Antiguo 03/09/2008, 02:04
rhervad
 
Fecha de Ingreso: mayo-2008
Mensajes: 10
Antigüedad: 16 años
Puntos: 0
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.