Seite 1 von 1

Speicherproblem!

Verfasst: 22.03.2006 12:48
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:

Verfasst: 22.03.2006 13:20
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

Verfasst: 22.03.2006 16:50
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

Verfasst: 22.03.2006 20:48
von Nik
Dann mal ab damit ins englische Forum

Verfasst: 23.03.2006 09:57
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 =)