Das Array hat einen unvollständigen Elementtyp. Was bedeutet das? [Duplikat]
Ich möchte ein Array erstellen, in dem die Multiplikationswerte einer beliebigen Ganzzahl n gespeichert sind. Danach möchte ich dieses Array an eine andere Funktion übergeben und das Array ausdrucken. Ich erhalte jedoch den folgenden Fehler:
Mein Code:
Dies ist meine .c-Datei:
#include "multiplication.h"
#include <stdio.h>
int main(){
int num;
int arr=multiplication(4);
printArray(arr);
}
int mulitpication(int num){
/* initialize array and build*/
int arr[num][num];
for(int i=0; i<num;i++){
printf("row number: %d ",i);
for(int j=0;j<num;j++){
printf("column number: %d", j);
arr[i][j]= (i+1)*(j+1);
}
}
return arr;
}
void printArray(int arr[][]){
int i;
for(i=0;i<sizeof(arr);i++){
for(int j=0;j<sizeof(arr);j++){
printf("%d ",arr[i][j]);
}
}
Dies ist meine Header-Datei:
void multiplication(int num);
void print(int arr[][]);
Der Fehler:
multiplication.h:4:19: error: array has incomplete element type 'int []'
void print(int arr[][]);
^
Antworten
Zunächst fügen Sie die Quelldateien nicht ineinander ein, sondern kompilieren und verknüpfen sie zu einer Binärdatei.
Das eigentliche Problem liegt jedoch in dem Code, den Sie nicht angezeigt haben ( multiplication.hDatei), aber in der Fehlermeldung, die wir sehen können
void print(int arr[][]);
ist keine gültige Syntax. Sie können den äußeren (-most) Index nur leer lassen, alle anderen Indizes müssen einen geeigneten Wert haben. Etwas wie
void print(int arr[ ][10]);
^^---------- inner index
^^^------------- outer index
oder für mehr Dimensionen
void print(int arr[ ][5][10][15]);
Die Analogie dahinter ist für Funktionsdeklaratoren:
"Eine Deklaration eines Parameters als '' Array vom Typ '' wird an '' qualifizierter Zeiger auf Typ '' angepasst, ...."
Um diese Anpassung vornehmen zu können, sollte der Typ dem Compiler zur Kompilierungszeit bekannt sein.
Im Falle einer Erklärung wie
void print(int arr[][10]);
Der Typ ist int[10], aber wenn eine Syntax wie
void print(int arr[][]);
erlaubt ist, kann der Typ nicht bekannt sein. Daher der Fehler.
Andere Probleme: Sie scheinen viele andere Probleme zu haben, wie z
Die Funktionsdefinition lautet
int mulitpication(int num){ // returning an int
aber eigentlich tust du das
return arr; //where arr is an array of size int[num][num], defined locally
Dies ist aus zwei Gründen ungültig
- an
intund anint[num][num]sind nicht vom gleichen Typ. - Der Umfang einer VLA
arrist auf den Funktionsblock beschränkt. Sie können nicht zulassen, dass das Array die Adresse an den Aufrufer zurückgibt und etwas Sinnvolles erwartet, da die zurückgegebene Adresse nicht mehr gültig ist.
Ich glaube, Sie sind besser dran, den zugewiesenen Speicher ( malloc()und die Familie) zu verwenden und Ihren Index / die Anzahl der Elemente manuell zu verfolgen.
Um die printArrayFunktion zu reparieren, müssen Sie die Array-Dimensionen einschließen. In C sind Arrays einfach ein Block von Elementen, es ist nirgendwo eine Länge gespeichert. Der Programmierer müsste die Länge auf irgendeine Weise verfolgen.
Zum Beispiel:
// header
void printArray(int num, int arr[num][num]);
// source file
void printArray(int num, int arr[num][num])
{
for(int i=0;i<num;i++){
for(int j=0;j<num;j++){
printf("%d ",arr[i][j]);
}
Für die multiplicationFunktion, die Sie ähnlich ausführen müssen, sollte der Aufrufer das Array zuweisen (z. B. int arr[num][num];) und dann sollte die Funktion die Werte für die Array-Zellen eingeben.