Schreibfehler an Adresse 46 im RAM?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Schreibfehler an Adresse 46 im RAM?

Beitrag von STARGÅTE »

Pointer-Arrays sind vollkommen in ordnung ...
TS-Soft, hier hast du mal unrecht ...

Ein Pointer hat genauso wie eine Integer einen Ort für die 4/8 Bytes der Zahl/Adresse
Debug @*Pointer

Im prinzip ist
Dim *Pointers(10)
das gleiche wie
Dim Pointers.i(10)
wenn es um die Adressen, Zahlen geht ... Man erstellt halt ein Array mit Adressen.

Nützlich beim PointerArray ist, das man ihnen noch n Struktur geben kann (ohne das die größe eines Feldes sich ändert).
Wenn der Pointer zB auf ein LinkedList Element verweist...

Zum Code:
Zunächst mal macht DIM automatisch eine Leerung ... FreeArray braucht man nicht!


Auf anhieb sehe ich leider nicht ob es ein Fehler in deinem Code gibt.
Was mir jedoch etwas sorgen macht ist:

Code: Alles auswählen

If *Char\c = 10 Or *Char\c = 13
  *Char\c = 0
Das Problem was ich hier sehe ist, du schreibst in einem String (deren Pointer ist ja *Char) eine NULL.
Für den String heißt das, er wurde gekürtzt.
Für den Speicher heißt das, er kann alles danach (was ja eigentlich noch zum String gehörte) anderen Sachen zuweisen, z.B einem Array, Variable usw.
Trotzdem ließt du aber fleißig weiter ... das führt meiner Meinung nach zu Speicherlegs!

Denn du übergibst dann Pointer zu Stellen, an den Du deine anderen Strings vermutes, welche aber nicht mehr existieren!
Weil du der ersten abgetrennt hast ...

Bitte starte mal mit Purifier, u.u. müsste der sich dann melden!
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
SebastianJu2
Beiträge: 180
Registriert: 24.09.2010 10:39

Re: Schreibfehler an Adresse 46 im RAM?

Beitrag von SebastianJu2 »

@Stargate

Das FreeArray werde ich dann rausnehmen.

Was das Schreiben der 0 angeht... wird der Speicher denn dann wirklich freigegeben für andere Variablen? Weil eigentlich dürfte die Originalvariable URLInputList$ doch die ganze Zeit den gesamten großen Speicherbereich für sich reserviert haben. Die besteht ja noch. Und an der Variable ändert sich ja nur außer dass an seinem Inhalt verändert wird. Aber bekommt das die Originalvariable überhaupt mit und wird dadurch die Reservierung der Originalvariable verändert?

Den Purifier habe ich jetzt in den Optionen aktiviert, dann kompiliert und die Einleseroutine aktiviert. Es gab aber keine Meldung.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Schreibfehler an Adresse 46 im RAM?

Beitrag von STARGÅTE »

Und an der Variable ändert sich ja nur außer dass an seinem Inhalt verändert wird. Aber bekommt das die Originalvariable überhaupt mit und wird dadurch die Reservierung der Originalvariable verändert?
Tia, die Frage stelle ich mir auch.
Und da ich keine Antwort weiß, würde ich das nicht so machen.
EIn ähnliches Thema gab es hier: String mit PokeC() kürzen OK?

Da hieß es u.a.:
[...] Aber du hast recht, wenn man keine Stringbefehle auf diesen String anwedet, wird der zusätliche Speicher nicht freigegeben. Nach dem anwenden eines String Befehls würde jedoch der Speicher freigegeben.
Fest steht. Nachdem du die erste NULL in den Speicher von URLInputList$ geschreiben hast, ist URLInputList$ (also das Original) genau an dieser Stelle zuende!

Was mit dem Restlichen Speicher passiert ist ungewiss (zumindest für mich).
Vllt bleibt er reserviert, weil der String-Pool die Originallänge von URLInputList$ als Buffer nimmt.
Vllt wird er freigegeben, weil URLInputList$ den Speicher nicht mehr benötigt, und kein andere darauf zugreifen muss (Dein Pointer ist ja kein ^muss ^^)
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
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Schreibfehler an Adresse 46 im RAM?

Beitrag von ts-soft »

STARGÅTE hat geschrieben:Pointer-Arrays sind vollkommen in ordnung ...
TS-Soft, hier hast du mal unrecht ...
Mag sein, ist aber unlogisch und IMHO ein scheiss Stil.
In der Hilfe unter DIM ist die Rede von jedem Typen, auch strukturiert,
Pointer sind unter Typen nicht aufgeführt! Pointer sind Zeiger auf Speicher
und kein Typ.

Für Pointer wird normallerweise nicht automatisch Speicher allokiert.
Also Dim von Pointerarrays weicht da wohl ab, würde ich nicht so
verwenden. Bietet keinerlei Geschwindigkeitsvorteil und verschlechtert
lediglich die Lesbarkeit des Codes.

Aber im Endeffekt muß das jeder für sich selber entscheiden.

Bestärkt Ihn ruhig in seiner: "Alles muß gepointert werden" Manier :mrgreen:

Pointer sollte man IMHO nur dann verwenden, wenn es wirklich Vorteile bringt,
ansonsten sind diese im Sinne der strukturierten Programmierung eher zu meiden,
genauso wie Goto :mrgreen:

Ich halte mich ja auch nicht immer an die richtlinien der strukturierten Programmierung,
weil dann hätte jede Funktion nur einen definierten Eingang und einen definierten Ausgang,
aber ich kenne sie wenigstens und überlege mir, ob es sich in diesem Falle lohnt oder
nicht.

Hier gehts aus meiner Sicht um das Pointern des Pointern wegens, also vollkommen
Hirnlos.

Gruß
Thomas

// Nachtrag:
Das Array enthält zwar Pointer, aber es ist kein Pointer!

Code: Alles auswählen

Procedure foo(*arr)
  Dim *bla(10)
  *bla() = *arr
  Debug *bla(5)
EndProcedure

Dim *bla(10)
*bla(5) = 1000
foo(*bla())
sonst würde dies Funktionieren :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
SebastianJu2
Beiträge: 180
Registriert: 24.09.2010 10:39

Re: Schreibfehler an Adresse 46 im RAM?

Beitrag von SebastianJu2 »

@Stargate

Ja die Pointer sind kein Muss. Es war eigentlich ein Versuch und theoretisch kann ich mir auch kein Vorgehen vorstellen dass mit weniger Rechenarbeit einen großen String in kleine Teile teilt die Listenelemente sind.

Man könnte das Ganze sicher auch machen ohne 0 zu schreiben. Indem man einfach an jeden Satzanfang einen Pointer setzt der in einer Struktur zusammen mit einem Integer ist. Dann sucht man das Ende der Zeile und speichert die Anzahl Zeichen in dem Integer. Und wenn man dann den String braucht kann man ihn mit PeekS und der Längenbegrenzung aus dem Integer holen. Funktioniert aber wohl nur mit Ascii.

Ich denke aber ich werde doch mal versuchen die Teilstrings herauszukopieren. Der Startpunkt sollte aber schon jeweils ein Pointer sein weil Stringfunktionen auf einen so großen String scheinen mir einfach sehr langsam. Aber mal sehen.

Also wenn Stringfunktionen benutzt werden in denen der Hauptstring eine Rolle spielt dann wird er intern kopiert und am Ende ist er kürzer und der Speicherbereich freigegeben. Das dürfte ja heißen dass, wenn man den Hauptstring nach dem Schreiben von 0 nicht mehr im Code erwähnt dass es sicher sein müsste.
Kann vermutlich nur jemand vom Entwicklerteam wirklich beantworten.

@ts-soft

Du glaubst mir doch immer noch nicht dass bei einem so großen String, der vielleicht 200.000 URLs beinhaltet die normalen Stringfunktionen von PB einfach sehr langsam sind. Und logisch sollte sein dass die direkte Angabe eines Speicherortes dann sehr viel schneller ist als den String als Ganzes zu betrachten und dann irgendwo einen Teil rauszusuchen. Pointern des Pointerns wegen... so ein Blödsinn.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Schreibfehler an Adresse 46 im RAM?

Beitrag von ts-soft »

Trotzdem kennzeichnest Du ein Array mit dem Pointerzeichen. Es ist ein Array, kein Pointer.
Es geht nicht darum was in das Array hineinkommt, sondern das Pointerzeichen ist nur für
Pointer und nicht für Arrays, auch wenn es funktioniert, ist es trotzdem falsch.
Obiger Code zeigt Dir ja auch, das Du es auch nicht als Pointer nutzen kannst.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Schreibfehler an Adresse 46 im RAM?

