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
Arbeiten mit Arrays
03.03.2019, 17:10
Beitrag #1
Arbeiten mit Arrays
Moin!

ich möchte mein erstes grosses Sketch von Null aufbauen.

Es geht um die Steuerung von Weichen in Verbindung mit Sensoren. Mit GleisCount möchte sich später die Anzahl der Abstellgleise (das ganze ist ein einfacher Bahnhof) möglichst einfach erweitern können. Deshalb auch die Schleifen.

In VB würde ich das über Arrays und Schleifen lösen.

Meinen Einstieg haut mir die IDE beim Übersetzen um die Ohren. Mir fallen aber keine weiteren Syntax-Fehler auf. Kann einer einmal rüber schauen?

Gruß Jan

Hier mein Code:
PHP-Code:
// Pinbelegung am Board
// Sensoren für die Zugdurchfahrt
#define sReset 6
#define GleisCount 2 // Anzahl der Gleise

// Belegung für die Weichenschaltung
int SensorGleisPin[GleisCount];
int SwitchPin[GleisCount][2];

// Pinbelegung für die Gleissensoren
SensorGleisPin[1] = 8;
SensorGleisPin[2] = 7;

// Pinbelegung für die Weichensteuerung
SwitchPin[1][0] = 5// Weiche 1- geradeaus 
SwitchPin[1][1] = 6// Weiche 1- abbiegen
SwitchPin[2][0] = 7// Weiche 2- geradeaus 
SwitchPin[2][1] = 8// Weiche 2- abbiegen

int g_CurrentGleis= -1;          // -1 ... offen für neue Gleiseinfahrten / 1... belegtes Gleis

void setup() 
  {
    
Serial.begin(9600);
    
Serial.println("Pinbelegung");
    
pinMode(sReset,INPUT);
    
// ToDo: hier könnte eine Schleife definiert werden
    
for (int i=1; ==GleisCounti++){
      
Serial.print("Pin: ");
      
Serial.println(i);
      
pinMode(SensorGleisPin[i],INPUT);
    }
//end-for

  
// end-setup

void loop() {
 
Serial.println("LOOP ....");
 
// Auslesen Reset-Sensor
 
if (digitalRead(sReset))==HIGH
    
Serial.println("Reset");
    
g_CurrentGleis true;
 }        

 
// ToDo: hier könnte eine Schleife definiert werden
 
if (digitalRead(sReset)==HIGH){ 
    
Serial.println("Reset");
    
g_CurrentGleis = -1;
 }        
 
}
//end loop


void SchalteWeiche()
  {
  }
//end-SchalteWeiche 
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.03.2019, 17:47
Beitrag #2
RE: Arbeiten mit Arrays
Hallo Jan,

da sind gleich mehrere Probleme vorhanden.

Das Setzen der Pin-Belegungen sind Zuweisungen. Die musst du in setup() unterbringen.

Code:
void setup() {
  // Belegung für die Weichenschaltung
  int SensorGleisPin[GleisCount];
  ...
  SwitchPin[2][1] = 8; // Weiche 2- abbiegen
  ...
}

Die for - Schleife in setup() ist ebenfalls falsch formuliert.
Code:
for (int i=1; ==GleisCount; i++){ // falsch
for (int i=0; i <GleisCount; i++){ // richtig
Die Bedingung muss angeben, wann die Schleife ausgeführt werden soll. Das ist der Fall, wenn i < Gleiscount ist. Arrays in C beginnen immer bei 0, daher sollte auch die Schleife bei 0 beginnen.

in loop(9hast du noch einen Klammerfehler:
Code:
if (digitalRead(sReset))==HIGH{  // falsch
if (digitalRead(sReset)==HIGH) {  // richtig
if (digitalRead(sReset)) {  // wäre auch möglich

Diese Hinweise betreffen nur die Syntax. Über die Funktion habe ich mir keine Gedanken gemacht.

Gruss
René
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.03.2019, 18:03
Beitrag #3
RE: Arbeiten mit Arrays
Hallo Rene,

vielen Dank erst einmal für die Hilfestellung.

Das mit dem Zählen von 0 ignoriere ich einfach einmal und lasse 0 links liegen - ansonsten kommt es bei der Konfiguration später zu Benennungsproblemen. Gleise mit der Nummer 0 gibt es nicht.

Hier nun die aktuelle Version:
PHP-Code:
// Pinbelegung am Board
// Sensoren für die Zugdurchfahrt
#define sReset 6
#define GleisCount 2 // Anzahl der Gleise

void setup() 
  {
    
Serial.begin(9600);
    
Serial.println("Pinbelegung");
 
     
// Belegung für die Weichenschaltung
    
int SensorGleisPin[GleisCount];
    
int SwitchPin[GleisCount][2];

    
// Pinbelegung für die Gleissensoren
    
SensorGleisPin[1] = 8;
    
SensorGleisPin[2] = 7;

    
// Pinbelegung für die Weichensteuerung
    
SwitchPin[1][0] = 5// Weiche 1- geradeaus 
    
SwitchPin[1][1] = 6// Weiche 1- abbiegen
    
SwitchPin[2][0] = 7// Weiche 2- geradeaus 
    
SwitchPin[2][1] = 8// Weiche 2- abbiegen

    
int g_CurrentGleis= -1;          // -1 ... offen für neue Gleiseinfahrten / 1... belegtes Gleis
 
    
pinMode(sReset,INPUT);
    
// ToDo: hier könnte eine Schleife definiert werden
    
for (int i=1<GleisCount+1i++){ // richtig
      
Serial.print("Pin: ");
      
Serial.println(i);
      
pinMode(SensorGleisPin[i],INPUT);
    }
//end-for

  
// end-setup

void loop() {
 
Serial.println("LOOP ....");
 
// Auslesen Reset-Sensor
 //
 
if (digitalRead(sReset)) {
    
Serial.println("Reset");
    
g_CurrentGleis = -1;
 }        

 
// ToDo: hier könnte eine Schleife definiert werden
 //if (digitalRead(sReset)) {
 //   Serial.println("Reset");
 //   g_CurrentGleis = -1;
 //}        
 
}//end loop 

Aber es kommt immer noch eine Fehlermeldung:
Zitat:H:\Modellbahn\Elektronik\Arduino Ausweichbahnhof\Arduino\Ausweichbahnhof_20190303\Ausweichbahnhof_20190303.ino: In function 'void loop()':

Ausweichbahnhof_20190303:44: error: 'g_CurrentGleis' was not declared in this scope

g_CurrentGleis = -1;

^

exit status 1
'g_CurrentGleis' was not declared in this scope

die ich nicht verstehe!

Kannst Du nochmal schauen?

Gruß Jan
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.03.2019, 18:17
Beitrag #4
RE: Arbeiten mit Arrays
Hallo Jan,

jetzt hast du zu viel nach unten in setup() genommen.
Folgende Teile sind Deklarationen und müssen im Bereich oberhalb von setup() verbleiben.

Code:
// Pinbelegung am Board
// Sensoren für die Zugdurchfahrt
#define sReset 6
#define GleisCount 2 // Anzahl der Gleise

// Belegung für die Weichenschaltung
int SensorGleisPin[GleisCount];
int SwitchPin[GleisCount][2];

int g_CurrentGleis= -1;          // -1 ... offen für neue Gleiseinfahrten / 1... belegtes Gleis

void setup()
  {

int g_CurrentGleis= -1; ist eine Deklaration mit Zuweisung eines Startwertes. Diese dürfen global angegeben werden.
Die Deklaration in setup() ist ebenfalls erlaubt. Allerdings ist dann die Variable auch nur in setup() sichtbar.

Gruss
René
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.03.2019, 18:41 (Dieser Beitrag wurde zuletzt bearbeitet: 03.03.2019 18:55 von shrimps.)
Beitrag #5
RE: Arbeiten mit Arrays
Hi,
du definierst ein Array mit [2] und schreibst z.bsp. später in
myArry[2] etwas rein.
Das ist FALSCH und kann zu sehr seltsamen Problemen führen.

Ich habe mal für dich in der ArduinoRef. nachgelesen, leider nur die englische, aber die sollte dir vom Verständniss her helfen:

Viel Spaß
Shrimps

***
Accessing an Array

Arrays are zero indexed, that is, referring to the array initialization above, the first element of the array is at index 0, hence

mySensVals[0] == 2, mySensVals[1] == 4, and so forth.

It also means that in an array with ten elements, index nine is the last element. Hence:

int myArray[10]={9, 3, 2, 4, 3, 2, 7, 8, 9, 11};
// myArray[9] contains 11
// myArray[10] is invalid and contains random information (other memory address)

For this reason you should be careful in accessing arrays. Accessing past the end of an array (using an index number greater than your declared array size - 1) is reading from memory that is in use for other purposes. Reading from these locations is probably not going to do much except yield invalid data. Writing to random memory locations is definitely a bad idea and can often lead to unhappy results such as crashes or program malfunction. This can also be a difficult bug to track down.

Unlike BASIC or JAVA, the C++ compiler does no checking to see if array access is within legal bounds of the array size that you have declared.
***

Nochmals Hi,
ich hätte als Beispiel eine Struktur definiert und diese dann als Array aufgebaut...

Da ich nicht genau weiss, wie du die Weichen ansteuerst, schwimme ich hier etwas.

Beispiel:
Ich habe eine Datei namens variablen.h:
struct _Weiche {
byte pin1;
byte pin2;
boolean richtung;
};

_Weiche Weichen[10]; // Nun hast du 0-9 Weichenadressen

// Nun alles vorbelegen:

Weichen[1].pin1 = 7;
Weichen[1].pin2 = 8;
Weichen[1].richtung = true;

Wenn man es weitertreiben möchte, kann man die Indexzähler auch vie Enum sprechend machen, aber das könnte dich ggf. jetzt überfordern.

Viel Spaß
Shrimps
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.03.2019, 19:44 (Dieser Beitrag wurde zuletzt bearbeitet: 03.03.2019 20:21 von Jan99.)
Beitrag #6
RE: Arbeiten mit Arrays
hi!
danke für die Info - werde ich mir mal näher ansehen.

Was ich aber gerade noch festgestellt habe ist folgendes und vielleicht steht das in dem Zusammenhang:

Die Wertebelegung ist ja hier bekannt und in der Loop ist nur folgendes:

PHP-Code:
Serial.print(sReset);
if (
digitalRead(sReset)==HIGH) {
  
Serial.println(" - HIGH");
} else {
  
Serial.println(" - LOW");  
}


Serial.print(SensorGleisPin[2]);
if (
digitalRead(SensorGleisPin[2])==HIGH) {
  
Serial.println(" - HIGH");
} else {
  
Serial.println(" - LOW");  
}


Serial.print(SensorGleisPin[1]);
if (
digitalRead(SensorGleisPin[1])==HIGH) {
  
Serial.println(" - HIGH");
} else {
  
Serial.println(" - LOW");  


Dennoch werden teilweise merkwürdige Pins ausgelesen, die ich gar nicht definiert habe bzw. diese werden "hochgezählt" - jenseits von gut und böse.

An welcher Stelle in meinem Code muss ich die structure und die Anzahl der Weichen definieren?

Dann sollte ich die Sensoren-Pin auch in die Weichen integrieren.

Gruss Jan

Hi!

habe jetzt einmal folgendes ausprobiert:

PHP-Code:
// Pinbelegung am Board
// Sensoren für die Zugdurchfahrt
#define sReset 6
#define GleisCount 2 // Anzahl der Gleise

// Belegung für die Weichenschaltung
int SensorGleisPin[GleisCount];
int SwitchPin[GleisCount][2];

int g_CurrentGleis= -1;          // -1 ... offen für neue Gleiseinfahrten / 1... belegtes Gleis

struct _Weiche {
  
byte pin1;
  
byte pin2;
  
byte sensor;
  
boolean geradeaus;
};

void setup() 
  {
    
Serial.begin(9600);
    
Serial.println("Pinbelegung");

    
_Weiche Weichen[GleisCount+1];

    
Weichen[1].pin1 9;
    
Weichen[1].pin2 10;
    
Weichen[1].sensor 8;
    
Weichen[1].geradeaus true;
    

    
Weichen[2].pin1 11;
    
Weichen[2].pin2 12;
    
Weichen[2].sensor 7;
    
Weichen[2].geradeaus true;

    
pinMode(sReset,INPUT);
    
// ToDo: hier könnte eine Schleife definiert werden
    
for (int i=1<GleisCount+1i++){ // richtig
      
Serial.print("Pin: ");
      
Serial.println(i);
      
pinMode(SensorGleisPin[i],INPUT);
    }
//end-for

     
Serial.println("LOOP follow now ....");

  } 
// end-setup

void loop() {
  
//
   
for (int i=1<GleisCount+1i++){ // richtig
     
Serial.print(i);
     if (
digitalRead(Weichen[i].sensor)==HIGH
       
Serial.println(" - HIGH");
     } else {
       
Serial.println(" - LOW");  
     }
//endif
   
}//end-for
 
}//end loop 

Bekomme aber folgende Meldung:

Zitat:Ausweichbahnhof_20190303:55: error: 'Weichen' was not declared in this scope

if (digitalRead(Weichen[i].sensor)==HIGH)

^

Ausweichbahnhof_20190303:57: error: 'else' without a previous 'if'

} else {

^

H:\Modellbahn\Elektronik\Arduino Ausweichbahnhof\Arduino\Ausweichbahnhof_20190303\Ausweichbahnhof_20190303.ino: At global scope:

Ausweichbahnhof_20190303:112: error: expected declaration before '}' token

}//end loop

^

exit status 1
'Weichen' was not declared in this scope

??

Gruß Jan
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.03.2019, 20:30
Beitrag #7
RE: Arbeiten mit Arrays
Hallo Jan,
Du musst alle Arrays nochmals durchgehen. Diese beginnen immer mit dem Index 0.

Wenn du das Array mit int SensorGleisPin[2] deklarierst, gibt es nur SensorGleisPin[0] und SensorGleisPin[1]. SensorGleisPin[2] referenziert dann einen Speicherinhalt, der zu einer anderen Variablen gehört. Dasselbe gilt auch für SwitchPin.

Gruss
René
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.03.2019, 22:10 (Dieser Beitrag wurde zuletzt bearbeitet: 03.03.2019 22:10 von MicroBahner.)
Beitrag #8
RE: Arbeiten mit Arrays
Hallo Jan,
(03.03.2019 18:03)Jan99 schrieb:  Das mit dem Zählen von 0 ignoriere ich einfach einmal und lasse 0 links liegen - ansonsten kommt es bei der Konfiguration später zu Benennungsproblemen. Gleise mit der Nummer 0 gibt es nicht.
Wie dir schon gesagt wurde, kannst Du das nicht ignorieren, denn der Compiler macht das nunmal so. Die Gleisnamen sollten auf jeden Fall unabhängig von den Indizes sein. Das kann man z.B. machen indem man den Indexwerten Namen gibt.
Du musst dich auch ein wenig mit den Basics von C++ befassen - was sind Definitionen, was Deklarationen und wie wird initiiert. Du kannst deine Variablenwerte nämlich direkt bei der Variablendefinition mit angeben, dann brauchst Du im setup da gar nichts mehr machen.
Bevor Du dich mit struct befasst, solltest Du meiner Meinung nach erstmal das mit den Arrays vollständig im Griff haben Wink.

Ich habe mal deinen Code aus dem ersten Post so korrigiert, dass er fehlerfrei übersetzt und lauffähig ist:
Code:
// Pinbelegung am Board
// Sensoren für die Zugdurchfahrt
#define sReset 6
#define GleisCount 2 // Anzahl der Gleise

// Belegung für die Weichenschaltung
// << Werte, die sich nicht ändern, sollten als 'const' definiert werden ( und müssen dann auch gleich initiiert werden )
const int SensorGleisPin[GleisCount] = { 8,7 };
const int SwitchPin[GleisCount][2] = { { 5,6 }, { 7,8 } };

/* << Initiierungen können direkt bei den Variablendefinitionen erledigt werden
// Pinbelegung für die Gleissensoren
SensorGleisPin[1] = 8;
SensorGleisPin[2] = 7;

// Pinbelegung für die Weichensteuerung
SwitchPin[1][0] = 5; // Weiche 1- geradeaus
SwitchPin[1][1] = 6; // Weiche 1- abbiegen
SwitchPin[2][0] = 7; // Weiche 2- geradeaus
SwitchPin[2][1] = 8; // Weiche 2- abbiegen
*/
int g_CurrentGleis= -1;          // -1 ... offen für neue Gleiseinfahrten / 1... belegtes Gleis

void setup()
  {
    Serial.begin(9600);
    Serial.println("Pinbelegung");
    pinMode(sReset,INPUT);
    // ToDo: hier könnte eine Schleife definiert werden
    for (int i=0; i<GleisCount; i++){
      Serial.print("Pin: ");
      Serial.println(i);
      pinMode(SensorGleisPin[i],INPUT);
    }//end-for
    
  } // end-setup

void loop() {
//Serial.println("LOOP ....");
// Auslesen Reset-Sensor
if (digitalRead(sReset)==HIGH )  {
    Serial.println("Reset");
    g_CurrentGleis = true;
}        

// ToDo: hier könnte eine Schleife definiert werden
if (digitalRead(sReset)==HIGH){
    Serial.println("Reset");
    g_CurrentGleis = -1;
}        

}//end loop


void SchalteWeiche()
  {
  }//end-SchalteWeiche

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Brauche Hilfe bei Arrays mega-hz 23 1.236 10.07.2019 15:59
Letzter Beitrag: MartinZ
  mehrdim. Arrays wert der ersten dimension ausgeben sepp01 19 1.663 14.10.2018 06:55
Letzter Beitrag: sepp01
  mit Mengen(?) arbeiten uweq 16 1.929 12.08.2018 19:10
Letzter Beitrag: uweq
  Arrays of String in C Diskusguppy 3 1.346 16.12.2017 10:12
Letzter Beitrag: Diskusguppy
  Ablaufstruktur beim arbeiten mit Sensorwerten? Jan_OL 22 4.261 02.11.2017 00:08
Letzter Beitrag: georg01
  Übergabe von Arrays an Funktionen Marcel 4 2.452 31.10.2017 13:28
Letzter Beitrag: Tommy56
  Arbeiten mit millis Franz54 5 1.784 07.03.2017 20:43
Letzter Beitrag: Tommy56
  große 2-dim float-Arrays schnell auf SD speichern und zurücklesen? HaWe 25 5.035 22.06.2015 14:41
Letzter Beitrag: Thorsten Pferdekämper
  wieder mal: Problem mit arrays als Fkt.-Parameter HaWe 13 3.331 13.05.2015 09:29
Letzter Beitrag: Thorsten Pferdekämper
  einfache Initialisierung mehrdim. Arrays HaWe 8 2.950 29.04.2015 11:17
Letzter Beitrag: HaWe

Gehe zu:


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