Frage zu Schleifenvariable

M

michael m.

Aktives Mitglied
Thread Starter
Dabei seit
29.12.2006
Beiträge
407
Reaktionspunkte
6
Hi,

ich habe ein Array mit 143 Objekten.
Alle Objekte werden bearbeitet und daher wollte ich die Schleifenvariable mit der Count Methode generieren
Da das Array immer bei 0 beginnt, muss der Wert kleiner sein als der errechnete Wert durch count
Code:
for(int i = 0; i < zeilenArray.count; i++) {
...
}

Leider erhalte ich eine Fehlermeldung , wahrscheinlich wird eine weiterer Schleifendurchlauf versucht.

Code:
*** Terminating app due to uncaught exception 'NSRangeException',

Ändere ich den Code so ab

Code:
NSInteger zaehler = [zeilenArray count] -1;
for(int i = 0; i < zaehler; i++) {

Läuft die Schleife und erhalte auch keine Fehlermeldung.
Allerdings erhalte ich in Array dann aber nur 142 Objekte, eines fehlt!!?

Eigentlich sollten doch beide Vorgehensweisen das gleiche Ergebnis liefern?

Habe ich da einen Denkfehler?

Vielen Dank

Michael
 
der denkfehler ist, dass es gleiche ergebnisse liefern sollte.
weil zeilenArray.count nicht gleich [zeilenArray count]-1 ist …
ist ja ein unterschied von 1 …
 
  • Gefällt mir
Reaktionen: michael m.
Sollte doch das gleiche Ergebnis liefern.

Hier habe ich beschrieben, das es kleiner sein soll als zeilenArray.count
Code:
i < zeilenArray.count

Genau so wie
Code:
NSInteger zaehler = [zeilenArray count] -1;

Allerdings hakt es immer am letzten Eintrag des Arrays?
 
Solches Verhalten deutet eigentlich immer auf Seiteneffekte des Schleifeninhaltes hin. Veränderst du den Inhalt des Arrays da? Sowas ist nämlich ganz ganz ganz böse...
 
  • Gefällt mir
Reaktionen: michael m.
Mir ist aufgefallen, das ein Datum nicht bearbeitet werden konnte, welches immer am Ende des Arrays war.
Da ich im Code einfach nichts finden konnte, habe ich in der zu importierenden CSV Datei geschaut und musste feststellen, das es ganz am Ende noch einen Absatz mit einem Leerzeichen gab, die auch in das Array importiert wurde, aber keine Daten hatte.

Das Leerzeichen habe ich entfernt und siehe da, es funktionierte auf einmal. :clap:
 
Sollte doch das gleiche Ergebnis liefern.

Hier habe ich beschrieben, das es kleiner sein soll als zeilenArray.count
Code:
i < zeilenArray.count

Genau so wie
Code:
NSInteger zaehler = [zeilenArray count] -1;

Allerdings hakt es immer am letzten Eintrag des Arrays?

wieso sollte es?
i < zaehler
und
i < zeilenArray.count

zaehler ist 142 und zeilenArray.count 143 …

also löst die korrektur deines CSV wohl nicht dein schleifen problem…
 
Ist nicht ganz richtig.
Code:
i < zeilenArray.count
Das Ergebnis vom count ist 143 richtig, aber da ja von 0 bis 142 gezählt wird,
läuft die Schleife solange wie i kleiner als 143 ist also 142.
Von 0 bis 142 sind 143 durchläuft.

Code:
NSInteger zaehler = [zeilenArray count] -1;
Das Ergebnis hier ist 142 und lässt auch die Schleife 143 mal laufen
und zwar von 0 bis 142.

Habe es jetzt noch mal getestet und mittlerweile klappt alles.
Das Problem war tatsächlich in der CSV Datei mit dem Seitenumbruch und dem Leerzeichen.
Mein Problem ist damit doch gelöst.
 
die andere läuft 1 mal mehr durch…
i < 142 und i < 143

und bei der 0 zählung 143 und 144…
 
Ich möchte nicht unhöflich sein aber nach meiner Kenntnis ist es wie folgt.

Code:
i < zeilenArray.count   // i < 143
Das wären 143 durchläufe von 0 bis 142

Code:
NSInteger zaehler = [zeilenArray count] -1;  // NSInteger = 143 - 1
Das wären ebenfalls 143 durchläuft von 0 bis 142, denn 143-1 Ergibt 142
 
bei i < 142 geht es von 0 bis 141, bei 142 ist die abbruchbedingung erfüllt und es geht nicht weiter…
 
Ich kapier echt nicht wie Du auf i < 142 kommst, tatsächlich wird mit count 143 zurückgegeben und da das kleiner Zeichen die Bedienung ist, wird bei 142 Schluss (i<143) gemacht. Wir sind uns einig, das die Schleife von 0 bis 142 läuft und damit ist die Bedingung erfüllt, da werden 143 Schleifendurchgänge abgearbeitet.
 
Zuletzt bearbeitet:
Ich kapier echt nicht wie Du auf i < 142 kommst…

Na ganz einfach weil du einmal geschrieben hast:

Code:
NSInteger zaehler = [zeilenArray count] - 1;
Unter der Annahme, dass [zeilenArray count] 143 ist wird hier zaehler auf 142 initilisiert und in der Schleife fragst du nach der Bedingung i < zaehler, also i < 142 ;)

wird bei 142 Schluss (i>143) gemacht.

Ja, schon der Klammerausdruck ist falsch, nicht i > 143 sondern i = 143 führt schon dazu, dass die Schleifenbedingung nicht mehr erfüllt ist.
 
  • Gefällt mir
Reaktionen: michael m.
Ach jetzt versteh ich es.
Allerdings waren das zwei verschiedene Schleifen und hatten nichts miteinander zu tun.
Es ging lediglich darum, das beide Schleifen das gleiche Ergebnis erzielen sollten.
Zu diesem Zeitpunkt wusste ich nicht, das der Fehler in der ein zu lesenden Datei steckte.

Trotzdem vielen Dank an alle
 
Hat dein Programm eigentlich generell Probleme damit, wenn eine Zeile leer ist? Ich empfehle dir das zu prüfen und nur dann die Zeile zu verarbeiten, wenn sie auch die entsprechende Voraussetzung besitzt verarbeitet zu werden.
 
Habe es noch nicht implementiert, werde es aber nachholen.
Danke
 
Ach jetzt versteh ich es.
Allerdings waren das zwei verschiedene Schleifen und hatten nichts miteinander zu tun.

es mögen unterschiedliche schleifen sein, aber die mit i < zeilenArray.count ist nun mal nicht korrekt.
die liefert dir immer eine NSRangeException, egal, ob deine CSV ok ist oder nicht.

das grundlegende problem mit dem count, i++ als postinkrement und dem verschieben um 1 wegen array ab 0 hast du ja schon erkannt, aber es nur an einer stelle berücksichtigt, der schleife mit zaehler…
deswegen gibt dir objective-c auch andere methoden um arrays zu iterieren als mit einer i++ for-schleife…
 
Zurück
Oben Unten