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

X-treme

Frischling

Beiträge: 5

Wohnort: Niederösterreich

  • Private Nachricht senden

11

08.05.2006, 22:50

Zitat von »"$nooc"«

Textout("size='& Size & "'>");

Wenn ich das richtig verstanden habe, willst du mehrere Strings miteinander verknüpfen. Unter C kannst du aber keine Strings(char-Arrays) einfach durch Schreiben eines "&" miteinander verknüpfen. Um Strings wirklich verknüpfen zu können, musst du für jeden Teilstring eine Instanz der Klasse "std::string" erstellen und diese dann miteinander verküpfen. Zum Schluss speicherst du alles noch in eine weitere std::string-Instanz und übergibst das char-Array dieser Instanz der Funktion "Textout":

char pTemp[100];

Textout(std::string(std::string("size='") + std::string(itoa(Size, pTemp, 10)) + std::string("'>")).data());
... alles verstanden? :huhu:

... nochmal langsam:

(1) Teilstrings aus allen Teilen, die du verknüpfen willst, erstellen
std::string("size='")
std::string(itoa(Size, pTemp, 10)) ...itoa konvertiert eine Ganzzahl in einen String
std::string("'>")

(2) alles in eine weitere Instanz reinhauen, die den Ergebnisstring enthalten soll(mit "+" miteinander verknüpfen)
std::string(std::string("size='") + std::string(itoa(Size, pTemp, 10)) + std::string("'>"))

(3) da die Funktion Textout ein char-Array haben will, liefern wir ihr das
std::string(...wie oben...).data()

(4) dann alles noch in die Funktion "Textout" packen und ... FERTIG!

...wäre eine Möglichkeit, mit der Variante im Buch gehts aber kürzer und übersichtlicher ;)

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

12

08.05.2006, 22:54

man könnte sich auch (überflüssigerweise) eine eigene Stringklasse schreiben, auf der der Operator & definiert ist. Das ist übersichtlich und man lernt viel dabei, nur recht überflüssig.

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

13

09.05.2006, 08:22

@ X-treme:
jap, ich denke ich hab das verstanden :)

nun ja, ich habe etwas vorweggegriffen und mich an ein Win32 fenster gemacht.. hier habe ich jetzt ein ähnliches problem:

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
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// Hauptprogramm

//

