Index der FOR-Schleife +1 wenn Bed. nicht erfüllt!

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
darkdantedante
Beiträge: 9
Registriert: Fr 12. Okt 2012, 15:37

Index der FOR-Schleife +1 wenn Bed. nicht erfüllt!

Beitrag von darkdantedante »

Hallo Community,
ich sitze nun schon etwas länger an einem Programm in dem es darum geht, dass mehrere BMP-Dateien in ein Image geladen werden sollen. Mit jedem einzelten Bild wird jedoch eine Operation durchgeführt.
Die Dateien heißen "001.BMP" - "999.BMP" jedoch sind nicht alle Nummern vorhanden. Ich möchte deswegen mit dem Befehl "fileexists" prüfen ob die Datei vorhanden ist, wenn nicht dann soll die Schleife nicht weiter durchlaufen werden und das nächste Bild geladen bzw. gesucht werden!

Kann mir jemand bei dem Problem behilflich sein, bin leider noch ein "angefangener Anfänger" :lol:

P.S.: Der "coninue-Befehl" (laut google wird mit diesem an den Anfang der Schleife gesprungen und der Index +1 erhöht, funktioniert, so wie unten in meinem Programm leider nicht und er schmeißt einen Fehler raus :( )

Code: Alles auswählen

 
          FOR bildnummer:=1 TO 999 DO
           begin
           s:=inttostr(bildnummer);
           IF length(s)=1 THEN dateiname:='00' + s + '.BMP';
           IF length(s)=2 THEN dateiname:='0' + s + '.BMP';
           IF length(s)=3 THEN dateiname:=s + '.BMP';
           IF not fileexists(dateiname) THEN continue;
 
         Image2.Picture.LoadFromFile(dateiname);                

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2825
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Index der FOR-Schleife +1 wenn Bed. nicht erfüllt!

Beitrag von m.fuchs »

Warum so kompliziert mit continue?

Code: Alles auswählen

if FileExists(dateiname) then begin 
  Image2.Picture.LoadFromFile(dateiname);
  // was immer du noch damit machen musst
end;
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Index der FOR-Schleife +1 wenn Bed. nicht erfüllt!

Beitrag von Socke »

darkdantedante hat geschrieben:P.S.: Der "coninue-Befehl" (laut google wird mit diesem an den Anfang der Schleife gesprungen und der Index +1 erhöht, funktioniert, so wie unten in meinem Programm leider nicht und er schmeißt einen Fehler raus :( )
  • Wie lautet der Fehler?
  • Google sagt dir nur, wo du etwas finden könntest. Was ist die ursprüngliche Quelle?
  • Hast du dein Programm schon durch den Debugger betrachtet?
    Der Debugger wird automatisch gestartet, wenn ein Programm in Lazarus gestartet wird. Einen Haltepunkt (der Debugger hält dein Programm an, wenn es diese Quelltextzeile erreicht) kannst du mit einem Linksklick auf den Rand des Editors links des Quelltextes setzen und wieder entfernen. Über das Menü Ansicht -> Debuggerfenster findest du alle Fenster um den Debugger zu steuern und auch den Inhalt von Variablen auszulesen.
Zu deinen Fragen:
Die Continue-Anweisung springt vor das Ende der Schleife, sodass dann die Schleife erneut durchlaufen wird. Bei einer for-Schleife wird dementsprechend auch weitergezählt.

Noch ein weiterer Hinweis auf eine Frage, die du gar nicht gestellt hast:
Die Funktion FileExists() sagt dir nur, ob eine Datei existiert hat, nicht ob diese danach immer noch vorhanden ist oder ob sie überhaupt gelesen werden kann. Eine korrekte Dateiverarbeitung sähe demnach so aus:

Code: Alles auswählen

FOR bildnummer:=1 TO 999 DO
  begin
  s:=inttostr(bildnummer);
  IF length(s)=1 THEN
    dateiname:='00' + s + '.BMP'
  else
  IF length(s)=2 THEN
    dateiname:='0' + s + '.BMP'
  else
    dateiname:=s + '.BMP';
 
  try
    Image2.Picture.LoadFromFile(dateiname);    
  except
    // Datei konnte nicht zum Lesen geöffnet werden.
    continue;
  end;
end;
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

darkdantedante
Beiträge: 9
Registriert: Fr 12. Okt 2012, 15:37

Re: Index der FOR-Schleife +1 wenn Bed. nicht erfüllt!

Beitrag von darkdantedante »

Socke hat geschrieben:
darkdantedante hat geschrieben:P.S.: Der "coninue-Befehl" (laut google wird mit diesem an den Anfang der Schleife gesprungen und der Index +1 erhöht, funktioniert, so wie unten in meinem Programm leider nicht und er schmeißt einen Fehler raus :( )
  • Wie lautet der Fehler?
  • Google sagt dir nur, wo du etwas finden könntest. Was ist die ursprüngliche Quelle?
  • Hast du dein Programm schon durch den Debugger betrachtet?
    Der Debugger wird automatisch gestartet, wenn ein Programm in Lazarus gestartet wird. Einen Haltepunkt (der Debugger hält dein Programm an, wenn es diese Quelltextzeile erreicht) kannst du mit einem Linksklick auf den Rand des Editors links des Quelltextes setzen und wieder entfernen. Über das Menü Ansicht -> Debuggerfenster findest du alle Fenster um den Debugger zu steuern und auch den Inhalt von Variablen auszulesen.
Zu deinen Fragen:
Die Continue-Anweisung springt vor das Ende der Schleife, sodass dann die Schleife erneut durchlaufen wird. Bei einer for-Schleife wird dementsprechend auch weitergezählt.

Noch ein weiterer Hinweis auf eine Frage, die du gar nicht gestellt hast:
Die Funktion FileExists() sagt dir nur, ob eine Datei existiert hat, nicht ob diese danach immer noch vorhanden ist oder ob sie überhaupt gelesen werden kann. Eine korrekte Dateiverarbeitung sähe demnach so aus:

Code: Alles auswählen

FOR bildnummer:=1 TO 999 DO
  begin
  s:=inttostr(bildnummer);
  IF length(s)=1 THEN
    dateiname:='00' + s + '.BMP'
  else
  IF length(s)=2 THEN
    dateiname:='0' + s + '.BMP'
  else
    dateiname:=s + '.BMP';
 
  try
    Image2.Picture.LoadFromFile(dateiname);    
  except
    // Datei konnte nicht zum Lesen geöffnet werden.
    continue;
  end;
end;
Also ich habe den Quelltext nun übernommen und ihn an die Stelle in meinem Programm geschrieben! Aber auch hier spuckt der compiler wieder eine Fehlermeldung raus.
Ich habe das Gefühl, dass der Befehlt "continue;" nicht funktioniert!
Dateianhänge
FEhler.jpg

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Index der FOR-Schleife +1 wenn Bed. nicht erfüllt!

Beitrag von Socke »

darkdantedante hat geschrieben:Also ich habe den Quelltext nun übernommen und ihn an die Stelle in meinem Programm geschrieben! Aber auch hier spuckt der compiler wieder eine Fehlermeldung raus.
Ich habe das Gefühl, dass der Befehlt "continue;" nicht funktioniert!
Der Befehl continue kann nur "funktionieren" wenn der Compiler ihn in ein fertiges Programm übersetzen kann. Dass kann er aber nicht, weil dein Quelltext syntaktisch nicht in Ordnung ist.

Zur Abwechslung einmal bitte die Compilermeldung nicht nur ansehen sondern auch durchlesen:
Syntax Error, "." expected but ";" found
Wie du siehst, es wird ein Semikolon angekreidet und nicht das continue selbst. Daraus lässt sich schließen, dass das Schlüsselwort continue existiert und korrekt verwendet wird.

Die Lösung wird es wohl nicht sein, das Semikolon durch einen Punkt zu ersetzen, da das Semikolon als Trennzeichen zwischen zwei Ausdrücken vollkommen richtig ist.

Empfehlung: Den Quelltext syntaktisch überprüfen. Eine korrekte Einrückung der Ebenen (begin .. end;-Blöcke und der darin enthaltenen Ausdrücken) hilft dabei ungemein.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: Index der FOR-Schleife +1 wenn Bed. nicht erfüllt!

Beitrag von gocher »

ich würde es so anstellen:

Code: Alles auswählen

 for i := 1 to 999 do
begin
  img := PathToFolder + Format('%.4d', [i]) + '.BMP';
  if FileExists(img) then
  begin 
     Image2.Picture.LoadFromFile(img);
     //...
  end;
end;
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

darkdantedante
Beiträge: 9
Registriert: Fr 12. Okt 2012, 15:37

Re: Index der FOR-Schleife +1 wenn Bed. nicht erfüllt!

Beitrag von darkdantedante »

darkdantedante hat geschrieben:
Socke hat geschrieben:
darkdantedante hat geschrieben:P.S.: Der "coninue-Befehl" (laut google wird mit diesem an den Anfang der Schleife gesprungen und der Index +1 erhöht, funktioniert, so wie unten in meinem Programm leider nicht und er schmeißt einen Fehler raus :( )
  • Wie lautet der Fehler?
  • Google sagt dir nur, wo du etwas finden könntest. Was ist die ursprüngliche Quelle?
  • Hast du dein Programm schon durch den Debugger betrachtet?
    Der Debugger wird automatisch gestartet, wenn ein Programm in Lazarus gestartet wird. Einen Haltepunkt (der Debugger hält dein Programm an, wenn es diese Quelltextzeile erreicht) kannst du mit einem Linksklick auf den Rand des Editors links des Quelltextes setzen und wieder entfernen. Über das Menü Ansicht -> Debuggerfenster findest du alle Fenster um den Debugger zu steuern und auch den Inhalt von Variablen auszulesen.
Zu deinen Fragen:
Die Continue-Anweisung springt vor das Ende der Schleife, sodass dann die Schleife erneut durchlaufen wird. Bei einer for-Schleife wird dementsprechend auch weitergezählt.

Noch ein weiterer Hinweis auf eine Frage, die du gar nicht gestellt hast:
Die Funktion FileExists() sagt dir nur, ob eine Datei existiert hat, nicht ob diese danach immer noch vorhanden ist oder ob sie überhaupt gelesen werden kann. Eine korrekte Dateiverarbeitung sähe demnach so aus:

Code: Alles auswählen

FOR bildnummer:=1 TO 999 DO
  begin
  s:=inttostr(bildnummer);
  IF length(s)=1 THEN
    dateiname:='00' + s + '.BMP'
  else
  IF length(s)=2 THEN
    dateiname:='0' + s + '.BMP'
  else
    dateiname:=s + '.BMP';
 
  try
    Image2.Picture.LoadFromFile(dateiname);    
  except
    // Datei konnte nicht zum Lesen geöffnet werden.
    continue;
  end;
end;
Also ich habe den Quelltext nun übernommen und ihn an die Stelle in meinem Programm geschrieben! Aber auch hier spuckt der compiler wieder eine Fehlermeldung raus.
Ich habe das Gefühl, dass der Befehlt "continue;" nicht funktioniert!
Vielen Dank an alle, es läuft nun juhuuu :lol:

Eclipticon
Beiträge: 292
Registriert: Sa 5. Feb 2011, 20:38
OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
CPU-Target: 32Bit
Wohnort: Wien

Re: Index der FOR-Schleife +1 wenn Bed. nicht erfüllt!

Beitrag von Eclipticon »

Hi,

statt diesem Code hier

Code: Alles auswählen

 
  IF length(s)=1 THEN
    dateiname:='00' + s + '.BMP'
  else
  IF length(s)=2 THEN
    dateiname:='0' + s + '.BMP'
  else
    dateiname:=s + '.BMP';
 
wuerde sich die Verwendung von StrUtils.AddChar anbieten ...

Antworten