OpenFile Bug?

Fragen und Bugreports zur PureBasic 4.0-Beta.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

hey, leute...

es geht hier um OpenFile(), nich um sonstwas für scherze,
und ich gehe davon aus das die frage ernstgemeint war.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Beitrag von Thorium »

Also der Bug ist nicht reproduzierbar. Da scheint einfach was in PureBasic durcheinandergeraten zu sein. Der Bug von gestern Abend ist heute bei gleichem Source nicht mehr aufgetreten. Hät ich eigentlich auch schon gestern ausprobieren können, PureBasic einfach neustarten. :oops:

Naja für die Akten: Problem trat bei jedem zweiten Aufruf von OpenFile() mit gleichen Parametern auf. #PB_Any habe ich nicht verwendet.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> Problem trat bei jedem zweiten Aufruf von OpenFile() mit gleichen Parametern auf.

war das File noch offen?
also, war evtl dein system verlangsamt durch einen anderen dienst,
sodass dein prog erneut zu öffnen versucht hat,
bevor das OS das File als geschlossen registrieren konnte?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Beitrag von Thorium »

Kaeru Gaman hat geschrieben:> Problem trat bei jedem zweiten Aufruf von OpenFile() mit gleichen Parametern auf.

war das File noch offen?
also, war evtl dein system verlangsamt durch einen anderen dienst,
sodass dein prog erneut zu öffnen versucht hat,
bevor das OS das File als geschlossen registrieren konnte?
Eigentlich nicht, es liefen genau die Dienste und Prozesse wie heute. Zumal das Öffnen ja funktioniert hat. Heißt ich bekomme 0 zurückgeliefert, kann aber aus der Datei lesen und auch in die Datei schreiben bis ich sie wieder schließe.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

ja, das ist insgesamt sehr merkwürdig.

mit "open readonly" und "not yet closed" habe ich eigentlich die möglichen logischen erklärungen für dieses phänomen erschöpft.

PS:
bei "open readonly" kann das file geöffnet werden, aber erlaubt keinen vollzugriff.
deswegen offen aber fehler.

bei "not yet closed" hängt das system minimal hinterher,
die erste anfrage ergibt ein "bereits geöffnet",
aber da das file eigentlich doch schon geschlossen ist,
funktioniert es trotzdem.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

ts-soft hat geschrieben:Bei #PB_Any wird der benötigte Speicher für die GadgetStructure extra allociert, der zurückgegebene Pointer dürfte also niemals auf 0 verweisen :mrgreen:
Ich hoffe das hast auch Du jetzt verstanden :twisted:
wenn du dir sicher bist, dass eine funktion mit #PB_ANY niemals 0 zurückgibt.. kann ja sein, aber diese begründung dafür leuchtet mir nicht ein.
wenn du -1 / PB_ANY als PB-ID benutzt, wird ja kein (System-)handle, sondern die PB-ID zurückgegeben, und die stellt doch keinen pointer dar. warum sollte sie also nicht 0 sein können?
my pb stuff..
Bild..jedenfalls war das mal so.
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

Beitrag von ts-soft »

@#Null
Hier der Beweis, obwohl ich bezweifle, das Du es verstehst

Auf jedenfall kann ein Pointer niemals 0 sein, also in diesem Falle auch nicht

Code: Alles auswählen

; Structure laut PB Library SDK
Structure PB_GadgetStructure
  Gadget.l
  *VT.l
  UserData.l
  OldCallback.l
  Data.l[4]
EndStructure

Define.PB_GadgetStructure *Button

If OpenWindow(0, #PB_Ignore, 0, 100, 100, "")
  If CreateGadgetList(WindowID(0))
    *Button = ButtonGadget(#PB_Any, 10, 10, 60, 30, "")
  EndIf 
EndIf

Debug "PBID für Button: " + Str(*Button)

Debug "hWnd = " + Str(GadgetID(*Button))

Debug "Über Strukture:"
Debug "hWnd = " + Str(*Button\Gadget)

While Not WaitWindowEvent() = #PB_Event_CloseWindow : Wend 
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
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Wenn man an eine Create Funktion #PB_Any übergibt, bekommt man
natürlich ein Pointer zurück o_O.
Bild
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

der aufruf einer create-funktion mit #PB_ANY gibt also einen zeiger auf eine (pb-interne?) struktur zurück, welche unter anderem das OS-handle enthält. dieser pointer ist die PB-ID.

wenn ich die PB-ID selbst bestimme, durch angabe einer konstante, ist diese PB-ID doch aber kein pointer, sondern irgendeine 'nummer', die keinen speicher addressiert, denn die 'nummer' kann ja auch 0 sein, bzw objekte verschiedenen typs (gadget oder sound) können ja auch dieselbe 'nummer' haben.

[bis jetzt alles richtig?]

dann wären PB-IDs ja manchmal speicheradressen und manchmal nicht.
wie weiß denn eine funktion wie z.b. GadgetID(GadgetNr) ob der parameter als pointer oder als Nr zu handhaben ist. einfach nur anhand der größe seines wertes?

[das ein gültiger pointer niemals 0 sein kann, ist mir klar. nur ich dachte bisher PB-IDs seien niemals pointer]

:freak: vielleicht verweist ja auch einfach eine meiner synapsen auf 0. wäre nett wenn ihr trotzdem noch versucht mir die richtige addresse zu zeigen ;)
my pb stuff..
Bild..jedenfalls war das mal so.
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

Beitrag von ts-soft »

Anhand der größe ist richtig. Mehr als 10000 Gadgets sind nicht möglich, also
können die mit Konstanten erstellten Gadgets, nur von 0 - 9999 sein, was
niemals mit einer Speicheradresse kollidieren sollte. Für alle so erzeugten
Gadgets wird der Speicher automatisch erzeugt, 0 bis größte Konstante *
benötigter Speicher, deshalb ist es wichtig, das die Nummern keine Lücken
aufweisen und bei 0 anfangen, um unnötigen Speicherverbrauch zu
vermeiden.
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
Gesperrt