IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Alokácia 2D poľa

Aktivity
Avatar
rosina.jakub
Člen
Avatar
rosina.jakub:8.11.2017 13:54

Ahojte,
potrebujem si dynamicky alokovať 2D pole. Vyberám si zo súboru ŠPZ, ktorá je na určitom riadku (vždy 2n riadok). Do poľa si potrebujem zapísať celú ŠPZ, ktorá je typu string. Po zbehnutí kódu mi program prestane pracovať. Mám to v osobitnej funkcií kde je parametrom smerník na FILE a vracajúcou hodnotou má byť vytvorené pole s ŠPZ.
Ďakujem za pomoc

int poc = 0, i = 1, j = 0, l, k;
        char ch;
        while (!feof(p_file)) {
                ch = fgetc(p_file);
                if (ch == '\n') {
                        poc++;
                }
        }
        fseek(p_file, 0L, SEEK_SET);
        poc = poc / 5;
        char **p_spz = (char **)malloc(sizeof(char *)*poc),riadok[50];
        while (fgets(riadok, sizeof(riadok), p_file)) {
                if (i == 2) {
                        p_spz[j] = (char *)malloc(sizeof(char) * 7);
                        for (k = 0; k < poc; k++) {
                                for (l = 0; l < 7; l++) {
                                        p_spz[k][l] = riadok[l];
                                }
                                j++;
                        }
                }
                else if (i == 5) {
                        i = 0;
                }
                i++;
        }
        for (i = 0; i < poc; i++) {
                for (j = 0; j < 50; j++) {
                        free(p_spz[j]);
                }
        }
        free(p_spz);
        p_spz = NULL;
        return *p_spz;
 
Odpovědět
8.11.2017 13:54
Avatar
Odpovídá na rosina.jakub
Neaktivní uživatel:8.11.2017 16:30

Proč na konci uvolňuješ paměť a pak se snažíš vrátit hodnotu na adrese NULL? Možná tam bych začal

free(p_spz);
p_spz = NULL;
return *p_spz;
Editováno 8.11.2017 16:30
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
8.11.2017 16:30
Neaktivní uživatelský účet
Avatar
rosina.jakub
Člen
Avatar
 
Nahoru Odpovědět
8.11.2017 18:34
Avatar
rosina.jakub
Člen
Avatar
Odpovídá na Neaktivní uživatel
rosina.jakub:8.11.2017 18:59

Ale problém. Musím tam dať podmienku, že ak je pole už vytvorené, číže funkcia už bola použitá tak musím pamäť dealokovať a potom alokovať znova. Podmienka

if (p_spz != NULL) {
                free(p_spz);
        }

mi nefunguje. Kde je prosím problém. A ešte mi dáva, že pole nie je inicializované.

 
Nahoru Odpovědět
8.11.2017 18:59
Avatar
Odpovídá na rosina.jakub
Neaktivní uživatel:8.11.2017 19:20

Jestli ten kód, co jsi posílal je jen jedna funkce, tak o dealokaci se musí postarat ten, kdo tu funkci volá. Funkce má za úkol pouze to pole vytvořit.

Anebo to celé nějak předělat. To je ale práce pro tebe a ne pro nás.

Nahoru Odpovědět
8.11.2017 19:20
Neaktivní uživatelský účet
Avatar
rosina.jakub
Člen
Avatar
Odpovídá na Neaktivní uživatel
rosina.jakub:8.11.2017 19:37

Funkciu volám v maine a to po stlačení klávesu "n". Takže niečo takéto?

if ((funkcia == 'n') && (p_spz != NULL)) {
        free(p_spz);
}
Editováno 8.11.2017 19:38
 
Nahoru Odpovědět
8.11.2017 19:37
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.