Wieso funktioniert array.push() nicht?


03.01.2023, 22:42

EDDIT: array.unshift klappt auch nicht

SerenityStar  05.01.2023, 08:06

Hast du schonmal geguckt welchen ausgabewert width vor Ausführung der schleife hat?

Finja27727 
Fragesteller
 05.01.2023, 10:06

ja es ist 25

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Hallo,

Syntaktisch ist der Code fehlerfrei.

Die Ursache für das leere Array kann im Grunde zwei Ursachen haben:

  1. Der Block der for-Schleife wird niemals ausgeführt. Ich habe zwar keinerlei Kenntnis über die beiden von Dir verwendeten Variablen width und groesse, gehe aber mal stark davon aus, dass keiner der beiden Operanden negativ ist und das Ergebnis kleiner 0 ist.
  2. Du hast einfach vergessen, die Funktion Xcoordinate aufzurufen.

Eines verstehe ich dann aber doch nicht so ganz:

let value = i ;
XArray.push(value);

Wozu eine weitere Referenz auf die Variable i, wenn du das Array ohnehin um diesen Wert erweitern möchtest? Schreibe lieber folgendes:

XArray.push(i);

LG

Finja27727 
Fragesteller
 04.01.2023, 09:46

Danke für die Tipps ich werde Mal den Code ein wenig anpassen

1
Finja27727 
Fragesteller
 04.01.2023, 18:10

was meinst du genau mit der for loop wird nicht audgeführt, in welchem fall würde er denn wohl ausgeführt ?

(width/groesse = 25)

0
regex9  04.01.2023, 18:58
@Finja27727

Die Schleife wird nur dann ausgeführt, wenn die Bedingung im Kopf zutrifft (die war im Übrigen heute morgen auch noch anders, jemand muss den Fragetext bearbeitet haben).

i <= width

Angenommen, width hätte den Wert -1. Dann wäre die Bedingung nicht erfüllt, da der Wert von i (0) weder kleiner, noch gleich -1 ist.

Da du schreibst, dass die Division 25 ergibt, sollte die Schleife jedoch einmal ausgeführt werden.

i = 0, i < 25 => true
- Schleifenkörper wird ausgeführt
- i += 30

i = 30, i < 25 => false
Schleifenlauf ist beendet 

An der Stelle könnte man dennoch noch einmal nachhaken, ob die Division auch zum Zeitpunkt der Ausführung deiner Funktion dieses Ergebnis liefert. Das kannst du ja ziemlich leicht herausfinden, indem du dir den Wert einmal in der Browserkonsole ausgeben lässt.

function Xcoordinate() {
  console.log(width / groesse);
  // Schleife, etc. ...
}     

Wenn der Wert nicht passt, wird die Funktion zum falschen Zeitpunkt aufgerufen bzw. die Variablen haben zu dem Zeitpunkt noch nicht den richtigen Wert zugewiesen bekommen.

Solltest du keine Konsolenausgabe bei Ausführung deiner Anwendung erhalten, muss man davon ausgehen, dass die Funktion Xcoordinate nie aufgerufen wird. Entweder, weil du nirgendwo einen Aufruf in dein Skript integriert hast oder weil ein Programmzweig, in dem sie aufgerufen werden sollte, nie ausgeführt wird.

1
Heinzfred  04.01.2023, 21:22
@Finja27727

@regex9 hat den Ablauf der for-Schleife schon gut veranschaulicht.

Die Definition der Variable i wird einmalig ausgeführt. Anschließend wird die Bedingung im zweiten Teil des Kopfes der for-Schleife ausgewertet. Evaluiert diese zu true, wird zunächst der Schleifenkörper ausgeführt. Anschließend wird in deinem Falle der Wert der Variable i um 30 addiert. Nun wird die Bedingung erneut überprüft und der Code im Schleifenkörper ausgeführt, wenn diese weiterhin true ist. Das geht solange weiter, bis die Bedingung nicht mehr true, sondern false ergibt.

In deinem Falle würde die for-Schleife also nur dann niemals ausgeführt werden, wenn die Variable width bereits im ersten Durchlauf kleiner 0 wäre.

Davon würde ich allerdings eher weniger ausgehen. Entweder die Funktion wird nicht aufgerufen, oder width ist gar nicht definiert, hat also den Wert undefined.

Überprüfe auch das in der Konsole:

function Xcoordinate()
{
  console.log(width);
  // for-Schleife
}

Xcoordinate();

LG

0
Finja27727 
Fragesteller
 04.01.2023, 22:22
@Heinzfred

OK vielen Dank

width ist eine festgelegte variable in der p5-library und ist immer die breite des Canvas.

ich werde also überprüfen, ob ich die funktion aufgerufen habe.

0
Finja27727 
Fragesteller
 04.01.2023, 22:23
@regex9

Vielen Dank, für deine Gute ausführung über den For loop ich denke ich habe es jetzt besser verstanden

0

Bist du sicher, dass

let XArray = [];

innerhalb der function bekannt ist? Ich würde

var XArray = [];

setzen.

Heinzfred  03.01.2023, 23:22

Stellt in JavaScript kein Problem dar. Variablen bzw. Konstanten, die im globalen Gültigkeitsbereich definiert sind, sind in sämtlichen Funktionen und Blöcken auch sichtbar. Davon mal abgesehen sind die var-Zeiten glücklicherweise vorbei ;-)

1