GCC: 배열 유형에 불완전한 요소 유형이 있습니다.
나는 이 일을 선언했습니다.struct
, 그리고 나는 그 구조들의 배열을 통과하려고 노력합니다.double
2배열과 정수)를 함수로 배열합니다.컴파일할 때 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
'programing' 카테고리의 다른 글
모듈을 python에 "pythonport"한 다음 가져오기 후 코드를 변경하는 방법 (0) | 2023.09.11 |
---|---|
MySQL - NULL safe not equal 연산자 (0) | 2023.09.11 |
도커: $PATH에서 실행 파일을 찾을 수 없습니다. (0) | 2023.09.11 |
NodeJS를 사용하여 CSV 파일 구문 분석 (0) | 2023.09.11 |
Node.js REPL에 있는 함수를 )(로 호출하는 이유는 무엇입니까? (0) | 2023.09.11 |