查看完整版本: 關於C語言的 struct (已解決)
頁: [1]

在那裡 發表於 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註解的我不大明白究竟錯在哪兒
有大大可以幫我指明嗎?


...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><div></div>

inunu 發表於 2017-1-11 03:04 AM

你用 C 還是 C++ compiler?
C 本身沒有引進物件導向的概念, 不能定義 member function
而你第三行正好定義了 set() 這個 body 的 member function
之後的兩個 error 都是在 function 之外寫程式碼, 應該要寫到 main() 裡頭

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 static/image/common/back.gif
哦哦
原來如此!
移動main狀況就解除了,檔名改成cpp後set的錯誤也消失了,


你的struct直能用來declare種類int,char,double等等<br><br><br><br><br><div></div>

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的觀點來講的話
那麼還是應該以元素來稱呼會比較妥善
結構裏的元素也有限制
函式是不允許被直接定義在結構裏面的
只有函式的指標可以放進去struct body {
    int x,y;
    void set(int X, int Y) {x=X; y=Y;} //error
    struct body *next;
};
typedef struct body BODY;
在C語言裏是錯誤的宣告方式
正確的宣告方式如下struct _body {
    int x,y;
    (void*)(*set)(int x, int y, struct _body *myself);
    struct _body *next;
};
typedef struct _body BODY;

void set(int x, int y, struct _body *myself) {
       myself->...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

CoNsTaRwU 發表於 2017-6-13 11:55 AM

chevylin0802 發表於 2017-6-4 10:50 AM static/image/common/back.gif
在函式外是可以指定初始值的
在C語言來說這種情形相當常見
尤其是Linux kernel/drivers的程式碼裏可以說是 ...

這種寫法完全可以使用C來編譯, 不需要把檔名改成.cpp
樓主的寫法完全可以用 C++ 來編譯,不需要修改任何程式碼

而且樓主的問題明明就在 global scope 不能有那兩個 statement

你也要去扯用 C 來模擬物件導向
扯 linux kernel,扯 driver
實在是很無言……

補充內容 (2017-6-13 12:25 PM):
我在跟你講你搞錯問題重點了,你還要來跟我扯C有沒有比較低階,扯我主管…我到底該哭還是該笑啊………...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

coal511464 發表於 2017-8-2 11:35 PM

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