Seite 1 von 1
was spricht für oder gegen wvsprintf_
Verfasst: 13.02.2009 16:51
von hjbremer
Irgendwie gefällt mir wvsprintf_ , könnte einem das lästige a$ = "dies ist der " + str(x) + ". Test" vereinfachen.
ein paar Beispiele:
Code: Alles auswählen
test.s{99}
;--------------------------------------------------------
wert = 65 ;setzt AsciiZeichen ein
wvsprintf_(@test, "Das hat %c Ticks gedauert", @wert)
Debug test
;--------------------------------------------------------
wert = 65
wvsprintf_(@test, "Das hat %d Ticks gedauert", @wert)
Debug test
;--------------------------------------------------------
a$ = "65"
wert = @a$
wvsprintf_(@test, "Das hat %s Ticks gedauert", @wert)
Debug test
;--------------------------------------------------------
Was spricht dafür oder dagegen ?
Verfasst: 13.02.2009 16:55
von bobobo
---------------------------
PureBasic Debugger
---------------------------
Das mit dem Debugger getestete Executable endete unerwartet.
---------------------------
OK
---------------------------
DAS
hoppla
ach mal so
Code: Alles auswählen
wert = 65
test.s=""
wvsprintf_(@test, "Das hat %d Ticks gedauert", @wert)
Debug test
dann gez(*) auch ohne böse Meldung (*) sparsyntax
Verfasst: 13.02.2009 16:57
von shadow
Hi,
nette Idee.
Dagegen: Reine Windows-API, also nicht unter anderen Systemen lauffähig.
Dafür: Einen Wrapper in C zu schreiben, der die sprintf-Funktion zur Verfügung stellt. Wäre ein Fall für die String-Standard-Bibliothek.
mfg
Verfasst: 13.02.2009 17:00
von STARGÅTE
es geht noch einfacher:
Code: Alles auswählen
Macro Int(Value) : _DQ_+Str(Value)+_DQ_
EndMacro
Macro _DQ_:"
EndMacro
x = 12453
a$ = "dies ist der Int(x). Test"
Debug a$

Verfasst: 13.02.2009 17:01
von AND51
So eine Funktion kannste dir doch locker selber schreiben! Die wäre dann sogar mindestens genauso schnell würd ich einfach mal behaupten.
Wie auch immer, es gibt mindestens 2 Nachteile:
MSDN hat geschrieben: Security Alert Using this function incorrectly can compromise the security of your application. The string returned in lpOutput is not guaranteed to be NULL-terminated. Also, avoid the use of the %s format, which can lead to a buffer overrun. This can lead to a denial of service if it results in an access violation, or an attacker may inject executable code. Consider using one of the following alternatives: StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintf, StringCchPrintfEx, StringCchVPrintf, or StringCchVPrintfEx. You should review Security Considerations: Windows User Interface before continuing.
MSDN hat geschrieben:lpOutput
[out] Pointer to a buffer to receive the formatted output. The maximum size of the buffer is 1024 bytes.
Der Buffer darf nur 1 KB groß sein, für längere Texte also nicht unbedingt geeignet. Und der ausgegebene String ist nicht nullterminiert, könnte einen IMA ergeben!
Verfasst: 13.02.2009 17:05
von R4z0r1989
hab ja schon länger nicht mehr php-programmiert.... aber kann es sein dass dies ähnlich wie in php is?
Verfasst: 13.02.2009 21:28
von AND51
Ja, in PHP wie auch in Perl gibt es eine
printf Funktion, die formatierten Text ausgibt.
Hier ein Link zu
printf in Perl:
http://de.selfhtml.org/perl/funktionen/ ... htm#printf
Verfasst: 19.02.2009 23:29
von hjbremer
AND51 hat geschrieben:und der ausgegebene String ist nicht nullterminiert, könnte einen IMA ergeben!
im Code steht test.s{99} und das sind 99 Nullchar und davon stehen nun 98 zur Verfügung. Und wem das nicht reicht, der schreibt da halt 1024 hin.
1023 Zeichen sollten für kleinere Infotexte ja wohl reichen.
Und wer Probleme mit dem einhalten dieser kleinen Grenze hat, der benutzt halt eine Structure mit StructureUnion
Außerdem wozu selbst schreiben, wenn es die Funktion schon gibt
Und nun noch ein Beispiel mit mehr Variablen, man kann wie im Beispiel 6 Variablen nehmen, aber auch 8 oder 10.
Hauptsache ImportC stimmt mit dem späteren Aufruf überein.
Code: Alles auswählen
ImportC "msvcrt.lib"
c_vsprintf_(a,b,c,d,e,f) As "_vsprintf"
EndImport
Structure cInfo
StructureUnion
s.s{99}
s0.s{100} ; <-- für die Sicherheitsfanatiker, damit ein NullChar da ist
EndStructureUnion
EndStructure
ausgabe.cInfo
vorgabe.cInfo\s = "Byteposition ist: %d / Hex = $%02X / Dez = %03d / Ascii = %c"
wert1 = 650000
wert2 = 210
wert3 = wert2 ;das muß leider sein, die Variablen müssen existieren
wert4 = wert2
c_vsprintf_(@ausgabe, @vorgabe, @wert1,@wert2,@wert3,@wert4)
Debug ausgabe\s
wert1 = 8956
wert2 = 41
wert3 = wert2
wert4 = wert2
c_vsprintf_(@ausgabe, @vorgabe, @wert1,@wert2,@wert3,@wert4)
Debug ausgabe\s
Verfasst: 19.02.2009 23:42
von Kiffi
@hjbremer: Du stellst ja hier im Board regelmäßig viele interessante
Codes vor (an dieser Stelle ein lange überfälliges

von mir), aber
wenn ich mir das da oben ansehe, dann bleibe ich in diesem Fall lieber bei
meinem umständlichen
(Da blicke ich wenigstens durch.

)
Grüße ... Kiffi
Verfasst: 20.02.2009 08:39
von dige
Ich würde lieber die PB Boardmittel nehmen um ggf. Unicode und Threadsicherheit zu haben..