Beitrag von STARGÅTE »

@TS-Soft ...

Dein Beispiel ist quark!

also: Dim *bla(10)
Erzeugt ein Array mit 11 Feldern in denen Pointer (Integers) sind (das ist Fakt).

*bla(5) = 1000
Setz den Pointer in Feld 5 auf 1000

*bla()
Ohne Index gibt das die Adresse von *bla(0) zurück NICHT DEN HEADER DES ARRAYS! Und nicht die Adresse die drin steht!

*bla() = *arr
Funktioniert in PB so nicht!
Denn damit würdest du ja den Pointer zu Feld 0 überschreiben. Nicht den Header des Arrays und nicht das Feld selber!

______

Das ein Array kein * haben darf ist blödsinn!

Denn das * verweißt ja nicht darauf, dass es ein Pointer zum Array sein muss, sonden einfach nur das der Inhalt des Feldes ein Pointer ist/sein wird.

Dim *Test(3)

Ist gleichbedeutend wie:

Structure Test
*Test[4]
EndStructure
Test.Test

oder

Structure Test
*Test0
*Test1
*Test2
*Test3
EndStructure
Test.Test

oder einfach nur
*Test0
*Test1
*Test2
*Test3

also Pointer die mal irgendwann mit einer Adresse gefüllt werden.

Das die Verwendung bei SebastianJu2 etwas fragwürdig ist, geb ich dir recht.
Aber allgemein ist ein Array aus Pointer sehr nützlich.
Beispiel: LinkedList-Array-Verknüpfung.
LinkedList verwaltet die Daten und über das Array kann schneller Zugriff ermöglicht werden.
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
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Schreibfehler an Adresse 46 im RAM?

Beitrag von ts-soft »

STARGÅTE hat geschrieben: Aber allgemein ist ein Array aus Pointer sehr nützlich.
Hab ich doch nichts gegen gesagt, gegen ein Array aus Pointern, aber
das Array ist kein Pointer, es ist ein Array, also kein *, weil das blöd-
sinnig ist. Mit * werden nur Pointer gekennzeichnet, keine Arrays.
Die Adresse zum Array ist ein Pointer, aber der Pointer ist trotzdem
kein Array.

So, jetzt geh ich schlafen, bevor ich hier weiter philosopiere.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Schreibfehler an Adresse 46 im RAM?

Beitrag von STARGÅTE »

Ich hoffe mit diesem Beispiel, kann ich überzeugen warum ein * vor einem ArrayNamen so normal ist, wie ein * vor einer Variable ...

Code: Alles auswählen

Structure Beispiel
  String.s
  Long.l
  Float.f
EndStructure

Beispiel1.Beispiel\String = "Hallo Welt"
Beispiel2.Beispiel\Float = #PI

Dim *Pointer.Beispiel(100) ; Dieses Array hat eine Gesamtgröße von nur SizeOf(Integer)*101 !!
                           ; Ein Feld hat also nicht die größe von der Struktur "Beispiel",
                           ; anders, als wenn ich das * weglassen würde!

*Pointer(50) = @Beispiel1
*Pointer(60) = @Beispiel2

Debug *Pointer(50)\String
Debug *Pointer(60)\Float
; Man darf natürlich nur dann die Struktur lesen, wenn der Pointer auch gesetzt wurde, sonst gibt es ein Lesefehler!
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
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Schreibfehler an Adresse 46 im RAM?

Beitrag von ts-soft »

STARGÅTE hat geschrieben:Ich hoffe mit diesem Beispiel, kann ich überzeugen warum ein * vor einem ArrayNamen so normal ist, wie ein * vor einer Variable ...
Nein,

Code: Alles auswählen

Structure Beispiel
  String.s
  Long.l
  Float.f
EndStructure

Beispiel1.Beispiel\String = "Hallo Welt"
Beispiel2.Beispiel\Float = #PI

Dim Pointer.Beispiel(100) ; Dieses Array hat eine Gesamtgröße von nur SizeOf(Integer)*101 !!
                           ; Ein Feld hat also nicht die größe von der Struktur "Beispiel"

Pointer(50) = @Beispiel1
Pointer(60) = @Beispiel2

Debug Pointer(50)\String
Debug Pointer(60)\Float 
so sieht es korrekt aus. Du Speicherst einen Pointer im Array, aber das Array erhält kein *
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten