error: use of parameter outside function body before ']' token

Hallo,
ich bekomme eine Fehlermeldung die ich nicht verstehe:

error: use of parameter outside function body before ‘]’ token

WIESO ??? Das Programm funktioniert mit CodeBlocks einwandfrei.
Aber der Arduino-Compiler gibt obrige Meldung aus.

Wieso geht das Programm mit dem CodeBlocks Gnu GCC Compiler
aber NICHT mit dem Arduino-Compiler.

#include <stdio.h>
#include <stdlib.h>
 
int mein_erstes_Array[3][5] = {                                    
                                {
                                   7,  11, 13, 17, 19,    
                                },
 
                                {
                                   23, 29, 59, 61, 67,                  
                                },
 
                                {
                                   71, 73, 79, 83,  89,  
                                }
                              };
 

int mein_zweites_Array[3][7] = {        
                                 {
                                    2, 4, 6, 8, 10, 12, 14
                                 },
 
                                 {
                                    12, 14, 16, 18, 110, 112, 114
                                 },
 
                                 {
                                   22, 24, 26,  28, 210, 212, 214
                                 }
                               };
 
int zeige_Grafik(int zeile, int spalte, int unbek_array[zeile][spalte])
{
printf("\n\n");
//int gesamtanzahl_Elemente = sizeof(unbek_array) / sizeof(int);
int gesamtanzahl_Elemente = zeile * spalte;
printf ("Gesamtanzahl der Elemente: %d\n", gesamtanzahl_Elemente);
 
int *zeiger = &unbek_array[0][0]; /*Position des Zeigers auf das erstes Element des Array setzen. */
 
for(int i = 0 ; i < gesamtanzahl_Elemente ; i++)
    {
printf ("Zahlen aus dem Array: %d\n", *zeiger );
zeiger++;
    }
}
 



int zeige_Grafik2(int zeile, int spalte, int unbek_array[zeile][spalte])
{
printf("\n\n");
int gesamtanzahl_Elemente = zeile * spalte;
int zeilenzaehler0 = 0;
int zeilenzaehler1 = 0;
int zeilenzaehler2 = 0;
 
for(int i = 0 ; i < gesamtanzahl_Elemente / 3 ; i++)
    {
printf("\n\n");
printf("Zahlen aus dem Array: %d\n", unbek_array[0][zeilenzaehler0]);
printf("Zahlen aus dem Array: %d\n", unbek_array[1][zeilenzaehler1]);
printf("Zahlen aus dem Array: %d\n", unbek_array[2][zeilenzaehler2]);
zeilenzaehler0++;
zeilenzaehler1++;
zeilenzaehler2++;
    }
}
 
void setup()
{
zeige_Grafik(3,7,mein_zweites_Array);
printf("\n\n");
zeige_Grafik2(3,5,mein_erstes_Array);
}




void loop() {}

Die Fehlermeldung (zumindest die ausführliche: Datei-Einstellungen) sagt Dir auch die Zeile.
Warum verheimlichst Du uns diese Info?

Gruß Tommy

int zeige_Grafik2(int zeile, int spalte, int unbek_array[zeile][spalte])

Diese Zeile ist unsinnig!

Zu Tommy56:
Ja, 'schuldigung. Die Fehlermeldung bezog sich auf die Programmzeile wo dies steht:

int zeige_Grafik(int zeile, int spalte, int unbek_array[zeile][spalte])

dabei zeigt ein Hinweispfeil auf die letzte eckige Klammer.

Zu combie:
NEIN, die Funktionsdeklaration ist kein Unsinn.

int zeige_Grafik(int zeile, int spalte, int unbek_array[zeile][spalte])

Ich darf das laut cplusplusforum. Das Verrückte ist ja das ich dieses Programm in der CodeBlocks IDE
zum Laufen bekomme OHNE das der dortige Compiler meckert.
Nur die Arduino IDE weigert sich diese Funktionsdeklaration zu Akzeptieren.

Nicht alle "C++"s sind gleich.
Grüße Uwe

Dein Compiler sagt Dir, dass Du die Variable spalte (zeile übrigens auch) nicht schon im Funktionskopf verwenden darfst.

Du solltest das Array als Pointer übergeben und in der Funktion das Element berechnen oder vorm Funktionsaufruf das Element bestimmen und es als int übergeben.

Gruß Tommy

Tommy56:
Du solltest das Array als Pointer übergeben und in der Funktion das Element berechnen oder vorm Funktionsaufruf das Element bestimmen und es als int übergeben.

