www.mikrocontroller.net

Forum: Compiler & IDEs Was bedeutet "__builtin_alloca" ???


Autor: Bert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist das ein Standard-Makro oder sowas?

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie der Name schon sagt, ist es eine einebaute Version von alloca. Warum 
interessiert dich das?

Autor: Bert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich hab das hier gefunden:
ethernetbuffer = (unsigned char*) __builtin_alloca (( size_t )
 ETHERNET_HEADER_LENGTH + IP_HEADER_LENGHT + UDP_HEADER_LENGHT +
 Datalenght );

gibts das alloca_ nur für AVR?

Kann ich das irgendwie rausnehmen?

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

Bewertung
0 lesenswert
nicht lesenswert
Bert wrote:
>
> ich hab das hier gefunden:
>
>
> ethernetbuffer = (unsigned char*) __builtin_alloca (( size_t )
> ETHERNET_HEADER_LENGTH + IP_HEADER_LENGHT + UDP_HEADER_LENGHT +
> Datalenght );
> 
>
> gibts das alloca_ nur für AVR?
>
> Kann ich das irgendwie rausnehmen?

Das kommt jetzt auf den Zusammenhang an. Aber ein
  ethernetbuffer = alloca( ( size_t ) ETHERNET_HEADER_LENGTH +
  IP_HEADER_LENGHT + UDP_HEADER_LENGHT + Datalenght );

sollte das eigentlich ersetzen können.
Wenn alle Stricke reissen, muesste man sich die Funktion in der
das eingesetzt wird ansehen und entscheiden ob ein Ersatz mit
malloc vernünfitg machbar ist.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ethernetbuffer = (unsigned char*) __builtin_alloca (( size_t )
     ETHERNET_HEADER_LENGTH + IP_HEADER_LENGHT + UDP_HEADER_LENGHT +
     Datalenght );

Keine Ahnung, wozu das gut sein soll. Eigentlich sollte man alloca 
verwenden. Der Compiler bzw. der Standardheader entscheidet dann, welche 
Implementation tatsächlich verwendet wird.

> gibts das alloca_ nur für AVR?

alloca ist eine nicht-Standard-Funktion, die aber sehr weit verbreitet 
ist. Es funktioniert wie malloc, aber nimmt den Speicher für lokale 
Variablen (also üblicherweise Stack).

> Kann ich das irgendwie rausnehmen?

Du könntest es als C99 übersetzen. Dann kannst du den Aufruf ersetzen 
durch ein Array mit variabler Länge. Aber warum willst du das 
rausnehmen?

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
alloca() ist mittlerweile (aber noch nicht in einem Release) auch
in der avr-libc ,,offiziell'' deklariert.

Die Deklaration lautet:
extern void *alloca(size_t);

Autor: Bert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich muss das malloc oder alloc irgendwie ersetzen, da mein 
Fujitsu-Compiler damit nicht klar kommt.

Oder ich schreibe ihm die Definition selbst. Wo genau ist malloc mal 
definiert?

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

Bewertung
0 lesenswert
nicht lesenswert
Bert wrote:
> Hallo,
>
> ich muss das malloc oder alloc irgendwie ersetzen, da mein
> Fujitsu-Compiler damit nicht klar kommt.
>
> Oder ich schreibe ihm die Definition selbst. Wo genau ist malloc mal
> definiert?


Im K&R gaabs früher mal eine malloc Implementierung. Ob sie
in der jetzt aktuellen AUsgabe immer noch drinnen ist, weiss
ich nicht.

Wenn du aber so fragen musst, dann vergiss das gleich wieder.
Einen malloc schreibt man nicht einfach so zwischen halb 12 und
Mittag.

Was genau bedeutet: "damit nicht klar kommt"?

Autor: Bert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich weis nicht genau ob es daran liegt, aber ich kann es mir denken.

Das gehört alles zu einem UDP-Sende-Projekt.
Es funktioniert mit dem AVR ohen Probleme, lade ich aber den Code auf 
einen Fujitsu, so entsteht eine Lücke im Ethernet-Frame (an der stelle 
der IP-Checksumme, die wird einfach übergangen). Dadurch verfälscht der 
komplette Frame.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bert wrote:

> ich muss das malloc oder alloc irgendwie ersetzen, da mein
> Fujitsu-Compiler damit nicht klar kommt.

Dann bist du hier im falschen Forum...

Wenn dein Fujitsu-Compiler wenigstens Arrays variabler Länge (als
lokale Variable) kann, dann kannst du das alloca() dadurch
ersetzen.  Siehe Rolf Magnus ganz oben, ist ein C99-Fietscher.

Wenn er das nicht kann, bleibt dir eigentlich nur noch, das Array
mit der größtmöglichen anzunehmenden Größe zu definieren.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In meiner K&R Version ist übrigens das Malloc-Beispiel (noch?) drin. 
Tolle Sache ;)

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.