Hollosi Information eXchange /HIX/
HIX CODER 322
Copyright (C) HIX
1998-12-28
Új cikk beküldése (a cikk tartalma az író felelőssége)
Megrendelés Lemondás
1 C kerdesek (mind)  88 sor     (cikkei)
2 Delphi3 (mind)  4 sor     (cikkei)

+ - C kerdesek (mind) VÁLASZ  Feladó: (cikkei)

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:  --
+ - Delphi3 (mind) VÁLASZ  Feladó: (cikkei)

Hi mindenkinek!
A Delphi3 allandoan kifagy w98 alatt nalam cla333-on foleg
ha a DBgrid -et kerulgetem. Nemtudja vki hogy ez hiba vagy
feature? vagy esetleg mit lehetne tenni ellene....????

AGYKONTROLL ALLAT AUTO AZSIA BUDAPEST CODER DOSZ FELVIDEK FILM FILOZOFIA FORUM GURU HANG HIPHOP HIRDETES HIRMONDO HIXDVD HUDOM HUNGARY JATEK KEP KONYHA KONYV KORNYESZ KUKKER KULTURA LINUX MAGELLAN MAHAL MOBIL MOKA MOZAIK NARANCS NARANCS1 NY NYELV OTTHON OTTHONKA PARA RANDI REJTVENY SCM SPORT SZABAD SZALON TANC TIPP TUDOMANY UK UTAZAS UTLEVEL VITA WEBMESTER WINDOWS