Seite 1 von 1

PokeS löscht Pointer o_O !

Verfasst: 01.01.2005 04:10
von MVXA
Hallo !
Ich programmiere doch ein bischen an Easy :mrgreen:. Ist sogar ziehmlich weit und ist im Begriff ziehmlich was Leisteun zu können. Nun habe ich aber ein kleines Problem. PokeS() löscht bei mir nach dem Aufruf den Pointer :(.
Hier mal der kleine Code:

Code: Alles auswählen

Structure sMemory
    MemPointer.l
    MemType.l
    MemSize.l
EndStructure

Procedure SetString(strString.s, *MemPoint.sMemory)   
    If *MemPoint\MemSize < Len(strString)
        *MemPoint\MemPointer = ReAllocateMemory(*MemPoint\MemPointer, Len(strString)) 
    EndIf
    PokeS(*MemPoint\MemPointer, strString, Len(strString))
    *MemPoint\MemSize = Len(strString)
    *MemPoint\MemType = #TYPString
EndProcedure
Funktioniert eigentlich ganz herrlich. Aber wenn ich die Funktion so aufrufe:

Code: Alles auswählen

SetString(Stack()\stoDataS, Speicher(CountList(Stack())-lngI))
löscht PokeS aus einem merkwürdigem Grund den *MemPoint :(. PokeS funktioniert noch (denke ich) aber *MemPoint\MemSize = Len(strString) crasht dann. Speicher() ist übrigens auch als sMemory definiert. Wenn ich aber das Len(strString) weg mache funktioniert es weiterhin wunderbar o_O. Hier der ASM Output vom Compiler der Zeile PokeS().... und der darunter:

Code: Alles auswählen

; PokeS(*MemPoint\MemPointer, strString, Len(strString))  
  MOV    eax,dword [esp]
  CALL   PB_Len
  PUSH   eax
  PUSH   dword [esp+4]
  MOV    ebp,dword [esp+12]
  MOV    eax,dword [ebp]
  CALL   PB_PokeS2
; *MemPoint\MemSize = Len(strString)
  MOV    eax,dword [esp]
  CALL   PB_Len
  MOV    ebp,dword [esp+8-4]
  MOV    dword [ebp+8],eax
könnte sich Fred das bitte nochmal ansehen ?
---
Ist jetz bischen Merkwürdig geschrieben, ich hoffe, ihr versteht mich :|

Verfasst: 01.01.2005 07:29
von Deeem2031
Also bei mir läuft das super:

Code: Alles auswählen

#TYPString = 0

Structure sMemory 
  MemPointer.l 
  MemType.l 
  MemSize.l 
EndStructure 

Procedure SetString(strString.s, *MemPoint.sMemory)    
  If *MemPoint\MemSize < Len(strString) 
    *MemPoint\MemPointer = ReAllocateMemory(*MemPoint\MemPointer, Len(strString)) 
  EndIf 
  PokeS(*MemPoint\MemPointer, strString, Len(strString)) 
  *MemPoint\MemSize = Len(strString) 
  *MemPoint\MemType = #TYPString 
EndProcedure

SetString("test", @tmpMem.sMemory)
CallDebugger
Im ASM Code konnte ich auch nichts ungewöhnliches erkennen...

Kleiner Tip: Immer lauffähigen Code posten, das kommt besser an ;)

Verfasst: 01.01.2005 07:42
von MVXA
laufähiger code aber verdammt groß und ich wollt das gesamte nicht umbedingt allzusehr aufpumpen. Ich find des aber trozdem interessant, dass das ganze dann funktioniert, wenn ich die Len() funktion rausnehme...

Verfasst: 01.01.2005 07:45
von Deeem2031
Läuft denn nu mein Code bei dir oder nich?
Außerdem musst du ja nicht deinen ganzen Code posten, musst doch nur die teile die Dafür wichtig sind nehmen..

Verfasst: 01.01.2005 08:30
von MVXA
hab ich nicht getestet da ich gerade mit meinem P1er* einen erbitterten kampf kämpfe. Mensch gegen PHP&MySQL. Entweder funktioniert der MySQL server nid, da er die Datenbanken nicht findet oder der PHP Parser streikt :coderselixir:

*P1er: siehe Profil, da isa abgebildet :freak:

Re: PokeS löscht Pointer o_O !

Verfasst: 04.01.2005 20:30
von Kaeru Gaman
LittleFurz hat geschrieben:PokeS() löscht bei mir nach dem Aufruf den Pointer :(.
bist du sicher, dass er gelöscht wird?

es würde sinn ergeben, wenn er auf das ende des strings gesetzt wird,
damit man den befehl mehrfach fortlaufend benutzen kann.

wenn deine allocated memory dann schon zuende ist, schmiert das natürlich ab...

in der beschreibung von PokeS() steht davon zwar nix, aber ich meine mich zu erinnern,
in irgenteinem kapitel der help mal sowas gelesen zu haben...

lösungsvorschlag: dummy-variable zum puffern verwenden... :wink:

PS: jajaja: PUNKTPUNKTPUNKT :twisted:

Verfasst: 04.01.2005 20:57
von Andreas21
mmm ich würde sagen dein Buffer ist 1 zeichen zu klein. Schau mal in die Help zu PokeS()

Syntax

PokeS(*SpeicherBuffer, Text$ [, Länge])
Beschreibung

Nur für fortgeschrittene Programmierer. Schreibt einen String (einschließlich einer abschließenden '0') an die angegebene Speicheradresse.

Ein optionaler Parameter 'Länge' kann angegeben werden. Dieser gibt die Länge (in Bytes) des Strings an, trotzdem wird nach dem geschriebenen ('poked') String noch eine Null angehängt (d.h. die Angabe von 6 wird 7 Bytes schreiben, 6 für den String, und das letzte Byte wird Null sein).

Unterstützte OS
Windows, AmigaOS, Linux