Arrays (und andere größere Datentypen wie Strings) kann man in C nur per Referenz,also als Pointer übergeben.
Ich versuche vergebens eine zwei dimensionales Array an eine Funktion zu übergeben.
Deklariert ist dieses Array Globalvoid Pos_save(int *Position[][])
{
...........
.........
if (digitalRead(Taster1) == HIGH) //Speichern
{
for (int i = 0; i < 4 ; i++ )
{
Wire.beginTransmission(GeberAddr[i]);
Wire.write(255);
Wire.endTransmission();
Wire.requestFrom(GeberAddr[i], 2);
if (2 <= Wire.available())
{
byte MSB =Wire.read();
delay(1);
byte LSB =Wire.read();
Position[Pos_Display][i] = (MSB << 6) + LSB;
}
}
lcd.setCursor(4,1);
lcd.print(Position[Pos_Display][0]);
lcd.setCursor(14,1);
lcd.print(Position[Pos_Display][1]);
lcd.setCursor(4,2);
lcd.print(Position[Pos_Display][2]);
lcd.setCursor(14,2);
lcd.print(Position[Pos_Display][3]);
Position[Pos_Display][4] = Pos_Display; // Speichern von Pos
Position[Pos_Display][5] = Tool_Display; // Speichern von Tool
Position[Pos_Display][6] = Delay_Display; // Speichern von Delay
Position[Pos_Display][7] = Speed_Display; // Speichern von Speed
delay(2000);
lcd.clear();
Teachen_menue();
Pos_Display++;
lcd.setCursor(19, 3);
lcd.print(Pos_Display);
}
}
und hier müsste ich darauf zugreifen können ->
void Automatik()
{
if (digitalRead(Taster1) == HIGH) // Taster 1(Start) Automatik Starten.
{
for (int Pos_Display = 0; Pos_Display <=6 ; Pos_Display++) // Fahre 6 Programme ab
{
do {
for (int i = 0; i < 4 ; i++ )
{
Wire.beginTransmission(GeberAddr[i]);
Wire.write(255);
Wire.endTransmission();
Wire.requestFrom(GeberAddr[i], 2);
byte MSB =Wire.read();
delay(1);
byte LSB =Wire.read();
IstPosition[i] = (MSB << 6) + LSB;
}
Stepperdelta0 = -( Position[Pos_Display][2]- IstPosition[2]);
Stepperdelta1 = -( Position[Pos_Display][3]- IstPosition[3]);
Stepperdelta2 = -( Position[Pos_Display][1]- IstPosition[1]);
Stepperdelta3 = -( Position[Pos_Display][0]- IstPosition[0]);
if( Stepperdelta0 > 50 | Stepperdelta0 < -50 ){
Stepper0.setSpeed(-Stepperdelta0);
Stepper0.runSpeed();
}
if( Stepperdelta1 > 50 | Stepperdelta1 < -50 ){
Stepper1.setSpeed(Stepperdelta1);
Stepper1.runSpeed();
}
if( Stepperdelta2 > 50 | Stepperdelta2 < -50 ){
Stepper2.setSpeed(-Stepperdelta2);
Stepper2.runSpeed();
}
if( Stepperdelta2 > 50 | Stepperdelta2 < -50 ){
Stepper3.setSpeed(Stepperdelta3);
Stepper3.runSpeed();
}
........................
............
......
}
Was muss ich da besonderes beachten ? Kann man das nicht ohne Pointer bewerkstellen ?
Arrays (und andere größere Datentypen wie Strings) kann man in C nur per Referenz,also als Pointer übergeben.
i hab mich vorhin schon versucht ein bisschen einzulesen aber wirklich habe ich das mit den Pointern nicht verstanden, bzw ich habe es bei meinem Programm nicht hinbekommen.... Der Fehler ist -> "Teachen:1: error: declaration of 'Position' as multidimensional array must have bounds for all dimensions except the first"
Das Array wollte ich in der anderen Funktion mit einem "&Pos_save(int *Position[][])" aufrufen . Das geht aber nicht weil dann kommt der Fehler.
Gruß
Geändert von jok3r (02.04.2014 um 19:32 Uhr)
1. Bitte Quelltext anständig formatieren, da will sich so doch keiner durcharbeiten, gerade wo es teilweise mehrfach verschachtelt ist.
2. Warum willst du eine globale Variable übergeben, wo sie doch überall sichtbar ist?
3. Bei der Übergabe zweidimensionaler Felder muß die Zeilenlänge zur Kompilezeit bekannt sein. Sie darf nicht variabel sein und muss angegeben werden.
Code:... const int zeilenlaenge = 17; ...void Pos_save(int Position[][zeilenlaenge])...
Eben sie ist nicht sichtbar , ich hab gedacht das wäre normal ? Auf der einen Seite speichere ich werte im Array und auf der anderen Seite will ich sie abfragen nur leider steht nichts drinnen bzw manchmal was was keinen Sinn ergibt. Anständig formatieren ? O_oGruß
1.Was ist einfacher zu lesen?Anständig formatieren ?
Das:
oder das:void Automatik()
{
if (digitalRead(Taster1) == HIGH) // Taster 1(Start) Automatik Starten.
{
for (int Pos_Display = 0; Pos_Display <=6 ; Pos_Display++) // Fahre 7 Programme ab
{
do {
for (int i = 0; i < 4 ; i++ )
{
Wire.beginTransmission(GeberAddr[i]);
Wire.write(255);
Wire.endTransmission();
Wire.requestFrom(GeberAddr[i], 2);
byte MSB =Wire.read();
delay(1);
byte LSB =Wire.read();
IstPosition[i] = (MSB << 6) + LSB;
}
...
2.Code:void Automatik() { if (digitalRead(Taster1) == HIGH) // Taster 1(Start) Automatik Starten. { for (int Pos_Display = 0; Pos_Display <=6 ; Pos_Display++) // Fahre 7 Programme ab { do { for (int i = 0; i < 4 ; i++ ) { Wire.beginTransmission(GeberAddr[i]); Wire.write(255); Wire.endTransmission(); Wire.requestFrom(GeberAddr[i], 2); byte MSB =Wire.read(); delay(1); byte LSB =Wire.read(); IstPosition[i] = (MSB << 6) + LSB; } ... } } } }Viel einfacher! Aufruf wäre:Das Array wollte ich in der anderen Funktion mit einem "&Pos_save(int *Position[][])" aufrufen . Das geht aber nicht weil dann kommt der Fehler.
Pos_save(Position);
Geändert von Sisor (02.04.2014 um 20:30 Uhr) Grund: Ergänzung
Ohja, ich gebe dir recht.
Also wenn das Array Global ist kann von überall gelesen und geschrieben werden verstehe ich das richtig ?
Lesezeichen