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

1

29.10.2007, 11:20

LPCTSTR -> const char * nicht möglich

Hallo zusammen,

kleines Problem beim Benutzen von Variablen. Ich hab mir eine Video-Class geschrieben (oder eher abgeschrieben) und wollte jetzt einen Pfad per Variable übergeben. Dabei hat der Compiler gemeckert, daß er den string nicht in LPCTSTR konvertieren kann. Also hab ich mich auf die Suche des Problems gemacht und bin hierdrauf gestoßen. Also die Aussage von AFE-GmdG, daß man mit der Definition mit LPCTSTR und dem TEXT("")-Makro das ganze dann unabhängig von Zeichensatz machen kann.

Klasse hab ich mir gedacht, machen wir das doch. Also hab ich angefangen mein ganzes Programm umzuschreiben und jag jetzt diversen Fehlern nach.

Jetzt bin ich bloß an den Punkt gekommen an dem der Compiler sagt, daß er LPCTSTR nicht nach const char * konvertieren kann. Also gegoogelt und auf was sehr verwirrendes getroffen => lünk
In dem PDF wird auf der 2ten Seite dargelegt, welcher Namen mit welchen Datentyp verbunden wird. Bloß steht da ja, daß LPCTSTR = const char *.

Wieso kann der dann nicht konvertiert werden?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

29.10.2007, 11:38

Schau dir die Definition an:

C-/C++-Quelltext

1
2
3
4
5
#ifdef UNICODE
typedef LPCWSTR PCTSTR, LPCTSTR;
#else
typedef LPCSTR PCTSTR, LPCTSTR, PCUTSTR, LPCUTSTR;
#endif


Es wird also unterschieden zwischen Unicode und Ansi. Wenn du dein Programm mit der Einstellung Unicode compilierst dann entspricht LPCTSTR einem const wchar_t* was natürlich inkompatibel zu const char* ist.

D.h. du kannst folgendes tun: Dein Programm nur für ANSI compilieren. Dann kannst du const char* überall verwenden (LPCTSTR entspricht dann auch const char*) oder du bleibst strikt bei LPCTSTR (const wchar_t*) und unterstützt Unicode.
Dritte Möglichkeit: Sowohl Ansi und Unicode unterstützen. Dabei helfen dir die Macros: TEXT (_T) und TCHAR.
@D13_Dreinig

3

29.10.2007, 12:37

Ah, ok. Dann hab ich die Aussage von der JLI-Seite falsch verstanden oder derjenige hat sich falsch ausgedrückt.

Zitat



oder lieber gleich die passenden Typedefs für const TCHAR*:

Quellcode

1
LPCTSTR Konstante=TEXT("Test");

Das wird nämlich je nach gewählten Zeichensatz richtig überführt").



Naja, dann nehm ich doch Tor Nr. 3. Dann brauch ich mich auch nicht mehr damit rumschlagen.

Vielen Dank für die ausführliche Erklärung und vor allem für die vorgeschlagenen Lösungsansätze.

4

29.10.2007, 23:01

Hmm, nicht ganz dasselbe aber zur Thematik gehörend:

Bin beim umschreiben der Logfile-Klasse in dieser Funktion:

C-/C++-Quelltext

1
2
3
4
5
void LogfileClass::Textout(const TCHAR *LogText)
{
    fstr_logfile_o.write( LogText, sizeof(LogText));
    fflush(m_Logfile);
}


dabei ist fstr_logfile_o std::ofstream

Auch mit unicode möchte die write-Funktion "const char *" haben. Ich hab auch in der ostream.h reingeschaut aber keine Unterscheidung nach Zeichensatz gefunden.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    _Myt& __CLR_OR_THIS_CALL [b]write[/b](const _Elem *_Str,
        streamsize _Count)
        {   // insert _Count characters from array _Str

        _DEBUG_POINTER(_Str);
        ios_base::iostate _State = ios_base::goodbit;
        const sentry _Ok(*this);

        if (!_Ok)
            _State |= ios_base::badbit;
        else
            {   // state okay, insert characters

            _TRY_IO_BEGIN
            if (_Myios::rdbuf()->sputn(_Str, _Count) != _Count)
                _State |= ios_base::badbit;
            _CATCH_IO_END
            }

        _Myios::setstate(_State);
        return (*this);
        }


Definition vom String ist

C-/C++-Quelltext

1
            string _Str(_STRING_INC, '\0');


Wenn ich jetzt zur Definition von _STRING_INC springen will bekomm ich die Meldung, daß das nicht definiert ist.


Was nu?

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

5

29.10.2007, 23:11

hmm... std::iostream is teilweise echt bisschen ungünstig wenn es um Unicode / ANSI geht.
Evtl. std::wiostream wenn es nur um wchar_t geht oder dann std::basic_iostream<TCHAR> um beides zu unterstützen. Ich hab allerdings mit std::wiostream bisher keine allzu tollen Erfahrungen gemacht.

6

30.10.2007, 08:58

Hmm, nach einigen googeln und google-codesearch hab ich den Stream im Header der LogFile-Klasse so im privat-Bereich deklariert:

C-/C++-Quelltext

1
std::basic_iostream<TCHAR> fstr_logfile_o = new std::basic_iostream<TCHAR>


Beim Kompilieren werd ich aber beim Konstruktor der Logfile-Klasse darauf hingewiesen, daß kein geeigneter Standardkonstruktor vorhanden ist.

Hab ich was falsch verstanden?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

7

30.10.2007, 09:42

Wir sind hier nicht bei C# sondern c++. Der Operator new kann nur mit einem Zeiger verwendet werden! Das war Fehler Nummer eins.
Der zweite Fehler: Du musst einen der verfügbaren Konstruktoren verwenden. Ist kein Standardkonstruktor vorhanden benötigst du halt Parameter. Schauen wir also die Deklaration an:

C-/C++-Quelltext

1
explicit basic_iostream(basic_streambuf<charT,traits>* sb);


Er will also einen Zeiger auf ein Objekt des Typs basic_streambuf<TCHAR, char_traits< TCHAR > > haben.
@D13_Dreinig

8

30.10.2007, 18:47

Danke für den Hinweis. Naja, in der Schule haben wir 1,5 Jahre Theorie, 0,5 Jahre Praxis C++ und 1 Jahr C# gemacht :roll:

Aber ich befürchte ich bin an dem Punkt gelandet wo ich sagen muß ich hab keinen Schimmer mehr was ich tun soll oder ich seh das Ganze zu kompliziert. Gut, bei C++ für Spieleprogrammierer wird kurz auf Templates eingegangen, aber nicht soweit, daß es mir helfen könnte oder ich kann die gegebenen Informationen nicht adäquat auswerten. Auch Tutorials dazu hab ich bis jetzt keine gefunden. Wenn jemand was dazu wüßte besonders ausführliche Erläuterungen und Tutorials wär das wirklich Klasse.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

9

30.10.2007, 18:59

Das Objekt will einfach nur einen Puffer in den geschrieben werden kann. Da iostream relativ niedrig in der Hierarchie ist kannst du keine Dateinamen angeben, dafür gibts ofstream, ifstream und fstream. Ggf solltest du darauf zurückgreifen.
@D13_Dreinig

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

10

30.10.2007, 19:46

jetzt wo du es erwähnst -> ich hatte in meinem Post oben auch eigentlich std::basic_fstream<TCHAR> gemeint, hab das nur beim aufschreiben vertauscht gehabt...

Werbeanzeige