Inicjalizacja dynamicznej tablicy łańcuchów znaków w funkcji [C]

0

Witam.

Piszę grę w C i potrzebuję wczytać nazwy kolejnych map z pliku do tablicy. Ilość map nie jest znana, długość nazwy pojedynczej mapy nie może przekraczać 40 znaków. Przykładowo plik wygląda w ten sposób (liczba na początku to ilość map, potem w każdej linijce jest nazwa kolejnej mapy):

2
map1.m
map2.m

W funkcji main deklaruję tablicę nazw map i zmienną przechowującą ich ilość:

 
char **maps; // ścieżki do kolejnych map
int number_of_maps; // liczba map

I mam funkcję, której zadaniem jest odpowiednie zainicjalizowanie tej tablicy i przypisanie do niej kolejnych nazw map z pliku:

// LoadMapsPathL: ładuje ścieżki do map z podanego pliku (w przypadku niepowodzenia zwraca false)
static bool LoadMapsPathL(const char* const path, char*** maps, int* number_of_maps)
{
    FILE* file = fopen(path, "r");

    if (!file)
        return false;

    // zmienne pomocnicze:
    int i;
    char temp[32];

    fscanf(file, "%d", number_of_maps);

    *maps = malloc(*number_of_maps * sizeof **maps);
    if (!*maps)
        return false;

    for (i = 0; i < *number_of_maps; ++i)
    {
        *maps[i] = malloc(40 * sizeof ***maps);

        fscanf(file, "%s", temp);

        strcpy(*maps[i], temp);
    }
    fprintf(stdout, "In function:\n");
    for (i = 0; i < *number_of_maps; ++i)
    {
        fprintf(stdout, "%d: %s\n", i, *maps[i]);
    }

    return true;
}

W celu sprawdzenia poprawności wykonywanego kodu wywołuję pętle która wyświetla nazwy kolejnych map.

W main wywołuję tą funkcję:

// inicjalizujemy ścieżki do kolejnych map:
LoadMapsPathL("maps", &maps, &number_of_maps);
int i;
fprintf(stdout, "In main:\n");
for (i = 0; i < number_of_maps; ++i)
{
    fprintf(stdout, "%d: %s\n", i, maps[i]);
}

W celu sprawdzenia poprawności wykonywanego kodu ponownie wywołuję pętle sprawdzająca czy tablica maps przechowuje odpowiednie nazwy map. Niestety skompilowanie i uruchomienie tego kodu wypisze na konsolę:

In function:
1: map1.m
2: map2.m
In main:
1: map1.m
2: (Null)

Czyli z tego wynika, że informacja o 2 wartości w tablicy nie jest poprawnie zapisywana w funkcji. Generalnie próbowałem już to zrobić na kilka sposobów, szukałem też o tym informacji na forach, ale bez skutku. Byłbym wdzięczny za każdą sugestię co robię źle lub jak można to zrobić poprawnie. Z góry bardzo dziękuje, gdyż sam jestem już bez pomysłu.

Pozdrawiam

0
FILE *file=fopen(path,"r");
fscanf(file,"%u",number_of_maps); // ma być unsigned no chyba że spodziewasz się ujemnej ilości map
fseek(file,0,SEEK_END);
long size=ftell(file);
fseek(file,0,SEEK_SET);
maps[0]=(char**)malloc((*number_of_maps)*sizeof(char*));
char *onebuf=(char*)malloc(size);
maps[0][0]=onebuf;
size=fread(maps[0][0],1,size,file);
for(int i=0,y=1;(y<number_of_maps)&&(i<size);++i)
  {
   if(onebuf[i]=='\n') onebuf[i]=0;
   else if((i)&&(onebuf[i-1]=='\n')) maps[0][y++]=onebuf+i;
  }

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