[C]Witam. Mam do oddania na zajęcia projekt z przetwarzania obrazów *.pgm. W programie obraz przechowuje w zmiennej strukturalnej która posiada kolejne parametry i na końcu wskaźnik na tablice dwuwymiarową(zawierającą piksele).
struct obraz
{
char std[2];
int szer;
int wys;
int grey;
int **tab;
};
W funkcji wczytującej obraz z pliku musze zaalokować tą tablice z wczytanymi wcześniej parametrami. Wiem, że przy alokacji w osobnej funkcji musze sie posłużyć wskaźnikiem(np przy tablicy jednowymiarowej, wskaźnik na wskaźnik) i analogicznie tutaj powinienem użyć wskaźnika na wskaźnik na wskaźnik (***), z drugiej strony do funkcji wczytującej wchodzi wskaźnik na strukture, w której zawiera sie wskaźnik na tablice dwuwymiarową, więc nie wiem czy jest to potrzebne. Generalnie pogubiłem sie i nie wiem jak to zbudować. Pozostaje jeszcze problem odwołania sie do pól tablicy już poza tą funkcją. Wewnątrz działa normalne tab[x][y] ale jak to zrobić kiedy do tablicy dostaje się poprzez wskaźnik na strukture ze wskaźnikiem na tablice.
W tym kodzie może być troche bałaganu bo kombinowałem na różne sposoby sobie z tym poradzić.
No i probelm nr 2. Obsługa komentarzy
W instrukcji miałem powiedziane, żeby wykorzystać, że fscanf zwraca 0 jeśli wczytywanie sie nie powiedzie(np. chce dostać float'a a wczytuje char). Zastosowałem to jak na razie tylko przy wczytywaniu drugiego parametru bo mam probelm: Moge sie przenieść o ileś znaków od obecnego miejsca, ale jak to zrobić aby skakało odrazu do następnej linii?
No i funkcja w której te dwa problemy sie zawierają:
int wczytaj(struct obraz *foto)
{
char nazwa[20];
printf("Podaj nazwe pliku(do 20 znaków): (*.pgm)\n");
scanf("%s", nazwa);
FILE *plik;
int a=1;
int i, j;
plik = fopen(nazwa, "r");
if (plik == NULL)
{
system("cls");
printf("Nie można otworzyć pliku. Plik nie istnieje lub jest otwarty w innym programie.\n\n");
return 0;
} //otwieranie pliku wraz z zabezpieczeniem
fscanf(plik, "%s", (foto->std));
if (*(foto->std + 1) != 50) {
printf("Nieobsługiwany standard pliku\n");
fclose(plik);
return 0;
}
do{
a = fscanf(plik, "%d", &(foto->szer));
} while (a == 0);
printf("%d\n", foto->szer);
fscanf(plik, "%d", &(foto->wys));
printf("%d\n", foto->wys);
fscanf(plik, "%d", &(foto->grey));
printf("%d\n", foto->grey);
int **tab;
tab = calloc(foto->szer, sizeof(tab));
if (tab != NULL)
{
for (i = 0; i < (foto->szer); i++)
{
tab[i] = calloc(foto->wys, sizeof(*tab));
if (tab[i] == NULL)
{
for (i; i == 0; i--)
free(tab[i]);
free(tab);
printf("Błąd alokacji obrazu(tablicy)01\n");
fclose(plik);
return 0;
}
}
}
else
{
printf("Błąd alokacji obrazu(tablicy)02\n");
fclose(plik);
return 0;
}
for(i=0; i<foto->szer; i++)
{
for (j = 0; j < foto->wys; j++)
{
fscanf(plik, "%d", &tab[i][j]);
printf("%d", tab[i][j]);
}
printf("\n");
}
foto->tab = &tab;
printf("ALE:%d\n", tab[2][6]);
printf("%d", foto->tab);
fclose(plik);
return 1;
}