AW: C fuggveny hatarozatlan szamu agumentummal

WLC02E, wlc02e at automation.siemens.com
Tue Sep 13 08:45:55 CEST 2005


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;
> >
> > ...
> > }




More information about the Elektro mailing list