myGully.com

myGully.com (https://mygully.com/index.php)
-   Programmierung (https://mygully.com/forumdisplay.php?f=67)
-   -   vb.net Frage zu For Each -Schleife (https://mygully.com/showthread.php?t=4922329)

hondocrx 13.10.17 14:34

vb.net Frage zu For Each -Schleife
 
Hallo!

Ich habe ein Array mit bestimmten Dateinamen welche gesucht werden sollen.

PHP-Code:

For Each sDateiname In arrDateiliste

    
if 
        
Existiert die date mach das 
    
else
        
mach das und ne kleine pause
        
--> DAS MÖCHTE ICH !
        
setz die FOR-Schleife um 1 zurück damit die Prüfung noch mal erfolgt
    end 
if

NEXT 

Im Prinzip möchte ich das im ELSE-Zweig die Forschleife nicht hochgezählt wird sDateiname noch mal geprüft wird.

Hat jemand eine Idee?

MfG

baldurgarda2 20.10.17 12:45

Mit For Each klappt das so nicht ;-) Bei dieser Schleife hat du keinen Zugriff auf den Interator ...

Besser du verwendest
Dim i As Integer = 0
While i < arrDateiliste.lenght
if
arrDateilist(i)
i += 1
else
i = i - 1
end if
End While

Wornat1959 21.10.17 16:32

@baldurgulda:
Ja das Konstrukt For Each ist nicht für diese Anforderung gemacht. Ich würde aber auf jeden Fall bei einer echten Zählschleife bleiben. Du hast dir unbemerkt einen Fehler eingebaut.

Mal angenommen die Datei arrDateilist[0] gibt es nicht und es wird FALSE als boolscher Wert zurückgegeben - im Else-Fall ziehst du jetzt 1 ab und deine Zählvariable i steht auf -1.
Es wurde danach gefragt das die Prüfung nochmal mit der gleichen Datei wiederholt werden soll. Also ist die Subtraktion falsch. Für den geschilderten Fall kommt es zu einem Out-Of-Bounds-Error wegen arrDateiliste[-1]

@hondocrx
Ohne mich jetzt mit der Syntax von VB auszukennen tiefer würde ich bei der echten Zählschleife bleiben. Mach es wie folgt - musst du dann nur in passende VB-Syntax anpassen.

Code:

for (int lauf=0; lauf<Größe des Array arrDateiliste;lauf++)
{
    if (existiertDatei(arrDateiliste[lauf]))
    {
          mache irgendwas;
      }
    else
    {
          mache irgendwas;
          mache ne Pause;
         
          lauf--;
      }
}

Hier wird im Else-Zweig auch abgezogen, allerdings findet das lauf++ auch noch statt das immer automatisch kommt.
Noch etwas wenn die Datei nicht existiert und beim zweiten mal auch nicht dann prüft er weiter und weiter und weiter. Du musst also noch eine Art Abbruchbedingung einbauen damit du nicht in ein Endlossschleife steckenbleibst.

Vielleicht so:
Code:

int wie_oft_geprüft=0;
for (int lauf=0; lauf<Größe des Array arrDateiliste;lauf++)
{
    if (existiertDatei(arrDateiliste[lauf]))
    {
          mache irgendwas;
      }
    else
    {
          mache irgendwas;
          mache ne Pause;

          if (wie_oft_geprüft<2)
          {
              lauf--;
              wie_oft_geprüft++;
          }
          else
          {
              wie_oft_geprüft=0;
            }
      }
}

Jetzt wird die Zählvariable lauf aus der For-Schleife nur dann zurückgesetzt um 1 wenn nicht öfters als schon 2 mal geprüft worden ist. Sonst wird mit der nächsten Datei fortgefahren weil lauf nicht zurückgesetzt wurde.

baldurgarda2 21.10.17 16:44

Päpstlicher wie der Papst ;) Ein leeres arrDateiliste.lenght gibt 0 zurück und 0 < 0 geht schwer in die Schleife :D

Wornat1959 21.10.17 17:19

Das war nicht das Problem. Ich spreche nicht von einem von einem leeren arrDateiliste. Das wäre ja nur ein Sonderfall. Hinter arrDateiliste[x] stehen Strings die Dateinamen enthalten sollen. Der Dateiname wird dann genommen und es soll geprüft werden obs dazu die Datei gibt. Wenn nein machst du i=i-1;

Startet man also mit arrDateiliste[0]="irgendeinName" und die Prüfung sagt "Datei gibts nicht" kommt danach arr_Dateiliste[-1] wegen i=i-1. Das Array ist nicht auf einmal kleiner geworden wo es vorher noch den Namen kannte. Deswegen kann man auch in einen Out-Of-Bounds-Error laufen. Grundsätzlich ist i=i-1 wie du sagst, falsch. Du bleibst nicht auf dem Dateinamen zu einer Datei stehen, sondern gehst im Array einen Dateinamen zurück. Das war mein Einwand. Ist vielleicht nicht so klar rüber gekommen.

baldurgarda2 22.10.17 09:01

Wenn man bei einer Grundsatzfrage "päpstlicher wieder Papst" sein will, kommt nie was klar rüber ;) In VB.NET ist ein arrDateiliste[0]="irgendeinName", abgefragt mit arrDateiliste.lenght = 1 :D

Und hondocrx fragte: setz die FOR-Schleife um 1 zurück um dieselbe Datei nochmals zu prüfen ...


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:11 Uhr.

Powered by vBulletin® (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.