Array über 2te Variable aufrufen

Ich möchte in meiner Methode "AusgabeArray" bei der Übergabe den Array namen mit angeben können und dann über den namen dieses Array ausgeben. --> Serial.print(Name_des_Arrays[ZeilenAnfang][Spalte]);
Wie schaffe ich es das Serial.print Name_des_Arrays auch wirklich als Name des Array erkennt? Denn so bekomme ich immer die
Fehlermeldung:
invalid types 'char[int]' for array subscript
exit status 1
invalid types 'char[int]' for array subscript

Entschuldigt die Fehlerhafte ausdrucksweise aber ich kann das Poblem leider nicht besser beschreiben.

Hier der Code:

int B_Positionen[96][3] = { 
  //Grundposition
  {1, 3, 1}, //Baustein 1
  {1, 2, 1}, //Baustein 2
  {1, 1, 1}, //Baustein 3
  {2, 1, 1}, //Baustein 4
  //Grundposition_Rechts
  {1, 3, 0}, //Baustein 1
  {7, 5, 1}, //Baustein 2
  {6, 2, 6}, //Baustein 3
  {4, 0, 7}, //Baustein 4
};

int E_Positionen[96][3] = {
  //Grundposition
  {2, 2, 1}, //Baustein 1
  {2, 1, 1}, //Baustein 2
  {1, 1, 1}, //Baustein 3
  {1, 1, 2}, //Baustein 4
  //Grundposition_Rechts
  {0, 0, 0}, //Baustein 1
  {0, 0, 0}, //Baustein 2
  {0, 0, 0}, //Baustein 3
  {0, 0, 0}, //Baustein 4
};



void setup() {
  Serial.begin(9600);
  AusgabeArray(4, 7, "B_Positionen"); //Aufruf und Übergabe der Variablen an die Methode
}

void loop() {
}


void AusgabeArray(int ZeilenAnfang,int ZeilenEnde, String Name_des_Arrays) {
  //Deklaration der Variable Spalte
  int Spalte = 0; 
  //Überschrift in der Seriellen Ausgabe
  Serial.println(Name_des_Arrays);
//-------------------------------------------------------------------------------------------
  //Führe die Schleife so lange aus bis alle definierten Zeilen ausgegeben wurden 
  for (ZeilenAnfang; ZeilenAnfang <= ZeilenEnde; ZeilenAnfang++) {
    Serial.print(Name_des_Arrays[ZeilenAnfang][Spalte]); Serial.print("  ");
    //Führe die Schleife so lange aus bis alle Spalten der jeweiligen Zeile ausgegeben wurden
    for (Spalte = 1; Spalte <= 2; Spalte++) {
      Serial.print(Name_des_Arrays[ZeilenAnfang][Spalte]); Serial.print("  ");
    }
    Serial.println();
    Spalte = 0;
  }
//-------------------------------------------------------------------------------------------
}

Danke für alle konstruktive Verbesserungsvorschläge im Vorraus!

Aus dem Bezeichnern die du im Quellcode verwendest
B_Positionen, E_Positionen macht der compiler im compilierungsprozess schöde Zahlen.

Das bedeutet die Variablennamen kann man überhaupt nicht direkt als Parameter an eine function übergeben.
Was geht ist einen Pointer auf die Variable. Das habe ich selbst noch nie gebraucht obwohl ich schon so einiges programmiert habe.

Pointer zu verstehen hat auch einen gewissen Anspruch. Im weiteren werden sich bestimmt einige User melden die dir mal eben auf die schnelle den entsprechenden Code hier reinposten können.

Die Frage ist ob das wirklich die leicht verständlichste Lösung ist und es ist die Frage ob es für die übergeordnete Anwendung für die du das benutzen willst notwendig ist.

Wenn du denn den größeren Zusammenhang - am besten das Projekt als ganzes hier beschreibst dann kann man bessere Vorschläge machen. Möglicherweise gibt es eine viel einfache Lösung als Pointer. Beurteilen kann man das erst wenn du das Gesamtprojekt beschrieben hast.
vgs

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden.
Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.
mfg ein Moderator.

Das Gesamtprojekt besteht darin die Möglichkeiten einen Würfel zusammenzustzen auszurechnen mit verschieden vordefinierten Objekten, diese sind gespeichert in den Arrays mit den Koordinaten x,y und z und die Zeilen stehen für einzelne kleine würfel aus denen sich dann der gesamte ergeben soll.

Um ständig gewisse Teile eines Arrays anzeigen zu können wollte ich diese als eigenständige Funktion auslagern und ihr immer nurnoch die Werte übergeben die ich grade benötige. --> Nämlich Zeile von bis und das Array das ausgelesen werden soll.

Hier die Skizze eines Objekts aus der sich der Spätere 3x3 Würfel zusammen setzen soll:

Hoffe diese Beschreibung ist Hilfreich.

mfg

also eine Variante das zu lösen wäre aus dem zwei-dimensionalen Array einen drei-dimensionalen Array zu machen
dieser dritte index wäre dann für die Auswahl des B_Pos/E_Pos-arrays

index 0 für den B_Pos-array
und
index 1 für den E_Pos-array

Oder du baust in den Namen des Arrays den du als String übergibt noch etwas ein, dass den ersten Buchstaben hernimmt und dann eine Logik

if (ErsterBuchstabe == 'B' )
dann Index = 0

if (ErsterBuchstabe == 'E' )
dann Index = 1

vgs

1 Like

Danke für die gute Idee. Allerdings steht der Großbuchstabe bei einem Array für einen "Baustein" (inges. 7) bei jedem Baustein wird eine Grundposition festgelegt und auf Basis derer jede andere Mögliche position im Raum errechnet (siehe zeichnung). Dabei hat das Array schon für einen Bausein eine größe von [96][3] bei dieser Datenmenge wird es zu unübersichtlich für mich den Überblick zu behalten weshalb ein 3 Dimensionales Array als Lösung viel zu viel aufwand bietet.

Hätten Sie noch einen 2ten Lösungsansatz?

Sie hatten in ihrer ersten Nahcricht etwas über Pointer gesagt allerding habe ich das nicht ganz verstehen können obwohl mir das Prinzip von Zeigern bekannt ist.

mfg

Hallo,
ganz spontan ein struct mit x,y,z, das in einem Array und die Nummer des Array mit enum . Damit geht zwar kein
Serial.print(Name_des_Arrays[ZeilenAnfang][Spalte]);
aber z.B

Serial.print (wuerfel[rot].x);
Serial.print (wuerfel[gelb].y);

ich bin mir aber nicht sicher ob Dir das nützt.
Heinz

1 Like

Wenn du sowas machst solltest du auch wissen wie man mit Array umgeht. Und dazu gehört wie man Arrays an Funktionen übergibt. Array-Variablen entsprechen Zeigern auf das erste Element, daher übergibt man einfach einen Zeiger auf den entsprechenden Datentyp.

Und ja, eine Ansammlung aus 3-dimensionalen Koordinaten ist eher ein Array aus Strukturen als ein 3-dimensionales Array

1 Like

Hallo,
Dir ist schon klar das das schnell dazu führt das dir der Speicher ausgeht. Wie viele Würfel musst Du denn haben.
für integer 9632Byte= 576 byte an Daten je Würfel. Da bist Du mit einem UNO schnell am Ende.
Heinz

Also am besten auf einen Teensy 4.0 umsteigen. 600 MHz Taktfrequenz 1 MegaByte RAM!

Kann auch mit Arduino-IDE programmiert werden

Man kann ein Array an eine Funktion lediglich über einen Pointer (call-by-reference) übergeben! Einen Bezeichner also "String Name_des_Arrays" von hier:

kann man nicht übergeben!

Eigentlich sollte man das mit einem Pointer machen aber Pointer auf Arrays ist so ne Sache, am besten Googeln. Hier zB. wird die Übergabe eines Arrays erklärt. (open book)

