C kerdes megint, cast

Fuzesi Arnold arnold.fuzesi.lista at gmail.com
Thu Jul 12 00:55:15 CEST 2007


Hú, köszi ismét!
C különórák így esténként :)))

Lockolás rendben van, abból 100000000% nem lesz gond, "atomic" minden ilyen 
művelet.

C-ben írom (megneztem direkt...szimplán C...van ECPP stb...de nem az), és
error-t dob a fordító....

A.
----- Original Message ----- 
From: "Andras Tantos" <andras at tantosonline.com>
To: <elektro at tesla.hu>
Sent: Wednesday, July 11, 2007 7:19 PM
Subject: Re: C kerdes megint, cast


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]



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



More information about the Elektro mailing list