[C] przekazywanie zaalokowanej pamięci do funkcji

0

Witam mam taki problem:

Chcę stworzyć dwie funkcję. Pierwsza ma zczytywać dane z pliku do tablicy dwuwymiarowej, a druga ma zapisywać je do innego pliku. Wygląda to mniej więcej tak:

deklaracja struktury;

int zczytywanie(struct pixel**tab){
otwieranie pliku;
alokacja pamięci dla tablicy dwuwymiarowej;
zczytywanie danych z pliku do tej tablicy;
zamykanie pliku;
}

int zapisywanie(struct pixel**tab){
otwieranie pliku;
zapisywanie danych do pliku z tablicy;
zamykanie pliku;
zwalnianie pamięci;
}

int main(){
struct pixel**tab;
zczytywanie(&tab);
zapisywanie(&tab);
}

Program się kompiluje, ale wywala po uruchomieniu. Tzn wykonuje całą pierwszą funkcję i łapie crasha gdy w drugiej funkcji chcę na przykład wypisać przykładową komórkę mojej tablicy, więc domyślam się, że źle ją przekazałem do funkcji. Do komórki odwołuje się w taki sposób: "tab[i][j].r". Nie wiem może właśnie to źle robię. Mam nadzieję, że ktoś będzie mi w stanie pomóc. Od razu zaznaczam, że jestem początkującym "programistą", więc prosty język mile widziany. Z góry dzięki. ;]

0

A czy masz tam jakąś alokację pamięci? Poza tym skoro masz

pixel** tab;

i wywołujesz &tab to funkcja powinna przyjmować

pixel***

a nie

pixel**
0

Jak dam 3 gwiazdki to nawet w pierwszej funkcji nie mogę wywołać komórki tej tabeli. Daję cały kod:

#include<stdio.h>
#include<stdlib.h>
typedef struct pixel px;

struct pixel{
	int r;
	int g;
	int b;
};

int rozdzielczosc(char**nazwa,int xy[]){
	int i=0;
	char znak;
	FILE*obraz;
	obraz=fopen(nazwa,"r");
	if(obraz==NULL){
		printf("Nie moge otworzyc pliku.\n");
		return -1;
	}
	else{
		while(i<2){
			znak=getc(obraz);
			if(znak=='\n')
				i=i+1;
		}
		fscanf(obraz,"%d %d",&xy[0],&xy[1]);
		fclose(obraz);
		printf("Rodzielczosc: %dx%d\n",xy[0],xy[1]);
		return 0;
	}
}

int zczytywanie(char**nazwa,px**tab,int xy[]){
	int i,j;
	char znak;
	FILE*obraz;
	obraz=fopen(nazwa,"r");
	if(obraz==NULL){
		printf("Nie moge otworzyc pliku.\n");
		return -1;
	}
	else{
		tab=(px**)malloc(xy[0]*sizeof(px*));
		if(tab==NULL){
			printf("Nie moge zaalokowac pamieci.\n");
			return -1;
		}
		for(i=0;i<xy[0];i++){
			tab[i]=(px*)malloc(xy[1]*sizeof(px));
			if(tab[i]==NULL){
				printf("Nie moge zaalokowac pamieci.\n");
				return -1;
			}
		}
		i=0;
		while(i<3){
			znak=getc(obraz);
			if(znak=='\n')
				i=i+1;
		}
		for(j=0;j<xy[1];j++){
			for(i=0;i<xy[0];i++){
				//zrobic sprawdzanie fscanfa
				fscanf(obraz,"%d",&tab[i][j].r);
				fscanf(obraz,"%d",&tab[i][j].g);
				fscanf(obraz,"%d",&tab[i][j].b);
			}
		}
		fclose(obraz);
		printf("%d",tab[1][0].r);
		return 0;
	}
}

int zapisywanie(char**nazwa,px**tab,int xy[]){
	int i,j;
	FILE*obraz;
	obraz=fopen(nazwa,"w");
	if(obraz==NULL){
		printf("Nie moge otworzyc pliku.\n");
		return -1;
	}
	else{
		fprintf(obraz,"P3\n");
		fprintf(obraz,"# CREATOR: GIMP PNM Filter Version 1.1\n");
		fprintf(obraz,"%d %d\n",xy[0],xy[1]);
		for(j=0;j<xy[1];j++){
			for(i=0;i<xy[0];i++){
				fprintf(obraz,"%d\n",tab[i][j].r);
				fprintf(obraz,"%d\n",tab[i][j].g);
				fprintf(obraz,"%d\n",tab[i][j].b);
			}
		}
		fclose(obraz);
		for(j=0;j<xy[0];j++){
			if(tab[j]!=NULL){
				free(tab[j]);
				tab[j]=NULL;
			}
		}
		if(tab!=NULL){
			free(tab);
			tab=NULL;
		}
		return 0;
	}
}

int main(int argc,char**argv[]){
	px**tab;
	int xy[2]={0};
	if(argc!=3){
		printf("Nieprawidlowa ilosc argumentow funkcji main.\n");
		return -1;
	}
	else{
		rozdzielczosc(argv[1],xy);
		zczytywanie(argv[1],&tab,xy);
		zapisywanie(argv[2],&tab,xy);
		system("pause");
		return 0;
	}
} 
0

Jeśli chcesz coś wczytac do elementu tab[i][j], i funkcja oczekuje adresu to samo tab[i][j] jest juz adresem wiec nie trzeba &.

0

No dobra czyli zamieniam:

zczytywanie(argv[1],&tab,xy);
zapisywanie(argv[2],&tab,xy);

na:

zczytywanie(argv[1],tab,xy);
zapisywanie(argv[2],tab,xy);

Wszystko się kompiluje i po uruchomieniu program wywala się już przy pierwszej funkcji. Wyskakuje taki error:

Debug Error!

Program: <ścieżka>
Module: <ścieżka>
File:

Run-Time Check Failure#3 - The variable 'tab' is being used without being initialized.

(Press Rerty to debug the application)

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