Stránka 1 z 1

C++ otazka na Integer Promennou

Napsal: 11 úno 2010 15:40
od daviddda
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?

Re: C++ otazka na Integer Promennou

Napsal: 11 úno 2010 16:40
od Sender
tomu type je předána adresa,tím se type nastaví na nějakou hodnotu. "int type" je pouze pomocná proměnná.

Re: C++ otazka na Integer Promennou

Napsal: 11 úno 2010 17:31
od daviddda
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..

Re: C++ otazka na Integer Promennou

Napsal: 11 úno 2010 19:50
od Sender

Re: C++ otazka na Integer Promennou

Napsal: 12 úno 2010 01:54
od daviddda
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.

Re: C++ otazka na Integer Promennou

Napsal: 12 úno 2010 02:37
od melior
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

Re: C++ otazka na Integer Promennou

Napsal: 12 úno 2010 14:58
od daviddda
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.

Re: C++ otazka na Integer Promennou

Napsal: 12 úno 2010 15:24
od melior
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.

Re: C++ otazka na Integer Promennou

Napsal: 12 úno 2010 17:55
od daviddda
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..