Speicherproblem!

Fragen und Bugreports zur PureBasic 4.0-Beta.
Benutzeravatar
Pelagio
Beiträge: 424
Registriert: 11.11.2004 17:52
Computerausstattung: AMD Ryzen 5 7600 6-Core Prozessor 3.80 GHz
16,0 GB Arbeitsspeicher
Windows 11 Pro Betriebssystem
Wohnort: Bremen

Speicherproblem!

Beitrag von Pelagio »

:oops:

Der folgende Code ergibt einen Fehler:

Code: Alles auswählen

;/Ermittlung des Dateipfades
;/[Value.s] = GetPath(#False/#True) | Temp-/Aktuelles Verzeichnis
Procedure.s GetPath(Verzeichnis.b) 
   Buffer.s = Space (255)
   Select Verzeichnis
      Case #False
         GetTempPath_(255,Buffer)
      Case #True
         Buffer = Left(Buffer, GetFullPathName_("*", 255, Buffer, ""))
   EndSelect      
   ProcedureReturn GetPathPart(Buffer)
EndProcedure

BasePath.s = GetPath(#True)
;BasePath.s = "C:\"

If OpenWindow(0, 0, 0, 200, 100, "TestGadget", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
   If CreateGadgetList(WindowID(0))
      StringGadget(1, 10, 10, 180, 80, BasePath)
   EndIf   
EndIf

Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
1)Wird die Variable BasePath mit Getpath(#True) gefüllt, so fehlt beim Fenstertitel der erste Buchstabe und die variable wird nicht im Gadget angezeigt.
2) Wird die Variable erst mit GetPath(#True) gefüllt und dann mit "C:\", so wird der Fenstertitel korrekt wiedergegeben, aber das erste Zeichen (C) im Gadget wird nicht richtig wiedergegeben.
3)Lasse ich GetPath(#True) weg und füll die Variable nur mit "C:\" so funktioniert es.
4) GetPath(#False) funktioniert.

Warum Wieso Weswegen?
:lamer:
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

mit ausgeschaltetem Debugger zeigt er bei "#True"
übrigens gar keinen Windowtitle an.

ist irgendwie ein älterer Bug und gehört scho lange gemeldet

Mit folgendem Code kann man in 3.94 je nachdem
ob die Zeile BasePath.s="C:" auskommentiert ist oder nicht den Windowtitle anzeigen lassen oder den Inhalt des StringGadgets
In Beta4 geht das mit ausgeschaltetem Debugger

Code: Alles auswählen

Buffer.s = Space (255) 
Buffer.s = Left(Buffer,GetFullPathName_("*", 255, Buffer, "")) 
BasePath.s=GetPathPart(Buffer) 

BasePath.s = "C:\" 

If OpenWindow(0, 0, 0, 200, 100, #PB_Window_SystemMenu|#PB_Window_ScreenCentered, "TestGadget") 
   If CreateGadgetList(WindowID(0)) 
   
      StringGadget(1, 10, 10, 180, 80, BasePath) 
   EndIf    
EndIf 
Debug GetWindowTitle(0)
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
Ich meld das mal weiter
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
FGK
Beiträge: 249
Registriert: 09.01.2005 14:02
Computerausstattung: i5-4430 CPU / 8GB RAM
GeForce GT630
Windows 10 Home / 64-bit
Wohnort: Augsburg

Beitrag von FGK »

@Pelagio

kann zwar den Bug nachvollziehen aber habe spitzfindig wie ich bin,
auch noch eine "kleine Programmierfalle" entdeckt.

In deinem Code initialisiert du deinen Buffer mit Länge 255 -
das ist genaugenommen nicht richtig - denn dazu gibt es die
Konstante #MAX_PATH die laut MSD mit 260 deklariert ist und
auch in PB existiert und sicherstellt daß auch der vom OS
zulässige maximale Pfad noch aufgenommen werden kann.

Wie gesagt "spitzfindig" aber .....


Gruß

FGK
Nik
Beiträge: 132
Registriert: 04.02.2005 19:57

Beitrag von Nik »

Dann mal ab damit ins englische Forum
www.KoMaNi.de
Eine kleine Gruppe von Hobby Programmierern, die gerade einen Instant Messenger natürlich in PureBasic schreiben.
Benutzeravatar
ABBKlaus
Beiträge: 61
Registriert: 15.03.2006 22:09
Wohnort: Ratingen
Kontaktdaten:

Beitrag von ABBKlaus »

@FGK ,

stimmt nicht : http://msdn.microsoft.com/library/defau ... thname.asp
If the lpBuffer buffer is too small to contain the path, the return value is the size of the buffer that is required to hold the path and the terminating null character, in TCHARs. Therefore, if the return value is greater than nBufferLength, call the function again with a buffer that is large enough to hold the path.
kleiner Ausschnitt aus dem Beispielcolde der MSDN

Code: Alles auswählen

#include <windows.h>
#include <stdio.h>

#define BUFSIZE 4096

int main(int argc, char *argv[])
{
    DWORD retval=0;
    BOOL success; 
    char buffer[BUFSIZE]=""; 
    char * lpPart[BUFSIZE]={NULL};

// Retrieve a full path name for a file.  The file does not need to 
// exist.
    retval = GetFullPathName("c:\\testfile.txt",
			     BUFSIZE,
	                     buffer,
			     lpPart);
ein Buffer von 255 ist kein Fehler =)
PureBasicPower TailBite Printer_Lib / PDFBarcode / PrintBarcode / ExcelWriter
Gesperrt