Segmentation Fault - jeszcze nim program zaczyna pracę

0

Witam,

Mam poważny problem z swoim programem, jak już zaznaczyłem w temacie, program wywala Segmentation Fault nim jeszcze zacznie pracę.
[code]
//forum zamienialo krzyzyk na to usunalem
include <stdio.h>
include <stdlib.h>
include "pgm_file.h"
include "operations.h"
include "random.h"

int main(int argc, char *argv[])
{
printf("dgfs");
pgm *pgm_file;
printf("sdfgd");
load_basic_data(&pgm_file, argc, argv);
printf("dsfgdsf");
if(load_file(&pgm_file))
{
operations(&pgm_file, argc, argv);
save_file(&pgm_file);
}
return 0;
}

[/code]

//Te dziwne ciagi znaków są po to by dowiedzieć się w którym momencie jest ten błąd, wyszło na to że przed funkcją main, bo żaden się nie wyświetlił oO

Nie jestem pewien czy na pewno, ale zdaję mi się że błąd może być gdzieś w dwuwymiarowej tablicy dynamicznej umieszczonej w strukturze, dlatego umieszczam ten kawałek kodu:

[code]
typedef struct pgm_file{
char file_name_in[FILE_NAME_MAX_LENGHT]; //Nazwa pliku wejsciowego
char file_name_out[FILE_NAME_MAX_LENGHT]; //Nazwa pliku wyjsciowego
int sizex; //Szerokosc obrazu
int sizey; //Wysokosc obrazu
int grayscale; //Skala szarosci obrazu
int display;
FILE *file; //Wskaznik na plik
int **picture; //Dwuwymiarowa tablica informacji o poszczegolnych pikselach obrazu
} pgm;
[/code]
[code]
int load_file(pgm *pgm_file){
...
(pgm_file)->picture = (int
)malloc((pgm_file)->sizex * sizeof(int));
for (int i = 0; i < (*pgm_file)->sizex; i++)
(pgm_file)->picture[i] = (int) malloc((*pgm_file)->sizey * sizeof(int));

}
[/code]
Takie rozwiązanie znalazłem gdzieś na internecie i na pierwszy rzut oka zdaje mi się prawidłowe

Jakie mogą być inne przyczyny takiego błędu? Kompilator gcc na diablo pwr.

0

Kompilacja z -Wall przebiega czysto?

0

Skoro przed mainem to gdzieś przy tworzeniu zmiennej statycznej.

Korzystasz z linuksa? To skompiluj z flagą -g, przenieś program na partycję ext (na ntfs nie chcą się niektórym generować core'y), skompiluj, daj polecenie ulimit -c unlimited, uruchom program, w katalogu z którego uruchomiłeś powinieneś mieć plik core.<numerek>. Daj znać jak dojdziesz tu.

0

[code]
$ make
gcc -c -Wall pgm_file.C
pgm_file.C: In function 'int load_file(pgm**)':
pgm_file.C44: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
pgm_file.C16: warning: statement has no effect [-Wunused-value]
pgm_file.C57: error: invalid type argument of unary '' (have 'int')
pgm_file.C77: error: invalid type argument of unary '
' (have 'int')
pgm_file.C97: error: invalid type argument of unary '' (have 'int')
pgm_file.C57: warning: format '%d' expects argument of type 'int
', but argument 3 has type 'int' [-Wformat]
pgm_file.C: In function 'void save_file(pgm**)':
pgm_file.C34: warning: comparison with string literal results in unspecified behaviour [-Waddress]

  • Error code 1
    make: Fatal error: Command failed for target `pgm_file.o'

[/code]

0
Zellus napisał(a):

[code]
pgm_file.C57: warning: format '%d' expects argument of type 'int*', but argument 3 has type 'int' [-Wformat]
[/code]

W skrócie: zamiast adresu podajesz int, jest on traktowany jako adres, przy próbie wyciągnięcia inta spod tego nieprawidłowego adresu aplikacja się sypie.

2

printf("dgfs\n");
lub:
printf("dgfs"); fflush(stdout);
inaczej nie widzisz tych wydruków bo się buforują.

0

_13th_Dragon - Teraz się wyświetla i rzeczywiście, błąd jest w funkcji load_file a nie przed main'em więc wiem od czego wyjść, dzięki wielkie :)
lll - ten błąd już poprawiłem, ale dalej wywala segmentation fault, ale myślę że dalej sam sobie poradzę, dzięki

1 użytkowników online, w tym zalogowanych: 0, gości: 1