Problema Segmentation fault: 11

di il
9 risposte

Problema Segmentation fault: 11

Ho un problema che non so come risolvere di segmentation...
il mio programma apre un immagine jpg con quattro uova, cerco i pixel con i valori rgb corrispondenti a queste uova, e disegno su di esse un quadrato da 150 pixel introducendo una tolleranza in caso che non prendo esattamente tutti i pixel delle uova... ma non capisco per quale motivo mi da un errore si segmentation... qualcuno di voi mi può aiutare ?
grazie in anticipo


Questo é il mio programma

#include <stdio.h>
#include "image.h"
#include <stdlib.h>

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

// Le nom du fichier à lire
char * fichier = "/Users/dax/Desktop/detection-mac/763.jpg";

// Lire l'image
struct Image image;
char * erreur = image_read(&image, fichier);
if (erreur != NULL)
{
printf("Impossible de lire %s: %s\n", fichier, erreur);
return 1;
}

//definisco variabili per cicli for
int k;
int x;
int y;

// definisco la struttura
struct Uovo {
int flag;
int countX;
int x1;
int y1;
};


// dichiarazione variabili
struct Uovo uova [4];
for (k=0; k<4; k++)
{
uova[k].flag=0;

}

struct Uovo vario;
vario.flag=0;
vario.countX=0;



//trova le uova
int i;
int a;
int tolleranza;
int esci=0;

for(a=0; a<4; a++)
{
//trovo una riga orrizzontale di 150 pixel color uovo
for ( y = 0; y < image.heightInPixels; y++) //ciclo sulle y
{

for ( x = 0; x < image.widthInPixels; x++) //ciclo sulle x
{

i = y * image.widthInPixels + x;
if ((abs(image.pixels.r - 70) < 30 && abs(image.pixels.g - 40) < 25 && abs(image.pixels.b - 25) < 20) ||
(abs(image.pixels.r - 50) < 20 && abs(image.pixels.g - 10) < 10 && abs(image.pixels.b - 10) < 10)) //Se il pixel è colorato
{

if (vario.countX == 0) //se è il primo pixel colorato
{
vario.x1 = x;
vario.y1 = y;
tolleranza=0;
}
vario.countX++;
}
else //se il pixel NON è colorato
{
if (vario.countX>0)
{
tolleranza++;
vario.countX++;
}

if (tolleranza>30)
{

if (vario.countX < 150)
{
vario.countX = 0;
}
else
{
uova[a].x1=vario.x1;
uova[a].y1=vario.y1;
uova[a].flag=1;
esci=1;
break;
}
}
}
}
if (esci==1)
break;
}


//verificare che sia vero uovo e colorare di blu
tolleranza=0;
for ( y = uova[a].y1; y<=uova[a].y1+200; y++)
{

for( x = uova[a].x1; x<=uova[a].x1+200; x++)
{
i = y * image.widthInPixels + x;
if ((abs(image.pixels.r - 70) < 30 && abs(image.pixels.g - 40) < 25 && abs(image.pixels.b - 25) < 20)||
(abs(image.pixels.r - 50) < 20 && abs(image.pixels[i].g - 10) < 10 && abs(image.pixels[i].b - 10) < 10))
{}

else
{
tolleranza++;
}
// Rendre le pixel blu
image.pixels[i].r = 190;
image.pixels[i].g = 0;
image.pixels[i].b = 0;

}

}
printf("tolleranza %d\n", tolleranza);
vario.countX = 0;
/*if (tolleranza<1000)
{
printf("la bandiera è %d\n", uova[a].flag);
a++;
}
else
{
uova[a].x1=0;
uova[a].y1=0;
uova[a].flag=0;

}*/


}


// Ecrire l'image (avec les pixels modifiés)
image_write_to_png(&image, "/Users/dax/Desktop/detection-mac/763-modifie.png");



// Libérer la mémoire occupée par l'image
image_free(&image);

return 0;
}

9 Risposte

  • Re: Problema Segmentation fault: 11

    E' impossibile provare il tuo programma senza installare le librerie che usi e quindi impossibile provarlo.

    Devi fare in modo di individuare la linea in cui avviene l'errore, magari con delle printf messe prima o dopo.
  • Re: Problema Segmentation fault: 11

    Con il solo sorgente, senza sapere quale libreria stai utilizzando (non e' che "image.h" dica molto), quale sia l'immagine, e senza sapere quale sia la riga di codice che genera l'eccezione, non e' possibile dire molto.

    Il problema, comunque, lo puoi identificare tu: basta che utilizzi il debugger ed esegui il codice passo/passo fino alla generazione dell'eccezione. Quindi, ragionare sul perche' tale eccezione si verifica.

    Un segmentation fault e' sempre legato ad un puntatore che punta al posto sbagliato
  • Re: Problema Segmentation fault: 11

    Per non sapere ne leggere ne scrivere, questo codice mi puzza:
    for ( y = uova[a].y1; y<=uova[a].y1+200; y++)
    {
    
    for( x = uova[a].x1; x<=uova[a].x1+200; x++)
  • Re: Problema Segmentation fault: 11

    questo codice mi puzza:
    Saranno le uova andate a male ...
  • Re: Problema Segmentation fault: 11

    Lo so che senza librerie é quasi impossibile ma non posso fare di meglio perché se mettessi librerie e tutto questo post sarebbe veramente lungo...
    comunque non dovrebbe puzzare é la parte che mi definisce un quadrato di pixel così posso identificare l' uovo ...
  • Re: Problema Segmentation fault: 11

    Il problema potrebbe essere che dai per scontato che ti puoi muovere di 200 pixel nelle due direzioni ma non è detto che disponi di 200 pixel. Devi limitare sempre l'azione nei limiti dell'immagine.

    Se controlli l'ultimo pixel a destra, ad esempio, ovviamente avrai un errore perché non ce ne sono altri 200 dopo.

    Comunque, come ti ho detto, usa delle printf e individua la riga dell'errore.
  • Re: Problema Segmentation fault: 11

    Quello l' ho dato scontato perché da li mi dovrebbe muoversi di 200 dal primo pixel color uovo e io non ho nessuna immagine con delle uova che si vedono parzialmente quindi dovrebbe essere sempre possibile muoversi di quella distanza ... e poi coloro quel quadrato così che quando mi cerca il secondo oggetto non mi viene identificato sempre lo stesso .
  • Re: Problema Segmentation fault: 11

    Okay ma, per l'ultima volta, identifica la linea dell'errore con delle printf o non si va avanti.
  • Re: Problema Segmentation fault: 11

    Prova lo stesso a mettere il controllo che non stai sbordando dall'immagine,potresti avere un colore in essa che sia simile all'uovo e ti faccia partire l'algoritmo facendoti eccedere.
    Diciamo poi che sarebbe buona programmazione.
Devi accedere o registrarti per scrivere nel forum
9 risposte