Piszę program który ma się zajmować edycją obrazów .pgm. Mam problem z dynaiczną tablicą do przechowywania obrazu. Proszę o wskazanie błędu.
Błąd jest w tym fragmencie:
tab=(int(*))malloc(sizeof(int)*(*wymx)*(*wymy));
int (*piksele)[*wymx];
piksele=(int(*)[*wymy])tab;
/* Pobranie obrazu i zapisanie w tablicy obraz_pgm*/
for (j=0;j<*wymy;j++) {
for (i=0;i<*wymx;i++) {
fscanf(p,"%d",&piksele[i][j]);
/*sprawdzenie czy pobrany obraz ma wlasciwe wymiary*/
if(i>=MAX||j>=MAX) {/*mala zmiana w stosunku do oryginalu*/
fprintf(stderr,"Blad: Niewlasciwe wymiary obrazu\n");
return(0);
A to jest cały kod. na początku chcę wczytać i zapisać obraz.
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
/*maksymalny rozmiar obrazka w pikselach
okresla MAX*/
#define MAX 512
#define DL_LINII 80
int czytaj(FILE *p, int *tab,int *wymx,int *wymy,int *szarosci);
void zapisz(int *wymx,int *wymy,int *tab,int *szarosci,char komentarz[]);
/*void wyswietl();
int negatyw(int *wymx,int *wymy,int obraz_pgm[][MAX],int *szarosci);
int progowanie(int *wymx,int *wymy,int obraz_pgm[][MAX],int *szarosci);
int konturowanie(int *wymx,int *wymy,int obraz_pgm[][MAX]);
int splot(int *wymx,int *wymy,int tab[][MAX]);
int normalizacja(int *wymx,int *wymy,int obraz_pgm[][MAX],int *szarosci);
*/
/*zmienna pomocnicza do okreslenia czy zostal wczytany jakis plik,
jesli nie to program odmowi wykonania opcji zapisu, oraz funkcji przetwarzania*/
typedef struct obraz_pgm{
char nazwa;
FILE *plik;
int wymx,wymy,odcieni;
int *tab;
}obrazy;
/**********************************MAIN***************************/
/*Glowna czesc programu z menu uzytkownika i wywolaniami funkcji*/
int main()
{
int plikwczytany=0;
char *rozszerzenie=".pgm";
//int x;
/*x-zmienna pomocnicza do MENU
c-zmienne pomocnicza do MENU2*/
int wymx,wymy,odcieni,obraz[MAX][MAX];
//FILE *plik;
char nazwa_odczyt[100];
obrazy *a;
a=(obrazy*)malloc(sizeof(obrazy));
printf("Wybrales odczyt,podaj nazwe pliku\n\n");
printf("Podaj sama nazwe pliku bez jego rozszerzenia (rozszerzenie domyslne .pgm):\n");
scanf("%s",&(a->nazwa));
/*dodajemy koncowke .pgm do nazwa_odczyt,ta sama koncowka co w funkcji zapisz*/
strncat(&a->nazwa,rozszerzenie,sizeof nazwa_odczyt-1);
puts(&a->nazwa);
a->plik=fopen(&a->nazwa,"r");
/*wywolanie funkcji czytaj*/
czytaj(a->plik,a->tab,&a->wymx,&a->wymy,&a->odcieni);
plikwczytany=1;
char komentarz[69];
if(plikwczytany==0){
printf("!!Nie wczytales zadnego pliku do pamieci!!\n");
}
printf("%d \n %d",a->wymx, a->wymy);
/*wywolanie funkcji zapisz*/
zapisz(&a->wymx,&a->wymy,a->tab,&a->odcieni,komentarz);
return 0;
}
/****************************CZYTAJ*********************************/
/*funkcja do odczytu pliku o podanej nazwie udostepniona na stornie kursu*/
int czytaj(FILE *p,int *tab,int *wymx,int *wymy,int *szarosci) {
char s[DL_LINII];
int znak,koniec=0,i,j;
/*sprawdzenie czy podano prawidlowy uchwyt pliku */
if (p==NULL) {
fprintf(stderr,"Blad: Nie podano uchwytu do pliku\n");
return(0);
}
if (fgets(s,DL_LINII,p)==NULL) koniec=1;
/* Sprawdzenie "numeru magicznego - powinien być P2 */
if ( (s[0]!='P') || (s[1]!='2') || koniec) {
fprintf(stderr,"Blad: To nie jest plik PGM\n");
return(0);
}
/* Pominiecie komentarzy */
do {
if ((znak=fgetc(p))=='#') {
if (fgets(s,DL_LINII,p)==NULL) koniec=1;
} else {
ungetc(znak,p);
}
} while (! koniec && znak=='#');
/* Pobranie wymiarow i liczby odcieni szarosci */
if (fscanf(p,"%d %d %d",wymx,wymy,szarosci)!=3) {
fprintf(stderr,"Blad: Brak wymiarow obrazu lub liczby stopni szarosci\n");
return(0);
}
printf("%d \n %d",*wymx, *wymy);
tab=(int(*))malloc(sizeof(int)*(*wymx)*(*wymy));
int (*piksele)[*wymx];
piksele=(int(*)[*wymy])tab;
/* Pobranie obrazu i zapisanie w tablicy obraz_pgm*/
for (j=0;j<*wymy;j++) {
for (i=0;i<*wymx;i++) {
fscanf(p,"%d",&piksele[i][j]);
/*sprawdzenie czy pobrany obraz ma wlasciwe wymiary*/
if(i>=MAX||j>=MAX) {/*mala zmiana w stosunku do oryginalu*/
fprintf(stderr,"Blad: Niewlasciwe wymiary obrazu\n");
return(0);
}
}
}
return *wymx**wymy;
}
/*******************************************************************************************************/
/***************************************ZAPISZ******************************************/
/*funkcja do zapisywania pliku pod zadana nazwa*/
void zapisz(int *wymx,int *wymy,int *tab,int *szarosci,char komentarz[])
{
int (*piksele)[*wymx];
piksele=(int(*)[*wymy])tab;
char *rozszerzenie=".pgm";
int i=0,j=0;
FILE *plik2;
char nazwazapis_pgm[100];
/*if(pr==1){*szarosci=1;}*/
printf("%d \n %d",*wymx, *wymy);
/*wczytanie nazwy pliku bez dodawania rozszerzenia .pgm*/
printf("Podaj nazwe pliku bez dopisywania rozszerzenia:\n");
scanf("%s",nazwazapis_pgm);
printf("Trwa zapisywanie \n");
/*do wczytanej nawzwy dopisujemy koncowke rozszerzenia ".pgm"*/
strncat(nazwazapis_pgm,rozszerzenie,sizeof nazwazapis_pgm-1);
printf("\n");
puts(nazwazapis_pgm);/*wyswietl nazwe zapisywanego pliku*/
printf("%d \n %d",*wymx, *wymy);
plik2=fopen(nazwazapis_pgm,"w"); /*tworzymy plik o podanej nazwie*/
printf("%d \n %d",*wymx, *wymy);
fprintf(plik2,"P2\n");/*dodajemy numer magiczny:) P2*/
fprintf(plik2,"\n%d %d\n",*wymx,*wymy);/*wpisujemy wymiary tablicy zawierajacej obraz pgm*/
fprintf(plik2,"%d\n",*szarosci);/*wpisujemy liczbe oznaczajaca maksymalna szarosc*/
/*dwie petle for wypisuja wartosci z tablicy*/
for(j=0;j<*wymy;++j)
{
for(i=0;i<*wymx;++i){printf("%d ",piksele[i][j]);}
}
fclose(plik2);/*zamykamy plik*/
printf("Obraz zostal zapisany do pliku\n");/*dajemy komunikat o poprawnie wykonanym poleceniu*/
}
program się sypie i wyświetla błąd:Segmentation fault (core dumped).