Keresés

Új hozzászólás Aktív témák

  • DopeBob
    addikt

    Megpróbáltam lefordítani az eredeti kódodat, de nekem (treat warnings as errors beállítással) fordítási hibát dobott a scanf és a printf sorokra. Érthető, mivel az int (*statData)[statDay][OPEN_HOURS] egy kétdimenziós tömbre mutató pointer, nem pedig egy kétdimenziós tömb. A statData[i][j] nem egy int-et, hanem egy pointert jelent. Cast-olással kierőszakoltam, hogy leforduljon, valamint felcseréltem a statData deklarációjában a sorokat és az oszlopokat (int (*statData)[OPEN_HOURS][statDay]), és így már ez a változat is működött.

    Ökölszabályként azt tartsd szem előtt, hogy amikor egy pointert deklarálsz, akkor azt tömbként is tudod használni (meg tudod indexelni [i] stílusban), tehát úgy is felfogható a dolog, hogy egy * ugyanúgy hozzáad egy dimenziót a deklarált tömbödhöz, mint egy [SIZE]. Fordítva is igaz a dolog: egy tömb utolsó dimenzióját lehagyva egy pointert kapsz.

    Vagyis amikor ezt írod le: int (*statData)[OPEN_HOURS][statDay], akkor ez igazából egy 3 dimenziós tömb, aminek az első két dimenziója a fix [OPEN_HOURS] és [statDay], a harmadik dimenziója dinamikus, és ennek mérete a malloc-ban megadott értékből jön, ami jelen esetben [1] (mivel a teljes allokált méret OPEN_HOURS*statDay*1). Éppen ezért az így deklarált tömb elemeire ezen a módon kell hivatkozni: statData[i][j][0]. Kipróbáltam ezt is, és így is működik. Ezzel együtt nem javaslom ennek a formának a használatát, és nem is értem, hogy a Pluralsight miért így tanítja.

    Szia,

    nagyon köszönöm a segítséget, azt hiszem most már értem, legalább ezt a részt :B

  • DopeBob
    addikt

    Szerintem a malloc sorral van a gond. Ahogy írtad, úgy eggyel több az indirekció a bal oldalon (pointer egy két dimenziós tömbre, ami így egy három dimenziós tömbbel lesz analóg). Helyette ez kellene:

    int (*statData)[statDay] = malloc(sizeof(int[statDay][OPEN_HOURS]));

    Másik lehetőség, hogy egy dimenziós tömböt használsz (szimpla pointert allokálsz) és [i*OPEN_HOURS+j] formában indexeled.

    És a free-nél sem kell a csillag, csak simán free(statData).

    Ah, megvan, azt nem állítom, hogy pontosan értem de működik:

    Ez nem jó:
    int (*statData)[statDay] = malloc(sizeof(int[statDay][OPEN_HOURS]));

    Ez ok, szépen lehet indexelni, adatok a helyükön.
    int (*statData)[OPEN_HOURS]= malloc(sizeof(int[statDay][OPEN_HOURS]));

    Nagyon köszi a segítséget :R

  • DopeBob
    addikt

    Szerintem a malloc sorral van a gond. Ahogy írtad, úgy eggyel több az indirekció a bal oldalon (pointer egy két dimenziós tömbre, ami így egy három dimenziós tömbbel lesz analóg). Helyette ez kellene:

    int (*statData)[statDay] = malloc(sizeof(int[statDay][OPEN_HOURS]));

    Másik lehetőség, hogy egy dimenziós tömböt használsz (szimpla pointert allokálsz) és [i*OPEN_HOURS+j] formában indexeled.

    És a free-nél sem kell a csillag, csak simán free(statData).

    Megnézem, de ennél a résznél kezdem elveszteni már a fonalat :D Pluralsight-on csinálom a C képzéseket, pont azt monta az oktató ennél a résznél, hogy ez a legegyszerűbb módja mert egyszerű utána felszabadítani a memóriát, és ugyan úgy lehet hivatkozni egy elemet, ahogy statikus 2D tömbnél. Neten- YT-n mindenhol a for ciklussal feltöltögetős verziót láttam, azért örültem meg ennek, de hát nem megy.

    Amit írtál azt hogy kell elépzelni, nem teljesen értem. Egy sort ki tudok választani egy pointerre és egy elemet egy indexel?

  • DopeBob
    addikt

    Sziasztok, valaki ránézni, hogy mit rontok el? Nem jövök rá mi a baj. Az is lehet, hogy több sebből vérzik a dolog, egy ismerősnek próbálok segíteni vizsgára készülni, de hát eddig vak vezet világtalant :D Első félében C-vel veszik a kedvüket egy életre a programozástól (gépész ráadásul)

    Egy 2D-s tömböt kéne feltölteni, ez lenne egy feladat eleje. A sorok számát kell bekérni, oszlop szám adott, és utána az értékeket.

    #include <stdio.h>
    #include <stdlib.h>

    #define OPEN_HOURS 5

    int main (void) {
        
        int statDay = 0;
        printf("Hany nap adatait visszuk be? ");
        scanf("%d", &statDay);

        int (*statData)[statDay][OPEN_HOURS]= malloc(sizeof(int[statDay][OPEN_HOURS]));

        for (int i = 0; i<statDay;i++) {
            for (int j = 0; j<OPEN_HOURS;j++) {
                printf("Kerem az %d. nap %d elemet: \n", i,j);
                scanf("%d", &statData[i][j]);
            }
        }

        printf("\nKiiras\n");

        for (int i = 0; i<statDay;i++) {
            printf("%d. nap:\t", i);
            for (int j = 0; j<OPEN_HOURS;j++) {
                printf("(%d;%d) %d\t", i,j, statData[i][j]);
            }
            printf("\n");
        }    

        free(*statData);
        
        return 0;
    }

    Látszólag működik is a dolog, de a tömbben rossz helyre kerülnek az értékek és nem jövök rá miért. Ha pl 0. napra 0, 1, 2... az 1. napra 10, 11, 12-t írok akkor ezt kéne kiírnia:

    0: 0 1 2 3 4
    1: 10 11 12 13 14

    de helyette ez van:

    0. nap: 0       1       2       10      11
    1. nap: 10      11      12      20      21
    2. nap: 20      21      22      23      24

    0. napon 3 és 4 helyett 10 és 11 van, 1. napon 13 és 14 helyett 20 és 21...

Új hozzászólás Aktív témák