Sziasztok!
Volt egy par C kerdes (meg valasz), hagy reagaljak rajuk egyszerre.
Bocs, mar nem tudom, ki irta:
> Bocsass meg hogy beleszolok, biztos van valami ok hogy fopen-nel
> akarod olvasni a billentyuzetet, de nem ertem miert.
Az ok, mint kiderult, mas volt, de ennek ellenere szerintem
egyaltalan nem gond az, ha valaki file-kent kezeli a standard inputot
is (persze altalaban ujra megnyitni nem kell, ott az stdin, ahonnan
az input kapasbol olvashato). Az egesz Unix filozofianak (ami a C-vel
szinte osszenott) ez az alapja. Javasoltad helyette a cgets()-et. Ez
egy teljesen DOS-hoz kotodo fuggveny, nem resze semmilyen
standardnak, raadasul nagyon csunya is :) Javara irando azert, hogy
legalabb a puffer meretet tudja a fuggveny, tehat nem hajlamosit
buffer overflow jellegu hibakra. A szabvanyos gets() viszont nagyon
el van rontva, mert elsporoltak belole a puffermeret parametert,
szoval marad az fgets().
Mindenesetre az eredeti kerdeshez visszaterve: Nem tudom, hogy az
fopen("CON","rt") miert nem mukodik BC alatt, kellene neki. Mas C
forditoval probaltam, ott ment.
JimBoo ) irta:
> Mer' nem megy ez a fuggveny?
>
> char *copy(char *o,int fstchar,int num)
> {
> char *outcopy;
...
> a pascal-os copy fuggvenynek lenne a C-s megfeleloje,azaz
> az 'o' string 'fstchar'-adik karakteretol 'num' darabot ad vissza.
Masok mar megirtak, hogy miert nem megy ez igy, kikerulo megoldas is
szuletett. En viszont inkabb azt irnam, hogy nem biztos, hogy az a jo
modszer C programozasra, hogy megirod a Pascalbol ismert dolgok C-s
megfelelojet, es utana mar a C-ben is tudsz Pascalul programozni. Mas
a filozofiaja a ket nyelvnek, egy ilyen copy fuggvennyel csak
megeroszakolod a C-t. Inkabb mas modon kell a programot szervezni, ha
egy string kozepere van szukseged. Elkepzelheto, hogy ugy jarsz a
legjobban, ha nem 0 terminalt stringkent kezeled (ha a hossz ismert),
ilyenkor egyszeruen ennyi: o+fstchar. Vagy ha mindenfelekeppen
masolni kell, akkor ott a memcpy() fuggveny, valahogy igy:
memcpy(ide, o+fstchar, num);
ide[num] = '\0';
Persze az ide puffert neked kell foglalnod, vagy statikusan, vagy
dinamikusan a stack-en illetve malloc()-kal a 'nagy' memoriabol. Ezt
megint az adott kornyezet alapjan lehet kigondolni, hogy hogyan a
jobb, nem erdemes egy copy fuggvenybe beledrotozni egyfele megoldast.
(Stack-en a copy fuggveny _belsejeben_ allokalt puffert persze nem is
lehetne hasznalni.)
Voros Attila ) egy statikus puffert hasznalt a
valaszaban, arrol persze tudnod kell, hogy csak addig jo, amig egy
masik stringgel (vagyis a copy egy ujabb hivasaval) felul nem irod.
(Ezt Attila persze Te biztos tudod, csak JimBoo miatt irtam, aki
lathatolag kezdo C-ben.)
A masik megjegyzesem a temaval kapcsolatban az asm rutinokrol:
Gondolom, kiderult rolam mar eddig is, hogy az assembly-ben erzem
magam leginkabb otthon. Megis az a velemenyem, hogy ha valaki C-ben
programozik, akkor irja C-ben a rutinjait, lehetoleg ne hasznaljon
asm beteteket (persze lehetnek kivetelek). Az adott esetben teljesen
felesleges az asm betet, ott van a memcpy(), pont ilyenekre talaltak
ki.
Ugyancsak JimBoo irta:
> Adott egy fuggveny ami (char *)-ad vissza. Onmagaba mukodik rendesen,
> DE egy nagyobb programon belul (null)-al ter vissza mindig, a 'user
> screen'-en meg ez van: Null pointer assignment
Hogy miert ter vissza null-lal mindig, azt ebbol nem lehet tudni.
Null pointer assignment viszont bizonyara azert lesz belole, mert
ahova visszater, ott erre a null erteku pointerre irsz valamit.
Szoval nem ellenorzod, hogy mit adott vissza a fuggveny, csak
felhasznalod a visszaadott pointert.
... Hosszu voltam, bocs :)
István
-- Istvan Marosi -- http://www.sch.bme.hu/~marosi --
-- Recosoft Ltd. -- mailto: --
|