Mr Burns Skrevet 22. november 2007 Del Skrevet 22. november 2007 (endret) Heisann! Jeg lager meg et program som skal bl.a. ta imot pakker fra en RS-485 buss (tenk RS232). Data som blir mottat tenkte jeg å legge i en struct. Dette fungerer fint hvis data har fast lengde, men det kan jeg ikke basere meg på. Derfor la jeg til en peker i structen til data. Denne pekeren blir jo opprettet i funksjonen som mottar data, men den er ikke gyldig utenfor funksjonen, og det er jo der jeg vil bruke den. Structen ser forresten slik ut: typedef struct { //uint8_t EDM; // Error Detection Method uint8_t DAB1; // This is our adress, uint8_t SAB1; // This is senders adress, uint8_t dataLen; // # bytes received uint8_t * dataPtr; // Pointer to data } SNAP_RX_Packet; Funksjonen som tar seg av dette er definert slik : SNAP_RX_Packet * SNAPreceive(); Funksjonen oppretter en array for å lagre data, men arrayet forsvinner vel ut av scope når funksjonen returnerer? For å hanke ut data tenkte jeg å gjøre noe a la dette: SNAP_RX_Packet rx_packet; SNAP_RX_Packet * rx_packetPtr; rx_packetPtr = &rx_packet; uint8_t * dataPtr; rx_packetPtr = SNAPreceive(); dataPtr = rx_packet.dataPtr; Når jeg da sjekker dataPtr[0] ser det ut til at den er null. En mulig løsning er å ha en global peker som blir oppdatert i SNAPreceive(), men det tar minne (har bare 1K RAM). I tillegg forsvinner litt av poenget med structen, som var å ha alt som hadde med pakken å gjøre en plass. Andre forslag? Endret 22. november 2007 av Mr Burns Lenke til kommentar
Giddion Skrevet 23. november 2007 Del Skrevet 23. november 2007 Funksjonen oppretter en array for å lagre data, men arrayet forsvinner vel ut av scope når funksjonen returnerer? Stemmer det. Når jeg da sjekker dataPtr[0] ser det ut til at den er null. Jeg vet ikke hvordan pakke din ser ut, men jeg antar at du ikke forventer at første byte skal være 0 eller? Lenke til kommentar
Mr Burns Skrevet 26. november 2007 Forfatter Del Skrevet 26. november 2007 Når jeg da sjekker dataPtr[0] ser det ut til at den er null. Jeg vet ikke hvordan pakke din ser ut, men jeg antar at du ikke forventer at første byte skal være 0 eller? Jeg var nok litt upresis. Pekeren peker til null, altså den er null. Pekeren skulle pekt til data som var mottatt. Lenke til kommentar
GeirGrusom Skrevet 26. november 2007 Del Skrevet 26. november 2007 For å lese inn data, må du jo allokere arrayet på heap med operator new, da forsvinner den ikke ut av scope... Men når du returnerer en struktur, vil alle verdiene bli pushet til stacken, så den forsvinner ikke ut av scope. Lenke til kommentar
Harkonnen Skrevet 26. november 2007 Del Skrevet 26. november 2007 *peke på malloc()* Lenke til kommentar
GeirGrusom Skrevet 26. november 2007 Del Skrevet 26. november 2007 Ja seff, dette var C ja Lenke til kommentar
Mr Burns Skrevet 27. november 2007 Forfatter Del Skrevet 27. november 2007 Hmm, tror jeg trenger litt assistanse med den malloc-saken... Blir det omtrent slik: SNAP_RX_Packet * SNAPreceive() { SNAP_RX_Packet rcvPack; rcvPack.dataPtr = malloc(len); if ( rcvPack.dataPtr == NULL) PORTC = 0x01; else PORTC = 0x10; // Motta masse data her... // Behandle dem... // Fylle opp structen... return &rx_pack; } Og så noe sånt i koden som kaller SNAPreceive: SNAP_RX_Packet rx_packet; SNAP_RX_Packet * rx_packetPtr; rx_packetPtr = &rx_packet; rx_packetPtr = SNAPreceive(); PORTC = rx_pack.dataPtr[0]; free(rx_packet.dataPtr); Eller er jeg helt på jordet nå? Lenke til kommentar
Harkonnen Skrevet 27. november 2007 Del Skrevet 27. november 2007 Bortsett fra den åpnebare kodefeil ? Lenke til kommentar
GeirGrusom Skrevet 27. november 2007 Del Skrevet 27. november 2007 rx_packetPtr = &rx_packet; // <- Hva er poenget med denne? // den blir jo bare overskrevet i neste linje allikevel. rx_packetPtr = SNAPreceive(); Bortsett fra det, så ser det fint ut. malloc er nesten det samme som new i C++, den allokerer en array av bytes på heap. Lenke til kommentar
Mr Burns Skrevet 29. november 2007 Forfatter Del Skrevet 29. november 2007 Bortsett fra den åpnebare kodefeil ? Hei på deg! Kan du være så vennlig å vise meg den? Lenke til kommentar
Harkonnen Skrevet 29. november 2007 Del Skrevet 29. november 2007 (endret) SNAP_RX_Packet * SNAPreceive() { SNAP_RX_Packet rcvPack; rcvPack.dataPtr = malloc(len); ... return &rx_pack; } ser ikke ut som den returnerer det du har planlagt at den skal returnere. Endret 29. november 2007 av Harkonnen Lenke til kommentar
znora Skrevet 2. desember 2007 Del Skrevet 2. desember 2007 malloc() returnerer en void*. denne må castes til det du skal bruke den til. Lenke til kommentar
Mr Burns Skrevet 3. desember 2007 Forfatter Del Skrevet 3. desember 2007 (endret) SNAP_RX_Packet * SNAPreceive() { SNAP_RX_Packet rcvPack; rcvPack.dataPtr = malloc(len); ... return &rx_pack; } ser ikke ut som den returnerer det du har planlagt at den skal returnere. Ah, den henger igjen fra tidligere. Har prøvd litt forskjellig. Uansett, jeg returnerer heller selve strukten istedenfor en peker til structen. Jeg antar at like mye minne går med uansett, i og med at structen må jo faktisk ligge en plass. Da virker det... Takk for for all hjelp! Endret 3. desember 2007 av Mr Burns Lenke til kommentar
kernel Skrevet 26. desember 2007 Del Skrevet 26. desember 2007 SNAP_RX_Packet * SNAPreceive() { SNAP_RX_Packet rcvPack; rcvPack.dataPtr = malloc(len); ... return &rx_pack; } ser ikke ut som den returnerer det du har planlagt at den skal returnere. Ah, den henger igjen fra tidligere. Har prøvd litt forskjellig. Uansett, jeg returnerer heller selve strukten istedenfor en peker til structen. Jeg antar at like mye minne går med uansett, i og med at structen må jo faktisk ligge en plass. Da virker det... Merkelig om dette virker. Din struct "rcvPack" er en local variabel, og det er feil å returnere denne addressen, som typisk vil være allokert på stack, som blir borte når du gjør return fra funksjonen. Det du ønsket, var dette: #include<stdlib.h> SNAP_RX_Packet * SNAPreceive(void) { SNAP_RX_Packet *rcvPack = malloc(sizeof *rcvPack); rcvPack->dataPtr = malloc(len); ... return rcvPack; } Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå