Array Zeiger an Funktion übergeben (Hab schon Falten vom ärgern über mich)

Hallo,

`` Array : byte EngineOnOff[8]={1,2,3,4,5,6,7,8}; // Motor X on/off
Aufruf: SetGetBytesFromBitsVar(7,byte(Bits),byte(&EngineOnOff),byte(Value),SL,Command,WS);

Funktion:

void SetGetBytesFromBitsVar(int Count,byte Bits, byte *Var[], byte Value,boolean SL,String Command,boolean WS){   String Out="";
  Out+=S+Command +"|" + String(Bits)+"=";
  for(int I=0;I<=Count;I++){
    if(Bits & 1<<I){
     if(SL==false){Var[I]=Value;}  
      Out += String(byte(Var[I])); 
      if(I<Count){Out+=";";} 
     }
 
    } 
    TextOut(Out + E,WS);
}

Was ich möchte: ich habe mehrer Arrays die 8 Byte enthalten.
Möchte sie auslesen bzw. Werte im Array ändern.
z.B. EngineOnOff habe ich initialisiert. müßte beim Auslesen
die Werte des Arrays bekommen nix da:-(
Array:
EngineOnOff[]={1,2,3,4,5,6,7,8};
Bekomme sowas:
255;10;2;1;33;255;1;86 totaler MIST

Das Problem ist, ich bekomme nur falsche Werte zurück, und weiß nicht warum.
Wäre schön wenn mir Jemand helfen könnte.
Ich denke das ich mit dem Zeiger auf das Array einen Fehler mache.
Gruß Joe1964

Bin Anfänger !!!

ich habe mehrer Arrays die 8 Byte enthalten.

Dann mache einen Datentype draus!
Und nutze Referenzen, wenn dir Pointer (noch) zu kompliziert sind.

using MyArray = byte[8];


void printArray(MyArray & array)
{
  for(byte & feld:array)  Serial.println(feld);
}


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

  MyArray testArray {1,2,3,4,5,6,7,8};
  printArray(testArray);
}

void loop() 
{

}

Das sollte auch eine Referenz sein:

String Command

Objekte übergibt man nicht als Wert. Weil dann eine Kopie erstellt wird

Ansonsten mache dir den Zusammenhang zwischen Arrays und Zeigern klar. Arrays sind in C++ keine komplexen Datentypen. Array Variablen zerfallen bei der Übergabe in Zeiger auf das erste Element. Die Klammern bei byte *Var[] sind also unsinnig

Hallo,

ich hatte mal sowas gemacht. Dabei wird direkt im originalen Array geändert.
Frage an die Experten. Wäre das mit Zeigerübergabe noch besser?

byte helligkeit[7] = {0x10, 0x02, 0x60, 0x80, 0x10, 0x03, 0x05}; 

void setup() {

}

void loop() {

  aendere_Helligkeit (helligkeit, dimValue, 3);  // übergibt Arrayname, einen Wert und die Indexposition des Wertes
}


void aendere_Helligkeit (byte feld[], byte value, byte index) // ändert direkt im Array
{
  ...
  feld[index]= value;            // neuen Wert an Indexpos. schreiben
  ...
}

Danke für Eure Antworten :slight_smile:

Mal sehen wie weit ich komme.
Das mit der Referenz wusste ich nicht. Danke !

Wäre das mit Zeigerübergabe noch besser?

Ob du Zeiger, oder Referenzen übergibst, dürfte in etwa den gleichen Code ergeben.
Auf der Seite gibts keine Vorteile, oder so...

Bei dynamischer Speicherreservierung wirst du mit Pointern arbeiten müssen.
Nachteil: Du musst auch die Größe mitführen, und evtl abprüfen, um dir keine Bereichsüberschreitungen einzufangen

Arbeitest du mit Referenzen, dann bleibt die Größe des Arrays im Datentype verankert. Das vereinfacht manches.

okay, Danke