• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

[C]Dynamiczna alokacja tablicy dwuwymiarowej ze struktury. Obsługa komentarzy.

Object Storage Arubacloud
+1 głos
1,107 wizyt
pytanie zadane 28 listopada 2016 w C i C++ przez Fenix7 Nowicjusz (210 p.)

[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;
}

 

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 439 wizyt
0 głosów
1 odpowiedź 1,567 wizyt
pytanie zadane 4 lipca 2017 w C i C++ przez kyly Początkujący (260 p.)
0 głosów
2 odpowiedzi 312 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...