programing

GCC: 배열 유형에 불완전한 요소 유형이 있습니다.

newstyles 2023. 9. 11. 21:32

GCC: 배열 유형에 불완전한 요소 유형이 있습니다.

나는 이 일을 선언했습니다.struct, 그리고 나는 그 구조들의 배열을 통과하려고 노력합니다.double2배열과 정수)를 함수로 배열합니다.컴파일할 때 gcc에서 "array type has incomplete element type" 메시지가 나타납니다.제가 어떤 문제를 일으켰는지요?struct기능으로?

typedef struct graph_node {
  int X;
  int Y;
  int active;
} g_node;

void print_graph(g_node graph_node[], double weight[][], int nodes);

저도 노력했습니다.struct g_node graph_node[], 하지만 저도 같은 생각을 합니다.

다음과 같은 문제를 야기하는 것은 어레이입니다.

void print_graph(g_node graph_node[], double weight[][], int nodes);

두 번째 및 그 이후의 치수는 다음과 같이 지정해야 합니다.

void print_graph(g_node graph_node[], double weight[][32], int nodes);

또는 포인터에 포인터를 지정할 수 있습니다.

void print_graph(g_node graph_node[], double **weight, int nodes);

하지만, 겉보기에는 비슷하지만, 내부적으로는 매우 다릅니다.

C99를 사용하는 경우 다양한 자격을 갖춘 배열을 사용할 수 있습니다.C99 표준의 예(섹션 § 6.7.5.2 배열 선언자)를 인용하면,

void fvla(int m, int C[m][m]); // valid: VLA with prototype scope

void fvla(int m, int C[m][m])  // valid: adjusted to auto pointer to VLA
{
    typedef int VLA[m][m];     // valid: block scope typedef VLA
    struct tag {
        int (*y)[n];           // invalid: y not ordinary identifier
        int z[n];              // invalid: z not ordinary identifier
    };
    int D[m];                  // valid: auto VLA
    static int E[m];           // invalid: static block scope VLA
    extern int F[m];           // invalid: F has linkage and is VLA
    int (*s)[m];               // valid: auto pointer to VLA
    extern int (*r)[m];        // invalid: r has linkage and points to VLA
    static int (*q)[m] = &B;   // valid: q is a static block pointer to VLA
}

댓글로 질문하기

[...] 메인()에서 함수에 전달하려는 변수는double array[][], 그럼 그걸 기능에 어떻게 전달할 수 있을까요?합격array[0][0]그것은 나에게 호환되지 않는 논쟁 유형을 제공합니다.&array그리고.&array[0][0].

당신의main(), 변수는 다음과 같습니다.

double array[10][20];

아니면 희미하게 비슷한 것; 아마도.

double array[][20] = { { 1.0, 0.0, ... }, ... };

다음과 같은 코드로 전달할 수 있어야 합니다.

typedef struct graph_node
{
    int X;
    int Y;
    int active;
} g_node;

void print_graph(g_node graph_node[], double weight[][20], int nodes);

int main(void)
{
    g_node g[10];
    double array[10][20];
    int n = 10;

    print_graph(g, array, n);
    return 0;
}

명령행을 사용하여 GCC 4.2(i686-apple-darwin11-llvm-gcc-4.2(GCC) 4.2.1(Apple Inc. build 5658 기반)(LLVM build 2336.9.00) 및 Mac OS X 10.7.3의 GCC 4.7.0과 함께 (객체 코드에) 깨끗하게 컴파일됩니다.

/usr/bin/gcc -O3 -g -std=c99 -Wall -Wextra -c zzz.c

컴파일러는 2차원 배열에서 두 번째 차원의 크기를 알아야 합니다.예를 들어,

void print_graph(g_node graph_node[], double weight[][5], int nodes);

만약 누군가가 이 질문을 발견했을 때 왜 공식적인 이유에 대해 궁금해 할 경우에 이 글을 올립니다.[]일들과[][]일반적으로 그렇지 않습니다.다양한 규칙이 존재합니다. 즉, 유효한 배열 선언을 만드는 규칙과 첫 번째 요소에 대한 포인터로 기능하기 위한 매개 변수로서 배열이 어떻게 전달되는지에 대한 규칙입니다.

C17 6.7.6.2/1 배열 선언자:

요소 유형은 불완전하거나 함수 유형이 되어서는 안 됩니다.

의 경우double weight[][], 원소형은double[], 매개 변수든 아니든 간에 어느 곳에서도 선언할 수 없는 불완전한 (배열) 유형입니다.이 배열 선언 규칙은 C176.7.6.3/7 함수 선언자에서 볼 수 있는 함수 매개 변수의 "배열 붕괴" 규칙 앞에 적용되기 때문에 다음과 같습니다.

매개 변수를 "유형 배열"로 선언하면 "유형에 적합한 포인터"로 조정됩니다.

이 규칙은 배열에 대한 선언이 이미 있다고 가정하며, 이는 이전에 인용된 6.7.6.2 규칙에 따라 수행되어야 합니다.

배열의 의 의 double[]은 , 는 이지만 은 한 은 double은 완전한 타입입니다 , 한 입니다 이러한 배열 선언은 C176.7.6.2/4에 따라 허용됩니다.

크기가 없으면 배열 유형이 불완전한 유형입니다.

목록과 마다, 이 과 마다 될 마다 될 이 ,double foo[] = { 1.0f };C17 6.7.9/22에 따르면 초기화자에 따라 크기가 부여되며 선언이 끝날 때까지 완전한 형식으로 변경됩니다.

크기를 알 수 없는 배열이 초기화된 경우, 그 크기는 명시적 초기화기를 사용하여 색인화된 가장 큰 요소에 의해 결정됩니다.배열 유형은 이니셜라이저 목록의 끝에서 완료됩니다.

변수 목록의 , 한 "되고 되지 의 되고 " 한 이 일 되고 이 한 되지 double[]다로 .double*.

과 가 등의 가 있을 합니다.double [][3]인 한 이지만 입니다 입니다 이지만 한 .double [3]는 완전한 배열 형식이므로 유효한 선언입니다.우런는소에한로다neo,hrtns한ao런d,r에eet우는소double (*)[3] 매개변수 에서 가장 차원이 수 로 입력하는지는하지 않습니다. 이것이 다차원 배열 매개변수 선언에서 가장 왼쪽 배열 차원이 생략될 수 있는 이유입니다. 실제로 우리가 어떤 크기로 입력하는지는 중요하지 않습니다.

언급URL : https://stackoverflow.com/questions/10003270/gcc-array-type-has-incomplete-element-type