![]() |
[C] Zeichenfolge aus Funktion zurückgeben
Folgender Code:
Code:
Leider gelingt es mir nicht eine ganz normale Zeichenfolge beliebiger Länmge aus der Funktion zurückzugeben, so dass ich sie mit printf ausgeben kann.
#include <stdio.h>
#include <windows.h> TCHAR* SysErrorMessage(int ErrorCode) { TCHAR szBuf[80]; LPVOID lpMsgBuf; DWORD dw = GetLastError(); FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL ); wsprintf(szBuf, (LPTSTR)lpMsgBuf); LocalFree(lpMsgBuf); return szBuf; } int main(int argc, char* argv[]) { printf(SysErrorMessage(5)); return 0; } Zusatzaufgabe: Wie mache ich das ganze Unicode sicher? |
Re: [C] Zeichenfolge aus Funktion zurückgeben
Benutzt du dort den GNU-C Compiler?
Mh, ohne jetzt eine genaue Ahnung zu haben, würde ich versuchen einen pChar zurückzugeben. Grad mal in die Hilfe zu FormatMessage geguckt: Zitat:
|
Re: [C] Zeichenfolge aus Funktion zurückgeben
Code:
- übergebenen Wert aus "ErrorCode" wird jetzt zur Umwandlung genommen
#include <stdio.h>
#include <windows.h> TCHAR* SysErrorMessage(int ErrorCode) { TCHAR szBuf[80]; LPVOID lpMsgBuf; // DWORD dw = GetLastError(); DWORD dw = ErrorCode; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, NULL ); wsprintf(szBuf, (LPTSTR)lpMsgBuf); LocalFree(lpMsgBuf); return szBuf; } int main(int argc, char* argv[]) { printf("%s", SysErrorMessage(5)); return 0; } - Ausgabe geändert in "printf("%s", SysErrorMessage(5));" Ich würde einen Char-Array als Parameter übergeben, in den du schreibst, oder du holst Speicher innerhalb der Funktion und gibst ihn nach dem Aufrufen wieder frei. :) |
Re: [C] Zeichenfolge aus Funktion zurückgeben
Zitat:
Deine Version kompiliert jetzt zwar, aber es wird nur Datenmüll ausgegeben. Später will ich die Funktion SysErrorMessage auch bei einer Messagebox oder so benutzen, da geht das ja dann nicht mehr mit printf("%s", ...);. |
Re: [C] Zeichenfolge aus Funktion zurückgeben
Ganz grober Schnitzer: szBuf liegt auf dem Stack, ist also nach dem Aufruf der Funktion eigentlich nicht mehr gültig. Wenn der Inhalt noch drin steht, dann hast du Glück. Ein erster Bugfix wäre, static TCHAR szBuf[80]; zu benutzen.
Allerdings ist es in C üblich, den Ergebnisparameter zusammen mit der maximalen Länge zu übergeben, wie ste_ett schon schrieb. |
Re: [C] Zeichenfolge aus Funktion zurückgeben
Also so was:
Code:
Nur bin ich in C noch nicht so tritt fest, wie müsste denn dann die Implementation und der Aufruf aussehen? Und ambesten noch Unicode fähig. Wir wollen ja gleich up to date sein. ;)
void SysErrorMessage(int ErrorCode, char* Buffer, int lenBuffer)
|
Re: [C] Zeichenfolge aus Funktion zurückgeben
Code:
z.B. so :)
#include <stdio.h>
#include <windows.h> DWORD SysErrorMessage(const int ErrorCode, wchar_t* szBuf, const DWORD ArrayLength) { DWORD result = 0; LPVOID lpMsgBuf = NULL; DWORD dw = ErrorCode; result = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPWSTR)&lpMsgBuf, 0, NULL); if (result <= ArrayLength) { wsprintf(szBuf, (LPWSTR)lpMsgBuf); } else { result = (DWORD)-1; // ErrCode } LocalFree(lpMsgBuf); return result; } int main(int argc, char* argv[]) { TCHAR szBuf[80]; ZeroMemory(szBuf, sizeof(szBuf)); if (SysErrorMessage(5, szBuf, sizeof(szBuf) / 2)) { wprintf(L"%s", szBuf); } return 0; } |
Re: [C] Zeichenfolge aus Funktion zurückgeben
Etwa so:
Code:
// Nachtrag: noch erweitert
TCHAR *
SysErrorMessage (DWORD dwErrorCode, TCHAR *pszBuf, int nLenBuf) { FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM | (pszBuf ? FORMAT_MESSAGE_ALLOCATE_BUFFER : 0), NULL, dwErrorCode ? dwErrorCode : GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), pszBuf ? pszBuf : (LPTSTR)&pszBuf, pszBuf ? nLenBuf : 0, NULL); return pszBuf; } |
Re: [C] Zeichenfolge aus Funktion zurückgeben
Ah, ja die Version von ste_ett funktioniert und ich habe sie verstanden. Aber wäre es nicht sinnvoll die benötigte Länge des Buffers zurückzugeben, so dass man im Bedarfsfall entsprechend mehr Speicher reservieren kann? aslo:
Code:
Das ist jetzt Delphi Pseudocode.
len = SysErrorMessage(5, NULL, 0);
GetMem(szBuff, len) SysErrorMessage(5,szBuf, len); FreeMem(szBuf); Und wie kann ich den Code in eine eigene Quellcodedatei auslagern? Ich habe ihn in eine eigene Datei kopiert MpuTools.cpp und eine entsprechende headerdatei angelegt: MpuTools.h, die ich dann mit include eingebunden habe:
Code:
Das mag der Compiler jedoch nicht:
#include <stdio.h>
#include <windows.h> #include "MpuTools.h" int main(int argc, char* argv[]) { TCHAR szBuf[80]; ZeroMemory(szBuf, sizeof(szBuf)); if (SysErrorMessage(5, szBuf, sizeof(szBuf)) >0) { wprintf(L"%s", szBuf); MessageBoxW(0, szBuf, L"Test", 0); } return 0; } Zitat:
Zitat:
|
Re: [C] Zeichenfolge aus Funktion zurückgeben
OK, das Problem ist gelöst: Ich musste noch die dateien zum Projekt hinzufügen. Ich dachte das passiert irgendwie automatisch, wenn ich die entsprechende Header-Datei einbinde. Damit wäre alles geklärt. Besten Dank für eure Hilfe.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:22 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz