C kerdes megint, cast

Andras Tantos andras at tantosonline.com
Wed Jul 11 19:19:20 CEST 2007


Biztos, hogy C-ben irod? Ez csak C++-ban error, C-ben mindossze egy warning, 
vagy meg az sem.

De c++-ban vannak cast operatorok:

int s(const char *a,const char*b) {
 return 0;
}

volatile char arr[100];

int main() {
 s(const_cast<const char *>(arr+3),0);
 return 0;
}

Ez barmilyen hulyen hangzik, de mukodik, es 'type-safe' azaz ha elszurod a 
fordito uvolt.

De az se rossz, ha megirod a sajat strcmp-edet:

inline int strcmp(volatile const char *a,const char *b) { return 
strcmp(const_cast<const char*>a,b); }

vagy meg inkabb:

template<typename T1,typename T2> inline int strcmp(T1 a,T2 b) {
 return strcmp(const_cast<const char*>(a),const_cast<const char *>(b));
}

volatile char arr[100];

int main() {
 strcmp(arr+3,arr+5);
 return 0;
}

Ez utobbinak az az elonye is meg van, hogy statikus NULL-al nem mukodik 
(azaz s(arr+3,NULL) nem fordul le), es persze 'type-safe', azaz csak akkor 
fog mukodni, ha a tipusok valoban konvertalhatoak.

Egyre viszont figyelj oda, ha ilyet jattszol: oka van, hogy az eredeti 
forras nem fordul: leven a fordito, amikor a strcmp-t forditotta nem tudott 
a te volatile tipusmodositodrol, ezt nem is ve(he)tte figyelembe az 
optimalizalas soran. Magyarul az eredeti strcmp valoszinuleg nem a volatile 
szemantika szerint mukodik, ha megis raveszed a forditot arra, hogy 
leforditsa, akkor sem. Konnyen lehet nagyon nehezen megtalalhato hibakat 
csinalni igy. En azt javasolnam, hogy nezd meg meg egyszer alaposan, hogy 
biztos szukseg van-e a volatile definiciora, es hogy ha igen, akkor az egyeb 
szinkronizalasi objektumok rendben vannak-e. Mi van, ha a megszakitas a 
strcmp kozepen ut be, es a strcmp valahogy nem veszi figyelembe a valtozast? 
Mi van, ha figyelembe veszi? Mi van, ha csak a felet veszi figyelembe?

Udv,
Tantos Andras

----- Original Message ----- 
From: "Fuzesi Arnold" <arnold.fuzesi.lista at gmail.com>
To: <elektro at tesla.hu>
Sent: Wednesday, July 11, 2007 9:38 AM
Subject: C kerdes megint, cast


volatile char comm_ibuf0[100] ;

if( !strncmp( (char const*)&comm_ibuf0[3], ...........

castolni kell, mert az strncmp-nek nem tetszik a volatile.

Viszont már sokadszorra szivat meg, hogy lemaradt a cime operator, veletlen
ezt irtam:
if( !strncmp( (char const*)comm_ibuf0[3], ...........

normal esetben ezért anyázik hangosan, de a castolás miatt megeszi.

Ebbe bele kell törődni, vagy új strncmp-t írni, vagy mi a korrekt megoldás?

Kösz,
A.

-----------------------------------------
          elektro[-flame|-etc]





More information about the Elektro mailing list