伊莉討論區

標題: 關於C語言的 struct (已解決) [打印本頁]

作者: 在那裡    時間: 2017-1-10 10:58 PM     標題: 關於C語言的 struct (已解決)

本帖最後由 在那裡 於 2017-1-13 07:53 PM 編輯

struct body {
    int x,y;
    void set(int X, int Y) {x=X; y=Y;} //error
    struct body *next;
};
typedef struct body BODY;

BODY head , body , v = {1,0} , cookie; // v 移動向量
head.next = &body;  //error
body.next = NULL;  // error

int main()
{
    return 0;
}

他一直跳出 error: expected ':', ',', ';', '}' or '__attribute__' before '{' token| 錯誤行數為標上error註解的我不大明白究竟錯在哪兒
有大大可以幫我指明嗎?



作者: inunu    時間: 2017-1-11 03:04 AM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: scottcheng    時間: 2017-1-11 11:28 AM

在非 function 包含 main(), 之外只能宣告, 或 assign init value (非 member)
所以如 inunu 所講,

head.next = &body;  //error   <-- head.next 已經是在操作 head 的member了
body.next = NULL;  // error

請移到 main() 內

至於 void set(),  c++才支援 method, 所以請把你的附檔名從 .c 改成 cpp
如果是Linux, gcc 自動會 call g++ 來 compile cpp.

另外你上面 return 寫成 retrun 了

作者: 在那裡    時間: 2017-1-13 07:52 PM

本帖最後由 在那裡 於 2017-1-18 06:46 PM 編輯

哦哦
原來如此!
移動main狀況就解除了,檔名改成cpp後set的錯誤也消失了,
謝謝!


補充內容 (2017-1-18 06:45 PM):
懂了
不可以在函式或main以外的區域進行運算(除了宣告時)
不過.cpp那方面我是覺得有點奇怪
因為我看過有人用.c的檔名,可裡面卻進行跟我一樣動作
重點是編譯還過關了......
作者: 炽天使    時間: 2017-6-3 04:42 PM

在那裡 發表於 2017-1-13 07:52 PM
哦哦
原來如此!
移動main狀況就解除了,檔名改成cpp後set的錯誤也消失了,

你的struct直能用來declare種類int,char,double等等
作者: chevylin0802    時間: 2017-6-4 10:50 AM

本帖最後由 chevylin0802 於 2017-6-4 11:05 AM 編輯

在函式外是可以指定初始值的
在C語言來說這種情形相當常見
尤其是Linux kernel/drivers的程式碼裏可以說是最常見不過的事情

只是指定初始值的方式有它一定的遊戲規則
比如 head.next = &body 這種做法就不允許
對於結構的初始值化是要一個整體的一起進行的

在C裏的說法是結構裏的元素(element)而不能說結構裏的成員(member)
因為C語言並沒有物件的觀念
但在C++來講, 結構裏的元素都被稱作結構裏的成員
如果要以C的觀點來講的話
那麼還是應該以元素來稱呼會比較妥善
結構裏的元素也有限制
函式是不允許被直接定義在結構裏面的
只有函式的指標可以放進去
  1. struct body {
  2.     int x,y;
  3.     void set(int X, int Y) {x=X; y=Y;} //error
  4.     struct body *next;
  5. };
  6. typedef struct body BODY;
複製代碼
在C語言裏是錯誤的宣告方式
正確的宣告方式如下
  1. struct _body {
  2.     int x,y;
  3.     (void*)(*set)(int x, int y, struct _body *myself);
  4.     struct _body *next;
  5. };
  6. typedef struct _body BODY;

  7. void set(int x, int y, struct _body *myself) {
  8.        myself->x = x;
  9.         myself->y = y;
  10. }

  11. BODY body = { 0, 0, &set, NULL };
  12. BODY head = { 1, 0, &set, body };
複製代碼
這種寫法完全可以使用C來編譯, 不需要把檔名改成.cpp

事實上這種以結構的方式的寫法來實現C程式的物件化在國外是相當常見的
不管是知名的ffmpeg, vlc, 還是xine, 都是採取這種方式來作為程式最主要的架構
全部都是用純C語言寫出來的但架構上採用物件方式


作者: CoNsTaRwU    時間: 2017-6-13 11:55 AM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: coal511464    時間: 2017-8-2 11:35 PM

之後你可以檢查你的編譯環境 有時候只是哪邊沒設定好
要不然你可以試試網路上的c++ shell 可以線上編譯 如果可以執行 代表只是你的環境出問題




歡迎光臨 伊莉討論區 (http://1.eyny.com/) Powered by Discuz!