Es gibt mehrere Arten das zu tun. Mehr-dimensionale Arrays und Zeiger geht, ist aber etwas kompliziert von der Syntax her. Das ist was anderes als bei einfache eindimensionalem Array

Es würde wahrscheinlich schon helfen die Parameter anders zu nennen

@Serenifly: Wie würdest Du ein 2-dimensionales int-Array übergeben, um in der Funktion auf die Elemente zuzugreifen? Ich kenne bisher nur die Pointer-Variante.

Gruß Tommy

Kommt darauf an wie das Array deklariert ist und wie allgemein die Funktion sein muss. Man kann entweder beide oder nur eine Dimensionen direkt im Parameter übergeben.

Ein 2D Array ist nichts anderes als ein Zeiger auf Arrays.
Und da ein Array bekanntlich nur ein Zeiger aufs erste Element im Zeiger ist ist das ganze nur ein Zeiger auf einen Zeiger.

Im funktionsrumpf lässt sich das sowohl als

int (*array)[SPALTEN]
als auch als
int array[ZEILEN][SPALTEN]
schreiben.

Das ist beides das selbe.
Aus dem Grund ist es auch möglich
die erste Dimension wegzulassen:

int array[SPALTEN]

Wenn man es komplizierter machen will kann man so ein 2D Array auch als ein Array aus Zeigern übergeben.

int *array [SPALTEN]

Was allgemein auch geht ist einfach nur über nen einfachen pointer.

int *array

In den beiden letzten Fällen muss man dann aber beim dereferenzieren und mit der Pointer Arithmetik aufpassen.

Addi2438:
Ein 2D Array ist nichts anderes als ein Zeiger auf Arrays.
Und da ein Array bekanntlich nur ein Zeiger aufs erste Element im Zeiger ist ist das ganze nur ein Zeiger auf einen Zeiger.

Auch ein 2D/3D/xD Array ist ein Zeiger auf Elemente, nicht auf Pointer (es ist C++ nicht Java).

Serenifly:
http://forum.arduino.cc/index.php?topic=486578.msg3320284#msg3320284

Kommt darauf an wie das Array deklariert ist und wie allgemein die Funktion sein muss. Man kann entweder beide oder nur eine Dimensionen direkt im Parameter übergeben.

Danke für den Link. Ich habe bisher immer mit dem Pointer (Variante 3) gearbeitet.

Gruß Tommy

#include <stdio.h>
#include <stdlib.h>

int mein_Array[3][5] = {
                            {
                              7, 11, 13, 17, 19,
                            },

                            {
                              23, 29, 59, 61, 67,
                            },

                            {
                              71, 73, 79, 83, 89,
                            }
                        };



void funktion_2d(int zeile, int spalte, int *unbek_array)
{
int element_an_1_3 = *(unbek_array + 1 * spalte + 3);

printf("\n\n");
printf("element in Zeile-1 und Spalte-3: %d\n", element_an_1_3); // gibt die Zahl 61 aus.
}



void main()
{
funktion_2d(3,5,&mein_Array[0][0]);
//funktion_2d(3,5,mein_Array);     /*OHNE Adressoperator & und OHNE Index [][] */
                                   /*wird der Array-Name immer als Zeiger auf/*
                                   /*das erste Array-Element angesehen*/
}

In den FAQ der Arduino.cc steht:
All standard C and C++ constructs supported by avr-g++ should work in Arduino.
Also muß doch obiges Programm auch in der Arduino-Ide funktionieren.
Warum darf ich dann keine Int-Variable im Funktionskopf definieren ?
Wie gesagt unter dem C99 Compiler ist das KEIN Problem und avr g++ unterstützt ja
angeblich alle C-Standarts.

C99 ist nicht ein Subset von C++. Die zwei Sprachen haben sich zu dem Zeitpunkt auseinander entwickelt. Oder genauer, nebeneinander entwickelt mit ein paar Abgleichen hier und da. Jedenfalls gibt es ein paar subtile Unterschiede.
Und einige Cxx Features die auf dem Arduino funktionieren sind GNU GCC Erweiterungen. z.B. variable length arrays oder anonyme structs

Das Problem wird eher sein dass du die Variable deklarierst (Deklaration und Definition sind zwei verschiedene Dinge! Der Unterschied ist extrem wichtig), aber sie in der Parameter-Liste gleich wieder verwendest.