» »

[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

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 ()

purki ::

Prosim pomagajte! Ali bi šel čez ukaz strcpy ?

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.

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? :)

purki ::

E to vidiš.

Any Idea ?

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:
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.

Gundolf ::

Res je bluerunner, namesto strncpy mora biti memcpy, dobro da si opazil.

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!'

:)


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

C in funkcije ter #define

Oddelek: Programiranje
463938 (2299) misek
»

[C] struct in int[] (strani: 1 2 )

Oddelek: Programiranje
657320 (6393) MrBrdo
»

[C/C++] pointerji in reference

Oddelek: Programiranje
112014 (1838) Matako
»

strcpy reče segmatation fault

Oddelek: Programiranje
101494 (1445) MasterMind
»

Pointer-ji v C-ju

Oddelek: Programiranje
291773 (1471) rokpok

Več podobnih tem