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

Struktury, wskaźniki i tablice w programie przetwarzającym obraz pgm.
MI
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 13 lat
  • Postów:10
0

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

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

struct obraz obr1;

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

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

No i chcę pozmieniać zmienne na strukturę.

Kopiuj
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?

edytowany 1x, ostatnio: madmike
madmike
TAGUJ wątki nazwą języka/środowiska...
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
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ć:

Kopiuj
int obr1.piksele[][MAX]

? To czasem nie powinno po prostu być

Kopiuj
int tablica[][MAX]

?


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
MI
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 13 lat
  • Postów:10
0

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

Kopiuj
 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?

edytowany 1x, ostatnio: misiolak
iooi
  • Rejestracja:prawie 15 lat
  • Ostatnio:ponad 11 lat
  • Postów:573
0

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

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

// ...

struct obraz obr1;
czytaj(file, &obr1);
MI
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 13 lat
  • Postów:10
0

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

MI
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 13 lat
  • Postów:10
0

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

Wywołuję funkcję negatyw:

Kopiuj
 negatyw(plik_do_zapisu,&obr1);

Wygląda ona tak:

Kopiuj
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:

Kopiuj
 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...

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
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ć.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
MI
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 13 lat
  • Postów:10
0

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

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

I moja funkcja czytająca plik pgm:

Kopiuj
 
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?

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

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

Kopiuj
&obr1->piksele[i][j]

nie powinno być

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

?


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
MI
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 13 lat
  • Postów:10
0

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

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

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


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.