2017-04-11 70 views
-1
#include <graphics.h> //importing graphics 
#include <conio.h> 

int main() 
{ 
    int gd=0,gm; 
    initgraph(&gd,&gm," "); 
    circle(100,80,20); 
    getch(); 
    closegraph(); 
} 

我輸入了代碼::塊上面的代碼,但它不執行,並而是說加載圖形文件

warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings] 

我一直在嘗試了三天。有人請幫助我。 我已經安裝了winbgim.h和其他必要的圖形文件,但沒有幫助。我已經找遍了所有可能的網站...

The red color is indicating the error line

+1

[C++不推薦將字符串常量轉換爲'char \ *'](http://stackoverflow.com/questions/1524356/c-deprecated-conversion-from-string-constant-to-char) –

+1

請確定您正在使用哪種語言。 C不是C++ – Gerhardh

+0

OP顯然選擇了C,建議的僞指針似乎不適用。 –

回答

0

序言:我刪除,然後取消刪除這個答案好幾次。還有其他一些問題可以解決這個問題,但其中大多數似乎都集中在C++上,C++在這方面與C有一些不同,或者被視爲關於這個問題的一個隱瞞。有些人有我不關心的或者不完整的答案。因此,在一個傲慢自大的行爲中,我提供了這個答案,並且我選擇在這裏提供它。


因爲我不斷在代碼中看到的唯一字符串是" "參數initgraph(),警告必須從那裏產生。在這種情況下,該函數的第三個參數必須聲明爲char *

在這種情況下,您提供的代碼並沒有固有的錯誤。根據標準,字符串常量對應於char的數組,並且在評估它的大多數上下文中(包括它作爲函數參數出現的時間),這樣的數組會自動轉換爲指向其第一個元素的指針。這完全符合該功能。

問題是標準還說如果程序試圖修改字符串文字的內容,那麼它會產生未定義的行爲。實際上這是程序崩潰的情況並不罕見。因此,儘管技術上合法,但當您將字符串常量轉換爲char *時,您會承擔很大的風險,因爲處理指針的人可能不知道嘗試使用它來修改指向的內容是不安全的。如果您轉換爲const char *,則不會出現此問題。

GCC希望幫助您檢測這些問題。因此,它的-Wwrite-strings]選項啓用後,會將字符串常量視爲const char的數組而不是數組char,因此會觸發警告,例如遇到的警告。

你至少有三種選擇:

  1. 您可以禁用-Wwrite-strings編譯選項。這可能是具有良好測試行爲的遺留代碼的最佳方法,但我不建議使用其他方法。

  2. 只要實際上函數不嘗試修改陣列,其參數指向,直接或間接地,可以改變函數參數輸入const char *。這可能需要進行一系列其他類似的更改以避免附加的相關警告。

  3. 避免將字符串文字傳遞給該函數。相反,請創建並傳遞一個可變數組char。例如:

int gd = 0, gm; 
char s[] = " "; 

initgraph(&gd, &gm, s); 
// ... 

請特別注意,在那裏,雖然有一個字符串文字,它僅用於初始化的不同,非const陣列s

+0

非常感謝@JohnBollinger與上面那個.....我做了同樣的事情(我保存文件爲.cpp然後它工作)....程序編譯,但是當我運行代碼時,它停止工作。 ...在構建消息中,它表示**構建文件:「no project」中的「no target」(編譯器:未知)** ....爲什麼會發生這種情況? –

+0

@RabinBK,你的新問題聽起來像是你的項目配置問題。更改源文件後綴可能會產生這樣的問題(我注意到,這並不是我的建議之一,也不一定安全)。我無法對此多說。 –