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