Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Reservierten Speicherbereich ermitteln?

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 23.08.2007, 10:57    Titel: Reservierten Speicherbereich ermitteln? Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Mao



Anmeldungsdatum: 25.09.2005
Beiträge: 4409
Wohnort: /dev/hda1

BeitragVerfasst am: 23.08.2007, 14:02    Titel: Antworten mit Zitat

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. lächeln

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. grinsen
_________________
Eine handvoll Glück reicht nie für zwei.
--
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 23.08.2007, 14:18    Titel: Antworten mit Zitat

haette ja irgendwie sein koennen, das FB sich das moeglicherweise "merkt" wo, was, wann allocated wurde zwinkern
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
csde_rats



Anmeldungsdatum: 07.01.2007
Beiträge: 2292
Wohnort: Zwischen Sessel und Tastatur

BeitragVerfasst am: 23.08.2007, 14:39    Titel: Antworten mit Zitat

Code:
SIZEOF(*Test)
oder
Code:
SIZEOF(@Test)


k.A. ... ausprobieren...
_________________
If hilfreicher_Beitrag then klick(location.here)

Klick
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Mao



Anmeldungsdatum: 25.09.2005
Beiträge: 4409
Wohnort: /dev/hda1

BeitragVerfasst am: 23.08.2007, 15:14    Titel: Antworten mit Zitat

OMFG, wie wär's, wenn du mal ausprobierst, bevor du postest? peinlich
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
Benutzer-Profile anzeigen Private Nachricht senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 23.08.2007, 15:25    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
helium



Anmeldungsdatum: 10.09.2004
Beiträge: 397
Wohnort: Leverkusen

BeitragVerfasst am: 24.08.2007, 10:27    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 24.08.2007, 19:38    Titel: Antworten mit Zitat

Code:
Dim test As String="das ist ein test"
Dim usptr As Ubyte Ptr = CAST(Ubyte Ptr, *CAST(Integer Ptr, @test)) ' happy  happy  happy
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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
helium



Anmeldungsdatum: 10.09.2004
Beiträge: 397
Wohnort: Leverkusen

BeitragVerfasst am: 25.08.2007, 09:26    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Michael712
aka anfänger, programmierer


Anmeldungsdatum: 26.03.2005
Beiträge: 1593

BeitragVerfasst am: 25.08.2007, 11:31    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 25.08.2007, 12:01    Titel: Antworten mit Zitat

helium hat Folgendes geschrieben:
Ein einaches Len(test) tuts in FB nicht mehr?
doch, natürlich zwinkern

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
helium



Anmeldungsdatum: 10.09.2004
Beiträge: 397
Wohnort: Leverkusen

BeitragVerfasst am: 27.08.2007, 10:52    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 27.08.2007, 12:39    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 27.08.2007, 13:50    Titel: Antworten mit Zitat

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() grinsen

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 27.08.2007, 14:31    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz