 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
stevie1401
Anmeldungsdatum: 04.07.2006 Beiträge: 133
|
Verfasst am: 16.10.2006, 15:55 Titel: der DIR Befehl |
|
|
Ich wollte mir eine nette Fileselect-Box mit dem (Freebasic)DIR Befehl bauen.
DIR zeigt mir allerdings keine Ordner an, die das Attribut ARCHIV oder SCHREIBGESCHÜTZT haben. Weiss jemand Hilfe oder hat schon eine Datei-Auswahl-Routine geschrieben? Kommt mir nicht mit API!!
Ich sag ja immer: Schuster, bleib bei deinen Leisten. Ich möchte in BASIC programmieren und nicht die API aufrufen.
Über jede Hilfe wäre ich dankbar. |
|
Nach oben |
|
 |
ytwinky

Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 16.10.2006, 16:26 Titel: |
|
|
Hi,
wer hat dir verraten, was ich gerade mache?
Der Dir-Befehl zeigt sehr wohl Ordner an, du mußt nur den von Dos benutzen..
Kuck dir mal dies Beispiel an: Code: | 'Ä=Ž Ö=™ Ü=š ä=„ ö=” ü=? ß=á §=õ ©=¸ °=ø
'dir.bas ©¸2006 by ytwinky, MD
Option Explicit
Dim As String s, Verz
Dim Dnr As Long=FreeFile
Open Pipe "Dir c:\ /ogn" For Input As #Dnr 'Siehe Dir Optionen, Achtung: /ong<>/ogn
While Not Eof(Dnr)
Line Input #Dnr, s
Verz+=s &Chr(10)
Wend
Close Dnr
?Verz
Sleep | ..daraus ließe sich ein Menü basteln, es ist ja alles in Verz gespeichert.
Das Beispiel steht leicht abgewandelt übrigens in der Befehlsreferenz
..und die Optionen für den Dir-Befehl?
Da gibt es mehrere Möglichkeiten:
Google
www.microsoft.com
Hilfe- und Supportzentrum, k.A. wie das genau heißt, ist bei mir nämlich abgeschaltet
hh.exe ms-its:C:\WINDOWS\Help\ntcmds.chm::/ntcmds.htm
oder einfach Dir /?
(natürlich in einem Dos-Fenster..)
Viel Spaß beim Tüfteln..
Gruß
ytwinky _________________
v1ctor hat Folgendes geschrieben: | Yeah, i like INPUT$(n) as much as PRINT USING.. | ..also ungefähr so, wie ich GOTO.. |
|
Nach oben |
|
 |
ytwinky

Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 16.10.2006, 19:17 Titel: Re: der DIR Befehl |
|
|
So sorry, das sollte kein Doppelpost werden..
..ist aber vertretbar, da er eher als Kommentar zu sehen ist
stevie1401 hat Folgendes geschrieben: | DIR zeigt mir allerdings keine Ordner an, die das Attribut ARCHIV oder SCHREIBGESCHÜTZT haben. | Das stimmt so nicht!
Er macht es sehr wohl (s. Beschreibung inkl.Beispiel in der Befehlsreferenz). Code: | Dir("C:\*.*", &H37) | zeigt auch Verzeichnisse mit gesetztem Archiv- und ReadOnly-Bit an
stevie1401 hat Folgendes geschrieben: | Kommt mir nicht mit API!! | Warum eigentlich nicht?
Ich kauf mir doch keinen Porsche, um damit nur in 30Km/h-Zonen zu fahren
Gruß
ytwinky _________________
v1ctor hat Folgendes geschrieben: | Yeah, i like INPUT$(n) as much as PRINT USING.. | ..also ungefähr so, wie ich GOTO.. |
|
Nach oben |
|
 |
stevie1401
Anmeldungsdatum: 04.07.2006 Beiträge: 133
|
Verfasst am: 16.10.2006, 20:21 Titel: |
|
|
&H37 zeigt zwar auch schreibgeschütze Ordner an, allerdings dann auch Dateien.
Ich denke, der Freebasic-DIR-Befehl ist schlichtweg fehlerhaft.
Danke mit dem Tip PIPE-Befehl. Den hatte ich tatsächlich nicht ganz verstanden. Bei diesem Befehl werden die Ordner zwar richtig angezeigt, allerdings funktioniert das wiederum nicht mit Ordnern, welche LEERZEICHEN beinhalten.
API, ist, denke ich, Geschmackssache.
Erstens möchte ich meine Programme möglichst Windows und Linuxkompatibel halten und zweitens hat das Aufrufen von API Befehlen nichts mit Freebasic zu tun. Kurzum - ich möchte es einfach halten und (nur) mit den Freebasic eigenen Befehlen arbeiten. Wie gesagt BASIC!
Im übrigen bin ich doch sehr verwundert, dass es hier im Freebasicforum zu 80% um API geht und nicht um die Sprache Freebasic.
Aber das ist ein anderes Thema.
Nochmals: vielen Dank für deinen Tip. |
|
Nach oben |
|
 |
terminate
Anmeldungsdatum: 12.09.2006 Beiträge: 56
|
Verfasst am: 16.10.2006, 20:48 Titel: |
|
|
stevie1401 hat Folgendes geschrieben: | &H37 zeigt zwar auch schreibgeschütze Ordner an, allerdings dann auch Dateien.
Ich denke, der Freebasic-DIR-Befehl ist schlichtweg fehlerhaft.
|
Nein ist er nicht, man muß allerdings das Prinzip verstehen, ich hab dir hier mal den Kern meiner 'List all files and folders' Routine rauskopiert, läuft auch garantiert ohne winapi.
Noch Fragen?
EDIT:
Noch was zur Erklärung, die Dateiattribute:
Const attrib_readonly = &h01
Const attrib_hidden = &h02
Const attrib_system = &h04
Const attrib_directory = &h10
Const attrib_archive = &h20
werden bei der Dir Funktion UND verknüpft, d.h. ein Ordner der schreibgeschützt ist, wird nicht aufgelistet, wenn man nur nach 'Objekten' mit dem Attribut attrib_directory sucht, man muß gleichzeitig auch nach Objekten mit dem Attribut attrib_readonly suchen.
Also um alle Dateien und Ordner erfassen zu können sucht man prinzipiell immer nach allen Attributen und prüft dann bei jedem gefundenen Objekt, ob es sich um eine Datei oder einen Ordner handelt. Die Prüfung ist einfach, wenn ein Objekt zusätzlich zu seinen sonstigen Attributen auch noch das Attribut attrib_directory besitzt, handelt es sich um einen Ordner.
Code: |
'**************************************************
Const path_delimiter = "/"
Const attrib_readonly = &h01
Const attrib_hidden = &h02
Const attrib_system = &h04
Const attrib_directory = &h10
Const attrib_archive = &h20
declare function dirwalk_get_dir (byref s_startdir as string,byref s_filespec as string,byval i_attribs as integer)as long
'**************************************************
dim as string s_startdir, s_filespec
dim as integer i_attribs
dim as long i
s_startdir="d:"
s_filespec="*"
i_attribs=attrib_readonly+attrib_hidden+attrib_directory+attrib_archive+attrib_system 'or something like that
dirwalk_get_dir (s_startdir, s_filespec, i_attribs)
sleep
'**************************************************
function dirwalk_get_dir (byref s_startdir as string,byref s_filespec as string,byval i_attribs as integer)as long
Dim As String filename
dim as integer i_ret_attrib
filename = Dir( s_startdir+path_delimiter+s_filespec, i_attribs,@i_ret_attrib )
Do
If filename <> "." And filename<> ".." Then
if i_ret_attrib and attrib_directory then
print "dir: " & s_startdir + path_delimiter+ filename
else
print "file: " &s_startdir + path_delimiter+filename
endif
endif
filename = Dir(@i_ret_attrib)
Loop While filename > ""
return 0
End function
|
Zuletzt bearbeitet von terminate am 16.10.2006, 21:27, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
ytwinky

Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 16.10.2006, 21:17 Titel: |
|
|
@terminate:
..interessantes Listiing, schau ich gleich mal durch
@stevie1401:
Gerade das Thema FileAttribute ist ein gutes Beispiel..
Bevor ich irgendwelche Verrenkungen mit dem Shell-Befehl mache,
nehme ich doch lieber das WinAPI, weils schneller geht.
Ich weiß nicht, wie das unter linux geht und wenn, dann geht es sowieso anders als bei Windows..
btw:
Das Beispiel aus der Referenz findet auch Verzeichnisse mit Leerzeichen..
"Ein Programmiersprache lernt man am Besten, indem man Programme darin schreibt.."
(das hat natürlich kein FreeBASIC-Programmierer geschrieben )
Bei manchen Sachen bleibt es nicht aus, daß man ein wenig probieren muß.
Die Trial&Error-Methode hilft manchmal weiter..
..oder auch: Tipps kann ich dir geben, probieren mußt du.
Gruß
ytwinky _________________
v1ctor hat Folgendes geschrieben: | Yeah, i like INPUT$(n) as much as PRINT USING.. | ..also ungefähr so, wie ich GOTO.. |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 16.10.2006, 21:24 Titel: |
|
|
übrigens: mit der PIPE-Methode von ytwinky wirst du auch nicht ziwschen linux und windows hin- und hersrpingen können, denn in linux heißt der befehl nicht dir, sondenr...eben anders  _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
ytwinky

Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 16.10.2006, 21:37 Titel: |
|
|
..er hatte doch das mit dem Pipe-Befehl nicht richtig mitbekommen,
falls du das überlesen haben solltest  _________________
v1ctor hat Folgendes geschrieben: | Yeah, i like INPUT$(n) as much as PRINT USING.. | ..also ungefähr so, wie ich GOTO.. |
|
Nach oben |
|
 |
terminate
Anmeldungsdatum: 12.09.2006 Beiträge: 56
|
Verfasst am: 16.10.2006, 21:42 Titel: |
|
|
ytwinky hat Folgendes geschrieben: | @terminate:
..interessantes Listiing, schau ich gleich mal durch
... |
Hi, ytwinky, du bist doch auch auf www.freebasic.net/forum/ unterwegs, da hättest du doch eventuell auch meine vollständige Routine sehen müssen, (können?):
www.freebasic.net/forum/viewtopic.php?p=51120#51120
(Meine Programmiermethode ist einfach: Ich überleg mir erst mal selbst ne Lösung, poste sie auf www.freebasic.net/forum, dann warte ich bis coderJeff seinen Kommentar dazu abgibt und fange an zu verbessern )
Bei der Ermittlung der Größe von pagefile.sys dachte ich übrigens auch schon, dass pipe die einzige Lösung wäre, nachem ich bereits zwei winapi Funktionen erfolglos getestet hatte, aber war klar, dass coderJeff noch ne Lösung findet:
www.freebasic.net/forum/viewtopic.php?p=50571#50571 |
|
Nach oben |
|
 |
ytwinky

Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 16.10.2006, 21:50 Titel: |
|
|
terminate=xterm
Das wußte ich nicht..
Den Beitrag habe ich nur diagonal gelesen, weil im Titel 'non-recursive' stand..
..und das fand ich, nun ja, ehrlich gesagt, ohne dir zu nahe treten zu wollen,
nicht ganz so interessant
Seit ich Rekursion verstanden habe, finde ich sie nämlich total gut(sollte eigentlich anders heißen )
Gruß
ytwinky _________________
v1ctor hat Folgendes geschrieben: | Yeah, i like INPUT$(n) as much as PRINT USING.. | ..also ungefähr so, wie ich GOTO.. |
|
Nach oben |
|
 |
