C fuggveny hatarozatlan szamu agumentummal
Andras Tantos
andras at tantosonline.com
Tue Sep 13 17:10:34 CEST 2005
Nem talaltam meg hirtelen a szabvanyban, de azt hiszem a valasz 'integral
promotion'. A ...-ban minden egesz tipus int-re konvertalva (ha
konvertalhato) kerul atadasra.
Udv,
Tantos Andras
----- Original Message -----
From: "WLC02E," <wlc02e at automation.siemens.com>
To: <elektro at tesla.hu>
Sent: Monday, September 12, 2005 11:45 PM
Subject: AW: C fuggveny hatarozatlan szamu agumentummal
Szervusz Andras,
koszonom a reszletes valaszokat!
Mindenhol emlitik, ahogy Te is mondtad, hogy nem celszeru hasznalni ezt a
strukturat, overhead, stb.. Meg is oldottam nelkule, viszont szeretnem
megerteni mit rontottam el.
Vilagos, hogy printf tipusu fuggveny eseten jo elore definialni az
opcionalis parameterek tipusat es szamat. Esetemben viszont ez vagy semmi,
vagy ket unsigned char. Ertheto, ha nincs megadott parameter akkor
hatarozatlan( vagy 0?) erteket olvasok ki, de pl. ebben az esetben:
LcdPrintData("szoveg", 3, 4);
...
x = va_arg(ap,unsigned char);
y = va_arg(ap,unsigned char);
y = va_arg(ap,unsigned char);
miert csak a masodik y = va_arg... utan kerul y-ba a 4?
LcdPrintData("szoveg", 3, (unsigned char)4); eseten szinten..
Koszonom a segitseget!
Udv:
Zoli
> -----Ursprüngliche Nachricht-----
> Von: Andras Tantos [mailto:andras at tantosonline.com]
> Gesendet: Montag, 12. September 2005 17:18
> An: elektro at tesla.hu
> Betreff: Re: C fuggveny hatarozatlan szamu agumentummal
>
> Hali!
>
> > 1, Miert mukodik a lenti kodreszlet csak akkor, ha y-t
> ketszer olvasom
> > ki? (egyebkent y=0)
>
> Nem jol csinalod. Az elso va_arg hivas az elso *aktualis*
> parametert adja
> vissza. Azaz, ha nem adtal meg koordinatakat, akkor azok nem fognak
> szerepelni a va_arg listaban. Hogy pontosan mi szerepel
> benne, azt csak te
> tudhatod, a fordito nem. A normalis ...-t hasznalo fuggvenyek
> eseteben a nem
> opcionalis parameterek tartalmabol szoktak kitalalni a
> fuggvenyek futasi
> idoben, hogy minek kellene lennie a va_arg listaban, es azt
> hogy is kellene
> ertelmezni. Pl.:
>
> printf("%d %s\n",3,"234");
>
> Itt a printf eloszor elemzi a (nem opcionalis) formatum
> string-et, es ebbol
> derul ki szamara, hogy az elso va_arg egy int, a masodik
> pedig egy string
> mutato.
>
> De ha ezt irod le:
>
> printf("%d %s\n","234",32);
>
> Akkor is pont ugyanez fog tortenni, csak eppen a mutato erteket fogja
> szamkent kiirni, utana pedig meg probalja a harmas cimen talalhato
> string-tombot kiirni, amibe feltehetoen bele fog halni.
> > void LcdPrintData(const char* data, ...)
> > {
> > register unsigned char i, position, x=0, y=0, counter;
> > va_list ap;
> > va_start(ap, data);
> > if (!data) return; // Check to make sure we have a
> > good pointer
> > x = va_arg(ap,unsigned char);
> > y = va_arg(ap,unsigned char);
> > y = va_arg(ap,unsigned char);
> > if ((x>0)&&(x<21)&&(y>0)&&(y<4)) LcdGotoXY(x,y);
> > position=LcdControlRead(); // Read the actual
> cursor position
> > counter=0;
> >
> > ...
> > }
-----------------------------------
Szponzorunk: http://tonerbolt.hu/
More information about the Elektro
mailing list