簡體   English   中英

錯誤:變量“v1”具有初始化程序但類型不完整

[英]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 )。
  • 將“類”名稱添加到 function 作為命名空間。 這對於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM