Forum: PC-Programmierung problem with malloc()


von Nabil (Gast)


Lesenswert?

hallo alle!
ich will ein speicher mit unbekannter groesse reservieren.Meine frage 
gibts bei visual studio c++ 6 eine funktion ,die sowas macht?
Vielen Dank im voraus für jede Hilfe.
BS:Windows XP
mfg

von Christian R. (supachris)


Lesenswert?

Unbekannte Größe? Äh? Wie stellst du dir das vor? Du kannst Speicher 
allozieren und dann vergrößern, aber eine unbekannte Größe anfordern? 
Das widerspricht sich ja schon in der Fragestellung.

von Nabil (Gast)


Lesenswert?

Hallo wieder!
ich wollte dies Funktion (Marshallsoft benuzen)

fceGetList(Channel, Flag, Buffer, BufLen)

    Channel : (I) Channel number.

    Flag : (I) Listing type flag
    Buffer : (P) List buffer.    //hier ist mein

    BufLen : (I) Size of 'Buffer' //mein problem??????

RETURNS

    Return < 0 : An error has occurred (buffer overflow). Call 
fceErrorText.

    Return > 0 : Number of characters copied to 'Buffer'.

Ich weiß nicht wie kann ich speicher fuer variable buffer 
Allozieren,weil ich  nicht weiß, wie viel daten werde ich vom Server 
bekommen?
Allozieren und vergrößern hört sich gut an hast du irgen ein Beispiel 
dafuer?
mfg

von Karl H. (kbuchegg)


Lesenswert?

Nabil wrote:

> Ich weiß nicht wie kann ich speicher fuer variable buffer
> Allozieren,weil ich  nicht weiß, wie viel daten werde ich vom Server
> bekommen?

Man kann das aber in etwa abschätzen.
Dann noch mal, je nach Gemütslage 20% drauf und den call
einfach mal machen.
Der Server sagt dir dann schon, ob das gereicht hat oder nicht.

<Zitat>
    Return < 0 : An error has occurred (buffer overflow). Call
fceErrorText.
</Zitat>

Wenn der Server mitteilt, dass der Buffer zu klein war, kann
man ja den Buffer vergrößern. zb. neue Größe = alte Größe * 2
und den call nochmal machen.
1
static char* pBuffer;
2
3
   ....
4
5
   BufferSize = DENK_DIR_WAS_AUS;
6
   pBuffer = malloc( BufferSize );
7
8
   do {
9
     RetValue = fceGetList( Channel, Flag, pBuffer, BufferSize );
10
11
     if( RetValue < 0 ) {   // Buffer war zu klein
12
       free( pBuffer );
13
       BufferSize *= 2;
14
       pBuffer = malloc( BufferSize );
15
     }
16
   } while( RetValue < 0 );
17
18
   ....
19
20
   free( pBuffer );

So ungefähr. Wenn beim ReturnWert von fceGetList noch andere
Dinge als Buffer Overflow möglich sind, dann musst du halt die
Abfrage nach dem Buffer Overflow verfeinern.
Ob du jetzt den Buffer in der Größe immer verdoppelts oder ob du
zb. den Buffer in 1 Schritten größer machst, bleibt dir überlassen
und hängt auch davon ab über welche Datengrößen wir da reden. Denk
dir eine Strategie aus, die für deinen speziellen Fall gute Ergebnisse
verspricht.
Was auch gut kommt: Das vergrößern sollte nicht der Normalfall sein.
Also einfach mal nachsehen wie oft die Vergrößerung in Anspruch
genommen wird. Passiert das oft, dann geht man mit der initialien
größe DENK_DIR_WAS_AUS größer. Die automatische Vergrößerung sollte
sowas wie ein Notfallplan sein, der eher selten zum Zug kommt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.