[C] array dynamisch vergroten werkt niet zoals verwacht

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • ThaStealth
  • Registratie: Oktober 2004
  • Laatst online: 11-09 10:19
Voor mijn arduino heb ik een simpel protocol verzonnen wat data in meerder pakketjes kan opsplitsen, helaas gaat het bij het kopieren van het bericht naar de tijdelijke buffer (die pas verwerkt word als het laatste bericht binnen gekomen is) iets mis.

Ik declareer als eerste een tijdelijk array van de grootte huidige buffer + datablock grootte (-9 wanwege crc + header). Vervolgens kopieer ik alle bytes van de algehele buffer naar het array en gooi de bytes van het datablock erbij. Nadat dit gebeurd is release ik de oude algemene buffer en kopieer ik de pointer naar de nieuwe buffer.

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
                        unsigned char tempBuffer[commandBufferLength+blockLength-9];
                        for(int i = 0; i<commandBufferLength;i++)
                        {
                            //save bytes that we got already
                            tempBuffer[i] = commandBuffer[i];                       
                        }
                        for(int i = 7; i<blockLength-2;i++)
                        {
                            //copy block to tempbuffer and strip off header and crc
                            tempBuffer[commandBufferLength+i-7] = dataBlock[i];                                                                                                                                                                                     
                        }                       
                        commandBufferLength+=blockLength-9; //add blocklength                                           
                        free(commandBuffer); //clear old command buffer                                         
                        commandBuffer = tempBuffer; //copy pointer  


De 1e keer werkt de code, de tweede keer werkt het niet, na wat debuggen ben ik erachter gekomen dat de 2e x het geheugenadres van tempBuffer gelijk is aan commandBuffer. (en na de free gaat alles dan naar de knoppen).

Wat ik echter niet begrijp is hoe dit kan gebeuren, ik maak toch netjes een nieuwe tempBuffer aan (die op een nieuw geheugenadres gealloceerd word?)

Het is vast een domme (beginners) fout, maar ik spot hem even niet zo snel

Mess with the best, die like the rest


Acties:
  • 0 Henk 'm!

  • Arjan
  • Registratie: Juni 2001
  • Niet online

Arjan

copyright is wrong

Tempbuffer moet je met malloc alloceren, of niet freeen :)

oprecht vertrouwen wordt nooit geschaad


Acties:
  • 0 Henk 'm!

  • VyperX
  • Registratie: Juni 2001
  • Laatst online: 14-08 13:04
Wat verwacht je precies dat die "free(commandBuffer);" doet?
Hint: free() is gerelateerd aan malloc().

Dat de tweede keer het geheugenadres van tempBuffer gelijk is aan commandBuffer is logisch, dat heb je namelijk zo aangegeven op regel 14.

Verder heb je het over een "nieuwe tempBuffer" die op een nieuw geheugenadres wordt gealloceerd. In je functie maak je die buffer gewoon aan in je functie, waardoor deze op de stack staat (en dus niet op de heap is gealloceerd).

Het lijkt er op dat je functie moet kopieren van de commandBuffer naar de dataBlock. Waarom heb je daar die tempBuffer bij nodig eigenlijk?

My Dwarf Fortress ASCII Reward: ~~@~~####,.".D",.B""


Acties:
  • 0 Henk 'm!

  • ThaStealth
  • Registratie: Oktober 2004
  • Laatst online: 11-09 10:19
VyperX schreef op zondag 30 januari 2011 @ 18:41:
Het lijkt er op dat je functie moet kopieren van de commandBuffer naar de dataBlock. Waarom heb je daar die tempBuffer bij nodig eigenlijk?
Ik probeer commandBuffer (dus data wat ik in vorig bericht(en) heb gekregen) + dataBlock (data in dit bericht) in 1 array te dumpen, hiervoor doe ik eerst een nieuw array aanmaken van commandBuffer lengte + datablock lengte, daar commandBuffer in zetten en vervolgens datablock in plaatsen.
VyperX schreef op zondag 30 januari 2011 @ 18:41:
Wat verwacht je precies dat die "free(commandBuffer);" doet?
Hint: free() is gerelateerd aan malloc().
Het geheugen van de oude commandBuffer (= dus data van vorige berichten zoder mijn huidge bericht, dat staat nog in tempBuffer) vrij geven.

Mess with the best, die like the rest


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 11:51
Kweetniet hoeveel RAM je arduinio heeft, maar een oplossing met een aantal fixed sized statische buffers zou misschien meer op z'n plek zijn.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • MLM
  • Registratie: Juli 2004
  • Laatst online: 12-03-2023

MLM

aka Zolo

tempbuffer is een functie-local variabele (op de stack)
je assigned een pointer naar die buffer aan commandBuffer.
dat betekent dat je commandBuffer daarna niet meer kan gebruiken buiten de functie (immers, de variabele met de data gaat uit scope zodra de functie returned)

1) gebruik je commandBuffer nadat je functie gereturned heeft?
2) klopt de data in tempBuffer wel op regel 12? (een fout in je gekopieer eerder)

ik gok dat 1 je fout is :)

oplossingen:
1) dynamische allocatie van je tempBuffer (dan moet je wel een free doen nadat je klaar bent met de tempBuffer (of commandBuffer, als je die returned)
2) een statische buffer (aka global) gebruiken, dan hoef je geen free te doen, maar beperk je je tot 1 buffer tegelijk verwerken. voor embedded single-threaded etc wellicht aan te raden.

-niks-


Acties:
  • 0 Henk 'm!

Verwijderd

Wat dacht je van realloc()? Verkeerd gelezen.

[ Voor 31% gewijzigd door Verwijderd op 31-01-2011 09:40 ]

Pagina: 1