int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrevInst,
                    LPSTR lpcmdline, int ncmdshow)
{
  WNDCLASSEX windowclass; // Struktur für Fenstereigenschaften

  HWND       hWnd;        // Fenster-Handle

  MSG        message;     // Nachricht


  // Der Klassen-Name des Fensters ist frei wählbar

  const char szClassName[] = "Erstes Fenster";


//....


// Klassenname angeben

  windowclass.lpszClassName = szClassName;


//....

//...


// Das Fenster erzeugen

  hWnd = CreateWindowEx (NULL,
                         szClassName,
                         "Das erste Fenster!",
                         WS_OVERLAPPEDWINDOW | WS_VISIBLE,
                         100, 100,
                         300, 250,
                         NULL,
                         NULL,
                         hInst,
                         NULL);

//....

//...


Fehlermeldung:

Zitat


Fehler 1 error C2440: 'Initialisierung': 'const char [10]' kann nicht in 'LPCTSTR' konvertiert werden c:\dokumente und einstellungen\$ilentsnooc\eigene dateien\ms visual c++\c++\c++ für spieleprogrammierer\kapitel 10\windows grundgerüst\windows grundgerüst\main.cpp 21

Fehler 2 error C2664: 'CreateWindowExW': Konvertierung des Parameters 3 von 'const char [19]' in 'LPCWSTR' nicht möglich c:\dokumente und einstellungen\$ilentsnooc\eigene dateien\ms visual c++\c++\c++ für spieleprogrammierer\kapitel 10\windows grundgerüst\windows grundgerüst\main.cpp 70


also.. das nervt mich jetz schon ... so stehts im buch, und gehn tuts nicht..
wenn ich szClassName als 'LPCWSTR' angebe, dann funktioniert das halt auch nicht..
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

14

09.05.2006, 09:29

ein (LPCTSTR) vor dem ", in beiden Fällen, sowas gehört aber zum Grundwissen und fragen braucht man für sowas auch nicht wirklich.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
  hWnd = CreateWindowEx (NULL,
                         (LPCTSTR) szClassName,
                         (LPCTSTR)("Das erste Fenster!"),
                         WS_OVERLAPPEDWINDOW | WS_VISIBLE,
                         100, 100,
                         300, 250,
                         NULL,
                         NULL,
                         hInst,
                         NULL);

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

15

09.05.2006, 15:40

Bei der Verwendung von UNICODE wird CreateWindowEx als CreateWindowExW definiert. Dadurch erwartet die Funktion natürlich auch UNICODE (wchar_t) und nicht ANSI (char). Wie man einen UNICODE-String schreibt hatte ich schon gepostet.

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

16

09.05.2006, 17:12

hm.. ja ... ich sehs ein... aber

dasm it dem casting (das ist doch casting nicht?) hab ich dann wohl nicht so ganz gecheckt...

und... ob ihr jetzt glaubt oder nicht ... ich bin noch immer ein anfänger :D

ich steig ja gerade erst ein in C++ ... hab halt noch keine routine usw.
ich hab nur (minimale) vorkenntnisse in visual basic

also... nehmen wir an ich hab eine funktion (namens Funktion()) die einen wchar_t als parmeter erwartet...

wenn ich der jetzt eine variable vom typ wchar_t übergeben will.. wie schreibe ich das?

wenn ich sage:

C-/C++-Quelltext

1
wchar_t MeineVar = "hallo";


dann geht das ja nicht...

wie schreibe ich das korrekt an?

so:

C-/C++-Quelltext

1
wchar_t MeineVar = (LPCTSTR)("Hallo");


oder wie?

sorry wenn meine fragen nerven weil sie vllt. auf basiswissen stoßen...

... danke für eure hilfe :)
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

17

09.05.2006, 17:37

C-/C++-Quelltext

1
2
wchar_t MeineVar = L'H' // auch wchar_t ist nur ein Zeichen!

wchar_t MeinString[] = L"Hallo!" // das L macht den Unterschied von char zu wchar_t!

das hatte ich auch schonmal geschrieben :rolleyes:

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

18

09.05.2006, 18:55

Also

1.) Zeichenketten (Zeichen Arrays) und Strings sind was total anderes, zumindest in C. Wenn du sowas machen willst: MeinString = "Hi"; dann musst du STRINGS nehmen (z.B. string aus <string>). Wenn du aber Arrays nehemen willst, z.B. char Arr[8], dann solltest du Funkrionen wie strcpy oder wcscpy nutzen. Bei Arrays kann man das nicht so machen, da der dumme Computer nicht weiss das er in jedes Kästchen einen Buchstaben packen soll. Das sagen wir ihm mit strcpy(...). Bei der Initialisierung eines Arrays funktioniert das, das wird dich jetzt aber nur verwirren, nutz einfach erstmal immer strcpy und strcmp um Strings zu manipulieren und zu vergleichen.
2.) Fang mit Konsole an. Wie ich sehe, kannst du nicht mal korrekt mit arrays umgehen, das soll lediglich eine Feststellung sein, keine Beleidigung.
3.) Vor UNICODE kommt immer ein L Weil: L = Long = 16Bit = Unicode. Damit man einen "normalen String" mit 8Bit und einen Unicoe String unterscheiden kann, kommt das L mit davor.

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

19

09.05.2006, 19:59

@grek40:
danke danke ;)

@koschka:
hm.. ja ich tu mir mit arrays noch ein wenig schwer.. geb ich zu..

