- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 8 von 8

Thema: Array an Funktion übergeben

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    28.09.2013
    Beiträge
    49

    Array an Funktion übergeben

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Ich versuche vergebens eine zwei dimensionales Array an eine Funktion zu übergeben.
    void 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);
    }

    }
    Deklariert ist dieses Array Global


    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 ?

  2. #2
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Arrays (und andere größere Datentypen wie Strings) kann man in C nur per Referenz,also als Pointer übergeben.

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    28.09.2013
    Beiträge
    49
    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)

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    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])...

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    28.09.2013
    Beiträge
    49
    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ß

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    1.
    Anständig formatieren ?
    Was ist einfacher zu lesen?
    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;
    }
    ...
    oder das:
    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;
            }
          ...
          } 
        }
      }
    }
    2.
    Das Array wollte ich in der anderen Funktion mit einem "&Pos_save(int *Position[][])" aufrufen . Das geht aber nicht weil dann kommt der Fehler.
    Viel einfacher! Aufruf wäre:
    Pos_save(Position);
    Geändert von Sisor (02.04.2014 um 20:30 Uhr) Grund: Ergänzung

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    28.09.2013
    Beiträge
    49
    Ohja, ich gebe dir recht.

    Also wenn das Array Global ist kann von überall gelesen und geschrieben werden verstehe ich das richtig ?

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    Zitat Zitat von jok3r Beitrag anzeigen
    Also wenn das Array Global ist kann von überall gelesen und geschrieben werden verstehe ich das richtig ?
    Ja, so ist es.

Ähnliche Themen

  1. Array an Funktion übergeben
    Von Che Guevara im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 10
    Letzter Beitrag: 02.05.2013, 22:23
  2. Register an Funktion übergeben
    Von EDatabaseError im Forum C - Programmierung (GCC u.a.)
    Antworten: 15
    Letzter Beitrag: 02.11.2008, 15:10
  3. array an subs übergeben?
    Von rathma im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 5
    Letzter Beitrag: 09.05.2007, 14:47
  4. Datenregister an Funktion übergeben
    Von ach-feld im Forum C - Programmierung (GCC u.a.)
    Antworten: 10
    Letzter Beitrag: 21.03.2006, 09:11
  5. ARRAY an Sub ider Function übergeben
    Von darwin.nuernberg im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 0
    Letzter Beitrag: 15.01.2006, 13:38

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests