Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 23.08.2007, 10:57 Titel: Reservierten Speicherbereich ermitteln? |
|
|
Moin,
kann man irgendwie (möglichst FB-Intern) den mit allocate reservierten Speicherbereich bze den reservierten Speicherbereichs eines Pointers ermitteln ?
Ich habe das mal so versucht:
Code: |
Dim Test as any ptr
Test=allocate(1000*Len(UInteger))
?Test
?SizeOf(Test)
?Len(Test)
Deallocate (Test)
sleep
|
aber er gibt mit einfach nur 4 zurueck... _________________
 |
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 23.08.2007, 14:02 Titel: |
|
|
Ja, er gibt dir 4 zurück, weil die Größe von Test 4 Byte beträgt. Da du unter einem 32-Bit-System arbeitest, sind Pointer auch "nur" 4 Byte groß. Und du lässt dir damit die Größe des Pointers ermitteln.
Für das, was du suchst, hab ich keine Lösung. Kann mir aber irgendwie auch nicht vorstellen, wie das gehen sollte...lass mich aber gern überraschen.  _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 23.08.2007, 14:18 Titel: |
|
|
haette ja irgendwie sein koennen, das FB sich das moeglicherweise "merkt" wo, was, wann allocated wurde  _________________
 |
|
Nach oben |
|
 |
csde_rats

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 23.08.2007, 15:14 Titel: |
|
|
OMFG, wie wär's, wenn du mal ausprobierst, bevor du postest?
Oder wenigstens *denkst*? Hm?
Die erste Variante gibt die Größe von dem aus, worauf Test zeigt. Allerdings zeigt Test auf einen *einzelnen* UInteger. (Zum Nachlesen: Pointer)
Mit der zweiten noch weniger geglückten Variante lässt du die Größe der Adresse des Pointers ausgeben...was nat. auch nur ein (U)Integer ist - unabhängig vom Datentyp, worauf gezeigt wird. _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 23.08.2007, 15:25 Titel: |
|
|
hab gerade noch ein anderes Problem/Frage ohne dafuer einen neuen Thread zu erstellen...
Wie kann ich 'funktionierend' mit unterschiedlichen Pointern die auf das selbe zeigen arbeiten ? oder funktioniert es nicht?
ein kleiner test, als Beispiel...
Code: |
Dim test as string="das ist ein test"
Dim SPtr as ubyte ptr=cast(ubyte ptr, @test)
Dim USPTR as uinteger ptr=cast(uinteger ptr, Sptr)
?test
?hex(SPtr[0])
?hex(USPtr[0])
SPtr[0]=33
?test
?hex(SPtr[0])
?hex(USPtr[0])
sleep
|
Sinn und Ziel der aktion war es strings, bzw deren inhalt in 4er teilen zu verschieben... _________________
 |
|
Nach oben |
|
 |
helium

Anmeldungsdatum: 10.09.2004 Beiträge: 397 Wohnort: Leverkusen
|
Verfasst am: 24.08.2007, 10:27 Titel: |
|
|
Größe musst du dir selbst merken. So ist das bei solchen Low-Level-Sprachen eben. Nichts ist bequem, alles muss man selber machen. _________________ Bevor Sie aufhören sich körperlich zu betätigen sollten Sie ihren Doktor befragen. Körperliche Inaktivität ist abnormal und gefährlich für Ihre Gesundheit. |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 24.08.2007, 19:38 Titel: |
|
|
Code: | Dim test As String="das ist ein test"
Dim usptr As Ubyte Ptr = CAST(Ubyte Ptr, *CAST(Integer Ptr, @test)) '
Dim l As Integer = *(CAST(Integer Ptr, @test)+1)
Screen 18,32
?test
?"Textlaenge = ";l
For i As Integer = 0 To (l-1)\2
Swap usptr[i], usptr[l-1-i]
Next
?test
Sleep |
ohne Kommentar!!! _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
helium

