www.mikrocontroller.net

Forum: Compiler & IDEs #define mit 2 Werten


Autor: andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,wie muss meine #define anweisung aussehen damit ich diesen 
Funktionsaufruf bewerkstelligen kann.

 T6963cPutStringXY_P(0,2, PSTR("Ti:"));

Im define sollen die Werte 0,2 sein.

Wenn ich es so probiere #define wert (0,2)
und dann die Funktion aufrufe mit

 T6963cPutStringXY_P(wert, PSTR("Ti:"));
bekomme ich Fehlermeldungen.
Hab schon einiges probiert,bekomme es aber nicht hin.
Wäre nett,wenn mir jemand helfen könnte.

gruss
andy

Autor: Michael H. (michael_h45)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aus: 
http://gcc.gnu.org/onlinedocs/cpp/Object_002dlike-...
    #define NUMBERS 1, \
                     2, \
                     3
     int x[] = { NUMBERS };
          ==> int x[] = { 1, 2, 3 };

Dein Problem liegt also woanders.
Ist 'wert' evtl eine Variable?

Autor: def (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
versuch mal #define wert 0,2

Autor: Uwe S. (de0508)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich würde das so machen

#define _CALL(a,b)_ T6963cPutStringXY_P(a, b, PSTR("Ti:"))

ok ?

Autor: Niklas Gürtler (erlkoenig)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn's der GCC ist, kannst du mit
cpp datei.c
 den Präprozessor durchlaufen lassen, und dir anschauen, was er da für 
Code produziert.

Autor: def (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Uwe S. schrieb:
> #define _CALL(a,b)_ T6963cPutStringXY_P(a, b, PSTR("Ti:"))

lol damit wär ihm auch nicht geholfen, dann ist a und b ja trotzdem 
undefiniert

Autor: Uwe S. (de0508)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
warum wird man hier eigentlich beleidigt ?
und diskutiert nicht fachlich ?

Also Frage, warum ist a und b undefiniert ?

Der Aufruf
_CALL(0,2)_;
 würde zu
T6963cPutStringXY_P(0, 2, PSTR("Ti:"));
expandiert.

Oder?

Autor: andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo danke für die antworten.Also es gibt 6 verschiedene Kombinationen 
der 2 Zahlen z.b 0,2  15,4  usw.
Damit ich sie leichter benutzen kann ohne sie zu verwechseln
wollte ich 6 #defines machen.
Aber wenn ich die defines in den Funktionsaufruf setze,gibts 
Fehlermeldungen.

gruss
andy

Autor: ydna (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
andy schrieb:
> Aber wenn ich die defines in den Funktionsaufruf setze,gibts
> Fehlermeldungen.
Welche?

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
andy schrieb:
> Aber wenn ich die defines in den Funktionsaufruf setze,gibts
> Fehlermeldungen.

Dann lass sie doch mal sehen.

Autor: Niklas Gürtler (erlkoenig)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
andy schrieb:
> Aber wenn ich die defines in den Funktionsaufruf setze,gibts
> Fehlermeldungen.
Deine Chancen auf Erfolg erhöhen sich, wenn du die Meldungen hier hin 
kopierst. Und den gesamten Code.

Autor: def (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Uwe S. schrieb:
> warum wird man hier eigentlich beleidigt ?
> und diskutiert nicht fachlich ?

ja tut mir leid.
aber du musst einsehen, die funktion so wie sie ist umzubenennen hilft 
auch nicht weiter

so schon eher

#define CALL T6963cPutStringXY_P(0, 2, PSTR("Ti:"))
//#define CALL T6963cPutStringXY_P(5, 7, PSTR("Ti:")) //wahlweise 
auszukommentieren

Autor: def (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sollte heissen: _call_ 

Autor: andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also wenn ich es so mache
#define wert 0,2

 T6963cPutStringXY_P(wert, PSTR("Ti:"));

bekomme ic folgende Fehlermeldungen


../Display_anzeige.c:8:42: error: macro "T6963cPutStringXY_P" requires 3 
arguments, but only 2 given
../Display_anzeige.c:8: error: 'T6963cPutStringXY_P' undeclared (first 
use in this function)
../Display_anzeige.c:8: error: (Each undeclared identifier is reported 
only once
../Display_anzeige.c:8: error: for each function it appears in.)

Wenn ich anstelle von wert 0,2 in den Funktionsaufruf schreibe klappt 
alles.

gruss

abdy

Autor: Niklas Gürtler (erlkoenig)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
andy schrieb:
> ../Display_anzeige.c:8:42: error: macro "T6963cPutStringXY_P" requires 3
> arguments, but only 2 given
Tja, das ist ein Makro, und keine Funktion... Offenbar wird 
T6963cPutStringXY zuerst expanded, und danach erst das 'wert', aber 
ersteres geht schon schief, weil halt 3 Argumente gefordert sind.
Mach's doch lieber so:
#define myT6963cPutStringXY_P(x) T6963cPutStringXY_P(0, 2, (x))
// zu verwenden dann so:
myT6963cPutStringXY_P(PSTR("Ti:"));

Autor: gcc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also der gcc sollte es schon schlucken



test.c

#define test 1,2
#include <stdio.h>

int main()
{
  printf("bla%i%i",test);
};


wird ohne meckern kompiliert und gibt bla12 aus

Autor: Niklas Gürtler (erlkoenig)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
printf ist ja auch kein Makro?!

Autor: andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo in der tat handelt es sich um ein makro.Bin leider noch nicht so 
weit.Ich dachte das das beim aufruf genau wie eine Funktion gehandhabt 
wird.
Niklas,wenn ich das richtig sehe,kann ich bei deinem Beispiel bei jedem 
aufruf den Text ändern,den ich dann übergebe.
Ich möchte aber die 2 Argumente durch ein define ersetzen.

gruss
andy

Autor: Niklas Gürtler (erlkoenig)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei 'meiner' Version hast du doch die zwei Werte in ein Makro gepackt - 
und den ganzen Funktionsaufruf dazu. Nur der Text wird an jeder Stelle 
im Code angepasst. Genau das wolltest du doch, oder?!

Autor: gcc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#define test 1,2

#define ego(a) printf("blaubaer%i-%i",a);
#include <stdio.h>

int main()
{
  ego(test);
};

das geht bei mir auch

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
andy schrieb:
> ../Display_anzeige.c:8:42: error: macro "T6963cPutStringXY_P" requires 3
> arguments, but only 2 given

Das läßt sich leicht über ein Zwischenmacro lösen.

Vorher müßte man aber die genaue Definition von T6963cPutStringXY_P 
wissen.

Bei Fragen ist es immer sinnvoll, alles zu definieren, was man 
verwendet, keiner kann hellsehen.


Peter

Autor: gcc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#define ego(a,b) printf("blaubaer%i-%i",a,b);

#define test 1,2

#include <stdio.h>

int main()
{
  ego(test);
};

so meckert er auch

Autor: andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo hier das makro

#define T6963cPutStringXY_P(X,Y, pString) \
  do { \
    T6963cSetAddress(T6963C_ADDR_TEXT + (T6963C_TEXT_COLS    *  (Y)) + 
(X + 2)); \
    T6963cPutString_P(pString); \
  } while(0)

gruss
andy

Autor: gcc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
du kOenntest eine inline funktion draus machen oder irre ich mich?

Autor: gcc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich schlage vor, du nimmst einfach 2 makros
 #define a 0  und
#define b 2
  damit hat sichs dann

Autor: andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,danke für die antworten.Das mit den 2 Makros geht natürlich auch.
Wäre nur schön gewesen wenns mit einem gegangen wäre.

gruss
andy

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

Bewertung
0 lesenswert
nicht lesenswert
andy schrieb:
> Hallo,danke für die antworten.Das mit den 2 Makros geht natürlich auch.
> Wäre nur schön gewesen wenns mit einem gegangen wäre.

Es geht auch mit einem.
Aber du musst eben einen Zwischenschritt einlegen.

Makros sind nun einmal einfach nur Textersetzungen. Und da kommt es dann 
eben auf die Reihenfolge der Ersetzungen an.

Allerdings wäre IMHO eine inline-Funktion hier die wesentlich bessere 
Lösung als ein Makro.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#define T6963cPutStringXY_P_(X,Y, pString) \
  do { \
    T6963cSetAddress(T6963C_ADDR_TEXT + (T6963C_TEXT_COLS    *  (Y)) + \
(X + 2)); \
    T6963cPutString_P(pString); \
  } while(0)

#define T6963cPutStringXY_P(...) T6963cPutStringXY_P_(__VA_ARGS__)


Peter

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.