C

10 bejegyzés megtekintése - 1-10 / 81
  • Szerző
    Bejegyzés
  • #2078015
    kisbetu
    Felhasználó

      Ha jól tudom, a C-ben erre vannak a mutatók. Egyszerűen visszaadod az első elem címét, innen a többi csak artimetika.
      De lehet, hogy ha a tömb globálisan van definiálva, akkor „visszaadás” nélkül is működik, hogy a függvény belepiszkál, a hívó meg élvezi az eredményt.

      #2078016
      pointux
      Felhasználó

        „Egyszerűen visszaadod az első elem címét”
        Lokálisan (az adott mutatót visszaadó függvényben) deklaráltnál nem jó, mivel az lokális, vagyis a visszatérés után a hivatkozás megszűnik, de legalábbis (saját foglalás esetén) a mutató teljesen máshova fog mutatni. (Kiválóan látszik, ha asm-ben megnézel egy c függvényt.)

        „De lehet, hogy ha a tömb globálisan van definiálva, akkor „visszaadás” nélkül is működik, hogy a függvény belepiszkál, a hívó meg élvezi az eredményt.”
        Ez is egy jó megoldás, meg a paraméterként cím átadása is. (Globális itt = a hivatkozással egy szinten, vagy feljebb lévő deklarálás.)

        #2078017
        eReL
        Felhasználó

          Azt tudom, hogy érték szerinti paraméterátadás van ‘C’-ben, cím szerinti nincs.
          Azt is tudom, hogy a ezáltal a hívott függvény által létrehozott cím az helyi cím, ami a hívó számára nem látszik.
          Ezért a hívott számára valószínűleg egy címkomponenst is át kell adni paraméterként, hogy tudja a hívó is, hogy hol van a tömb.
          Ez ‘void’ típusú függvények hívása esetén (eljárások) egyértelmű számomra, hiszen ez nem ad visszatérési értéket. Azonban egy visszatérési értéket adó függvénnyel mit adjak vissza?
          Konkrétumok az 1. hozzászólásom csatolmányában vannak.

          #2078018
          slate
          Felhasználó

            Lehet, hogy rossz helyen keresem, de nem látom a csatolmányt.
            Tudom ajánlani: http://pastebin.com/
            Nem vagyok egy nagy C guru, de öt perc alatt ezt sikerült, talán megvilágítja a problémát:
            http://pastebin.com/827944
            Egyébként javaslom a K&R könyvet. Én 3 éve olvastam, azóta nem írtam semmit C-be.
            http://www.alexandra.hu/scripts/cgi/webshop.cgi/GetBook?ID=5BC9340F56B92B5708B623EF5D51816A71CABC84AADCB58CA2A38B0A5E4918BF6C49B9&UserID=&SessionID=0375F1D584490FDEBCB3BB93414F27D78C3947071506&Page=1&SrcWord=C%20programoz%E1s&SrcField=sfMegNev&SrcOrder=oMegnev&CategoryID=NB&BookID=158992&GotoBook=True&CBCategory=&LastDays=7#BookMarker

            #2078019
            slate
            Felhasználó

              Na megtaláltam a csatolmányt.

              Problémád van a szintaxissal, gondolom azért mert nem teljesen tiszta, mi az összefüggés a tömb, a mutató, a változó, a változó címe, deklaráció, definíció és a változó értéke fogalmak között.
              Tényleg olvasd el a könyvet. Csak kétezer forint.

              Feltételezem, hogy a legnagyobb_index függvény az almátrix maximális eleméhez tartozó indexeket akarja visszaadni. Én erre struktúrát használnék, és azt adnám vissza.

              Ha mindenképpen tömböt akarsz visszaadni – bár nem értem miért – akkor a legnagyobb index függvényben kell deklarálni és allokálni egy tömböt, aminek a címét kell visszaadni a main függvénynek. Mivel a malloc globális, ezért fel kell szabadítani ezután a helyet.
              Fentieket valósítottam meg én is a példában.

              #2078020
              pointux
              Felhasználó

                „Azonban egy visszatérési értéket adó függvénnyel mit adjak vissza?”
                Ezért kéne c előtt asm.-t tanítani…
                Na akkor a C függvényhívás így történik (32 bites!)

                fgv:
                push ebp (bp regiszter lementése)
                mov ebp,esp (stackp. a bp-be)
                Erre a c-nek van szüksége.

                sub esp,0x40 pl. 64 byteos lokális helyfoglalás (visszaállítás után nem lesz itt)

                mov ebx,[ebp+8] az első paraméterének címe a memóriában (ebp+8)
                – ha ez egy változó, akkor ez egy érték [ebp+8] = pl.: 0xFFFF (65535)
                – ha ez egy 16 byte hosszú struktúra [ebp+8] = pl.: 0x1122334455667788….EEFF (16 byte hosszú ezért érdemes címet átadni)
                – ha ez egy cím (mindig 32 bit, a byte hosszú) [ebp+8] = pl.: 0xE0000000 (mondjuk egy video memória cím)

                Itt jön a kód

                mov eax,0xE0000000 (return unsigned* – ami mondjuk a video memória címe, mely globális… tehát van értelme)

                mov esp,ebp
                pop ebp

                visszaállítás

                ret

                Valami ilyen: video = fgv ( int valami );

                Ha nem érthető, nézz utána a „cpu regiszterek”, ill. „mov”, „push”, „pop” asm. utasításoknak (bár szerintem kifejezőek pl. mov = move)

                #2078021
                pointux
                Felhasználó

                  Kékkel jelöltem a programrészletet.

                  #2078022
                  pointux
                  Felhasználó

                    Természetesen egy
                    mov eax,[ebp+8]
                    is értelmezhető, mert az 1 paraméter akár egy konstans, akár egy cím a visszatérés után létezik
                    pl
                    int* fgv(int* var){
                    return var;
                    }

                    egy
                    int *fgv… {
                    int x;
                    return &x;
                    }

                    nem, mert
                    sub esp,0x4
                    ….
                    mov esp,ebp

                    már nem stimmel.

                    #2078023
                    slate
                    Felhasználó

                      Reagálnék arra, hogy mit is kéne tanítani.
                      Tény való, hogy a C fogalmai asm struktúrákra fordulnak. Minden számítógépes program erre fordul, a java is.
                      Vajon kell ismerni a TCP/IP csomagok struktúráját, ahhoz hogy honlapok készítsek a fényképemmel és az önéletrajzommal?
                      K&R azt írja a könyv bevezetőben, hogy a könyv alpján bármilyen C program megírható. Persze a használt függvénykönyvtárak doksiját nézegetni kell.

                      Erre lehet nyitni egy király flame-war-os topikot 🙂

                      Kérdés, mi segít jobban a kérdezőnek. Majd ő eldönti.

                      #2078024
                      pointux
                      Felhasználó

                        „Reagálnék arra, hogy mit is kéne tanítani.
                        Tény való, hogy a C fogalmai asm struktúrákra fordulnak. Minden számítógépes program erre fordul, a java is.
                        Vajon kell ismerni a TCP/IP csomagok struktúráját, ahhoz hogy honlapok készítsek a fényképemmel és az önéletrajzommal?”
                        És ezért nem ért senki semmit… (mert integrálást tanítanak, összeadás ismeretei nélkül).
                        Igen is az alap struktúrát meg kell érteni, különben csak „találgatni fogsz”.
                        Sőt meg fogsz lepődni, azt is, hogy hogyan működik egy számítógép, vagy egy mikroprocesszor. (Itt persze nem arra gondolok, hogy rajzoljon fel egy komplett banias magot pl.)
                        Tapasztalatból mondhatom, hogy azon bukdácsoló hallgatók (akik meg akarták érteni és nem beseggelni), miután program működési elvet (és minimális asm.-t) stb. tanultak, egyből hibátlanhoz közeli dolgozatokat írtak a pótvizsgán. (Noha közrejátszott apuka pénze is. ;D)

                        Aláírom, aki seggel, azt nem érdekli… aki viszont meg szeretné érteni (és/vagy utál seggelni), annak igenis előnyös. És én azt véltem felfedezni, hogy érdekli, hogy valójában mi van a háttérben. (Noha az biztosan tömény, amit írtam…, de majd kérdez.)
                        (Ha meg kizárólag a szintaktika érdekli, arra vannak jó irodalmak… sok.)

                        „K&R azt írja a könyv bevezetőben, hogy a könyv alpján bármilyen C program megírható. Persze a használt függvénykönyvtárak doksiját nézegetni kell.”
                        És meg is érthető?
                        Mert utána jönnek az „érthetetlen” hibaüzenetek, seggfoltok, fagyások. (Mert a c elrejti ugyan, hogy mit csinál, de nincsenek, olyan hatékony (automata) eszközök és nem is olyan biztonságos, mint pl. egy java.)

                      10 bejegyzés megtekintése - 1-10 / 81
                      • Be kell jelentkezni a hozzászóláshoz.