Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Fallo de segmentacion en 64 bits

Estas en el tema de Fallo de segmentacion en 64 bits en el foro de C/C++ en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 02/09/2008, 05:20
 
Fecha de Ingreso: mayo-2008
Mensajes: 10
Antigüedad: 16 años
Puntos: 0
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.
  #2 (permalink)  
Antiguo 02/09/2008, 06:06
Avatar de Fayca  
Fecha de Ingreso: abril-2008
Mensajes: 164
Antigüedad: 16 años, 1 mes
Puntos: 2
Respuesta: Fallo de segmentacion en 64 bits

Supongo que habria que ver el codigo
  #3 (permalink)  
Antiguo 02/09/2008, 07:27
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: Fallo de segmentacion en 64 bits

¿Compilado para 64 bits funcionaba en 32 bits? Eso si que es raro ...

Depuralo para ver donde da el problema (podes usar gdb, supongo que estas en GNU/Linux) o dejanos el codigo como dice Fayca.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #4 (permalink)  
Antiguo 03/09/2008, 02:04
 
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.
  #5 (permalink)  
Antiguo 03/09/2008, 03:18
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
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
  #6 (permalink)  
Antiguo 03/09/2008, 03:40
 
Fecha de Ingreso: mayo-2008
Mensajes: 10
Antigüedad: 16 años
Puntos: 0
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.
  #7 (permalink)  
Antiguo 03/09/2008, 04:03
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
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
  #8 (permalink)  
Antiguo 03/09/2008, 05:03
 
Fecha de Ingreso: mayo-2008
Mensajes: 10
Antigüedad: 16 años
Puntos: 0
Respuesta: Fallo de segmentacion en 64 bits

Comprendido, muchisimas gracias.
  #9 (permalink)  
Antiguo 03/09/2008, 05:16
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: Fallo de segmentacion en 64 bits

De nadas
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:16.