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.
Copyright (C) 2001-2008 by www.elitesecurity.org. All rights reserved.