ähm.. es verwirrt mich nur dass der compiler es so stark unterscheidet (also zw. char und wchar_t) ... weil .. so gesehen ist es ja beides das gleich nicht? dr unterschied ist ja nur dass wchar_t 2byte bietet anstatt nur einem byte wie bei einem char.
mein problem war lediglich das casten, oder konvertieren, wie man auch immer dazu sagt in c++ ... ;p

aber eine frage hab ich da schon...
ACii ist ja veraltet.. UNICODE ist ja die erneuerung. d.h. demnach wäre es angebracht nur mehr UNICODE zu verwenden (oder liege ich da falsch?).. naja.. wenn dem so ist, dann wäre das ja speicherverbrauch oder? ich brauch ja für eine variable die "Hallo" enthält keine 2byte oder? auf dauer könnte das ja wohl zu speicherverlust führen? oder liege ich da komplett falsch? (ich kann das halt noch überhaupt nicht einschätzen ab wann man von "speicherverschwendung" reden kann :D)
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

20

09.05.2006, 20:36

UNICODE kann bist zu 65.000 Zeichen darstellen. Auf der Welt exestieren ca. 10000 Schriftzeichen (chinesische u.s.w.) Den Rest kann man für Sonderzeichen- und Steuerzeichen benutzen.

Das ASCII Format hat 7Bit, also 128 mgl. Zeichen. Darin enthalten sind die wichtigsten Steuerzeichen und das lateinische Alphabet (also a...z u.s.w.).

Das ANSI Format hat 8Bit, also 256 mgl. Zeichen. Darin enthalten sind die gleichen Zeichen wie im ASCII und Umlaute, sowie Zeichen mit hochkomma (oder wie das auch immer heisst) (ê u.s.w.). Man merkte das das ASCII - (American Standard Code for Information Interchange) für einige Sprachen wie z.B. Deutsch nicht gut genug war, weil zu klein. Deswegen benutzte man das ANSI ISO Format Langezeit.

Das UNICODE Format wird heutztage schon weltweit genutzt, man schaue sich nur alle Webseiten an, dort ist es total normal das man eine UTF16 Kodierung wählt, also Unicode. Jede Webite und auch jeder Browser kann das darstellen, es ist also nicht so dass wir hier was exotisches machen.

Wir gehen mal davon aus, du bist ein etablierter Programmmierer in einer Firma, diese will Software für den internationalen Markt entwickeln, dann wird diese sicherlich Unicode verwenden und nicht ANSI-ISO.

Das Unicode zwo Bytes braucht, ist logisch weil es auch einen größeren Bereich hat, und wir so alle mgl. Zeichen darstelllen können. Bei unseren heutigen Speicherkapazitäten ist es total wurst, wie viele Bytes wir an einen String verschwenden, besonders da der Rechner meist sowie so nur Adressen braucht und nicht den String an sich (siehe Pointer). Der Rechner braucht also immer einen Wert fester Länger, eine Adresse auf den Stringanfang. Er weiss wo der String zuende ist (bei "0").
Genau DAS machst du auch wenn du sagst wchar_t* hi = L"HI". Der String HI wird irgendwo im Code hinterlegt (meist Datensegment) und die Variable hi erhällt die Adresse (* oder []). DESWEGEN klappt das auch.
Aber es klappt nicht wenn du sowas schreibst: "hi2 == hi" Den du würdest Adressen vergleichen, was totaler nonsense ist, da du ja die Strings vergleichen willst.

wchar_t ist in C++ ein fester Typ. Genauso ist char auch ein Typ. Wenn der Compiler nicht unterscheiden würde, wäre das fatal!
Ein Beispiel:

Char Code: |x| = Ein Byte
Dies entspeicht hallo

Quellcode

1
 |h|a|l|l|o|0|


Uni Code: |x| = Ein Byte
Dies entspeicht hallo

Quellcode

1
 |0|h|0|a|0|l|0|l|0|o|0|0|


Wenn ich den Unicode als ANSI Char dekodieren würde:
käme:

0h0a0l0l0o00

Was durchaus nur Murks ist und keein ordentliches Hallo.

Werbeanzeige