2017-04-27 58 views
-1

我有這樣的代碼片段從C++的書:C++結構難題無法被編譯

#include<stdio.h> 
#include<stdlib.h> 

struct S1 
{ 
    const char *s; 
    int i; 
    struct S1 *slp; 
}; 

main() 
{ 
    static struct S1 a[]= {{"abcdef", 1, a+1}, 
        {"ghijkl", 2, a+2}, 
        {"mnopqr", 3, a} }; 

    struct S1 *p = a; 

    printf("a[0].s = %s p-> = %s a[2].slp->s = %s \n", a[0].s, p->s, a[2].slp->s); 

    for(int i=0; i<3; i++) 
    { 
     printf("--a[i].i = %d ", --a[i].i); 
     printf("++a[i].s[3] = %c \n", ++a[i].s[3]); 
    } 
} 

利用開發的C++ v5.11,我無法用一個錯誤代碼進行編譯:

[Error] increment of read-only location '*(a[i].S1::s + 3u)' 

作爲@Corristo評論的解決方案的作品。

感謝大家的幫助。我將在下次獲得更好的IDE和書籍。謝謝,@ Tomaz-Canabrava。

+4

我認爲這本C++書不是C++ ... – Jiahao

+3

這看起來更像是90年代初期的C,而不是恰當的C++。你應該得到一本更好的C++書。 –

+6

's'是'const char *',那麼'[3]'是'const char',你不能在其上執行'++'。 – songyuanyao

回答

6

停止使用開發的C++

  • 這是在年初的2000年和從未,也不是大學還是學生使用了一個不合格的IDE。簡單地說:它比其他任何東西都有更多的錯誤。 (不幸的是,幾乎所有的巴西各大學的選擇的IDE,嘆了口氣。)

得到適當的C++的書

  • 如果它說,它會教你以下C + 什麼 +11,這不是一個正確的C++的書,它會教你平時錯誤 C++從中世紀時代(前C++ 11)

不要與相關的Turbo C++

  • 嚴重的什麼地方,還是有使用教C++大學。

有良好的和免費的書籍,編譯器和IDE的周圍LOT,因爲你是在windows我會建議那些免費的IDE之一:

  • 微軟的Visual Studio Express的
  • Qt Creator的
  • Eclipse CDT的

這至少會給你一個現代C++,不是酒店fr在石器時代。 好的研究。

+0

Code :: Blocks對於初學者來說足夠體面,CLion對學生來說也是免費的。 – Quentin

+0

CLion非常好 - 我沒有加入名單,因爲我不知道它對學生是免費的。 Code :: Blocks我不推薦,因爲開發似乎停滯不前像DevC++ –

0

C++不支持默認intmain(),應加int爲返回值:

int main() 
{ 
    ... 
    return 0; 
} 

2.結構S1.sconst char *,意味着它的價值不能被改變,這樣你就可以't做++a[i].s[3]

+0

感謝您的回覆。刪除常量將編譯代碼,但會導致程序崩潰。 – Yosua

0

通常,像這樣的例子具有特定的用途,例如,該代碼對於特定版本的語言定義是有效的。

這一個可能會證明const不是真正的const。作者可能會假設ANSI C++。

它也可能是在特定編譯器中的一個bug。

我會看看您的編譯器設置,看看您是否可以將語言更改爲更高級的標準。