mikrocontroller.net

Forum: Compiler & IDEs C: __attribute__ als cast in Parameter


Autor: Luigi Ganove (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe eine Funktion, welche deklariert ist als
int bla(char *str, const char *format, ...)

Einer der unzähligen Aufrufe ist z.B. folgendermaßen:
static const char TEST[] __attribute__((section(".irom.text"))) = "DIES IST EIN TEST";
len = bla(buff, TEST);

Dieses Gebilde soll jetzt aber ein einziger Aufruf werden, d.h. die 
Deklaration der Konstante soll mit in den Aufruf hinein. Wie mache ich 
das? Es ist wichtig, dass das section-Attribut zum Tragen kommt, damit 
mir die Ganzen konstanten Texte am Ende nicht im RAM liegen.

Autor: Peter II (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Luigi Ganove schrieb:
> Dieses Gebilde soll jetzt aber ein einziger Aufruf werden, d.h. die
> Deklaration der Konstante soll mit in den Aufruf hinein.

geht nicht. Warum muss das in einer Zeile stehen?

Autor: Luigi Ganove (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmmmm. Das ist schlecht.
Es soll den Quelltext übersichtlicher machen.

Geht es vielleicht als Makro? Ich habe da schon ewig rumprobiert, aber 
der Rückgabewert (also "len") macht mir immer einen Strich durch die 
Rechnung.

Autor: Markus F. (mfro)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mir fällt auf, dass solche Fragen ("wie kann ich das 
übersichtlicher...") in letzter Zeit öfter auftauchen.

M.E. gibt's dafür nur eine Antwort: übersichtlich ist das, was genauso 
aussieht wie das, was es ist.

Auch wenn's schon viele versucht haben: man kann aus C kein Pascal, 
Algol oder was auch immer machen; es bleibt doch immer C.

In deinem Beispiel hast Du 1.) eine Variablendeklaration, die ein 
Attribut verpasst bekommt + die Zuweisung eines Werts.

Und Du hast 2.) einen Funktionsaufruf mit einer Zuweisung.

Was gewinnst Du dadurch, dass Du 1.) und 2.) (die ausser "TEST" nichts 
miteinander zu tun haben) miteinander verwurschtelst?

Ich wette, selbst wenn Du's hinkriegst, wirst Du's in ein oder zwei 
Monaten selbst nicht mehr verstehen.

Übersichtlich ist ein Programm m.E. dann, wenn Einer, der den Code noch 
nie gesehen hat, innerhalb von ein paar Minuten versteht, worum's geht.

Mit kryptischen Makros erreichst Du das nicht.

Autor: ich (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Mit gcc extension geht das recht angenehm, das Makro ist aber kein 
Standard-C.
#define BLA(str, format, ...) ({ \
  static const char rom_format[] __attribute__((section(".irom.text"))) = format; \
  bla(str, rom_format); \
})

len = BLA(buff, "DIES IST EIN TEST");

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, hab das ... vergessen, da muss noch ein _VA_ARGS_ rein:
bla(str, rom_format, ##__VA_ARGS__); \

Autor: Luigi Ganove (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich will letztlich eine (s)printf-Funktion erhalten, die ich genau so 
aufrufen kann, wie die Standard-Funktion, nur, dass sie eben die 
bestehenden Strings in den Flash verfrachtet. Ich gewinne quasi 
Kompatibilität bzw. Portabilität.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
2 lesenswert
nicht lesenswert
Oder wenn GCC, dann alternativ zum Vorschlag von "ich":
#define IROMSTR(str) \
(__extension__({static const char s[] __attribute__((section(".irom.text"))) = (str); &s[0];}))

len = bla(buff,IROMSTR("DIES IST EIN TEST"));

Autor: Luigi Ganove (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke. Ist es normal, dass die Variable "s" im Post über mir dann mit 
meiner lokalen Variable "s" im Code kollidiert? Ich habe Stunden nach 
einem Fehler gesucht, bis ich "s" in dem Makro mal umbenannt habe...
Ich dachte eigentlich, die geschweiften Klammern ermöglichen das 
Erzeugen einer neuen lokalen Variablen.

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.

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