[英]Error: variable ‘v1’ has initializer but incomplete type
我正在 C 中創建一個簡單的程序來使用結構來操作點。 到目前為止,我已經研究了這兩個答案:
其中第二個看起來與我的情況驚人地相似。 但是,當我嘗試復制問題的格式時,不幸的是,我一直遇到同樣的問題,因為我沒有在我的主 function 中使用struct
,並從我的 header 文件中導入了typedef
。 這是我的代碼:
function.c
#include "function.h"
struct _vector{
double x;
double y;
double z;
};
function.h
struct _vector;
typedef struct _vector vector;
main.c
#include "function.h"
int main(){
vector v1 = {0.1,0.2,0.3};
vector v2 = {0.3,0.4,0.5};
vector v3 = crossprod(v1,v2);
return 0;
}
謝謝。
為了做vector v1 = {0.1,0.2,0.3};
,編譯器需要知道vector
的完整定義。 由於您沒有提供此內容,因此編譯器無法知道{0.1,0.2,0.3}
應該產生哪些字節。
選項 1:提供結構的完整定義
function.h
:
typedef struct Vector {
double x;
double y;
double z;
} Vector;
Vector Vector_crossprod(Vector v1, Vector v2);
function.c
:
#include "function.h"
Vector Vector_crossprod(Vector v1, Vector v2) {
Vector v;
// ...
return v;
}
main.c
:
#include "function.h"
int main(void) {
Vector v1 = { 0.1, 0.2, 0.3 };
Vector v2 = { 0.3, 0.4, 0.5 };
Vector v3 = Vector_crossprod(v1, v2);
return 0;
}
筆記:
int main()
中添加了缺失的void
。Vector vector
)。crossprod
不是很重要,但是您會在下一個選項中看到為什么它變得很重要。選項 2:繼續使用不透明類型
如果要繼續隱藏結構的定義,則需要使用指針並提供構造函數。
function.h
:
typedef struct Vector Vector;
// Returns NULL and sets errno on error.
Vector *Vector_new(double x, double y, double z);
void Vector_free(Vector *v);
// Returns NULL and sets errno on error.
Vector *Vector_crossprod(Vector *v1, Vector *v2);
function.c
:
#include <stdlib.h>
#include "function.h"
struct Vector {
double x;
double y;
double z;
};
Vector *Vector_new(double x, double y, double z) {
Vector *v = malloc(sizeof Vector);
if (!v)
return NULL;
v->x = x;
v->y = y;
v->z = z;
return v;
}
void Vector_free(Vector *v) {
free(v);
}
Vector *Vector_crossprod(Vector *v1, Vector *v2);
Vector *v = malloc(sizeof Vector);
if (!v)
return NULL;
// ...
return v;
}
main.c
:
#include "function.h"
int main(void) {
int rv = 1;
Vector *v1 = Vector_new(0.1, 0.2, 0.3);
if (!v1) {
perror("Can't allocate vector");
goto ERROR1;
}
Vector *v2 = Vector_new(0.3, 0.4, 0.5);
if (!v2) {
perror("Can't allocate vector");
goto ERROR2;
}
Vector *v3 = Vector_crossprod(v1, v2);
if (!v3) {
perror("Can't determine vector crossproduct");
goto ERROR3;
}
rv = 0;
Vector_free(v3);
ERROR3:
Vector_free(v2);
ERROR2:
Vector_free(v1);
ERROR1:
return rv;
}
布局不對,試試
function.h
struct _vector{
double x;
double y;
double z;
};
typedef struct _vector vector;
main.c
#include "function.h"
int main(){
vector v1 = {0.1,0.2,0.3};
vector v2 = {0.3,0.4,0.5};
vector v3 = crossprod(v1,v2);
return 0;
}
function.c 不會自動包含在內。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.