Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

VuuRWerK

Frischling

Beiträge: 59

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

21

28.04.2009, 19:03

Ok, wir kommen hier vom hundertsten ins tausende das bringt doch nix. Der Threadersteller hat 2 Lösungsvorschläge erhalten und auf Deine optimierte Version warte ich immernoch ;)

Gut Schuß
VuuRWerK ;)
http://german-bash.org/212445
"C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off." - Bjarne Stroustrup

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

22

28.04.2009, 19:10

Zitat von »"VuuRWerK"«

Der Threadersteller hat 2 Lösungsvorschläge erhalten und auf Deine optimierte Version warte ich immernoch ;)


Die bekommst du wenn ich zu viel Zeit habe! :P Ich bin halt ein beschäftigter Mann! ;-)

23

28.04.2009, 19:19

Zitat von »"VuuRWerK"«

Ok, wir kommen hier vom hundertsten ins tausende das bringt doch nix.
Doch doch, es bringt schon was, am Rande darauf hinzuweisen, dass die Portabilität nicht unter allen Umständen gewährleistet ist.

Zitat von »"VuuRWerK"«

Wieso ist für den Test eine Funktion geeigneter? Den Test hätte ich wahrscheinlich sowieso gleich als Ausdruck ins if geschrieben und habe die #define variante wieder nur der lesbarkeithalber benutzt. Dennoch würde mich interessieren wieso eine Funktion besser gewesen wäre?
Die üblichen Probleme mit dem Präprozessor, der nur dumme Textersetzungen macht. Zum Beispiel hast du dein c nicht geklammert, was bei gewissen Operatoren zu Problemen bezüglich Priorität führen kann. Das ist hier vielleicht weniger relevant, da diese Operatoren nicht oft in Zusammenhang mit Zeichen verwendet werden, aber grundsätzlich sollte man das bedenken. Gleichzeitig sollte man auch wissen, dass man für das Makro bereits zwei Klammerebenen benötigt, nur um die Operatorpriorität sicherzustellen, während in der Funktion keine einzige Klammer nötig ist.

Und rate mal, was passiert, wenn du Folgendes hast:

C-/C++-Quelltext

1
2
char ch = 'y';
int b = is_alpha(++ch);

Das Schlüsselwort inline sorgt dafür, dass auch Funktionen direkt in den Quelltext kopiert werden können, womit ein weiterer Punkt entfällt. In C++ käme zusätzlich noch die Typsicherheit dazu, die in C nicht derart zentral ist. Alle diese Probleme hast du mit Funktionen nicht. Im Gegenzug hat dein Makro hier überhaupt keinen Vorteil.

VuuRWerK

Frischling

Beiträge: 59

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

24

28.04.2009, 21:27

Vielen Dank für Deine Antwort.

Die Problematik mit der Klammerung ist mir bekannt genauso das Problem mit dem increment (y wird 2mal hochgezählt). Wenn ich C schreibe welches eventuell wiederverwendet wird dann klammere ich bei Makros ebenfalls die Variablen. Jedoch hatte ich beim wählen des Makros 2 Sachen im Hinterkopf. 1. Ein Funktionsaufruf innerhalb einer Schleife bedeutet etwas mehr Aufwand was den Call-Stack anbelangt (yield, Schleife verlassen, Funktion aufrufen, zurückkehren). Die andere Sache ist: Mir ist zu Ohren gekommen dass das verwenden von inline heutzutage keine/kaum noch Auswirkungen hat. Mehr Erfolg würde wohl an dieser Stelle forceinline bringen jedoch ist dies nicht standardisiert.

Hast Du vielleicht ein Beispiel auf welcher Plattform wo ASCII anders umgesetzt ist als bekannt?

Gut Schuß
VuuRWerK ;)
http://german-bash.org/212445
"C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off." - Bjarne Stroustrup

25

28.04.2009, 21:31

Zitat von »"VuuRWerK"«

Hast Du vielleicht ein Beispiel auf welcher Plattform wo ASCII anders umgesetzt ist als bekannt?

wenn, dann wirdf nicht ASCII anders umgesetzt, sondern einfach ein anderer Zeichensatz (klassisches, wenn auch afaik seltenes beispiel: EBCDIC) verwendet ;)

VuuRWerK

Frischling

Beiträge: 59

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

26

28.04.2009, 21:38

Ach so war das gemeint, gut dann ist das natürlich was anderes. Dann hätte der Threadersteller aber vllt auch geschrieben, es muss in ASCII sowie auch in EBCDIC funktionieren.

Vielen Dank für die Glühbirne :)

Gut Schuß
VuuRWerK ;)
http://german-bash.org/212445
"C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off." - Bjarne Stroustrup

27

28.04.2009, 22:16

Zitat von »"VuuRWerK"«

(y wird 2mal hochgezählt).
Nein. Zwischen 2 und 4 Mal. :p

Zitat von »"VuuRWerK"«

Die andere Sache ist: Mir ist zu Ohren gekommen dass das verwenden von inline heutzutage keine/kaum noch Auswirkungen hat. Mehr Erfolg würde wohl an dieser Stelle forceinline bringen jedoch ist dies nicht standardisiert.
Was denkst du, wieso inline nicht mehr viele Auswirkungen hat? Richtig, weil Compiler solche Dinge oft besser optimieren können als Programmierer. Und wenn du bei einem guten Compiler eine so kleine Funktion schreibst und sogar noch das inline-Schlüsselwort als Empfehlung hinsetzt, ist es sehr wahrscheinlich, dass die Funktion auch tatsächlich inline wird. Dafür lohnen sich die Vorteile allemal.

BlackSnake

Community-Fossil

Beiträge: 1 549

Beruf: Student

  • Private Nachricht senden

28

08.05.2009, 11:42

forceinline muss auch nicht gewünschten ziel führen:

Zitat


You cannot force the compiler to inline a particular function, even with the __forceinline keyword.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

29

08.05.2009, 12:39

Das sollte relativ effizient gehen. Da nur Buchstaben gelöscht werden kann man einfach in place arbeiten...

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
inline bool specialCharacter(char c)
{
  return c == 'ä' || c == 'Ä' ||
         c == 'ö' || c == 'Ö' || 
         c == 'ü' || c == 'Ü' ||
         c == 'ß' || c == ' ';
}


char* clearString(char* str)
{
  for (char* i = str,* c = str; specialCharacter(*c) ? *c : *i++ = *c; ++c);
  return str;
}


int main(int argc, const char* argv[])
{
  char string[] = "abcdefg   öäüaddßfafä";
  clearString(string);
  return 0;
}

30

09.05.2009, 01:24

Zitat von »"BlackSnake"«

forceinline muss auch nicht gewünschten ziel führen:

Zitat


You cannot force the compiler to inline a particular function, even with the __forceinline keyword.

Rekursive und virtuelle Funktionen sind sowieso unmöglich inlinebar und auch ansosnten wäre es interessant, ob inline Funktionen z.B. im Header implementiert sein müssen, oder sonst nur in der cpp Datei, in der sie implementiert sind, ge-inlined werden können, oder ob der Linker später für das inlinen verantwortlich ist. (Denn der Compiler dürfte da ja arge Probleme haben, in cpp 1 eine Funktion aus cpp 2 zu inlinen, die er noch gar nicht kompiliert hat)
Lieber dumm fragen, als dumm bleiben!

Werbeanzeige