invalid conversion from LPCSTR to char



  • Hallo,

    ich versuche in einer routine welche mit Serialports arbeitet einen für CreateFileA() gültigen Port-Bezeichner zu übergeben welcher laut MS-Doku vom Typ "LPCSTR" sein muss.

    Um mal ganz einfach anzufangen habe ich es so gemacht:

    LPCSTR gszPort = new TCHAR(50);
    sprintf(gszPort, "\\\\.\\%s", "COM12");
    

    Da meldet der Compiler (MinGW) jedoch:

    error: invalid conversion from 'LPCSTR' {aka 'const char*'} to 'char*' [-fpermissive]|
    


  • @Knackwurst Das C in LPCSTR steht für const.

    Da du den String ja beschreibst, willst das aber nicht.

    Nimm LPSTR.



  • Danke, warum schreibt man nicht eigentlich gleich "const char *" oder "static const char *" ?


  • Mod

    @Knackwurst sagte in invalid conversion from LPCSTR to char:

    Danke, warum schreibt man nicht eigentlich gleich "const char *" oder "static const char *" ?

    Weil LPCSTR & Co. eben die vorgegebenen Typen sind, die von der API erwartet werden, const char* & Co. aber eben nicht. Die mögen zwar in 99.9% aller Fälle synonym füreinander sein, müssen sie aber nicht. Ein const char* darf theoretisch auch was anderes sein als ein LPCSTR sein und in solchen Fällen muss LPCSTR entsprechend eine andere Definition haben, sonst geht die Kommunikation mit der API schief.

    Bei LPCSTR ist es noch einigermaßen unrealistisch, dass es jemals einen Fall gibt, wo der char nicht kompatibel zu den Erwartungen der Windows-API ist, weil es Windows meines Wissens nach nur für Systeme mit 8-Bit Bytes gibt (Es gibt aber an sich Systeme auf der Welt mit breiteren Bytes und für die gibt es auch C++!), aber wenn man zu breiteren Zeichenencodings geht, wie z.B. LPTCSTR oder LPTWSTR ist es schon realistischer, dass sich da die Erwartungen der Winapi nicht unbedingt mit der Compilerdefinition eines wchar_t decken müssen.

    Und Wenn ich schon LPTCSTR erwähne: TCHAR ist ja sogar explizit jeweils was anderes, je nachdem, ob man nun für Unicode oder für ANSI Codierung übersetzt.



  • @DirkB sagte in invalid conversion from LPCSTR to char:

    @Knackwurst Das C in LPCSTR steht für const.

    Ganz wichtig auch zu wissen, dass es sich um einen Long Pointer handelt, sonst könnte man meinen, der dürfe nur auf das aktuelle 16-Bit Datensegment zeigen.... sorry, konnt ich mir nicht verkneifen 😄



  • Vielen Dank, wieder was gelernt!!!



  • @Finnegan Man soll ja an die Zukunft denken. Vielleicht hat ja irgendwann mal jemand mehr Speicher als die 640k


  • Mod

    Es ist aber ein weiteres gutes Beispiel für den Sinn der Typedefs. Als diese Spezifikationen Anno 198x geschrieben wurden, war das aus dem gesagten Grund meist kein typedef LPCSTR const char *, sondern halt typedef LPCSTR const char * far. Und obwohl das heute meistens anders sein dürfte, kann Code von damals, der LPCSTR benutzt, theoretisch heute noch übersetzt werden (abgesehen von 100 anderen Sachen, die sich an den Feinheiten der Sprache geändert haben).


Anmelden zum Antworten