Keresés

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

  • aviator

    tag

    Sziasztok!

    Valaki el tudja nekem magyarázni, hogy dinamikus tömbök esetén miután malloc-cal lefoglaltam a helyet az elemeknek és olvasom be őket scanf-fel, miért kell a változó neve elé & jel?

    Most tanulom ezt a témakört, szóval lehet hülye kérdés volt, de azért nem értem, mert ha nem tömbről van szó, hanem csak egy sima pointernek adom értékül a malloc által lefoglalt helyet (x=malloc(sizeof(int))), akkor a scanf-ben nem kell az & jel (scanf("%d",x)), mivel már megvan, hogy hova fog kerülni a beolvasott érték.

    Köszönöm, ha valaki segít.

  • aviator

    tag

    Köszönöm a választ!

    Amit írtál azt értem: a memóriaterület címét kell, hogy megkapja a scanf, ez alapján tudja, hogy hova írja a változó értékét. Azt nem értem, hogy ha ez így van, akkor miért NEM kell az & jel, ha az x nem egy dinamikus tömb, hanem egyetlen pointer.

    [ Szerkesztve ]

  • aviator

    tag

    typedef struct koordinata
    {
    int x;
    int y;
    int z;
    } koordinata;

    void beolvas(koordinata* pont)
    {
    scanf("%d %d %d",&(pont->x),&(pont->y),&(pont->z));
    }


    int main()
    {
    int a,i;
    printf("Kerem a koordinatak szamat");
    scanf("%d",&a);
    koordinata* koord = (koordinata*) malloc(sizeof(koordinata)*a);

    for(i=0;i<a;i++)
    {
    beolvas(&koord[i]);
    }

    for(i=0;i<a;i++)
    {
    printf("(%d;%d;%d)",koord[i].x,koord[i].y,koord[i].z);
    }

    free(koord);

    return 0;
    }

    Üdv!

    A feladat itt az volt, hogy függvénnyel töltsek fel egy koordinátákat tároló struktúrát ahol a struktúrák egy dinamikus tömb elemei. A feladatot sikerült megoldani, a kód így működőképes, egy dolgot viszont nagyon nem értek: A nyíl operátort ha jól tudom akkor használjuk, ha pointeren keresztül akarjuk elérni egy struktúra mezőit. Ha pointer nélkül hivatkozunk akkor a pont operátort használjuk. Ha ez így van, akkor miért van az, hogy a függvény definíciójában a pointer típusú, pont nevű paraméteren keresztül nyíllal hivatkozok a mezőkre, alul a kiíratásnál pedig már ponttal, annak ellenére, hogy a koord változó még mindig koordináta típusú pointer?

    [ Szerkesztve ]

  • aviator

    tag

    válasz Jester01 #5568 üzenetére

    Köszönöm!! :) Sajnos ilyen apróságok kimaradnak ha önállóan tanul programozni az ember.

  • aviator

    tag

    válasz aviator #5569 üzenetére

    char szoveg[101];
    char*szpt;
    scanf("%s",szoveg);
    szpt=(char*)malloc(sizeof(char)*((strlen(szoveg))+1));
    strcpy(szpt,szoveg);
    printf("%s",szpt);
    free(szpt);

    Újabb hasonló probléma. A strcpy itt elméletileg egy char típusú tömböt másol egy char* típusú tömbbe, ami nem lenne lehetséges. Sejtem, hogy az előző "indexelés megeszi a pointert" dolognak lesz itt is jelentősége, gondolom itt az indexelés a string-ben áll annak ellenére, hogy nem látszik az indexelő [] operátor. Kiíratáskor pedig látszólag string-ként íródik ki a pointer típus.
    Amit nem értek az az, hogy a strcpy két paramétere hogy lesz azonos típusú, melyiknek változik meg a típusa (ha egyáltalán megváltozik) és miért, illetve, hogy a kiíratáskor hogy lesz a pointerből kiíratható string.

  • aviator

    tag

    válasz Jester01 #5571 üzenetére

    Nagyszerű! Köszönöm.
    A kiíratás problémában is segítesz légyszi? Printf-ben egy pointer szerepel és string-et ír ki. Hogy van ez?

    [ Szerkesztve ]

  • aviator

    tag

    Tisztelt Szakértő Urak!

    Újabb kérdésem lenne:

    typedef struct koordinata
    {
    int x;
    int y;
    int z;

    }koordinata;

    typedef struct haromszog
    {
    koordinata* csucsok[3];

    }haromszog;

    Tehát létre lett hozva egy koordináta struktúra három int mezővel, illetve egy háromszög struktúra egy háromelemű pointertömbbel: A háromszög struktúra egy 3D-s háromszöget tárol amelynek három csúcsa van, egy csúcsnak pedig három koordinátája. Azért lett pointer a tömb típusa mert később a koordináták címeire lesz szükség.

    A továbbiakban egy egyszerű koordinátabekérést szeretnék csinálni a 0 indexű csúcsra a következő módon:

    haromszog triangle; //struktúra típusú változó létrehozása

    scanf("%d %d %d", &(triangle.csucsok[0]->x),&(triangle.csucsok[0]->y),&(triangle.csucsok[0]->z))

    Nem árulok el szerintem nektek újdonságot: ez így nem működik. Lefut, a fordító jónak látja de nem működik. Ti már biztos tudjátok az okát én még nem, viszont a megoldást igen:

    haromszog* triangle=(haromszog*)malloc(sizeof(haromszog));
    triangle->csucsok[0]=(koordinata*)malloc(sizeof(koordinata));
    scanf("%d %d %d", &(triangle->csucsok[0]->x),&(triangle->csucsok[0]->y),&(triangle->csucsok[0]->z))

    Amit nem értek: miért nem működik lefoglalás nélkül? Miért kell a csúcsoknak is külön helyet foglalni? Azt hiszem sajnos ez már az a szint amikor nagyon összefüggéseiben kéne látnom a dolgokat, úgy tűnik ezzel hadilábon állok.

    A válaszokat előre is köszönöm, aki esetleg érez némi motivációt arra, hogy egy kicsit részletesebben elmesélje ezt nekem, felépítve egy gondolatmenetet ami alapján érthetőbbé válik, hogy mi miért van, mi miből következik azzal sokat segítene...akár privátban is, hogy ne terheljük másoknak triviális dolgokkal a fórumot.

    [ Szerkesztve ]

  • aviator

    tag

    válasz dabadab #5585 üzenetére

    Nem akartam untatni a népet a teljes feladattal, illetve én is csak egy részét próbáltam megcsinálni első körben. Arról van szó, hogy van egy függvény, ami bekér három koordinátát, azaz csúcsonként hármat, tehát egy for ciklussal feltölti a csucsok tömböt 3x3 koordinátával, majd ezután visszaadja a haromszog típusú triangle struktúra címét. (Ezért kell, hogy pointer legyen a tömb típusa.) Ezt a címet veszi át egy másik függvény, ami elvégzi a lefoglalt terület felszabadítását. Eközben a főfüggvényben meg kell még oldani azt, hogy háromszög struktúrából (háromszögekből) is többet lehessen bevinni, méghozzá előre nem meghatározott darabot (dinamikus tömb).

    A magyarázatod egyszerűsíthető úgy, hogy azért szállt el a program mert a tömb tele volt null pointerekkel, illetve a hiba a foglalással azért oldódott meg, mert a foglalás után a pointereknek már lett értékük? Tehát inicializálatlan pointerekkel nem dolgozunk?

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