Seite 2 von 2

Verfasst: 27.11.2008 00:40
von cxAlex
@PMV:

Kommt drauf an wie viele Fehler man macht ^^.

Ansonnst hast schon recht. Kommt immer auf den Anwendungsfall an.

Verfasst: 27.11.2008 00:59
von freak
> Es ist doch die Sache eines jeden einzelnen wie und ob er seinen Code optimiert. Manchmal macht es was aus ob eine Funktion 40 anstatt 50 us zum Ausführen braucht.

Wenn der Preis dafür ist das das Programm abstürzt (PB 4.20), dann hat man definitv was falsch gemacht ;)
Wenn man das ganze dann auch noch als Tip postet sollte man sich über solche "Optimierungen" doppelt Gedanken machen.
Sinnloses Optimieren richtet meistens mehr Schaden an als es nützt.

Verfasst: 27.11.2008 20:32
von Josef Sniatecki
AND51 hat geschrieben:Also ich habe es unter Vista mit PB 4.30 BETA 4 getestet.

Als ich dann von Unicode auf ASCII wechselte, merkte ich, dass kein String ausgegeben wird. Die Lösung war, in der FormatMessage_() Zeile den die angegebene Buffergröße um 1 bzw 2 Byte zu verringern.

@ Josef:
Der Sinn von {1<<16} ist ja gerade, dass man sich die Space()-Funktion sparen kann. Benutzt du auch 4.20?

Erklärung, die mir hinterher doch überflüssig erscheint, weil ich glaube, dass Josef das schon weiß, die mir aber zu schade ist, sie wieder zu löschen:
Dies bewirkt, dass ein String mit fester Länge ("fixed string") definiert wird, der sozusagen "von Hause aus" den benötigten Speicherplatz bereithält. Es stehen zu Anfang 1<<16, also 65536 Nullen im String. Space() bräuchte allerdings erst etwas Zeit um den String manuell mit Leerzeichen zu füllen.
Ja ich weiß schon, was fixed strings sind und was "{...}" bedeutet,
trotzdem funktioniert es bei mir nur durch "space(...)" bei mir.
Noch was: Habe 4.20

So, damit wäre das mal geklärt :wink:

Verfasst: 27.11.2008 20:36
von PMV
Josef Sniatecki hat geschrieben:Ja ich weiß schon, was fixed strings sind und was "{...}" bedeutet,
trotzdem funktioniert es bei mir nur durch "space(...)" bei mir.
Noch was: Habe 4.20

So, damit wäre das mal geklärt :wink:
PB 4.20 ... echt? ... hät ich dir auch sagen können :mrgreen:
... ich würd dir mal empfehlen alles in einem Thread zu lesen, in dem du
aktiv bist. <)

MFG PMV

Verfasst: 27.11.2008 20:43
von Josef Sniatecki
PMV hat geschrieben:
Josef Sniatecki hat geschrieben:Ja ich weiß schon, was fixed strings sind und was "{...}" bedeutet,
trotzdem funktioniert es bei mir nur durch "space(...)" bei mir.
Noch was: Habe 4.20

So, damit wäre das mal geklärt :wink:
PB 4.20 ... echt? ... hät ich dir auch sagen können :mrgreen:
... ich würd dir mal empfehlen alles in einem Thread zu lesen, in dem du
aktiv bist. <)

MFG PMV
Ich weiß <) , aber ich wollte halt nur gezielt einen älteren Beitrag
antworten. Die weiteren sind ja schon fast offTopic (genauso wie dieser).

Gruß Josef

Verfasst: 27.11.2008 20:51
von PMV
Dann wüsstest du, dass Space() nicht die einzige Alternative ist.
Oder du hast die anderen Beiträge nicht verstanden ... die sich alle auf
den selben Post bezogen, den Zitierten von dir von AND51. :wink:

Mach mal aus "1<<16" ne 1000 oder noch was kleineres und änder das in
FormatMessage_() auch um. :D


MFG PMV

Verfasst: 27.11.2008 22:01
von AND51
Hallo!

Bin später zum Antworten gekommen, als ich dachte. Auf geht's:

> 64k für eine Fehlermeldung ist totaler Overkill
Das stimmt. Da habe ich vorher nicht dran gedacht. Ich habe lediglich den Hinweis auf der MSDN Seite gesehen, FormatMessage_() hat 64 KB als maximales Buffer-Maximum. Ich werde das in Kürze ändern.

> typische Optimierungswahn
Nun, ist es nicht schneller, einen festen String zu allokieren, statt einen 'dynamischen'; dessen Speicher erst vergrößert werden muss, um n Spaces aufzunehmen? Das war mein Gedanke, den ich dabei hatte. Ich wollte mir im Grunde lediglich das Space(1000) sparen. Das habe ich in einem PB-Tutorial gelesen, welches als Alternative zu

Code: Alles auswählen

buffer$=Space(1000)
; und
*buffer=AllocateMemory(1000)
das hier empfohlen hat:

Code: Alles auswählen

buffer.s{1000}
Find ich rech raffiniert.

> Wenn der Preis dafür ist das das Programm abstürzt (PB 4.20)
Nun, dass PB 4.20 Probleme mit solch großen Fixed-Strings hat, war mir nicht bewusst. Wie dem auch sei, ich werde den Buffer verkleinern.


@ All:
Vielen Dank für eure zahlreichen Posts und Rückmeldungen! Ich fand diese Prozedur eine gute Warmhalte-Übung, da ich seit Wochen leider nicht mehr in PB-Programmiere, weil ich z. Zt. nur wenig Zeit, aber noch weniger Ideen habe. :cry:

Verfasst: 06.12.2008 14:40
von mk-soft
Verwende ich schon seit langen...

Funktioniert so auch mit Unicode ohne irgendwelchen Speicher zu allokieren.

Code: Alles auswählen

Procedure.s FormatMessage(ErrorNumber.l)

  Protected *Buffer, len, result.s
  
  len = FormatMessage_(#FORMAT_MESSAGE_ALLOCATE_BUFFER|#FORMAT_MESSAGE_FROM_SYSTEM,0,ErrorNumber,0,@*Buffer,0,0)
  If len
    result = PeekS(*Buffer, len - 2)
    LocalFree_(*Buffer)
    ProcedureReturn result
  Else
    ProcedureReturn "Errorcode: " + Hex(ErrorNumber)
  EndIf
  
EndProcedure

Debug FormatMessage($8000ffff)

FF :wink:

Verfasst: 06.12.2008 17:42
von Josef Sniatecki
Danke. Einen API-Guru muss man haben. :wink: