PDA

Visualizza la versione completa : [C] problemi di segmentation fault


Mandibola
17-11-2010, 17:38
il programma che sotto riporto deve prendere le dimensioni di un container, il numero di pacchi contenuti e le dimensioni dei pacchi contenuti; deve verificare se sbordano, se non si compenetrano e se sono stabili; compilando l'eseguibile con Cygwin l'unico problema è del tipo "non newline at end of file", che comunque non riesco a risolvere. Se, però lancio il programma con un file di testo allegato, la risposta è: "segmentation fault <core dumped>".
Di seguito allego sia il programma sia un esempio di .txt allegato

#include <stdio.h>
#include <stdlib.h>
#define MAX_PACCHI 100
#define MAX_VOL 100

struct coordinate
{
double x;
double y;
double z;
};

struct Pacco
{
struct coordinate posizione;
struct coordinate dimensioni;
};

int WrongPosition (struct coordinate posizione, struct coordinate dimensioni, struct coordinate container);
int Compenetrazione (struct coordinate posizione, struct coordinate dimensioni);
int Stabilita (struct coordinate posizione, struct coordinate dimensioni);

int main(int argc, char *argv[])
{

long int TotalVolume=0;
long int i,j, numpacchi;
FILE *fp;
struct coordinate container;
struct Pacco pacchi[MAX_PACCHI];

if (argc!=2)
{
printf("\ne' necessario allegare 1 file.\n");
exit (EXIT_FAILURE);
}

if ((fp=fopen(argv[1],"r"))==NULL)
{
printf("\nil file non è stato trovato.\n");
exit (EXIT_FAILURE);
}

fscanf(fp,"%lf %lf %lf", &container.x, &container.y, &container.z);
fscanf(fp,"%ld", &numpacchi);

//Verifica che il volume totale non superi quello del container

for(i=0; i<numpacchi; i++)
{
fscanf(fp,"%lf %lf %lf", &pacchi[i].posizione.x, &pacchi[i].posizione.y, &pacchi[i].posizione.z);
fscanf(fp,"%lf %lf %lf", &pacchi[i].dimensioni.x, &pacchi[i].dimensioni.y, &pacchi[i].dimensioni.z);
TotalVolume += pacchi[i].dimensioni.x * pacchi[i].dimensioni.y * pacchi[i].dimensioni.z;

if (TotalVolume >= (container.x * container.y * container.z))
{
printf ("Container sottodimensionato.\n");
return -1;
}

if (WrongPosition(pacchi[i].posizione, pacchi[i].dimensioni, container))
{
printf ("Il pacco #%ld e' in posizione scorretta.\n", i);
return -1;
}

for (j=i+1; j<numpacchi; j++)
{
if (Compenetrazione(pacchi[MAX_PACCHI].posizione, pacchi[MAX_PACCHI].dimensioni))
{
printf ("Compenetrazione tra pacchi.\n");
return -1;
}

if (Stabilita(pacchi[MAX_PACCHI].posizione, pacchi[MAX_PACCHI].dimensioni))
{
printf ("Mancata stabilità tra pacchi.\n");
return -1;
}

}
}
return 0;
}

int WrongPosition (struct coordinate posizione, struct coordinate dimensioni, struct coordinate container)
{
if ((posizione.x + dimensioni.x > container.x) ||
(posizione.y + dimensioni.y > container.y) ||
(posizione.z + dimensioni.z > container.z))
{
return 1;
}
return 0;
}

int Compenetrazione (struct coordinate posizione, struct coordinate dimensioni)
{
long int i,j;
struct Pacco pacchi[MAX_PACCHI];

if ((pacchi[j].posizione.x < (pacchi[i].posizione.x + pacchi[i].dimensioni.x)) &&
(pacchi[j].posizione.y < (pacchi[i].posizione.y + pacchi[i].dimensioni.y)))
{
return 1;
}

if ((pacchi[j].posizione.x < (pacchi[i].posizione.x + pacchi[i].dimensioni.x)) &&
(pacchi[j].posizione.z < (pacchi[i].posizione.z + pacchi[i].dimensioni.z)))
{
return 1;
}

if ((pacchi[j].posizione.z < (pacchi[i].posizione.z + pacchi[i].dimensioni.z)) &&
(pacchi[j].posizione.y < (pacchi[i].posizione.y + pacchi[i].dimensioni.y)))
{
return 1;
}
return 0;
}

int Stabilita (struct coordinate posizione, struct coordinate dimensioni)
{
long int i,j;
struct Pacco pacchi[MAX_PACCHI];

if ((pacchi[j].posizione.y == (pacchi[i].posizione.y + pacchi[i].dimensioni.y)))
{
if ((pacchi[j].dimensioni.z) * (pacchi[j].dimensioni.x) > (pacchi[i].dimensioni.z) * (pacchi[i].dimensioni.x))
{
return 1;
}
}
return 0;
}

150.0 200.0 160.0

5

0.0 0.0 0.0
22.0 14.0 20.0

22.0 14.0 20.0
18.0 13.0 12.0

40.0 27.0 32.0
17.0 12.0 11.0

57.0 39.0 43.0
16.0 10.0 9.0

