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: Plnění trojrozměrného pole ze souboru v céčku

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

Aktivity
Avatar

Člen
Avatar
:24.6.2015 15:54

Zdravím,
už nějakou dobu si lámu hlavu chybou, co jsem napsal. Vzhledem k tomu, že jsem na nic nebyl schopný přijít, obracím se na fórum.

Pro zasvěcení, mým úkolem bylo vytvořit program, který by sloužil jako test ze slovíček z jazyků. Měl by fungovat tak, že uživateli by se zobrazilo slovo a on by ho zkusil napsat v druhém, už určeném jazyce. Pak by se na konci programu vytvořilo zhodnocení a tak... Bohužel jsem udělal chybu, kterou, jak už jsem zmínil, nejsem schopný vyřešit.

Tam to :), co pro teď mám, funguje na tom způsobu, že ve stejném adresáři otevře soubor vocabulary.txt, kde na prvním řádku je počet pojmů a na dalších jsou slovíčka v prvním a druhém jazyce, např.:

3
auto
car
hodiny
clock
postel
bed

Můj zdroják zatím vypadá takto:

#include <stdio.h>
#include <stdlib.h>
#define LENGTH 32

void vypis(char ***, int);

int main() {
    char ***array;
    char buffer[LENGTH];
    int count;
    FILE *vocabularies;

    if ((vocabularies = fopen("vocabulary.txt", "rt")) == NULL) {
        return 0;
    }
    fscanf(vocabularies, "%i", &count);

    // Alokalizace
    array = (char ***) malloc(sizeof(char **) * count);
    for (int x = 0; x < count; x++) {
        array[x] = (char **) malloc(sizeof(char *) * 2);
    }
    for (int x = 0; x < count; x++) {
        for (int y = 0; y < 2; y++) {
            array[x][y] = (char *) malloc(sizeof(char) * LENGTH);
        }
    }

    // Načtení do pole
    for (int x = 0; x < count; x++) {
        for (int y = 0; y < 2; y++) {
        fscanf(vocabularies, "%s", buffer);
        array[x][y] = buffer;
        vypis(array, count);
        }
    }

    system("pause");
    return 0;
}

void vypis(char ***pole, int count) {
    for (int x = 0; x < count; x++) {
        for (int y = 0; y < 2; y++) {
            printf("%s ", pole[x][y]);
        }
        printf("\n");
    }
    printf("--------------\n");
}

Při provedení posledního cyklu bych čekal že pole bude vypadat asi takto:
auto car
hodiny clock
postel bed

Ono ale je celé pole zaplněné vždy posledním slovíčkem. Pole se plní úplně jinak než bych čekal, jde to taky vidět na výstupu na obrázku. Prosím tedy o jakoukoli pomoc nebo i kritiku ohledně zdrojáku.

 
Odpovědět
24.6.2015 15:54
Avatar
tomisoka
Tvůrce
Avatar
Odpovídá na
tomisoka:24.6.2015 16:34

Problém je v tomto:

array[x][y] = buffer;

Všechny "array[x][y]" nastavuješ, že budou odkazovat na tento "buffer".

Můžeš:
1) zkopírovat obsah "buffer" do již předem alokovaného pole v "array[x][y]"
2) vždy znovu alokovat "buffer", načíst do něj informace ze souboru a pak ho přiřadit k "array[x][y]"

Editováno 24.6.2015 16:35
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
24.6.2015 16:34
Avatar

Člen
Avatar
Odpovídá na tomisoka
:24.6.2015 16:38

Už jdu na to, díky za řešení.

 
Nahoru Odpovědět
24.6.2015 16:38
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 3 zpráv z 3.