Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

C++Builder zbun

[es] :: C++ programiranje :: C++Builder zbun

[ Pregleda: 1422 | Odgovora: 5 ]

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Riste Pejov
Team Leader/Senior Software Developer @ Ein-Sof ltd S..
Skopje, Macedonia

Član broj: 128
Poruke: 571
62.162.102.*

Jabber: richie@bagra.net.mk
ICQ: 154236769
Sajt: riste.softver.org.mk


Profil

icon C++Builder zbun04.09.2002. u 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 ?

People who think they know everything tend to irritate those of us who do.
04.09.2002. u 13:31 

leka
Dejan Lekić
senior software engineer, 3Developers Ltd.
London, UK

Član broj: 234
Poruke: 2530
*.racasse.se

Sajt: dejan.lekic.org


Profil

icon Re: C++Builder zbun04.09.2002. u 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 :)
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
04.09.2002. u 17:29 

Riste Pejov
Team Leader/Senior Software Developer @ Ein-Sof ltd S..
Skopje, Macedonia

Član broj: 128
Poruke: 571
62.162.102.*

Jabber: richie@bagra.net.mk
ICQ: 154236769
Sajt: riste.softver.org.mk


Profil

icon Re: C++Builder zbun04.09.2002. u 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,
People who think they know everything tend to irritate those of us who do.
04.09.2002. u 18:10 

bm101
Vanja Tesin
Yu/Zr

Član broj: 1961
Poruke: 44
*.zre.sezampro.yu



Profil

icon Re: C++Builder zbun04.09.2002. u 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

04.09.2002. u 18:46 

Riste Pejov
Team Leader/Senior Software Developer @ Ein-Sof ltd S..
Skopje, Macedonia

Član broj: 128
Poruke: 571
212.110.78.*

Jabber: richie@bagra.net.mk
ICQ: 154236769
Sajt: riste.softver.org.mk


Profil

icon Re: C++Builder zbun05.09.2002. u 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
People who think they know everything tend to irritate those of us who do.
05.09.2002. u 01:41 

leka
Dejan Lekić
senior software engineer, 3Developers Ltd.
London, UK

Član broj: 234
Poruke: 2530
*.telia.com

Sajt: dejan.lekic.org


Profil

icon Re: C++Builder zbun05.09.2002. u 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.
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
05.09.2002. u 22:18 

[es] :: C++ programiranje :: C++Builder zbun

[ Pregleda: 1422 | Odgovora: 5 ]

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.