Gå til innhold

Problem med funksjon som returnerer en struct-peker som også inneholder peker


Anbefalte innlegg

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 av Mr Burns
Lenke til kommentar
Videoannonse
Annonse
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
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

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
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! :yes:

Endret av Mr Burns
Lenke til kommentar
  • 4 uker senere...
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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...