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