was spricht für oder gegen wvsprintf_

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

was spricht für oder gegen wvsprintf_

Beitrag 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 ?
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

---------------------------
PureBasic Debugger
---------------------------
Das mit dem Debugger getestete Executable endete unerwartet.
---------------------------
OK
---------------------------

DAS

hoppla :oops:
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
Zuletzt geändert von bobobo am 13.02.2009 16:57, insgesamt 1-mal geändert.
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
shadow
Beiträge: 189
Registriert: 23.03.2005 17:52
Wohnort: Lübeck

Beitrag 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
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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$
:lol:
Zuletzt geändert von STARGÅTE am 13.02.2009 17:03, insgesamt 2-mal geändert.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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!
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
R4z0r1989
Beiträge: 521
Registriert: 12.06.2005 18:06
Kontaktdaten:

Beitrag von R4z0r1989 »

hab ja schon länger nicht mehr php-programmiert.... aber kann es sein dass dies ähnlich wie in php is?
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Beitrag 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 :D

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  
 
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
Kiffi
Beiträge: 10715
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

@hjbremer: Du stellst ja hier im Board regelmäßig viele interessante
Codes vor (an dieser Stelle ein lange überfälliges :allright: von mir), aber
wenn ich mir das da oben ansehe, dann bleibe ich in diesem Fall lieber bei
meinem umständlichen

Code: Alles auswählen

a$ = "dies ist der " + str(x) + ". Test"
(Da blicke ich wenigstens durch. :D)

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
dige
Beiträge: 1245
Registriert: 08.09.2004 08:53

Beitrag von dige »

Ich würde lieber die PB Boardmittel nehmen um ggf. Unicode und Threadsicherheit zu haben..
"Papa, ich laufe schneller - dann ist es nicht so weit."
Antworten