Struktury, wskaźniki i tablice w programie przetwarzającym obraz pgm.

0

Witam.
Napisałem program przetwarzający obraz pgm, lecz teraz muszę pozmieniać zmienne na strukturę.
Mam sobie taką strukturę:

struct obraz 
	{
		int wymx,wymy,szarosci;
		int piksele[MAX][MAX];
	};

struct obraz obr1;

I do tej pory miałem taką funkcję:

int czytaj(FILE *p,int obraz_pgm[][MAX],int *wymx,int *wymy, int *szarosci) {...} 

No i chcę pozmieniać zmienne na strukturę.

int czytaj(FILE *p,int obr1.piksele[][MAX], int *obr1.wymx, int *obr1.wymy, int *obr1.szarosci) {...} 

Tylko że mi zaraz eclipse podkreśla cały kod a kompilator wywala że spodziewał się ; albo , przed kropką.
O co chodzi?

0

W deklaracji funkcji podajesz tylko TYPY danych! Nie ma tam znaczenia czy to są składowe jakiejś struktury czy też nie. Co niby miałoby znaczyć:

int obr1.piksele[][MAX]

? To czasem nie powinno po prostu być

int tablica[][MAX]

?

0

Nie gra mi coś.
Mam tą samą strukturę:

 struct obraz
	{
		int wymx,wymy,szarosci;
		int piksele[MAX][MAX];
	};

struct obraz obr1;

I jaki mam napisać prototyp funkcji w mod.h aby trzeba było do niej przekazać właśnie poszczególne pola tej struktur?

0

To po co ci struktura, jak chcesz przekazywać poszczególne pola?

int czytaj(FILE *p, struct obraz *obr)
{
    // teraz masz:
    obr->wymx = 1010;
    // itd...
}

// ...

struct obraz obr1;
czytaj(file, &obr1);
0

Dzięki. Już kapuję o co chodzi i jak na razie kompiluje bez błędów :D

0

No i dobra. Program mi działa, ale nie wiem dlaczego czasem musze użyć &.

Wywołuję funkcję negatyw:

 negatyw(plik_do_zapisu,&obr1);

Wygląda ona tak:

int negatyw(FILE *p, struct obraz *obr1)
{
	int i,j;

	for(j=0;j<obr1->wymy;j++)
		{
			for(i=0;i<obr1->wymx;i++)
			{
				obr1->piksele[i][j]=obr1->szarosci-obr1->piksele[i][j];  /*zmienia każdy el. tablicy na negatyw*/
			}

		}
	zapisz(p,obr1);
return(1);
} 

Ona pod koniec wywołuje funkcję zapisz:

 int zapisz(FILE *p,struct obraz *obr1)
{
	int i,j;

	fputs("P2 ",p);									 /*Wpisuje nr. magiczny dla pgm*/
	fprintf(p,"%d %d %d\n",obr1->wymx,obr1->wymy,obr1->szarosci);	 /*Wpisuje wymiary i szarosci  */

	for(j=0;j<obr1->wymy;j++)							/*Zapisuje do pliku po kolei każdy*/
	{										/*element tablicy obraz*/
		for(i=0;i<obr1->wymx;i++)
		{
			fprintf(p, "%d ", obr1->piksele[i][j]);
		}
		fprintf(p,"\n");
	}


}

Dlaczego przy wywołaniu funkcji zapisz: zapisz(p,obr1); niepotrzebny jest & przed obr1, a przy wywołaniu negatyw(plik_do_zapisu,&obr1); potrzebny jest ten &?
Skąd ta róznica? przecież to takie samo wywołanie funkcji...

0

Powiedz ze żartujesz ;] Widzisz różnicę w typach obr1 przed wywołaniem funkcji i wewnątrz niej?
obr1 przed wywołaniem negatyw() ma typ struct obraz, do funkcji chcesz przekazać wskaźnik do niego więc operatorem & pobierasz jego adres.
Wewnątrz funkcji negatyw() obr1 ma więc typ struct obraz* (czyli wskaźnik do miejsca w pamięci gdzie jest obiekt typu struct obraz).
Argumentem funkcji zapisz() jest struct obraz* więc dokładnie to czym jest obr1 w negatyw(), więc wywołując tą funkcję nie trzeba już nic z nim robić, wystarczy go tam przekazać.

0

Dzięki za wyjaśnienie.
Mam kolejny problem - naruszenie ochrony pamięci.
Moja struktura:

struct obraz
        {
                int wymx,wymy,szarosci;
                //int piksele[MAX][MAX];
                int **piksele;
        };
 
struct obraz obr1;
 

I moja funkcja czytająca plik pgm:

 
int czytaj(FILE *p,struct obraz *obr1) {
  char s[DL_LINII];
  int znak,koniec=0,i,j;
 
 
 ...
 
 
  /* Pobranie wymiarow obrazu i liczby odcieni szarosci */
  if (fscanf(p,"%d %d %d",&obr1->wymx,&obr1->wymy,&obr1->szarosci)!=3) {
    fprintf(stderr,"Blad: Brak wymiarow obrazu lub liczby stopni szarosci\n");
    return(0);
  }
     //Tworzenie dynamicznej tablicy
 
          obr1->piksele=(int**)malloc(obr1->wymx * sizeof(int));
                 for(i=0; i<obr1->wymx; i++)
               {
                         obr1->piksele[i]=(int*)malloc(obr1->wymy*sizeof(int));
               }
 
 
 
  /* Pobranie obrazu i zapisanie w tablicy obraz_pgm*/
  for (j=0;j<obr1->wymy;j++) {
    for (i=0;i<obr1->wymx;i++) {
      if (fscanf(p,"%d",&obr1->piksele[i][j]) != 1) {
        fprintf(stderr,"Blad: Niewlasciwe wymiary obrazu\n");
        return(0);
      }
    }
  }
  return obr1->wymx*obr1->wymy;
} 

Może ktoś powiedzieć co robię źle w tworzeniu tablicy dynamicznej?

0

Na oko jest ok. Jesteś pewny priorytetu operatorów tutaj:

&obr1->piksele[i][j]

nie powinno być

&(obr1->piksele[i][j])

?

0

Niestety nic to nie zmieniło. Program włącza się normalnie lecz gdy wbiorę plik do otworzenia wyskakuje naruszenie pamięci:/

0

No to odpal to pod debuggerem, nikt tego za ciebie nie zrobi. Błąd może być w zupełnie innym miejscu...

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