INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Index außerhalb des gültigen Bereichs
17.04.2014, 13:56 (Dieser Beitrag wurde zuletzt bearbeitet: 17.04.2014 14:47 von hr3.)
Beitrag #1
Index außerhalb des gültigen Bereichs
Hallo,
habe gerade eine Erkenntnis (getestet mit IDE 1.0.5 und 1.5.5), die ich nicht glauben mag.

Ich kann auf Elemente eines Arrays zugreifen die außerhalb des definierten (gültigen) Bereichs liegen, ohne eine Fehlermeldung zu bekommen. Dabei ist nicht nur abfragen sondern auch das zuweisen von Werten möglich.

In anderen Sprachen/Entwicklungsumgebungen kommt die Fehlermeldung "Index außerhalb des gültigen Bereichs" oder ähnlich.

Hier wird werden weder die Konstanten vom Compiler geprüft, noch bei der Ausführung (da könnten es auch Variablen sein) reagiert.

Mir ist bewußt, dass ein Abbruch für einen irgendwo im Hintergrund laufenden Arduino, nicht die Lösung sein kann und sollte und auch keine Standardausgabe für ein Protokoll vorhanden ist. Allerdings könnten/sollten anstelle von zufälligen Werten aus dem Speicherbereich z.B. LowValues bereitgestellt und Updates müssen zwingend verhindert werden.

Oder bin ich einem Irrtum aufgesessen?

Es geht noch schlimmer.

Auch die Division durch (konstante) NULL wird vom Compiler nicht erkannt und während der Laufzeit mit dem Ergebnis -1 ausgeführt. Auch 0 wäre falsch, aber aus meiner Sicht immer noch besser.

Natürlich kann ich das alles selber vorher prüfen und durch Logik darauf reagieren. Bläht ein kleines Arduino-Programm nur unnötig auf, kostet Speicher und Performance und wer denkt schon immer daran, zumal es in anderen Umgebungen (Ausnahme Division durch (variable, konstante ist sowie Quatsch) 0) nicht erforderlich ist.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.04.2014, 17:10
Beitrag #2
RE: Index außerhalb des gültigen Bereichs
Hallo hr3,

hört sich intressant an. Allerdings bringen deine Aussagen nicht soooviel, wenn die Codes die du verwendest nicht dabei sind.
Sollten deine Aussagen stimmen (was zu testen wäre - wozu man widerum den Code bräuchte), wäre eine Mitteilung an die Entwickler bei diesen sicher willkommen.
Auch wäre sinnvoll zu wissen mit welcher IDE Version auf welchem Betriebssystem du arbeitest.

Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.04.2014, 17:30 (Dieser Beitrag wurde zuletzt bearbeitet: 17.04.2014 17:55 von hr3.)
Beitrag #3
RE: Index außerhalb des gültigen Bereichs
Hallo,
IDE ist angegeben, XP sollte keinen Einfluß darauf haben.
Code:
int x=0;
int x0=0;

void setup() {
Serial.begin(9600);

x=1/0; //das könnte/sollte der Syntax-Checker erkennen
Serial.println(x); //Ergebnis -1

x=0;
x=1/x0; //wenn durch eine Variable geteilt wird, ist das eigentlich nur während der Laufzeit erkennbar
Serial.println(x); //Ergebnis -1
}
void loop() {}

und noch ein Beispiel zum Array-Thema
Code:
int i[2][3];

void setup() {
Serial.begin(9600);
i[0][0]=0; //erstes gültiges Element
i[1][2]=12; //letztes gültiges Element
ausgabe_i();
Serial.println("------------------------");
//alle folgenden sind außerhalb des (gültigen) Bereichs
i[0][4]=4;
i[1][3]=13;
i[2][0]=20;
i[3][0]=30;
i[4][0]=40;
i[4][1]=41;
i[4][2]=42;
i[4][3]=43;
i[4][4]=44;
i[99][99]=9999;
i[99][100]=99100;
ausgabe_i();
}
void loop() {}

void ausgabe_i() {
for (int i1=0; i1<5; i1++) {
  Serial.print("["); Serial.print(i1); Serial.print("]:");
  for (int i2=0; i2<5; i2++) {
   Serial.print(i[i1][i2]);
   Serial.print("|");
  }
  Serial.println();
}

Serial.print("\n[4][4]:");  Serial.println(i[4][4]);
Serial.print("[98][98]:");  Serial.println(i[98][98]);
Serial.print("[99][99]:");  Serial.println(i[99][99]);
Serial.print("[99][100]:"); Serial.println(i[99][100]);
Serial.print("[100][0]:");  Serial.println(i[100][0]);
}

Habe mittlerweile die Erkenntnis, dass das unter C++ wohl normal (gewollt) ist.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.04.2014, 17:57
Beitrag #4
RE: Index außerhalb des gültigen Bereichs
Nur ganz kurz:

- in der Arduino IDE wird ein Subset der Sprache C benutzt
- die Sprache C selbst kennt nur sehr wenige Möglichkeiten des Runtime / Error Trapping.
- dies liegt schlicht daran, dass C als Low Level Sprache geschrieben wurde
- Funktionen die nicht den eigentlichen Sprachumfang betreffen wurden also möglichst vermieden. Ergo der/die Programmierer/in muss sich selbst darum kümmern.

Jedoch selbst wenn in C das Trapping für Devision by Zero enthalten wäre, würde der Arduino bzw. der Compiler keinen Übersetzungsfehler erzeugen. Das hat eine einfache Ursache: Die AVR-basierenden Microcontroller haben keine Division - Instructions on board. Division wird also über andere math. Verfahren "emuliert".

Ergo weder ein Fehler im Syntaxcheck des Compilers, noch ein IDE-"Fehler"

Grüße Ricardo[/code]

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste