NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Alokácia 2D poľa

V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

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.