Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » dynamischer Buffer

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
04.11.2003, 18:38 Uhr
~Stefan
Gast


Hallo,

habe leider ein Grundlagenproblem in C.
Ich möchte für einen Mikrocontroller ein Programmm
zur Kommunikation mit der seriellen Schnittstelle
schreiben. Dafür brauche ich einen Buffer, der mir
die entfangenen Bytes erstmal bis zur Verarbeitung
aufnimmt und mir einen Buffer_overflow anzeigt.

Dachte das kann ich schon mal mit einem Array machen.

Buffer[SIZE]

Aber ist es möglich SIZE auch dynamisch zu machen und
erst bei einem best. Wert den Überlauf anzuzeigen??
Wenn ja, wie weis ich wieviele WErte es im Moment gibt
und wie kann ich sie verschieben??

for (X=0;x=SIZE-1;x++)
Buffer[x] = Buffer[x+1];

???

Hat jemand eine Beispiel oder eine Idee wie sich das
leicht verwirklichen läßt.

Wäre super dankbar!!!

Stefan
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
04.11.2003, 19:15 Uhr
Pablo
Supertux
(Operator)


Ja, malloc und realloc.

FAQ Lesen:
Die Sache mit den Rückgabewerten
malloc & co.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
04.11.2003, 19:18 Uhr
~YLIREBUS
Gast


int GROESSE;
int *buffer;

// die aktuelle Groesse des Buffers
GROESSE=SIZE;

buffer=(int*) malloc ( GROESSE *sizeof(inr));
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
04.11.2003, 19:19 Uhr
Pablo
Supertux
(Operator)


Aber vergiss nie den Speicher mit free wieder frei zu geben, sonst bleibt der Speicher da, auch wenn das Programm beendet.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
05.11.2003, 09:03 Uhr
ao

(Operator)



Zitat:
~Stefan postete
... für einen Mikrocontroller ...

Dynamischer Speicher ist bei Mikrocontrollern so eine Sache; nur für 32 oder 64 Bytes Empfangspuffer lohnt sich häufig der Overhead nicht, den du für die Heapverwaltung zahlst.

Was für ein Controller ist das denn, und wieviel Flash und RAM hat er?

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
06.11.2003, 20:08 Uhr
~Skylord
Gast


also generell wenn du ein array dynamisch gestalten willst muss du im heap arbeiten ,dann wären noch die frage ob du den array erweitern willst oder verkleinern, dafür must 2 funktionen schreiben,
es geht ungewähr beim erweitern so du erstellst einen temp array der grösser ist als dein alter und kopierst von deinem buffer array mit eier vorschleife allesda rein , dann gibs du dein buffer array frei mit delete[] und erstellst es neu in der gewünschten grösse, dann kopierst deine werte vom temp array wieder in den buffer und schon hast du einen neuen buffer array mit mehr platz, nicht vergessen den temp array freizugeben,
beim verkleinern eines array geht so enlich bloss erstellst du einen kleineren temp array ()
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
06.11.2003, 22:54 Uhr
Pablo
Supertux
(Operator)



Zitat:
~Skylord postete
dann gibs du dein buffer array frei mit delete[] und erstellst es neu in der gewünschten grösse,


Das ist Möglich, aber viel zu kompiliziert. Außerdem will Stefan in C machen und da gibt es den C++new Operator nicht.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
07.11.2003, 01:06 Uhr
0xdeadbeef
Gott
(Operator)


Die einfachste Möglichkeit wäre wohl, C++ statt C zu benutzen und einfach vector zu nehmen, der übernimmt dann das Speichermanagement für dich. Damit bist du auf der sicheren Seite, deswegen empfiehlt sich das besonders in sicherheitskritischen Bereichen. Es kann allerdings u.U. mit Performance-Einbußen einhergehen, besonders, wenn du Vektoren als Rückgabewerte benutzt. Wenn das ein Ausschlußkriterium ist, musst du in C malloc/calloc benutzen, darfst allerdings free nicht vergessen. Ich für meinen Teil empfinde es als schönen Programmierstil, diese Dinge zu kapseln, eine übliche Praxis in C ist folgendes:

C++:
void schreibe_etwas_in_den_buffer(char *buffer, size_t buflen) {
  /* ... schreib etwas in buf, aber nicht mehr als buflen Zeichen ... */
}


und nachher im Aufruf

C++:
char buffer[100];
schreib_etwas_in_den_buffer(buffer, 100);


respektive

C++:
inf buffer_lange;
char *buffer;
/*Die erforderliche Bufferlägne rauskriegen und in buffer_laenge speichern*/
buffer = (char*) malloc(buffer_laenge);
schreib_etwas_in_den_buffer(buffer, buffer_laenge);
/* ... */
free(buffer);


wenn die Länge des Buffers erst zur Laufzeit feststeht.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: