Witam chciałbym się dowiedzieć w jaki sposób na tym konkretnym przykładzie zmienić tablice statyczną na dynamiczną.
Mianowicie w pierwszym wierszu jest zadeklarowana tablica statyczna która pobiera z wczytanego PGMa wartość szarości i wymiary. Problem jest taki że czyni to tylko dla zdefiniowanego wcześniej maksymalnego rozmiaru obrazu. Prosiłbym o zmodyfikowanie tego kodu na taki który może pobrać to samo z tym że będzie to zapisane jako tablica dynamiczna. Już w ogóle byłbym bardzo wdzięczny gdyby tą tablicę dynamiczną zapisać jako jakąś prostę strukturę np
typedef struct{
~kod tablicy dynamicznej
}dynamiczny_obraz;
Kod źródłowy:
#define MAX 512
#define DL_LINII 1024
int czytaj(FILE *plik_we,int obraz_pgm[][MAX],int *wymx,int *wymy, int *szarosci) {
char buf[DL_LINII]; /* bufor pomocniczy do czytania naglowka i komentarzy */
int znak; /* zmienna pomocnicza do czytania komentarzy */
int koniec=0; /* czy napotkano koniec danych w pliku */
int i,j;
/*Sprawdzenie czy podano prawidłowy uchwyt pliku */
if (plik_we==NULL) {
fprintf(stderr,"Blad: Nie podano uchwytu do pliku\n");
return(0);
}
/* Sprawdzenie "numeru magicznego" - powinien być P2 */
if (fgets(buf,DL_LINII,plik_we)==NULL) /* Wczytanie pierwszej linii pliku do bufora */
koniec=1; /* Nie udalo sie? Koniec danych! */
if ( (buf[0]!='P') || (buf[1]!='2') || koniec) { /* Czy jest magiczne "P2"? */
fprintf(stderr,"Blad: To nie jest plik PGM\n");
return(0);
}
/* Pominiecie komentarzy */
do {
if ((znak=fgetc(plik_we))=='#') { /* Czy linia rozpoczyna sie od znaku '#'? */
if (fgets(buf,DL_LINII,plik_we)==NULL) /* Przeczytaj ja do bufora */
koniec=1; /* Zapamietaj ewentualny koniec danych */
} else {
ungetc(znak,plik_we); /* Gdy przeczytany znak z poczatku linii */
} /* nie jest '#' zwroc go */
} while (znak=='#' && !koniec); /* Powtarzaj dopoki sa linie komentarza */
/* i nie nastapil koniec danych */
/* Pobranie wymiarow obrazu i liczby odcieni szarosci */
if (fscanf(plik_we,"%d %d %d",wymx,wymy,szarosci)!=3) {
fprintf(stderr,"Blad: Brak wymiarow obrazu lub liczby stopni szarosci\n");
return(0);
}
/* Pobranie obrazu i zapisanie w tablicy obraz_pgm*/
for (i=0;i<*wymy;i++) {
for (j=0;j<*wymx;j++) {
if (fscanf(plik_we,"%d",&(obraz_pgm[i][j]))!=1) {
fprintf(stderr,"Blad: Niewlasciwe wymiary obrazu\n");
return(0);
}
}
}
return *wymx**wymy; /* Czytanie zakonczone sukcesem */
} /* Zwroc liczbe wczytanych pikseli */