Krise mit IMA bei AllocateMemory()

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Krise mit IMA bei AllocateMemory()

Beitrag von gnasen »

Hallo, ich habe mal wieder ein (scheinbar) triviales Problem, was mich sehr beschäftigt:

Code: Alles auswählen

Procedure SendString(ConID.l, text.s, typus.l)
  
  Protected tempTypus.s = Str(typus)
  
  If Len(tempTypus) < 2
    tempTypus = "0" + tempTypus
  EndIf
  
  
  If ConID
    
 
    Protected Outtext.s = ""

    Outtext = "<" + ">" + tempTypus + text + "<\>"
    
    Protected laenge.l = Len(Outtext)
    
    Protected *buffer = AllocateMemory(laenge)
    PokeS(*buffer, Outtext, Len(Outtext))
    SendNetworkData(ConID, *buffer, MemorySize(*buffer))
    
    FreeMemory(*buffer)
    
    Debug "Send: " + Outtext
    
  EndIf 
  
EndProcedure
Hierbei handelt es sich um meine Prozedur zum verschicken von Nachrichten (In Tags etc. zum Buffern beim Empfänger).

Allerdings tritt ab und an ein IMA in dieser Zeile auf

Code: Alles auswählen

Protected *buffer = AllocateMemory(laenge)
Ich hab allerdings keine Ahnung warum? Was könnte der Fehler sein?

Bespiel: SendString(ServerID, "2;4;3;0;|", 13)

ergibt manchmal einen Fehler
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

bin mir nich sicher, aber probiermal:
(alllocate laenge +1, für den nullchar, und außerdem nur buffer tun wenn buffer gut)

Code: Alles auswählen

    Protected *buffer = AllocateMemory(laenge+1)
    If *buffer
      PokeS(*buffer, Outtext, Len(Outtext))
      SendNetworkData(ConID, *buffer, MemorySize(*buffer))
   
      FreeMemory(*buffer)
   
      Debug "Send: " + Outtext
    EndIf
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Krise mit IMA bei AllocateMemory()

Beitrag von Kiffi »

ich weiß zwar nicht, warum der IMA auftritt und in letzter Konsequenz müsste
man untersuchen, warum es so ist, aber ich persönlich würde es unter
Umgehung von AllocateMemory wie folgt machen:

Code: Alles auswählen

Procedure SendString(ConID.l, text.s, typus.l)
  [...]
    Outtext = "<" + ">" + tempTypus + text + "<\>"
    
    SendNetworkData(ConID, @Outtext, Len(Outtext))
  [...]
EndProcedure
Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag von gnasen »

Mit dem Nullchar hatte ich auch schon getestet, allerdings änderte dies nichts (hatte schon vieles getestet), aber Kiffi, deine Lösung ist so einfach wie genial (und ich Blind & Doof :( )

Danke :allright:

PS: Aber warum dieser IMA... Es ergibt irgendwie keinen Sinn...
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

gnasen hat geschrieben: PS: Aber warum dieser IMA... Es ergibt irgendwie keinen Sinn...
Der IMA hat auch nix mit dem Codeausschnitt zutun, der braut sich ganz woanders in deinem Code zusammen.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Ich hätte noch eine verkürzte Version anzubieten, die auch mit Unicode
funktioniert.

Code: Alles auswählen

Procedure SendString(ConID.l, text.s, typus.l)
  
  If ConID
    Protected Outtext.s = "<>" + RSet(Str(typus), 2, "0") + text + "<\>"
    Protected laenge.l = Len(Outtext)
    
    SendNetworkData(ConID, @Outtext, laenge * SizeOf(Character))
    
    Debug "Send: " + Outtext
  EndIf
EndProcedure
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag von gnasen »

na Prima, der Debugger sagt Zeile 77 in der und der Codedatei und das passt nicht?

Trotzdem, mit Kiffis Variante läufts, also musses da liegen....

Und noch so als Info, keine Threads oder so, die da reinpfuschen könnten!
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Warum eigentlich kein SendNetworkString() ?
Das sollte sogar von Haus aus mit Unicode klar kommen.

Ausserdem ist das was #Null da oben geschrieben hat auch nicht zu vernachlässigen.
Weiss ja nicht, wie oft du deine Prozedur bereits aufgerufen hattest, bevor der Fehler kam, weil du nunmal jedesmal über den allokierten Bereich geschrieben hattest (durch das Nullbyte) was dann eben irgendwann zu einem IMA kommt/kommen kann.
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag von gnasen »

Ich dachte, der Aufruf von FreeMemory() würd genau das tun:
Aufräumen.

Dann sollte eine neue allokierung doch kein Problem sein, oder nicht?
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Nein, darum gehts nicht:
Jedesmal, wenn du einen String mit deiner o.g. Prozedur gesendet hast, hast du über den jeweils neu allokierten Bereich geschrieben.
Das kann 100 mal gutgehn, beim 101. mal erwischst du einen Bereich, der woanders benötigt wird, dann krachts halt irgendwann später (in deinem Fall eben beim erneuten allokieren, das kann aber auch ganz woanders sein).
Antworten