Kezdőlap › Fórumok › Programozás › C
- This topic has 80 hozzászólás, 19 résztvevő, and was last updated 17 years, 8 months telt el by
xcut.
-
SzerzőBejegyzés
-
2006-11-19-07:26 #2078015
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.2006-11-19-08:05 #2078016„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.)2006-11-19-09:22 #2078017Azt 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.2006-11-19-09:33 #2078018Lehet, 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#BookMarker2006-11-19-09:58 #2078019Na 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.2006-11-19-10:01 #2078020„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ásret
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)
2006-11-19-10:04 #2078021Kékkel jelöltem a programrészletet.
2006-11-19-10:12 #2078022Termé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.2006-11-19-10:26 #2078023Reagá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.
2006-11-19-10:49 #2078024„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.) -
SzerzőBejegyzés
- Be kell jelentkezni a hozzászóláshoz.
legutóbbi hsz