Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    [C] problemi di segmentation fault

    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

  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2010
    Messaggi
    45
    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:

    codice:
    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.



    EDIT:
    "non newline at end of file",
    Per questo basta che premi invio e lasci una riga vuota alla fine del codice.

  3. #3
    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

  4. #4
    Utente di HTML.it
    Registrato dal
    Mar 2010
    Messaggi
    45
    Analizzando bene il codice ho capito qual'è il tuo problema..

    codice:
    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.


  5. #5
    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

  6. #6
    Utente di HTML.it
    Registrato dal
    Mar 2010
    Messaggi
    45
    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?

  7. #7
    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?

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2010
    Messaggi
    45
    Prova a dichiararlo prima del main e vedi se funziona.

  9. #9
    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

  10. #10
    Utente di HTML.it
    Registrato dal
    Mar 2010
    Messaggi
    45
    Provando a compilarlo cosi a me va:

    codice:
    struct Pacco
    {
    struct coordinate posizione;
    struct coordinate dimensioni;
    }pacchi[MAX_PACCHI];
    codice:
    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

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.