Makro funktioniert nicht, warum?
-
#include <stdio.h> #define pow(a, b) (double atemp = a; for(;b>0;b--)a*=atemp;) void main() { double base = 2; int exp = 3; printf("Ergebnis: %3f", pow(base, exp)); }
1>d:\daten\z002nweb\inout\inout\inoutsource.c(10) : error C2146: syntax error : missing ')' before identifier 'atemp'
1>d:\daten\z002nweb\inout\inout\inoutsource.c(10) : error C2065: 'atemp' : undeclared identifier
1>d:\daten\z002nweb\inout\inout\inoutsource.c(10) : error C2106: '=' : left operand must be l-value
1>d:\daten\z002nweb\inout\inout\inoutsource.c(10) : error C2143: syntax error : missing ')' before ';'
1>d:\daten\z002nweb\inout\inout\inoutsource.c(10) : error C2065: 'atemp' : undeclared identifier
1>d:\daten\z002nweb\inout\inout\inoutsource.c(10) : error C2059: syntax error : ')'
1>d:\daten\z002nweb\inout\inout\inoutsource.c(10) : error C2059: syntax error : ')'
-
Makro haben keine Return-Wert.
-
Ich verstehe nicht. Was genau ist der Fehler?
-
#include <stdio.h> void main() { double base = 2; int exp = 3; printf("Ergebnis: %3f", (double atemp = base; for(;exp>0;exp--)base*=atemp;)); }
Ich kann kein C - sag mir was an dieses C Programm nicht stimmt.
Error 1 error C2146: syntax error : missing ')' before identifier
Error 2 error C2065: 'atemp' : undeclared identifier
Error 3 error C2106: '=' : left operand must be l-value
Error 4 error C2143: syntax error : missing ')' before ';'
Error 5 error C2065: 'atemp' : undeclared identifier
Error 6 error C2059: syntax error : ')'
Error 7 error C2059: syntax error : ')'
-
supertux schrieb:
abc.w schrieb:
Ganz kurz: Makros sind Scheisse!
Nein, das sind sie auch nicht. Manchmal ersapren Makros verdammt viel getippe: ...
...
Damit hab ich sofort ...
....
Ja, kann sein, habe versucht, deinen Code zu verstehen und habe cpp drüberlaufen lassen (musste in deinem Code noch hie und da ein ** einfügen) und bekomme folgendes:
int get_obj_i8(data_obj *cv, int8_t *val){ int ret; if(cv == NULL || val == NULL) return 0; if ((cv->dtype != TYPE_INVALID) && (cv->dtype != TYPE_I8)) return 0; ret = obj_request(cv, cv->read_to); if(ret == 0) return 0; *val = (int8_t) obj_get_value(cv); return 1;}; int get_obj_u8(data_obj *cv, uint8_t *val){ int ret; if(cv == NULL || val == NULL) return 0; if ((cv->dtype != TYPE_INVALID) && (cv->dtype != TYPE_U8)) return 0; ret = obj_request(cv, cv->read_to); if(ret == 0) return 0; *val = (uint8_t) obj_get_value(cv); return 1;}; int get_obj_i16(data_obj *cv, int16_t *val){ int ret; if(cv == NULL || val == NULL) return 0; if ((cv->dtype != TYPE_INVALID) && (cv->dtype != TYPE_I16)) return 0; ret = obj_request(cv, cv->read_to); if(ret == 0) return 0; *val = (int16_t) obj_get_value(cv); return 1;}; int get_obj_u16(data_obj *cv, uint16_t *val){ int ret; if(cv == NULL || val == NULL) return 0; if ((cv->dtype != TYPE_INVALID) && (cv->dtype != TYPE_U16)) return 0; ret = obj_request(cv, cv->read_to); if(ret == 0) return 0; *val = (uint16_t) obj_get_value(cv); return 1;}; int get_obj_i32(data_obj *cv, int32_t *val){ int ret; if(cv == NULL || val == NULL) return 0; if ((cv->dtype != TYPE_INVALID) && (cv->dtype != TYPE_I32)) return 0; ret = obj_request(cv, cv->read_to); if(ret == 0) return 0; *val = (int32_t) obj_get_value(cv); return 1;}; int get_obj_u32(data_obj *cv, uint32_t *val){ int ret; if(cv == NULL || val == NULL) return 0; if ((cv->dtype != TYPE_INVALID) && (cv->dtype != TYPE_U32)) return 0; ret = obj_request(cv, cv->read_to); if(ret == 0) return 0; *val = (uint32_t) obj_get_value(cv); return 1;};
So was mag ich nicht, so was möchte ich nicht "debuggen", weiss nicht, wie es die anderen sehen. Oder wahrscheinlich gehöre ich einfach zu der Menge der Programmierer, die schlechte Bugfixer sind und fremden Code nicht lesen können oder wollen, wie hier angesprochen http://www.c-plusplus.net/forum/viewtopic-var-t-is-267345-and-highlight-is-.html
Ausserdem greift das Argument "viel Tipparbeit einsparen" bei mir nicht, weil ich einen anderen Editor benutze, der einen Ruf hat, kompliziert zu sein, und den ich hier nicht nennen möchte, weil sich sonst sofort eine Gruppe anderer Leute melden würde, die einen anderen Editor benutzen, der einen Ruf hat, ein Betriebsystem zu sein, in dem es an einem guten Editor mangele
-
ich hab doch gesagt, ich hab es leicht abgeändert und Sachen entfernt, die dem Bsp nicht helfen, deshalb die fehlende \ am Ende.
Ich habe viele Module, die eine get und set Funktion für jedes Datentyp anbietet. Leider sieht diese get/set Funktion in allen Fällen gleich, bis auf den Datentypen. Wieso soll ich redundanten Code (der nur an sehr wenigen Stellen sich ändert) zig-Mal schreiben? Und wenn die Sematik leicht verändert, dann muss ich jede einzelne Funktion verändern. Mit meinem Makro verändere ich nur an einer einzigen Stelle (und sowas musste ich schon ein Paar machen).
Die Idee hab ich aus GTK geklaut, dort gibt (der gab es) solche Makros und fand es angenehm.
@jizzerr:
Makros sind keine Funktionen sondern eine reine *dumme* (fast) 1:1 Textersetzung. Dein Problem wirst du mit Makros NICHT gescheit lösen, höf auf deine Zeit damit zu verschwenden, dafür sind Makros nicht da.
-
Zeus schrieb:
#include <stdio.h> void main() { double base = 2; int exp = 3; printf("Ergebnis: %3f", (double atemp = base; for(;exp>0;exp--)base*=atemp;)); }
Ich kann kein C - sag mir was an dieses C Programm nicht stimmt.
Error 1 error C2146: syntax error : missing ')' before identifier
Error 2 error C2065: 'atemp' : undeclared identifier
Error 3 error C2106: '=' : left operand must be l-value
Error 4 error C2143: syntax error : missing ')' before ';'
Error 5 error C2065: 'atemp' : undeclared identifier
Error 6 error C2059: syntax error : ')'
Error 7 error C2059: syntax error : ')'Deklarationen in einer Anweisung sind das Problem
-
@jizzerr
Hast du nicht gemerkt, dass ich den Präprozessor gespielt habe?
-
Ok
-
Nochmal eine Frage. Um welches Zeichen in der ASCII-Tabelle handelt es sich am ende eines Strings? dez 0 oder dez 48 ? Was meint Null-byte bzw. NULL in C ?
-
jizzer schrieb:
Nochmal eine Frage. Um welches Zeichen in der ASCII-Tabelle handelt es sich am ende eines Strings? dez 0 oder dez 48 ? Was meint Null-byte bzw. NULL in C ?
0 natürlich. Sonst könnte man ja keine '0' im String haben.
-
Ok, und der Backslash ('****0')dient dann nur der Unterscheidung zu ('0') als eigentlichem, dargestelltem Zeichen?
-
jein. Im ASCII-Code sind auch Zeichen enthalten, die nicht gerdückt (dargestellt) werden können (die ersten 32 z.b.). Um diese trotzdem eingeben zu können, muss man "escapen", sprich ein bekanntes Zeichen mit einem vorangehenden Backslash. '\n' ist ein Bsp. dafür, '\n' entspricht ASCII 10. '\0' entspricht 0.
Du kannst aber nicht jedes Zeichen "escapen", z.b. "\1" hat keine Bedeutung im Standard.
-
merci
-
Da hier nur eine philosophische Diskussion über Makros ausgebrochen ist, niemand aber die eigentliche Frage beantwortet hat, hier mal mein Vorschlag:
Allerdings nur für Integer, sonst war's das
#define MPOW(result, base, exp) for (result = 1; exp--; result *= base);
-
du kannst es aber nicht als r-value benutzen, wie jizzer es haben will. D.h, sowas wie
int x = MPOW(x, 2, 4); printf("%d\n", MPOW(???, 2, 4));
geht schief.
-
Wäre es nicht sinnvoll bei MPOW den Parameter result wegzulassen, da er eh auf 1 gesetzt wird?
Und, dass es keinen return-wert gibt sehe ich auchGuten Abend noch
-
nein, es ist nicht sinnvoll, da du mehrere Anweisungen hast und while/for Schleifen keinen Wert zurückliefern können.
Hör auf dich mit dem Schwachsinn zu beschäftigen. Es ist so, als würdest du dir Gedanken machen, wie du in die Dusche reingehst, ohne naß zu werden.
-
Ich versuche bloß das Beispiel zuendezudenken - vom eigentlichen Nutzen mal abgesehen - und lerne damit ein paar Feinheiten von C dazu.
PS: Hast du vll ne Antwort zu dem struct-thread?
-
Makro sind nur in Verbindung mit Templates gut, aber das ist dann C++ *gg*