Forum » Programiranje » [C] problem s kazalci
[C] problem s kazalci
purki ::
Pozdravljeni
Imam dva kazalca. Eden kaže npr. na 8 bajtno lokacijo, na kateri je vrednost 0x922EF011. Drugi pa kaže npr. na 4 bajtno lokacijo 0x2244. Kako bi oba kazalca združil, tako da bi prvi kazal na 12 bajtno 0x922EF0112244
Imam dva kazalca. Eden kaže npr. na 8 bajtno lokacijo, na kateri je vrednost 0x922EF011. Drugi pa kaže npr. na 4 bajtno lokacijo 0x2244. Kako bi oba kazalca združil, tako da bi prvi kazal na 12 bajtno 0x922EF0112244
BlueRunner ::
typedef union tag ZDRUZ { byte[12] byteData; struct { int stiri; short dva; } simpleData; } ZDRUZ; .... int *pStiri; short *pDva; ZDRUZ *pZdruz; pZdruz = (ZDRUZ*)malloc(sizeof(ZDRUZ)); pZdruz->stiri = *pStiri; pZdruz->dva = *pDva;
Zeh... danes je počasen dan.
purki ::
Aha. Pozabil sem omenit da dolžina podatkov kamor kaže kazalec ni fiksna (8 in 4 byte) ampak se tekom delovanja spreminja! Bolj natančno je to tabela znakov - char.
Zgodovina sprememb…
- spremenilo: purki ()
Gundolf ::
strcat
Samo ne vem kako ti veš, koliko so dolgi stringi. Če so to regularni string in se zaključijo z 0, potem je strcat v redu.
Samo ne vem kako ti veš, koliko so dolgi stringi. Če so to regularni string in se zaključijo z 0, potem je strcat v redu.
purki ::
Hm, ja to ne bo šlo. Kaj pa ali so kakšne opcije z operatorji & (prirejanje naslova kazalcu) ?
napsy ::
Kazalec pri 32-bitni arhitekturi je vedno dolgi 32 bitov oz. 4 bejte. Ne da se ga "povečat". Edino kar lahko še narediš, je to, kar ti je že BlueRunner pokazal.
"If you die, you die. But when you live you live. There is no time to waste."
BigWhale ::
Torej, ti bi rad, da dva naslova nekje random v pomnilniku, ki kazeta na nek podatek, ki je se semi-random dolzine.
Zdaj bi pa rad, da sta ta dva podatka en za drugim? :)
Zdaj bi pa rad, da sta ta dva podatka en za drugim? :)
napsy ::
Običajno ni dovoljeno posegati v pomnilnik z random naslovom. Lahko si ogledaš funkcijo memalign().
"If you die, you die. But when you live you live. There is no time to waste."
Gundolf ::
Ja in kaj je narobe s tem kar ti je bluerunner nakazal? Razen tega da ni variabilne dolžine?
Gundolf ::
Ma ok, da se ne bomo več mučil kle. Ti imaš tole:
char* pointer1; char* pointer2; int size1; int size2;in bi rad imel tole:
int size12 = size1+ size2; char* pointer12 = (char*)malloc(size12); strncpy(pointer12, pointer1, size1); strncpy(pointer12+size1, pointer2, size2);
BlueRunner ::
Namesto strXXX družine se uporablja memXXX družina funkcij. StrXXX funkcije vsebujejo semantiko terminatorja niza, kar prepreči pravilno delovanje v primerih, ko se v neznanem nizu pričakuje tudi terminatorje znakovnih nizov.
Pravilno je tako:
@purki: Glede na izkazano znanje, bi ti priporočal, da se pri svojih prvih korakih v programiranju bodisi posvetiš kateremu izmed programskih jezikov, ki delujejo v okolju brez kazalcev (Java, C#, Python, ...), bodisi vzameš v roke K & R, kjer bo pojasnilo o svoji "težavi" prebral že tam nekje na deseti strani. Vsekakor pa ti pred nadaljevanjem v jezikih C oziroma C++ priporočam, da si prebereš vsaj NEKAJ, o pomnilniku in kazalcih, da boš vsaj razumel kako nerodno je bilo tvoje vprašanje, in zakaj si dobil tako enoumne/neumene odgovore si dobil.
Pravilno je tako:
int size12 = size1 + size2; char* pointer12 = (char*)malloc(size12); memcpy(pointer12, pointer1, size1); memcpy(pointer12+size1, pointer2, size2);
@purki: Glede na izkazano znanje, bi ti priporočal, da se pri svojih prvih korakih v programiranju bodisi posvetiš kateremu izmed programskih jezikov, ki delujejo v okolju brez kazalcev (Java, C#, Python, ...), bodisi vzameš v roke K & R, kjer bo pojasnilo o svoji "težavi" prebral že tam nekje na deseti strani. Vsekakor pa ti pred nadaljevanjem v jezikih C oziroma C++ priporočam, da si prebereš vsaj NEKAJ, o pomnilniku in kazalcih, da boš vsaj razumel kako nerodno je bilo tvoje vprašanje, in zakaj si dobil tako enoumne/neumene odgovore si dobil.
BigWhale ::
in pa namesto char se splaca uporabiti unsigned char. Da bo za zihr. :)
Poleg tega pa se splaca zapomniti se parolo: 'Free the mallocs!'
:)
Poleg tega pa se splaca zapomniti se parolo: 'Free the mallocs!'
:)
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | C in funkcije ter #defineOddelek: Programiranje | 3924 (2285) | misek |
» | [C] struct in int[] (strani: 1 2 )Oddelek: Programiranje | 7292 (6365) | MrBrdo |
» | [C/C++] pointerji in referenceOddelek: Programiranje | 2009 (1833) | Matako |
» | strcpy reče segmatation faultOddelek: Programiranje | 1491 (1442) | MasterMind |
» | Pointer-ji v C-juOddelek: Programiranje | 1771 (1469) | rokpok |