Funktion will nicht richtig

Hi Leute,
ich sitze hier mal wieder rum und vertreibe mir die Zeit mit wichtigen Sachen ;-).

Mein Ziel ist es, dass ich ein Teil vom Code, der sich sonst sehr sehr oft wiederholt, auszulagern, in eine Funktion, dieses bekomme ich jedoch nicht wirklich hin.

ich bin derzeit echt ahnungslos.

Danke schon mal für eure Hilfe.
Lieben Gruß an auch

Hier der Code:

#include <Wire.h>
int pin3 = 5; 
int pin4 = 6; 
int RafstoreLeo[2]; 

void setup()
{

 Wire.begin();
 pinMode(pin3,OUTPUT); 
 pinMode(pin4,OUTPUT);
 
}

void loop()
{


Raffstore(7, RafstoreLeo[2], pin3, pin4 );


}

//-------Ende LOOP---

void Raffstore(int dataAdresse, int roomRaffstore, int pinUp, int pinDown)
{
    Wire.requestFrom(dataAdresse, sizeof(roomRaffstore));
    byte* ptf = (byte*)roomRaffstore;

  for (unsigned int rf = 0; rf < sizeof(roomRaffstore); rf++)
  {
    *ptf = Wire.read();
     ptf++;
  }


   if(roomRaffstore[0]==1 && roomRaffstore[1]==0)
 {
  digitalWrite(pinUp,HIGH);
  }
  else
  {
    digitalWrite(pinUp,LOW);
    }

   if(roomRaffstore[1]==1 && roomRaffstore[0]==0)
 {
  digitalWrite(pinDown,HIGH);
  }
  else
  {
    digitalWrite(pinDown,LOW);
    }
  
}

So übergibt man keine Arrays. Korrekt:

int arr[2];

void func (int* arr, byte size)
{
}

void loop()
{
   func(arr, sizeof(arr));
}

Anmerkungen:
1.) sizeof() eines Zeigers ist die Größe des Zeigers, also muss man die Größe separat übergeben
2.) sizeof() liefert die Größe in Bytes und nicht die Anzahl der Elemente

Hi Serenifly,
danke für deine Hilfe aber ich bin zu blöd es zu Implementieren :frowning:
ich bastel hier rum... zumindest bekomme ich schonmal ein Signal durch, ....
Es ist das erste mal das ich mit Arrays arbeite.

Ich habe von dir schon ein anderen Beitrag gelesen wo du sowas ähnliches beschrieben hast, ich steige da allerdings noch nicht wirklich durch.

mein Ansatz:

#include <Wire.h>
int pin3 = 12; 
int pin4 = 13; 
int RafstoreLeo[2]; 

void setup()
{

 Wire.begin();
 pinMode(pin3,OUTPUT); 
 pinMode(pin4,OUTPUT);
 
}

void loop()
{


Raffstore(7, RafstoreLeo, sizeof(RafstoreLeo[2]), pin3, pin4 );


}

//-------Ende LOOP---

void Raffstore(int dataAdresse, int* roomRaffstore, byte size, int pinUp, int pinDown)
{
    Wire.requestFrom(dataAdresse, sizeof(roomRaffstore));
    byte* ptf = (byte*)roomRaffstore;

  for (unsigned int rf = 0; rf < sizeof(roomRaffstore); rf++)
  {
    *ptf = Wire.read();
     ptf++;
  }


   if(roomRaffstore[0]==1 && roomRaffstore[1]==0)
 {
  digitalWrite(pinUp,HIGH);
  }
  else
  {
    digitalWrite(pinUp,LOW);
    }

   if(roomRaffstore[1]==1 && roomRaffstore[0]==0)
 {
  digitalWrite(pinDown,HIGH);
  }
  else
  {
    digitalWrite(pinDown,LOW);
    }
  
}
sizeof(roomRaffstore)

Ich habe doch gesagt dass genau das nicht geht! Genau deshalb muss man die Größe extra übergeben. Du hast size als Parameter, dann verwende es auch

Zeiger sind auf einem 8-Bit Prozessor 16 Bit groß. Also kommt da immer 2 heraus. Dein Array ist aber 4 Bytes groß

Kleine Korrektur:
Ich hatte es erst so geschrieben dass man die Anzahl der Elemente im Array übergibt. Aber da du es byte-weise überträgt braucht man da tatsächlich die Größe in Bytes. Also nur sizeof() der Array-Variablen bei der Übergabe:

Raffstore(7, RafstoreLeo, sizeof(RafstoreLeo), pin3, pin4 );

HI Serenifly ,
danke nochmals für deine Hilfe und Geduld.... total lieb von dir aber ich bekomme es einfach nicht hin.
tut mir leid, ich denke mal das ist doch noch zu hoch für mich... wär echt top gewesen hätte ich das auslagern können.. so muss ich mir halt die Finger wundtippend und die Übersicht leidet drunter...

danke trotzdem
lieben Gruß

Mit einem Byte-Array damit man die Ausgabe einfacher sieht. Geht mit int aber genauso

byte data[] = { 10, 20, 150, 255 };

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

  print(data, sizeof(data));
}

void loop() 
{
}

void print(byte* data, byte size)
{
  for (int i = 0; i < size; i++)
    Serial.println(data[i]);
}

ardouino:
so muss ich mir halt die Finger wundtippend und die Übersicht leidet drunter...

Erklär doch erstmal genau, was Du überhaupt machen willst. Wenn das klar ist, finden sich oftmals viel einfachere Lösungen. Leider enthält dein Code auch keinerlei Kommentare, was es eigentlich unmöglich macht, den Sinn dahinter zu verstehen.

Vielleicht musst Du gar nicht soviele Parameter übergeben. Dein Array ist doch z.B. global definiert, da kann die Funktion auch direkt drauf zugreifen.
Bevor Du dir die Finger wundtippst, schreibe die entsprechenden Codeteile nur 2x auf. Dann kann man eher erkennen, wie man das am einfachsten in eine Funktion auslagern könnte.