terminate
Anmeldungsdatum: 12.09.2006 Beiträge: 56
|
Verfasst am: 16.10.2006, 22:30 Titel: |
|
|
ytwinky hat Folgendes geschrieben: | ... weil im Titel 'non-recursive' stand..
..und das fand ich, nun ja, ehrlich gesagt, ohne dir zu nahe treten zu wollen,
nicht ganz so interessant ...
Seit ich Rekursion verstanden habe, finde ich sie nämlich total gut ... |
IMHO hat Rekursion ihre Berechtigung als Methode zur Beschreibung spezieller Phänomene, es ist durchaus nützlich zu erkennen, dass ein Problem rekursiver Natur ist, das zwingt aber keinesfalls dazu, die Lösung dieses Problems ebenfalls rekursiv anzugehen zu müssen.
Von der Verwendung spezieller 'funktionaler Sprachen' wie z.B. SML
http://de.wikipedia.org/wiki/Funktionale_Programmiersprache#SML
vielleicht einmal abgesehen, birgt Rekursion beim programmieren immer die Gefahr ein potentieller 'Stackkiller' zu sein. Aber was meist noch interessanter ist, rekursive Lösungen gehören so gut wie nie zu den schnellsten Lösungen.
Der objektorientierten Programmierung hängt ja ein ähnliches Credo an. Es gibt aber Anwendungsbereiche in denen ich den Einsatz objektorientierter und auch rekursiver Programmierung ohne wenn und aber befürworte, dazu gehören Spiele und Simulationen, da wäre es schlichtweg eine Qual für den Programmierer alles prozedural, linear und nichtrekursiv modellieren zu müssen.
Aber du kannst ja gerne mal probieren ein rekursives Directory / Files Listing Programm zu schreiben und dann Geschwindigkeit und Speicherverbrauch mit einer nichtrekursiven Lösung vergleichen.
Wie gesagt alles nur meine persönliche Meinung. |
|
Nach oben |
|
 |
ytwinky

Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 16.10.2006, 23:47 Titel: |
|
|
Ich würde niemals auf die Idee kommen, eine Fakultät per Schleife zu berechnen.
Gut, in FORTRAN IV wäre das nicht anders möglich gewesen, aber das ist Schnee von gestern..
Aber ich würde auch nie behaupten, daß rekursive Programme etwas einsparen Code: | Function fak(Zahl As Long) As Double
If Zahl=1.0 Then fak=Zahl Else fak=Zahl*fak(Zahl-1.0)
End Function | sieht einfach besser aus als Code: | Function fuk(Zahl As Long) As Double
Dim i As Long, w As Double=1.0
If Zahl<>0 Then
For i=1 to Zahl
w*=i
Next i
End If
Return w
End Function | Die rekursive Funktion macht genau dasselbe, nur mit mehr Aufwand, der jedoch nicht zu sehen ist..
Und 'n rekursives Dateiverzeichnis gibt es längst: ListFiles.Bas
Allerdings gehöre ich nicht zu den Sekunden(Minuten??)-Zählern..
..das Programm macht, was es soll und gut is.
(Ich glaube, ich hatte das sogar schon mal hier vorgestellt..)
ObjektOrientiert Programmieren ist auch ne tolle Sache, wenn man's gebrauchen kann..
Das ist meine ganz persönliche Meinung.
Gruß
ytwinky _________________
v1ctor hat Folgendes geschrieben: | Yeah, i like INPUT$(n) as much as PRINT USING.. | ..also ungefähr so, wie ich GOTO.. |
|
Nach oben |
|
 |
stevie1401
Anmeldungsdatum: 04.07.2006 Beiträge: 133
|
Verfasst am: 17.10.2006, 05:49 Titel: |
|
|
@terminate
Das scheint ja wirklich zu funktionieren!
Dazu habe ich zwei Fragen (schliesslich möchte ich ja lernen):
Dieses "@i_ret_attrib" gibt ja anscheinend irgendetwas zurück. Wie kommt diese Info in "@i_ret_attrib" rein?
Gibt es bei DIR 3 Parameter? Wenn ja, was bezweckt der dritte Parameter? Er ist nicht dokumentiert.
Code: | filename = Dir( s_startdir+path_delimiter+s_filespec, i_attribs,@i_ret_attrib ) |
Und die zweite Frage: Mir ist aufgefallen, dass du eine Function gemacht hast, die (anscheinend) nichts zurück gibt. Oder "0"? Wegen RETURN 0?
Hättest du anstatt einer Function auch eine SUB nehmen können?
Danke für deine Beschreibung - die finde ich weitaus hilfreicher als die Erklärungen in der Hilfe!
@ytwinky:
Irgendwer hier hat schon einmal per API eine Fileselectbox per API geschrieben, die allerdings nur in der Console funktionierte.
Und das "FILEOPEN"-Beispiel in \FreeBASIC\examples\Windows\gui ist schlichtweg für einen Anfänger nicht zu verstehen! Bei diesem Beispiel bekomme ich einfach das Menü nicht weg! Ich möchte ein Programm im Vollbildmodus schreiben und in diesem Vollbildmodus soll sich b.B. eine Fileselectbox öffnen.
Witzig finde ich dabei, dass das GFA-Basic schon in den 80ern konnte - mit einem einzigen Befehl ohne dass man lange rumdoktorn musste. Schade, dass es heute nicht mehr nutzbar ist. Wäre schön, wenn Freebasic soetwas auch irgendwann einmal könnte. Aber Freebasic ist ja wirklich noch eine sehr junge Sprache und ich hoffe, dass sie sich nicht in die falsche Richtung entwickelt. (Klassische BASIC Befehle raus etc.) Sonst müsste sich Freebasic eh umbenennen von FreeBASIC in FreeIRGENDWASANDERES. |
|
Nach oben |
|
 |
