kerdesek

hoyuka hoya hoyuka at c2.hu
Thu Sep 1 14:01:36 CEST 2005


Szia!

Ehhez  a C ganyolas/nem ganyolas dologhoz szeretnek kicsit hozzaszolni.
Szerintem jo dolog, hogy ilyeneket megenged a C, mert:
- C egy gepfuggetlen assembly nyelvnek keszult
- C-ben kerneleket szoktak irni
- C-ben szoktak olyan eszkozokre fejleszteni, ahhol keves eroforras all
rendelkezesre

pl. vizsgaljuk meg ezt a structuras megoldast:

1. legyen az altalad preferalt modszer, a char *data;
(a konzekvenzia miatt maradjunk a lofasz-nal :))

typedef struct Lofasz {
  int size;
  char *data;
} Lofasz;

ennek  a structuranak a helyfoglalasa, 32 bites architektura es 64 bajtos
adatmezo eseten:
sizeof(Lofasz)=8bajt
sizeof(64*sizeof(char))=64bajt
Ez eddig 72 bajt, plusz meg az az adatmennyiseg, amit a malloc() csap
hozza a belso nyilvantartasa erdekeben (ezt olyan 8 bajtra tippelem). Es
ez ketszer (16bajt), mert kulon le kell foglalni a helyet a strukturanak
es az adatmezonek.
Igaz, ezt a strukturat stack-en is letre lehet hozni, igy nincs +
jarulekos memoria  veszteseg a malloc() miatt.
tehat az osszes helyfoglalas:
8+64+16=88 bajt.

a masik modszer:

typedef struct Lofasz {
   int size;
   char data[0];
}

sizeof(Lofasz)=4 bajt;
sizeof(64*sizeof(char))=64bajt
A strukturat egyszer kell allokalni, az ezzel jaro jarulekos memoria
legyen kb. 8 bajt;
szumma=4+64+8=76

Kulonbsegek vannak az adatszerkezetek kezeleseben is, ez a masodik modszer
szerintem gyorsabb es kevesebb kodot igenyel.

Engem is megkoveznenek a melohelyen, ha ilyeneket csinalnek, de itt mas a
felallas, nem eroforras szegeny eszkozokre  fejlesztunk.

Sok programozo maglyan egetne el a goto hasznalokat valami divatlaz miatt.
Pedig engem az ilyenek egyaltalan nem zavarnak:

bool openResource() {
   if (!openResourceA()) goto err0;
   if (!openResourceB()) goto err1;
   if (openResourceC()) return true;
   freeResourceA();
err1:
   freeResourceB();
err0:
   freeResourceC();
   return false;
}

Masik alkalmazasi pelda az egymasba agyazott ciklusokbol valo kilepes
lenne, de erre nincs kedvem peldat irni.

Szal az en velemenyem az, hogy  az "ertelmes" C-es ganyolas bizonyos
esetekben helyenvalo (bar ennek a megitelese szubjektiv dolog). Ha valaki
nem akar bizonyos dolgokat latni a projektjeben, akkor csinaljon coding
guideline-t es/vagy hasznaljon mas nyelvet.

Masik meglatasom, hogy "ganyolassal" is lehet nagyon szepen felepitett,
konnyen megertheto es jol karbantarthato progit irni es  JAVA-ban is lehet
nagyon nagy ocsmanysagokat csinalni. Pl. lattam olyan ember kodjat, aki
JAVA-ban tudot programozni csak (OOP nyelvek kozzul) es iszonyat
atlathatatlan gany volt amit csinalt. Jo, nem lesznek benne memory
leak-ek, nem fog segfault-ozni, de ha modositok egy class-ban egy member
class-t, akkor az isten sem fogja tudni megmondani, hogy melyik masik 800
class fogja  helytelenul a modositott peldanyt latni es melyik az a 3
class ezzek kozzul, akinek privat peldany kell az adott class-bol.

udv.
hoyuka

Valenta Ferenc said:
> hoyuka hoya wrote:
>
>> En arra tippelek, hogy lehet nem erted mi ez a 0 elemu tomb. Ez
>
> Igy van. De a forditok sem mindig.
>
>> gyakorlatilag semmi, nincs helyfoglalasa, a structura allokaciojanal dol
>> el, hogy mekkora lesz a tomb merete (malloc). Jo ez kicsit ganyolos, de
>> a
>> C amugyis egy nagyon ganyolos nyelv pl. a kifinomult C++ vagy JAVA
>> programozashoz kepest.
>
> Ez igen nagy ganyolas!! A C alapbol nem ilyen, csak lehetoseget ad
> ilyesmire is. Sohasem szerettem, az teny.
> Komolyan, ha itt jo lenne az info[], nem szolnek egy szot sem, de az
> info[0] kicsit durva.
>
>> Miert gondolod, hogy nem tanitottak a kod irojanak pointereket? Eleve
>> ilyen strukturat csak malloc-al erdemes letrehozni, ami eleve pointeres
>> dolog.
>
> Nem, tiszta statikus az egesz, nincs benne malloc.
> Legalabbis nem hapogott hogy nincs heap szegmens.
>
>> uint8_t *info != uint8_t info[0] !!!!
>
> Viszont char *info == char info[]
>
>> Az uint8_t *info 4 bajtot foglal a structurabol (32bites pointerek
>> eseten), a uint8_t info[0] meg semmit.
>
> Az eredeti progiban gyakorlatilag egy sima castolast csinal, csak
> nem kell minden hivatkozaskor megadni, hanem benne van a typedef-ben.
> Lehetett volna mashogy is csinalni, de igy csinaltak, inkompatibilitast
> okozva, gannya teve a kodot. Attol fuggetlenul, hogy mukodhet, az ilyen
> programozonak siman letornem a kezet.
> En nem is csinalhatok ilyet a melohelyen, az 1000 oldalas :) coding
> guideline tiltja a kokanyolast.
>
>> hoyuka
>
> --
> Valenta Ferenc <ferenc.valenta at vhl.hu>  Volcano/Mentor Graphics
> "My love is REAL, unless declared INTEGER"
>
>
> -----------------------------------
>  Szponzorunk: http://tonerbolt.hu/
>

-------------------------------------
C2 MAIL: A nagy levelez-Õ.  http://mail.c2.hu




More information about the Elektro mailing list