73.0 49.0 52.0
18.0 18.0 17.0

Doch88
18-11-2010, 16:11
Ciao,
La prossima volta che posti nel forum usa i tag CODE e leggi il regolamento.

Comunque prima di tutto dovresti localizzare dov'è che ti causa il segmentation fault.
Con varie prove potrai arrivare a capire che l'errore sta in questo if:


if (Compenetrazione(pacchi[MAX_PACCHI].posizione, pacchi[MAX_PACCHI].dimensioni))
{
printf ("Compenetrazione tra pacchi.\n");
return -1;
}


Quindi probabilmente l'errore si trova nella funzione Compenetrazione, ora sta a te capire precisamente dove, io ora non ho tempo e non posso aiutarti.
Per trovarlo puoi servirti di qualche printf sparso per il codice.
Quando l'avrai trovato, se non riesci a risolverlo da solo, posta qui il codice incriminato e vedremo di aiutarti.

:ciauz:

EDIT:
"non newline at end of file",

Per questo basta che premi invio e lasci una riga vuota alla fine del codice.

Mandibola
18-11-2010, 16:39
Scusate gli errori nella forma(mancato utilizzo dei tag CODE) ma è la prima volta che scrivo.
Ho provato varie printf nella funzione compenetrazione ma continuo a non capire dov'è il problema

Doch88
18-11-2010, 16:47
Analizzando bene il codice ho capito qual'è il tuo problema..


int Compenetrazione (struct coordinate posizione, struct coordinate dimensioni)
{
long int i,j;
struct Pacco pacchi[MAX_PACCHI];

if ((pacchi[j].posizione.x < (pacchi[i].posizione.x + pacchi[i].dimensioni.x)) &&
(pacchi[j].posizione.y < (pacchi[i].posizione.y + pacchi[i].dimensioni.y)))
{
return 1;
}

if ((pacchi[j].posizione.x < (pacchi[i].posizione.x + pacchi[i].dimensioni.x)) &&
(pacchi[j].posizione.z < (pacchi[i].posizione.z + pacchi[i].dimensioni.z)))
{
return 1;
}

if ((pacchi[j].posizione.z < (pacchi[i].posizione.z + pacchi[i].dimensioni.z)) &&
(pacchi[j].posizione.y < (pacchi[i].posizione.y + pacchi[i].dimensioni.y)))
{
return 1;
}
return 0;
}

perchè hai dichiarato un nuovo "Pacco pacchi"?
Ovviamente il nuovo oggetto è vuoto e non contiene niente, per questo ti fa segmentation fault.

:ciauz:

Mandibola
18-11-2010, 17:08
ho tolto la struct in questione, sia in Compenetrazione sia in Stabilita, eppure non va e mi da sempre segmentation fault.
Cmq hai ragione, l'errore è li', perchè in un esempio con la posizione scorretta, la funzione WrongPosition funziona correttamente

Doch88
18-11-2010, 17:10
Originariamente inviato da Mandibola
ho tolto la struct in questione, sia in Compenetrazione sia in Stabilita, eppure non va e mi da sempre segmentation fault.
Cmq hai ragione, l'errore è li', perchè in un esempio con la posizione scorretta, la funzione WrongPosition funziona correttamente

Hai provato a rendere il primo "struct Pacco pacchi[MAX_PACCHI];" globale e levarlo da tutte le altre funzioni?

Mandibola
18-11-2010, 17:16
se per "renderlo globale" intendi dichiararlo nel main allora si'; mentre la struct Pacco viene cosi' definita solo prima del main
struct Pacco{
struct coordinate posizione;
struct coordinate dimensioni;
};
è errato?

Doch88
18-11-2010, 17:18
Prova a dichiararlo prima del main e vedi se funziona.

Mandibola
18-11-2010, 17:22
ho provato a dichiararlo solo prima del main e non va;
ho provato a dichiararlo sia prima sia nel main e non va, non so più che fare

Doch88
18-11-2010, 17:25
Provando a compilarlo cosi a me va:


struct Pacco
{
struct coordinate posizione;
struct coordinate dimensioni;
}pacchi[MAX_PACCHI];


int Compenetrazione (struct coordinate posizione, struct coordinate dimensioni)
{
int i = 0,j = 0;

if ((pacchi[j].posizione.x < (pacchi[i].posizione.x + pacchi[i].dimensioni.x)) && (pacchi[j].posizione.y < (pacchi[i].posizione.y + pacchi[i].dimensioni.y)))
{
return 1;
}

if ((pacchi[j].posizione.x < (pacchi[i].posizione.x + pacchi[i].dimensioni.x)) && (pacchi[j].posizione.z < (pacchi[i].posizione.z + pacchi[i].dimensioni.z)))
{
return 1;
}

if ((pacchi[j].posizione.z < (pacchi[i].posizione.z + pacchi[i].dimensioni.z)) && (pacchi[j].posizione.y < (pacchi[i].posizione.y + pacchi[i].dimensioni.y)))
{
return 1;
}
return 0;
}

come output mi da: Compenetrazione tra pacchi.
non so cosa faccia il tuo programma quindi non so se è giusto, però cosi non fa altri segmentation fault

Loading