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

Korowai

unregistriert

1

21.03.2015, 08:13

struct.string in sprintf

Guten Morgen,

ich möchte ein struct.string über sprintf in der winapi ausgeben.

Habe das so versucht:

1. String in der struct deklariert und Wert zugewiesen

C-/C++-Quelltext

1
2
3
struct blabla
    {
        string Wort = "Demokratie";


2.

Quellcode

1
length3 = sprintf(temp3,"= %s", blabla.Wort;


Der Compiler meldet, dass der Typname nicht zulässig ist. Liegts am string, oder am struct?

Habe leider im Netz nichts gefunden, dass mich weiter bringt, irgendwas fehlt, komme aber nicht drauf.

Danke,

2

21.03.2015, 08:25

1. Da fehlt eine Klammer
2. sprintf akzeptiert nur CStrings, ein .c_str () sollte das Problem also lösen.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

21.03.2015, 08:56

3. blabla ist ein Typ und keine konkrete Instanz. Daher ist *der Typname* auch nicht zulässig.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

21.03.2015, 10:34

Außerdem würde ich empfehlen, in C++ mit stringstreams zu arbeiten, sprintf() ist eine Altlast aus C...

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

5

21.03.2015, 10:47

Ja. Ich muss aber auch zugeben, dass ich es manchmal noch benutze. Ist halt wesentlich kürzer %04d zu schreiben als den Stream umständlich zu manipulieren. Boost Format soll auch cool sein.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

21.03.2015, 11:23

Eigentlich müsste man da oben aber halt vor dem Aufruf wohl auf die Größe des Outputbuffers achten etc. und dann isses auf einmal nicht mehr wirklich einfacher. Man sollte zumindest snprintf() verwenden statt printf(). Aber auch das hat keine Typsicherheit und gerade bei der Mischung von C++ string Objekten und C Output Funktionen stellt es die Leute regelmäßig auf, weil sie was durcheinanderbringen, den Compiler mit wilden Casts zum schweigen bringen und mit dem falschen Compiler am falschen OS dann auf einmal bei allen schnellen Testläufen die Small String Optimization greift, gerade an der richtigen Stelle eine 0 im Stackframe eingebaut ist und es dann aussieht, als würde alles funktionieren, das Ding in Wahrheit aber eine tickende Zeitbombe ist...

7

21.03.2015, 12:08

Man munkelt, dass die alten C Funktionen auch etwas schneller sind ("Effektiv C++", glaube ich), aber sie sind halt auch einfach schlechter (s.o.). Und dass es in einem Programmteil, der Strings verarbeitet auf Geschwindigkeit ankommt (jedenfalls in diesem Maße) ist ziemlich ungewöhnlich...
Lieber dumm fragen, als dumm bleiben!

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

8

21.03.2015, 12:41

Es kommt darauf an, was du machst.
Wenn jemand eine große Textdatei verarbeitet, sei es XML oder irgendein anderes Format, dann sind langsame Stringfunktionen nicht schön. Das Argument, dass es bei bei dir bisher ziemlich ungewöhnlich war, rechtfertigt nicht eine gezogene Handbremse, wenn sie zu vermeiden ist. Außerdem widerspricht es der Designphilosophie von C++.

Meiner Meinung nach sind die IO Streams der schlimmste Teil der Standardbibliothek. Geschwindigkeit ist ein Grund, aber es gibt noch viele andere. Zum Beispiel sind sie immer State Behaftet. Das im Hintergrund liegende Klassendesign ist sehr kompliziert. Dateisystem und Stringverarbeitung wurde auf sehr bizarre Weise vermischt.

C-Buffer mit C-Funktionen sind auch nicht gerade schön zu verwenden und sehr fehleranfällig. Ein anständiger Compiler oder die statische Analyse von Visual Studio findet zwar die typischen Fehler, aber Perfekt ist es natürlich nicht. Es gibt sicher bessere Alternativen zu beiden. Ich kenne nicht die Funktionen von Boost, aber wenn ich mir nicht schon einmal selbst einmal die notwendigen String-Funktionen geschrieben hätte, würde ich mir zum Beispiel das anschauen. Mich stört besonders, dass die C++ IO Streams immernoch häufig gerade zu missionarisch als viel besser dargestellt werden.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

21.03.2015, 13:50

Und jetzt... back to Topic?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Korowai

unregistriert

10

21.03.2015, 16:23

Danke für die zahlreichen Rückmeldungen.

Leider kann ich da nicht viel mitreden. Aber könnte mir jemand einen Beispielcode posten, wie ich das bescheidene Ziel erreiche, strings aus Objekten in der winapi auszugeben?

Mit normalen integern etc... bekomme ich das ganz gut hin, aber es scheint, ich müsste mir da noch was in c++ draufschaffen, das ich noch nicht kenne.

Was mich auch interessieren würde: Warum dieses Kuddelmuddel mit dem Umwandeln von chars in strings über sonstwas, welchen Grund hat das?

Falls gewünscht, poste ich auch gerne meine codeschnipsel...

Bis dann und have a nice weekend

Werbeanzeige