ERLEDIGT
NEIN
NEIN
ANTWORTEN
9
9
ZUGRIFFE
6385
6385
EMPFEHLEN
-
Hallo,
ich habe da ein Problem, dass eigentlich kein Problem sein dürfte...
Ich habe am Anfang der Datei ein #define für die Stringlänge.
Das funktioniert auch wie erwachtet, bis auf eine Ausnahme:
Code :1 2 3 4 5 6 7 8 9 10 11
#define MAXSTRING 256 void loadData(){ char iniFile[MAXSTRING]; // wird wie erwartet erstetzt cIniEd tmp; strcpy(iniFile, projekt_Daten.projekt_Pfad); strcat(iniFile, "MAXSTRING.ini"); // wird nicht erstetzt tmp.setPfad(iniFile); }
Ich erhalte immer den Dateinahmen "MAXSTRING.ini", der sollte aber doch jetzt "256.ini" sein, oder ?
CU, Acki-----------------------------------------------------------------------------
using Code::Blocks with Win7 home-premium (64bit)
-----------------------------------------------------------------------------
-
20.05.04 09:11 #2
- Registriert seit
- Jul 2003
- Ort
- Duisburg (NRW)
- Beiträge
- 1.788
Versuch es mal so:
Eine andere Lösung kenne ich nicht, ausser Umwandlungsfunktionen (Z.B. sprintf()) oder Ausgabestreams zu verwenden.Code :1 2
#define MAXSTRING "256" strcat(iniFile, MAXSTRING ".ini"); // wird nicht erstetzt
Beispiel:
Übrigens könntest du die Zeile mit dem #define besser durch folgende ersetzen:Code :1 2 3 4 5 6 7 8
#define MAXSTRING (256) ... char buffer[40]; sprintf( buffer, "%d.ini", MAXSTRING ); printf( buffer ); strcat(iniFile, buffer ".ini");
Code :1
const int MAXSTRING = 256;
Chor: "Wir sind der Chor, und wir stimmen zu. Wir stimmen zu, wir stimmen zu, wir stimmen zu."
-
@Kachelator: Wieso sollte man ein #define deiner Ansicht nach durch ein const ersetzen? Dieser Grundsatz ist mir völlig neu!
Gawayn
-
20.05.04 13:03 #4
- Registriert seit
- Jul 2003
- Ort
- Duisburg (NRW)
- Beiträge
- 1.788
Nach Möglichkeit sollte man auf Defines ganz verzichten, wenn man stattdessen typsichere Definitionen verwenden kann. Im Unterschied zu #Defines, die im Quelltext ersetzt werden, bevor der Compiler sie zu Gesicht bekommt, geht beispielsweise das "const int " so an den Compiler weitergegeben. Das kann sehr hilfreich bei der Fehlervermeidung sein. Ebenso halte ich es für sinnvoll, wo es geht, Funktionstemplates anstelle von Define-Makros zu verwenden. Das setzt natürlich C++ voraus.
Eine beliebte Falle stellt zum Beispiel das Makro max() aus der windef.h dar:
Das Problem ist, das a und b je nach ihrem Wert hier ein oder zwei mal ausgewertet werden, ohne dass das im Code offensichtlich wäre. Was passiert nämlich, wenn a zum Beispiel ein Ausdruck der Form ++i ist...?Code :1
#define max(a,b) (((a) > (b)) ? (a) : (b))
Ich glaube, zu der Thematik findet man im Netz reichlich Material. Hier zum Beispiel:
(Quelle: http://www.wackerart.de/c.html )Makros:
Makros sind in C sehr wichtig.
#define SQUARE(a) a*a
int x = 5;
int y = SQUARE (x+2); /* berechnet wird: y = x + (2*x) + 2 */
Brjane Stroustroup äussert sich in seinem berühmten Buch "Die C++ Programmiersprache" wie folgt:
"Fast jedes Makro demonstriert eine Schwäche in der Programmiersprache, im Programm oder beim Programmierer. Da Makros den Programmtext ändern, bevor der Compiler ihn richtig liest, sind Makros außerdem ein großes Problem für viele Programmierwerkzeuge. Wenn man also Makros benutzt, muß man schlechtere Dienste von Werkzeugen wie Debuggern, Crossreferenz-Werkzeugen und Profilern erwarten."
"Geändert von Kachelator (20.05.04 um 13:13 Uhr)
Chor: "Wir sind der Chor, und wir stimmen zu. Wir stimmen zu, wir stimmen zu, wir stimmen zu."
-
Ja, dieser Problematik bin ich mir bewusst. Ich setze Defines ausschließlich für Konstante ein. Auf solche Scherze wie max( ++a, b ) verzichte ich ohnehin -- ich denke, wer soetwas schreibt, schreit nach Fehlern. Mitdenken ist angesagt. Defines haben halt den großen Vorteil, effizienteren Code zu erzeugen, da ja ein ganzer Speicherzugriff entfällt. Die Zahl, auf die es ankommt, ist bereits im Mnemonic kodiert und muss nicht noch von einer anderen Adresse geladen werden.
Gawayn
-
20.05.04 14:15 #6
- Registriert seit
- Jul 2003
- Ort
- Duisburg (NRW)
- Beiträge
- 1.788
Sicher? Ich habe mich allerdings mit der Problematik in den letzten Jahren nicht mehr so sehr beschäftigt, da ich der Meinung bin, dass aktuelle Compiler durchaus in der Lage sind, auf dieser Ebene Code effizienter zu optimieren als ein menschlicher Programmierer.Mitdenken ist angesagt. Defines haben halt den großen Vorteil, effizienteren Code zu erzeugen, da ja ein ganzer Speicherzugriff entfällt. Die Zahl, auf die es ankommt, ist bereits im Mnemonic kodiert und muss nicht noch von einer anderen Adresse geladen werden.Chor: "Wir sind der Chor, und wir stimmen zu. Wir stimmen zu, wir stimmen zu, wir stimmen zu."
-
23.05.04 23:02 #7
- Registriert seit
- Jul 2003
- Ort
- Duisburg (NRW)
- Beiträge
- 1.788
Ich habe hier gerade zufällig einen zum Thema Optimierung passenden Artikel wiederentdeckt, den ich recht gut finde: Klick
Chor: "Wir sind der Chor, und wir stimmen zu. Wir stimmen zu, wir stimmen zu, wir stimmen zu."
-
Es gibt die Möglichkeit, zumindest in Visual Studio, mit
#define MAXSTRING 256
#define ALSSTRING( x ) printf( #x "\n" )
Man beachte das # innerhalb des Makros. Dadurch wird ein Makro als Text eingesetzt.
Zu anderweitigen Problemen mit Defines ist hier ja schon genug gesagt worden.
Eine andere möglichkeit wären noch enums. Ich erzeuge zum Beispiel Konstanten einer Klasse generell als Member-Enums. Der Default-Namespace bleibt sauber, und Intellisense zeigt mir alle Konstanten an.
-
24.05.04 12:39 #9
- Registriert seit
- Jul 2003
- Ort
- Duisburg (NRW)
- Beiträge
- 1.788
Das printet "MAXSTRING" und nicht "256". #x gibt das Token aus, nicht den Wert desselben. Eignet sich gut, um zu Debugzwecken Variablen zu dumpen, aber nicht, um aus einer Zahl einen String zu machen.Original geschrieben von Endurion
#define MAXSTRING 256
#define ALSSTRING( x ) printf( #x "\n" )Chor: "Wir sind der Chor, und wir stimmen zu. Wir stimmen zu, wir stimmen zu, wir stimmen zu."
-
Hoppla, hab mal wieder zuviel Gutes angenommen.
Stimmt, funktioniert nicht.
Mea culpa grande maxima. Oder so.
Benutz enums - beschwöööööör - enuuuuuuums.
And now to something completely different...
Ähnliche Themen
-
#define string
Von Ozzy Ozborn im Forum C/C++Antworten: 4Letzter Beitrag: 29.01.08, 20:17 -
define Frage
Von CodeFatal im Forum C/C++Antworten: 1Letzter Beitrag: 02.02.06, 16:03 -
define()
Von Pherseus im Forum PHPAntworten: 8Letzter Beitrag: 01.02.06, 09:32 -
#define - Problem
Von Cusco im Forum C/C++Antworten: 10Letzter Beitrag: 31.01.06, 21:55 -
#define
Von kerian im Forum C/C++Antworten: 4Letzter Beitrag: 09.03.04, 07:05





Zitieren
Login