terminate
Anmeldungsdatum: 12.09.2006 Beiträge: 56
|
Verfasst am: 17.10.2006, 11:25 Titel: |
|
|
ytwinky hat Folgendes geschrieben: | Ich würde niemals auf die Idee kommen, eine Fakultät per Schleife zu berechnen... |
Kommt immer auf die Situation an, ich hatte früher öfter mal mit Mikrocontrollern zu tun, da gabs wirklich die 'geilsten' Geräte, Controller die wirlich alles konnten, Riesenbefehlssatz, großer Speicher, jede Menge I/O PINs A/D D/A, leider durften wir immer nur die jenigen verwenden, die 2,50 DM pro Stück billiger waren und denen genau das gefehlt hat was den Job zu einem Kinderspiel gemacht hätte, ich glaube das nennt man wirtschaftliche Zwänge.
Aber keine Angst in Forschung und Lehre ist nach wie vor alles erlaubt.
Zitat: |
Gut, in FORTRAN IV wäre das nicht anders möglich gewesen, aber das ist Schnee von gestern..
|
Beschwör das nicht herauf, immer wenn man so etwas sagt passiert irgendetwas Schlimmes, einer meiner Lehrer hat mal gesagt, 'Bereiten sie sich darauf vor, dass alles was ihnen begegnen wird, pathologisch ist, wenn es nicht so wäre würde man sie nicht benötigen, sondern den Job selbst erledigen!'
Zitat: |
...
Und 'n rekursives Dateiverzeichnis gibt es längst: ListFiles.Bas
|
Dass es eines gibt hatte ich nie bezweifelt, das ist ja sogar der klassische Ansatz, man betreibt rekursive Programmierung ja nicht um irgendetwas zu beweisen, (gelle ), sondern um sich die Arbeit zu vereinfachen.
Zitat: |
Allerdings gehöre ich nicht zu den Sekunden(Minuten??)-Zählern..
..das Programm macht, was es soll und gut is.
|
Ja, ist richtig, erst mal muß es funktionieren, dann kann man immer noch auf Geschwindigkeit optimieren.
Zitat: |
(Ich glaube, ich hatte das sogar schon mal hier vorgestellt..)
|
Bin noch nicht so lange dabei...
B.t.w. Du hast ne lustige Art zu programmieren, sieht irgendwie agressiv aus, mit den vielen @, (so wie im Comic: @#!!!!? ), weiter unten im Code ist dir noch ein f reingerutscht, ich hatte schon befürchtet du hättest irgendwo noch eine function f() versteckt. Im Prinzip ist das ja eigentlich genau das Programm das stevie1401 gesucht hat, ... ach ne geht ja nicht, da sind zu viele api Aufrufe dabei, übrigens ein paar sehr nützliche, habs mir auf jeden Fall mal abgespeichert.
Zitat: |
ObjektOrientiert Programmieren ist auch ne tolle Sache, wenn man's gebrauchen kann..
Das ist meine ganz persönliche Meinung.
Gruß
ytwinky |
Hab ich verstanden, dann machs mal gut, bis demnächst!
Gruß
terminate |
|
Nach oben |
|
 |
ytwinky

Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 17.10.2006, 12:14 Titel: |
|
|
terminate hat Folgendes geschrieben: |
Zitat: |
ObjektOrientiert Programmieren ist auch ne tolle Sache, wenn man's gebrauchen kann..
Das ist meine ganz persönliche Meinung.
Gruß
ytwinky |
Hab ich verstanden, dann machs mal gut, bis demnächst!
Gruß
terminate | Ich wollte die Diskussion damit nicht terminieren
Was die Zeilen nach dem Sleep sollen, weiß ich nicht, auch nich wie sie dahin gekommen sind..
..wird aber berichtigt, sobald ich wieder zu Hause bin, versprochen
Wenn du interessante Api-Aufrufe suchst: AllApi.Net (nur englische Version)
Gruß
ytwinky _________________
v1ctor hat Folgendes geschrieben: | Yeah, i like INPUT$(n) as much as PRINT USING.. | ..also ungefähr so, wie ich GOTO.. |
|
Nach oben |
|
 |
stevie1401
Anmeldungsdatum: 04.07.2006 Beiträge: 133
|
Verfasst am: 17.10.2006, 13:39 Titel: |
|
|
...ist ja witzig, was ihr da so erzählt - vor allem weil es nichts mit obigen Thema zu tun hat
Meine Fileselectbox ist fertig.
Sie ist unter "Projekte".
Bin ja gespannt, was ihr dazu sagt.
Nochmals danke für eure Tips.
...das mit dem @uebergabeatrib würde mich schon noch einmal interessieren.
Stevie1401 |
|
Nach oben |
|
 |
terminate
Anmeldungsdatum: 12.09.2006 Beiträge: 56
|
Verfasst am: 17.10.2006, 14:01 Titel: |
|
|
stevie1401 hat Folgendes geschrieben: | ...
Gibt es bei DIR 3 Parameter? Wenn ja, was bezweckt der dritte Parameter? Er ist nicht dokumentiert.
|
Ja es gibt 3 Parameter, und die sind auch dokumentiert:
http://www.freebasic.net/forum/viewtopic.php?p=47806#47806
http://www.freebasic.net/wiki/wikka.php?wakka=KeyPgDir
Allerdings ist der dritte Parameter erst später dazugekommen, (ich habe ihn auch erst eine ganze Zeit lang übersehen), der dritte Parameter, (out_attrib), ist eine Integer Variable in der die Dir Funktion bei jedem 'Dateiobjekt', (Verzeichnis oder Datei), das sie zurückgibt, die aktuellen Attribute dieses Dateiobjekts speichert, (hidden, readonly,system, directory etc.)
Code: | filename = Dir( s_startdir+path_delimiter+s_filespec, i_attribs,@i_ret_attrib ) |
Hier ist filename der aktuelle Dateiname, den die Dir Funktion in diesem Moment zurückgibt, (z.B. Neuer Ordner), nehmen wir mal an Neuer Ordner, wäre schreibgeschützt, versteckt, 'archivierbar' und natürlich auch ein Ordner, dann würde die Variable i_ret_attrib den Wert &h01+&h02+&h20+&h10=&h33, (dezimal: 51, binär: 110011), enthalten.
Das ergibt sich aus:
attrib_readonly + attrib_hidden + attrib_archive + attrib_directory = &h33
Praktischerweise, sind die Zahlenwerte für die Dateiattribute genau so festgelegt worden, dass sie jeweils 1 bestimmtes Bit belegen, d.h. attrib_readonly ist immer Bit 0 und attrib_directory ist immer Bit 4, deshalb darf man die Attribute auch einfach zusammenaddieren ohne dass sie sich gegenseitig beeinflussen, (Übertrag), und kann dann auch ganz leicht überprüfen ob ein Dateiobjekt ein Verzeichnis oder eine Datei ist:
i_ret_attrib AND attrib_directory =
Wenn es sich um ein Verzeichnis handelt kommt hier immer der Wert &h10, (dezimal: 16, binär: 10000), raus.
Deshalb schreibt man auch:
IF i_ret_attrib AND attrib_directory = 16 THEN
oder
IF i_ret_attrib AND attrib_directory <> 0 THEN
oder die Kurzform
IF i_ret_attrib AND attrib_directory THEN
EDIT:
IF i_ret_attrib AND attrib_directory > 0 THEN
macht, (wegen möglichem Rückgabewert -1), mehr Sinn wie
IF i_ret_attrib AND attrib_directory <> 0 THEN
aber dann muß man irgendwann auch damit anfangen über die jeweils korrekte Definition von Boolsch TRUE und FALSE nachzudenken. Wollte jedenfalls nur darauf hinweisen.
(Es gibt übrigens noch mehr Dateiattribute, die obigen sind nur die bekanntesten, unter Windows müßte man eigentlich nach all denen hier unten suchen um wirklich jede Datei mit Dir zu erwischen.
Also: i_attribs=1+2+4+16+32+128+256+2048, mach ich auch meistens, wobei es sich oftmals empfiehlt, auf FILE_ATTRIBUTE_SYSTEM und FILE_ATTRIBUTE_TEMPORARY zu verzichten)
Const FILE_ATTRIBUTE_READONLY = 1 '&H1
Const FILE_ATTRIBUTE_HIDDEN = 2 '&H2
Const FILE_ATTRIBUTE_SYSTEM = 4 '&H4
Const FILE_ATTRIBUTE_DIRECTORY = 16 '&H10
Const FILE_ATTRIBUTE_ARCHIVE = 32 '&H20
Const FILE_ATTRIBUTE_NORMAL = 128 '&H80
Const FILE_ATTRIBUTE_TEMPORARY = 256 '&H100
Const FILE_ATTRIBUTE_COMPRESSED = 2048 '&H800)
Zitat: | ...
Dieses "@i_ret_attrib" gibt ja anscheinend irgendetwas zurück. Wie kommt diese Info in "@i_ret_attrib" rein? |
Die Variable i_ret_attrib, (der Name ist ja beliebig), wird voher im Programm deklariert mit DIM i_ret_attrib as INTEGER, (damit belegt sie an einer bestimmten Stelle im RAM einen Speicherplatz einer bestimmten Größe).
@ bedeutet Adresse von, wenn man also @i_ret_attrib an die Dir Funktionen übergibt, bekommt die Dir Funktion nicht tatsächlich die Variable i_ret_attrib überreicht, (deren Inhalt), sondern nur Informationen darüber, wo sich i_ret_attrib im RAM befindet, mit dieser Information, (der Adresse von i_ret_attrib), kann dann Dir der Variablen i_ret_attrib beliebige Werte zuweisen ohne dass man explizit schreiben muß i_ret_attrib=4567.
Das ist eine gängige Praxis, wenn eine Funktion mal mehr als einen Wert zurückgeben soll, in eigenen Funktionen kann man das übrigens auch verwenden indem man Funktionsparameter BYREF Variablenname übergibt, (das @ wird in diesem Fall normalerweise nicht benötigt, kann aber, wenn man die nötige Erfahrung hat, oftmals sehr trickreich und platzsparend eingesetzt werden, (siehe: ytwinky)).
Die Umkehrung von @variable ist übrigens *variablenadresse und bedeutet Inhalt von variablenadresse.
Zitat: |
Und die zweite Frage: Mir ist aufgefallen, dass du eine Function gemacht hast, die (anscheinend) nichts zurück gibt. Oder "0"? Wegen RETURN 0?
Hättest du anstatt einer Function auch eine SUB nehmen können?
|
Ich nehme grundsätzlich Funktionen, (Gewohnheitssache), eine Funktion kann alles was eine SUB auch kann und noch ein bisschen mehr, warum also jedesmal überlegen ob man das eine oder das andere verwenden soll.
Eine Funktion muß immer einen Wert zurückgeben, sonst gibt es eine Compilerwarnung, es hat aber auch noch andere praktische Gründe, ich kann den Rückgabewert der Funktion überprüfen und weiß dann, aha Rückgabewert 0 alles ok, Funktion ist bis zum Ende durchgelaufen es gab keine Probleme, bei größeren Funktionen kann man ja an jeder beliebigen Stelle die Funktion mit return irgendwas verlassen, abhängig vom Rückgabewert weiß man dann an welcher Stelle die Funktion verlassen wurde und ob es Probleme gab. Return 0 am Ende der Funktion ist so eine Art Standard, Windows Funktionen geben übrigens meistens 1 zurück wenn alles planmäßig verlief, C Programmieren ist das meist egal und sie geben einfach Void zurück, also gar nichts.
Zitat: |
Danke für deine Beschreibung - die finde ich weitaus hilfreicher als die Erklärungen in der Hilfe!
...
|
Das hat eigentlich speziell nichts mit Freebasic zu tun, das sind alles Dinge, die das Betriebssystem so vorgibt, vieles was man im Umgang mit Freebasic lernt kann man leicht abgewandelt auch auf .Net oder C übertragen. Natürlich hätte man die DIR Funktion auch 'kundenfreundlicher' auf Freebasic übertragen können, dann wäre man aber hinterher nur schwer enttäuscht wenn man mal mit einer anderen Programmiersprache arbeiteten würde und wieder ganz von vorne anfangen müßte.
Zuletzt bearbeitet von terminate am 17.10.2006, 15:28, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
terminate
Anmeldungsdatum: 12.09.2006 Beiträge: 56
|
Verfasst am: 17.10.2006, 15:10 Titel: |
|
|
ytwinky hat Folgendes geschrieben: | Ich wollte die Diskussion damit nicht terminieren  |
Kein Thema, bei meinem Studium war zwar auch Informatik dabei, aber mit der Mathematik, (HM1,2,3), stand ich immer auf Kriegsfuss, ohne meinen TI89, (den wir glücklicherweise verwenden durften), wäre es verdammt schwer geworden.
Vielleicht liegt darin auch meine Abneigung gegen rekursive Funktionen begründet, wenn man mich jagen will, muss man mir nur implizite mathematische Funktionsdefinitionen mit den dazugehörigen (auf jeden Fall rekursiven) programmtechnischen Lösungsansätzen vorsetzen.
So gesehen kommt es mir sehr gelegen, dass rekursive Lösungen nicht zu den schnellsten und speichersparenden Lösungen zählen, das ist immer ein willkommenes Argument.
Die objektorientierte Programmierung finde ich eigentlich ganz ok, ich benutze auch gerne mal .Net, (GUI in 10 Minuten erstellt), aber das macht einfach zu sehr abhängig.
Zitat: |
Was die Zeilen nach dem Sleep sollen, weiß ich nicht, auch nich wie sie dahin gekommen sind..
|
Kein Problem hat ja funktioniert.
Zitat: |
...
Wenn du interessante Api-Aufrufe suchst: AllApi.Net (nur englische Version)
Gruß
ytwinky |
Ja, schau ich mir an.
Gruß
terminate |
|
Nach oben |
|
 |
stevie1401
Anmeldungsdatum: 04.07.2006 Beiträge: 133
|
Verfasst am: 18.10.2006, 07:20 Titel: |
|
|
@terminator
Danke für die doch recht hilfreiche Antwort.
Ich habe festgestellt ,dass "@i_ret_attrib " nicht mit FB15b geht.
Ich finde FB15b viel angenehmer zu programieren, da BASICnaher, als alle Versionen danach. Gibt es für die 15b auch einen Trick,"@i_ret_attrib " zu übergeben?
Stevie1401 |
|
Nach oben |
|
 |
ytwinky

Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 18.10.2006, 15:47 Titel: |
|
|
Hi,
diese Diskussion hat auf alle Fälle bewirkt, daß ich GetAttrib.Bas geschrieben habe..
..nichts Großartiges, aber enthält:
-Attrib(DateiName) zum Abfragen von Attributen
-Exist(DateiName) zum Prüfen auf Vorhandensein
-IsDir(DateiName) ist der String ein Verzeichnis
-IsFile(DateiName) ist der String eine Datei
@stevie1401:
Bedenke bei deiner Entscheidung aber auch, daß die Version 0.17 vor der (Weihnachts??-)Tür steht..
..mit nicht unerheblichen Änderungen
Es kann also sein, daß du mit deiner Entscheidung pro0.15b bald ein Einzelkämpfer sein könntest.
Gruß
ytwinky _________________
v1ctor hat Folgendes geschrieben: | Yeah, i like INPUT$(n) as much as PRINT USING.. | ..also ungefähr so, wie ich GOTO.. |
|
Nach oben |
|
 |
|
|
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.
|
|