www.mikrocontroller.net

Forum: PC-Programmierung problem with malloc()


Autor: Nabil (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Nabil (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.
static char* pBuffer;

   ....

   BufferSize = DENK_DIR_WAS_AUS;
   pBuffer = malloc( BufferSize );

   do {
     RetValue = fceGetList( Channel, Flag, pBuffer, BufferSize );

     if( RetValue < 0 ) {   // Buffer war zu klein
       free( pBuffer );
       BufferSize *= 2;
       pBuffer = malloc( BufferSize );
     }
   } while( RetValue < 0 );

   ....

   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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.