Anmeldungsdatum: 10.09.2004 Beiträge: 397 Wohnort: Leverkusen
|
Verfasst am: 25.08.2007, 09:26 Titel: |
|
|
Ein einaches Len(test) tuts in FB nicht mehr? _________________ Bevor Sie aufhören sich körperlich zu betätigen sollten Sie ihren Doktor befragen. Körperliche Inaktivität ist abnormal und gefährlich für Ihre Gesundheit. |
|
Nach oben |
|
 |
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 25.08.2007, 11:31 Titel: |
|
|
helium hat Folgendes geschrieben: | Größe musst du dir selbst merken. So ist das bei solchen Low-Level-Sprachen eben. Nichts ist bequem, alles muss man selber machen. |
Da bin ich mir nich so ganz sicher.
Wie funktioniert dann deallocate?
Man gibt als Parameter nur die Speicheradresse an, und nicht die Anzahl der Bytes. Somit wird es etweder von deallocate der stdlib automatisch geregelt, oder FreeBASIC merkt sich die Speichergröße und hängt sie nacher als parameter an. (man muss wissen, dass allocate, etc, von der stdlib (c) sind) _________________
Code: | #include "signatur.bi" |
|
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 25.08.2007, 12:01 Titel: |
|
|
helium hat Folgendes geschrieben: | Ein einaches Len(test) tuts in FB nicht mehr? | doch, natürlich
Hier ging es mir darum wo sich FB die Länge des reservierten Speichers merkt.
programmierer hat Folgendes geschrieben: | .. FreeBASIC merkt sich die Speichergröße und hängt sie nacher als parameter an. (man muss wissen, dass allocate, etc, von der stdlib (c) sind) | genau so! _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
helium

Anmeldungsdatum: 10.09.2004 Beiträge: 397 Wohnort: Leverkusen
|
Verfasst am: 27.08.2007, 10:52 Titel: |
|
|
Dein Beispiel enthält gar kein Allocate, hat also faktisch nichts mit dem Problem zu tun. Nüchtern betrachtet zeigt es einfach einen umständlichen weg die Länge von Strings (nicht null terminierte) zu bestimmen.
Allocate wird wohl so wie malloc() functionieren, also unter Linux z.B. intern (s)brk oder mmap verwenden. deallocate entsprechend wie free(). Beim Freigeben gibt man nie die Größe an. Wie das geregelt wird ist aus sicht des Programmierers im Grunde auch egal.
Beispiel: Irgendwo existiert eine Liste, in der Position und größe aller allokierten Blöcke stehen. Gibst du einen block frei wird in der Liste der entsprechende Entsprechende eintrag angepasst. An diese Liste kommst du aber nicht ran. (Das war jetzt ein frei erfundenes Beispiel. Aber es zeigt, das man das gaze problemlos implementieren kann ohne die Größe zu dem Speicherblock zu schreiben, sondern sie auch an ganz anderer Stelle halten kann.)
Ganz simple Beispile für die Speicherverwaltung: http://www.osdcom.info/content/view/31/39/ _________________ Bevor Sie aufhören sich körperlich zu betätigen sollten Sie ihren Doktor befragen. Körperliche Inaktivität ist abnormal und gefährlich für Ihre Gesundheit. |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 27.08.2007, 12:39 Titel: |
|
|
das ist ja wahrscheinlich auch wie bei der festplatte: beim löschen wird nicht die ganze datei gelöscht, sondern nur der FAT-Eintrag. Von daher muss das Programm nicht wissen, wie lang der string ist... _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 27.08.2007, 13:50 Titel: |
|
|
helium hat Folgendes geschrieben: | Dein Beispiel enthält gar kein Allocate, hat also faktisch nichts mit dem Problem zu tun. | Das Beispiel von Eternal_pain auf das ich antwortete enthält doch auch kein Allocate??
Eternal_pain hat Folgendes geschrieben: | Code: | Dim test as string="das ist ein test"
Dim SPtr as ubyte ptr=cast(ubyte ptr, @test)
Dim USPTR as uinteger ptr=cast(uinteger ptr, Sptr)
?test
?hex(SPtr[0])
?hex(USPtr[0])
SPtr[0]=33
?test
?hex(SPtr[0])
?hex(USPtr[0])
sleep |
|
helium hat Folgendes geschrieben: | Nüchtern betrachtet zeigt es einfach einen umständlichen weg die Länge von Strings (nicht null terminierte) zu bestimmen. | Naja, wenigstens ist der 'umständliche Weg' schneller als der Funktionsaufruf LEN()
Noch einmal konkreter:
Hier ging es mir darum wo sich FB die Länge des für den String reservierten Speichers merkt. _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 27.08.2007, 14:31 Titel: |
|
|
nun die Frage war vielleicht zu allgemein... aber ich glaubte wenigstens in meinem eigenen Programm irgendwie ermitteln zu koennen wieviel bytes nun ein reservierter speicherbereich der vom Programm erstellt wurde hat.
zB bei einer Lade Routine wo der zu reservierende Speicher sich aus Variablen innerhalb der Datei zusammensetzt...
es ist nichts unheimlich wichtiges, jedes waere es interessant, und koennte unter umstaenden bei der Fehlersuche helfen... _________________
 |
|
Nach oben |
|
 |
|