Ich verstehe die Aufgabenstellung nicht ganz aber ich würde eher die Würfel (mit je einer x,y und z Koordinate) erstellen und daraus den Rest machen. Soll nur ein alternativer Denkanstoss sein.

Grüße!

1 Like

Danke für die Hilfreichen Lösungsansätze!
Hab mich nun ein wenig Tiefer in die Zeiger eingelesen. Meine Lösung ist, das ich jedem Array noch einen Zeiger zugewießen habe den ich dann jeder Funktion übergeben kann, welche diese dann auch verwenden kann.

Ein paar Code Beispiele am Anfang wären Hilfreich gewesen aber jetzt ist es ja geschafft :sweat_smile:.

//2D Array deklaration
int Array[3][3] = {
  {77, 21, 43},
  {42, 75, 69},
  {79, 68, 19}
};

//Zeiger
int *pArray;
int *pVariablerPointer;


void setup() {
  Serial.begin(9600);
  //Initialisiere Zeiger
  pArray = &Array[0][0];
  Serial.print("Speicheradresse von Array[0][0]:  "); Serial.println((int)pArray);
  //Funktion aufrufen und Paramter übergeben
  ArrayShot(pArray, 0, 2, "Array");
}

void loop() {
  //Wird für das Beispiel nicht benötigt
}

//Allgemeine Funktion zur Ausgabe von Bestimmten Array Abschnitten
void ArrayShot(int VariablerPointer, int ZeilenAnfang, int ZeilenEnde, String ArrayName) {
  //Deklaration der Variable Spalte
  int Spalte;
  //Übergabe des Pointerinhalts an den Pointer in der Funktion
  pVariablerPointer = VariablerPointer;
  //Überschrift in der Seriellen Ausgabe
  Serial.print("Array Ausgabe von:  "); Serial.println(ArrayName);
  //-------------------------------------------------------------------------------------------
  //Im Merker soll die Zahl stehen wie viele Elemente zwischen dem Zeilen Ein- und Ausgang stehen (Wegen des Ausgabe im Seriellen Monitor)
  int Merker;
  int i = 3;
  Merker = ((ZeilenEnde - ZeilenAnfang + 1) * 3) - 1;
  Serial.print("Merker:  "); Serial.println(Merker);
  //Schleife zum Ausgeben des Array Inahltes
  for (ZeilenAnfang; ZeilenAnfang <= Merker; ZeilenAnfang++) {
    i++;
    Serial.print(*(pVariablerPointer + ZeilenAnfang)); Serial.print("  ");
    //Nach 3 Stellen soll eine neue Zeile begonnen werden 
    if (i%3 == 0) Serial.println();
  }
  //-------------------------------------------------------------------------------------------
}

mfg

Das braucht man nicht. Array-Variablen zerfallen bei der Übergabe schon in Zeiger auf das erste Element. Die kann man also direkt übergeben

Und das ist sowieso kein Array, sondern ein Wert:

void ArrayShot(int VariablerPointer,

Richtig:

void ArrayShot(int VariablerPointer[][3],

Auch das ist letztlich ein Zeiger. Die Syntax verschleiert es nur. Wobei es auch noch andere Varianten gibt

Und wie schon gesagt, sowas ist übersichtlicher:

struct Coord
{
  byte x, y, z;
};

Coord data[3] = { 
  { 1, 2, 3}, 
  { 10, 20, 30},
  { 50, 60, 70}
};

void setup()
{
  Serial.begin(9600);            
  
  print(data, sizeof(data) / sizeof(Coord));
}

void print(Coord* data, unsigned int size)
{
  for (unsigned int i = 0; i < size; i++)
  {
    Serial.print(data[i].x); 
    Serial.print(' '); 
    Serial.print(data[i].y); 
    Serial.print(' '); 
    Serial.println(data[i].z); 
  }
}
1 Like

Danke für die Antwort! :+1:

mfg

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.