C++ otazka na Integer Promennou

Místo pro dotazy a rady ohledně programovacích jazyků (C++, C#, PHP, ASP, Javascript, VBS..) a tvorby webových stránek

Moderátor: Mods_senior

daviddda
Level 1
Level 1
Příspěvky: 72
Registrován: leden 10
Pohlaví: Muž
Stav:
Offline

C++ otazka na Integer Promennou

Příspěvekod daviddda » 11 úno 2010 15:40

Ahoj, zkoumam jeden open-source kod (FileZilla Server) a casto tam byva nasledujici kod a jemu velice podobny:


BOOL CUsersListCtrl::ParseUserControlCommand(unsigned char *pData, DWORD dwDataLength)
{
int type = *pData;
if (type < 0 || type > 4)

proste hlavicka nejake funkce.. v ni je deklarovana promenna typu Integer a pak je initializovana Pointerem pData, ktery je pak v pripade pouzivani metody implementovany takto: unsigned char *pData=new unsigned char[4096];

jde mi o to, ze kdyz podobny kod otestuji (jen malou testovaci aplikaci), tak ten Integer "type" - (z kodu) hodi nejake nesmyslne cislo napr. 585736329176252, pritom v kodu rovnou porovnavaji jestli "type" je mensi nez nula nebo vetsi nez ctyri..

pod nim je pak dlouhy switch, kde se porovnava jestli je "type" 0, 1, 2 nebo 3 nebo default..
pritom me ten "type" vzdycky vyjde uplne nesmyslne dlouhy cislo. Rozumi tomu nekdo prosim?

Reklama
Uživatelský avatar
Sender
Level 3.5
Level 3.5
Příspěvky: 700
Registrován: leden 07
Bydliště: Vysočina
Pohlaví: Muž
Stav:
Offline

Re: C++ otazka na Integer Promennou

Příspěvekod Sender » 11 úno 2010 16:40

tomu type je předána adresa,tím se type nastaví na nějakou hodnotu. "int type" je pouze pomocná proměnná.

daviddda
Level 1
Level 1
Příspěvky: 72
Registrován: leden 10
Pohlaví: Muž
Stav:
Offline

Re: C++ otazka na Integer Promennou

Příspěvekod daviddda » 11 úno 2010 17:31

preda se ji adresa to Pointeru? Proc ji ale potom porovnavaji, jestli je ta adresa cislo 1,2,3, nebo 4, kdyz ta adresa toho pointeru vychazi naky dlouhy cislo napr. 538757284874 - zkousel jsem vytvorit neco podobneho napr:
unsigned char *test = new char[4096];
int zkouska=test;
cout<<zkouska;

a vyjde to dlouhe cislo. Nemaji v tom kodu nejaky jiny trik, ze jim vyjde jen neco kratsiho, jako 1, 2, 3 nebo 4 apod..

Uživatelský avatar
Sender
Level 3.5
Level 3.5
Příspěvky: 700
Registrován: leden 07
Bydliště: Vysočina
Pohlaví: Muž
Stav:
Offline

Re: C++ otazka na Integer Promennou

Příspěvekod Sender » 11 úno 2010 19:50


daviddda
Level 1
Level 1
Příspěvky: 72
Registrován: leden 10
Pohlaví: Muž
Stav:
Offline

Re: C++ otazka na Integer Promennou

Příspěvekod daviddda » 12 úno 2010 01:54

diky za odkazy, procetl jsem si je, ale k tomu mymu dotazu tam presto nic neni. Nechapu totiz proc je k integeru prirazenej pointer. Proc to jako v tom kodu takhle implementovali, je mi jasny, ze ten pointer ukazuje na nejakou adresu v pameti, a kdyz ho priradim k integeru, tak se divim, ze to compiler nehlasi a za druhy, nechapu jak jim tohle prirazeni mohlo vyhodit tak nizke cislo. Jinde jsem takoveto prirazeni jeste nevidel.

Uživatelský avatar
melior
Level 3.5
Level 3.5
Příspěvky: 977
Registrován: září 07
Bydliště: Brno
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: C++ otazka na Integer Promennou

Příspěvekod melior » 12 úno 2010 02:37

zakladni rozdil v tom kodu je, ze oni maj ten char v pameti alokovany pravdepodobne mallocem a predavany jako pointer

do intu se pak neulozi pointer, ale hodnota v pameti kam ukazuje pointer

ten kod co jsi psal naopak Ty ma statcike pole char, tedy s tim se pracuje trosku jinak
a pak samozrejme neprirazujes obsah pameti ( int test = * pointer) ale hodnotu pointeru
if (count(legs)==6) bug
else feature;

Dvě monarchie v nejednotné Evropě...
Dvě koloniální říše v neklidném světě 23. století...
Jaderné mocnosti s historií osmi vzájemných válek...
Federativna kraljevina Jugoslavija a Císařství České

daviddda
Level 1
Level 1
Příspěvky: 72
Registrován: leden 10
Pohlaví: Muž
Stav:
Offline

Re: C++ otazka na Integer Promennou

Příspěvekod daviddda » 12 úno 2010 14:58

myslim, ze uz jsem na neco prisel, tak to zde napisi. Jedna se jeste o jeden jednoduchy kod, ktery jsem odzkousel:

unsigned char *test = new unsigned char[4096];
test[0]=1;
test[1]=3;
test[2]=4;
test[3]='a';
test[4]='b';
test[5]='c';

int zkouska=*test;
cout<<zkouska;

v tomto pripade je pri prirovnani "zkouska=*test;" vysledek promenne zkouska cislo 1. Takze timto zbusobem pouzivali nejspise toto prirovnani i v kodu, ktery zkoumam...
v podstate kod "int zkouska=*test;" je tentyz jako "int zkouska=test[0];" , ze?
akorat je mi divne, ze prirovnani test[0]=1; funguje bez problemu, vlastne k characteru prirovnam hodnotu integeru a compiler to bez problemu compiluje na spravnou hodnotu charcteru - tedy cislo 1.

Uživatelský avatar
melior
Level 3.5
Level 3.5
Příspěvky: 977
Registrován: září 07
Bydliště: Brno
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: C++ otazka na Integer Promennou

Příspěvekod melior » 12 úno 2010 15:24

protoze CHAR neni nic jineho nez celociselna promenna o velikosti 1byte, ktera obsahuje ASCII cislo znaku

tedy 'A' je reprezentovano 65, 'a' 97.. atd.
do retzece timhle zpusobem neukladas znak '1', ale ASCII znak s poradovym cislem 1 coz je Start of Heading (viz Ascii tabulka).

Jinak samozrejme je tohle nebezpecny a nedoporucovany zpusob a vetsina novych kompilatoru by Ti mela aspon vyhodit warning.
if (count(legs)==6) bug
else feature;

Dvě monarchie v nejednotné Evropě...
Dvě koloniální říše v neklidném světě 23. století...
Jaderné mocnosti s historií osmi vzájemných válek...
Federativna kraljevina Jugoslavija a Císařství České

daviddda
Level 1
Level 1
Příspěvky: 72
Registrován: leden 10
Pohlaví: Muž
Stav:
Offline

Re: C++ otazka na Integer Promennou

Příspěvekod daviddda » 12 úno 2010 17:55

dobra, dekuji za vysvetleni, takze podle vseho muselo byt v retezci char znaku (alokovane pointerem pData) na prvnim miste retezce cele cislo (integer - tedy napr. 1, 2, 3..), ne? Jinak by kod z uplne prvniho prispevku (viz. int type = *pData;) nedaval zadny smysl..


Zpět na “Programování a tvorba webu”

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 1 host