Seite 2 von 2

Verfasst: 18.10.2006 12:51
von #NULL
ich hatte den überschreibungsschutz extra nicht in die procedure mit reingemacht, damit das jeder selber entscheiden kann.

aber bitte:
[gibt es irgendwelche nachteile daran, dass mit ReadFile() zu machen, und nicht mit Filesize() ?]

Code: Alles auswählen

Procedure.s increaseFilename(file.s)
  Protected path.s
  Protected ext.s
  Protected fullname.s
  Protected name.s
  If ReadFile(33,file)
    CloseFile(33)
    path=GetPathPart(file)
    fullname.s=GetFilePart(file)
    ext.s=GetExtensionPart(file)
    name=Left( fullname, Len(fullname)-Len(ext)-1 )
    i=2
    While ReadFile(33, path + name + "(" + Str(i) + ")." + ext )
      CloseFile(33)
      i+1
    Wend
    file= path + name + "(" + Str(i) + ")." + ext
  EndIf
  ProcedureReturn file
EndProcedure



datei$="C:\test\rippchen\tempo.txt"

CreateFile(0, increaseFilename(datei$) )
CloseFile(0)

CreateFile(0, increaseFilename(datei$) )
CloseFile(0)

CreateFile(0, increaseFilename(datei$) )
CloseFile(0)

CreateFile(0, increaseFilename(datei$) )
CloseFile(0)
insofern "C:\test\rippchen\tempo.txt" nicht existiert, aber es die ordner bereits gibt, werden die dateien
C:\test\rippchen\tempo.txt
C:\test\rippchen\tempo(2).txt
C:\test\rippchen\tempo(3).txt
C:\test\rippchen\tempo(4).txt
erstellt.

<edit>
die proc gibt den dateinamen zurück wie er übergeben wurde, wenn sie nicht existiert. wenn sie aber schon existiert, wird der name mit klammern inkrementiert, bis ein 'unbesetzter' dateiname entsteht, und wird zurückgegeben.
nachteil:
aus z.b.datei(9).ext macht die proc (wenn datei exisiert) den namen datei(9)(1).ext

Verfasst: 18.10.2006 12:56
von Nafets
@#NULL:

funktioniert wunderbar Dein Code.

Jetzt hätt mich nur noch interessiert wie sich das mit den Variablen in der Prozedur verhält.

Wieso haben die bei der Deklaration andere Namen als beim Aufruf ?

Verfasst: 18.10.2006 13:12
von NicTheQuick
@#Null:

Solche Sachen würde ich ausschließlich mit #PB_Any machen. Das ist die
sicherste Methode.

Verfasst: 18.10.2006 13:27
von Kaeru Gaman
Nafets hat geschrieben:Wieso haben die bei der Deklaration andere Namen als beim Aufruf ?
der name in der deklaration wird nur im code der Procedure selber benötigt.

später beim aufruf kann man jeden beliebigen ausdruck desselben typs dafür nehmen.
das ist schlicht und einfach sinn der sache, sonst bräuchte man doch keine Procedures schreiben.

was hab ich von einer Plot(x,y), wenn ich sie nicht mit

Code: Alles auswählen

Plot( 320+128*Sin((n/37)*#PI/180), 240+96*Cos((n/37)*#PI/180))
aufrufen kann?

Verfasst: 18.10.2006 13:35
von #NULL
@ntq
ja, das stimmt allerdings. die wahrscheinlichkeit einer bereit verwendeten FileID 33 ist zwar gering, aber beim programmieren, sollte es nur die wahrscheinlichekiten 0 und 1 geben <) .

@nafets
alle in dieser proc definierten variablen sind 'Protected'. auch die variable 'file' ohne das schlüsselwort 'Protected zu verwenden, weil sie bereits im prozeduren-kopf deklariert wird.

beim aufruf der proc zählt nur der inhalt von 'datei$'. du könntest ja auch direkt

Code: Alles auswählen

CreateFile(0, increaseFilename( "C:\test\rippchen\tempo.txt" ) ) 
schreiben, also ohne einen bezeichner zu verwenden. in der proc wird die variable 'file' am anfang mit dem übergebenen wert gefüllt. das einzige was 'datei$' und 'file' miteinander zu tun haben ist also, das beim aufruf der inhalt von 'datei$' in 'file' kopiert wird. datei$ wird selbst nicht verändert.

anders ist es beim direkten arbeiten mit pointern/zeigern bzw wenn arrays oder linked-lists übergeben werden..

in der hilfe gibt es einen abschnitt
-----------------------------
Prozeduren Unterstützung

Global
Procedure : EndProcedure
Protected
Shared
Static
-----------------------------

Verfasst: 18.10.2006 13:37
von Nafets
Dass Variablen variabel sein müssen is schon klar.
Bei Deinem Beispiel würde aber aus Plot(x,y) Plot(a,b) werden.

So ist es jedenfalls beim Code von #NULL weiter oben.

Oder reden wir jetzt aneinander vorbei ?

Verfasst: 18.10.2006 13:45
von Kaeru Gaman
@Nafets

> Oder reden wir jetzt aneinander vorbei ?

wahrscheinlich. ich formuliers mal anders.

bei erstellen/deklarieren einer procedure definiere ich argumente,
die dazu dienen, werte von außen in die Proc zu übernehmen.

Code: Alles auswählen

Procedure DisplayCoords( X.l, Y.l )
  Debug "Koordinaten: "+ Str(X) + ", " + Str(Y)
EndProcedure
später beim aufruf kann ich sie durch alles, was ich will ersetzen

Code: Alles auswählen

DisplayCoords(42,23)

DisplayCoords(37*#PI,42*#PI)

a = 17 : b = 11
DisplayCoords(a,b)
es besteht also kein grund, für den aufruf denselben namen wie bei der deklaration zu verwenden.
eher im gegenteil:
manche programmierer (mich eingeschlossen) verwenden lieber
mit absicht andere namen, um verwechslungen vorzubeugen.

Verfasst: 18.10.2006 14:09
von Nafets
OK. Kapiert.

Danke.

Verfasst: 18.10.2006 14:57
von Kaeru Gaman
d'rien