Mam mały problem w projekcie na studia. Dawno nie kodowałem nic w C i troszkę zagmatwałem się ze wskaźnikami i alokacją. Będę wdzięczny za pomoc.
W poniższej funkcji mam dwa problemy:
- nie mogę zwrócić pamięci zaalokowanej przez *h,
- wszystkie elementy tablicy: rainbowtab[0..n][1] mają taką samą wartość, równą wartości zwróconej w ostatniej iteracji funkcji hash(r)
/*
* Funkcja zwracająca dwuwymiarową tablicę tęczową, o danej głębokości i rozmiarze. Jako
* argument otrzymuje również listę wyrazów, z których będą generowane ciągi.
*/
char*** createRainbowTable(char **wordstab, int deep, int n) {
int i;
int j;
char *h = (char *) malloc(DES_CHARS_NUM * sizeof (char));
if (h == NULL) {
fprintf(stderr, "Nie mozna przydzielic pamieci 03");
return NULL;
}
char *r = (char *) malloc(RED_CHARS_NUM * sizeof (char));
if (r == NULL) {
fprintf(stderr, "Nie mozna przydzielic pamieci 04");
return NULL;
}
/*Alokacja pamięci dla tablicy*/
char ***rainbowtab = (char ***) malloc(n * sizeof (char **));
for (i = 0; i < n; i++) {
*(rainbowtab + i) = (char **) malloc(deep * sizeof (char *));
for (j = 0; j < deep; j++)
*(*(rainbowtab + i) + j) = (char *) malloc(DES_CHARS_NUM * sizeof (char));
}
if (rainbowtab == NULL) {
fprintf(stderr, "Nie mozna przydzielic pamieci 05");
return NULL;
}
for (j = 0; j < n; j++) {
for (i = 0; i < deep; i++) {
if (i == 0) {
h = (char *) hash(*(wordstab + j));
printf("rainbow[%d][%d]=%s\n", j, i, h);
}
if (i > 0 && i % 2 == 0) {
h = (char *) hash(r);
printf("rainbow[%d][%d]=%s\n", j, i, h);
}
if (i % 2 != 0) {
r = (char *) reduce(h);
printf("rainbow[%d][%d]=%s\n", j, i, r);
}
if (i == deep - 1) {
rainbowtab[j][1] = hash(r);
}
}
rainbowtab[j][0] = *(wordstab + j);
}
//free(h);
free(r);
return rainbowtab;
}