Forum: Compiler & IDEs #define mit 2 Werten


von andy (Gast)


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

von Michael H. (michael_h45)


Lesenswert?

aus: 
http://gcc.gnu.org/onlinedocs/cpp/Object_002dlike-Macros.html#index-g_t_0023define-44
1
    #define NUMBERS 1, \
2
                     2, \
3
                     3
4
     int x[] = { NUMBERS };
5
          ==> int x[] = { 1, 2, 3 };

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

von def (Gast)


Lesenswert?

versuch mal #define wert 0,2

von Uwe S. (de0508)


Lesenswert?

Hallo,

ich würde das so machen
1
#define _CALL(a,b)_ T6963cPutStringXY_P(a, b, PSTR("Ti:"))

ok ?

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

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

von def (Gast)


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

von Uwe S. (de0508)


Lesenswert?

warum wird man hier eigentlich beleidigt ?
und diskutiert nicht fachlich ?

Also Frage, warum ist a und b undefiniert ?

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

Oder?

von andy (Gast)


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

von ydna (Gast)


Lesenswert?

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

von Floh (Gast)


Lesenswert?

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

Dann lass sie doch mal sehen.

von Niklas G. (erlkoenig) Benutzerseite


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.

von def (Gast)


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

von def (Gast)


Lesenswert?

1
sollte heissen: _call_

von andy (Gast)


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

von Niklas G. (erlkoenig) Benutzerseite


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:
1
#define myT6963cPutStringXY_P(x) T6963cPutStringXY_P(0, 2, (x))
2
// zu verwenden dann so:
3
myT6963cPutStringXY_P(PSTR("Ti:"));

von gcc (Gast)


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

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

printf ist ja auch kein Makro?!

von andy (Gast)


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

von Niklas G. (erlkoenig) Benutzerseite


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?!

von gcc (Gast)


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

von Peter D. (peda)


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

von gcc (Gast)


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

von andy (Gast)


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

von gcc (Gast)


Lesenswert?

du kOenntest eine inline funktion draus machen oder irre ich mich?

von gcc (Gast)


Lesenswert?

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

von andy (Gast)


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

von Karl H. (kbuchegg)


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.

von Peter D. (peda)


Lesenswert?

1
#define T6963cPutStringXY_P_(X,Y, pString) \
2
  do { \
3
    T6963cSetAddress(T6963C_ADDR_TEXT + (T6963C_TEXT_COLS    *  (Y)) + \
4
(X + 2)); \
5
    T6963cPutString_P(pString); \
6
  } while(0)
7
8
#define T6963cPutStringXY_P(...) T6963cPutStringXY_P_(__VA_ARGS__)


Peter

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.