Das Array hat einen unvollständigen Elementtyp. Was bedeutet das? [Duplikat]

Sep 17 2020

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

6 SouravGhosh Sep 17 2020 at 10:36

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 an int[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.

M.M Sep 17 2020 at 12:02

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.