[ Riste Pejov @ 04.09.2002. 13:31 ] @
Portirao sam neki kod iz Delphi-ja u CBuilder i po nekoliko sati zivciranja(debagiranja) pronasao nesto ovako:
Code:

char* buff;
buff = new char[2];    
iProcitani = FileRead(iFileHandle, buff, 3);
            if(buff =='000')
            {
               ..... bla bla 
            } 


Zasto kod if(buff =='000') kompajler nije reagovao ?
nego je progutao '000' umesto "000", i sta je kompajler uopste
uporedio u ovom slucaju sa pascal style stringom ?
i zasto tretira '000' kao int ?
[ leka @ 04.09.2002. 17:29 ] @
Riste, 'b' je isto kao da si napisao 62, u tvom slucaju kompajler je prvo '000' transofrmisao u '0' (apostrofi sluze da se literalno kompajleru da do znanja da hoces da mu "serviras" char vrednost), a '0' je normalno broj 30 :)

Dakle kompajler je uporedio "nesto" (buff) i broj 30 koliko kapiram :)
[ Riste Pejov @ 04.09.2002. 18:10 ] @
Leko, u nijednoj dokumentacii koju sam citao o C++ nije se pominjao
apostrof, niti pa da 'b' predstavlja ASCII vrednost slova b. Zato sam se
stvarno zacudio kad sam video da uporedjuje if("000"=0).
sad sam isti uslov uradio kao:
if(strcmp("000",buff)=0)

Hvala puno,
[ bm101 @ 04.09.2002. 18:46 ] @
Samo jos da dodam, kada vec portujes sa delphija u builder, koristi AnsiString tip, jer si namestio omasku koja se ogleda u tome da si tip *char buff poredio bez iteracije i dereferenciranja, a posto je to "prost" tip u pitanju, ne postoji operator koji bi odradio to na poziv koji si ti imao u kodu:

char *buff;
...
if(buff =='000')

Sto je rezultovalo da kompajler proverava adresu sa brojem 30 (ASCII vrednost 0).

Umesto toga si mogao ovako:

AnsiString buff;

//ucitas podatke u string sa metodom LoadFromFile, ako se ne varam

if (buff == "000") // poziva operator == klase AnsiString

[ Riste Pejov @ 05.09.2002. 01:41 ] @
U konkretnoj situaciji nije se mogao iskoristiti AnsiString, jer se nije radilo o obicnog tekst fajla, vec o fajlu sa slogovima razlicitih velicina gde su ona tri bajta koje uporedjujem sa "000" tip sloga koji ima predefiniranu velicinu. Tako morao je biti char* buff, za da se fajl moze parsirati po slogovima. btw, i Delphi kod je isto tako radio sa char buferima
[ leka @ 05.09.2002. 22:18 ] @
Jeste da ce kompajleri da progutaju ovo (ako koristite string, AnsiString, CString...) jer je operator "==" preopterecen za ove klase... Ali generalno ja uvek u takvim slucajevima koristim strcmp() , jer znam da sve sigurno radi ako moram da kod iskompajliram u nekom "cudnom" kompajleru.

Citat:
bm101:
if (buff == "000") // poziva operator == klase AnsiString


Naravno, ovak kod je okej u C++-u, ali ja to izbegavam.