Не удается пройти предупреждение C++: (и сбой после) устаревшее преобразование из строковой константы в ‘char*’ [-Wwrite-strings]

Я пробовал все, и я даже не могу запустить этот простой код графа. Я установил graphics.h, winbgim.h и libbgi.a во все нужные папки. (включать и lib). Линкеры тоже -lbgi -lgdi32 -lcomdlg32 -luuid -loleaut32 -lole32

Я использую CodeBlocks 16.01. Я также пробовал это в Dev-C++ без везения.

Сначала я получил ошибку:

C:\Program Files (x86)\CodeBlocks\MinGW\include\graphics.h|302|ошибка: переопределение 'int right'

Но я решил это, изменив файл graphics.h, int right нужно заменить на int top.

Также есть 1 предупреждение -

C:\Users\Davor\Desktop\New Project\drugi\main.cpp||В функции 'int main()':| C:\Users\Davor\Desktop\New Project\drugi\main.cpp|15|предупреждение: устарело преобразование строковой константы в 'char*' [-Wwrite-strings]| ||=== Сборка завершена: 0 ошибок, 1 предупреждений (0 минут, 0 секунд)) ===|

После этого, когда я нажимаю «Построить и запускать», я получаю

«*.exe перестал работать». В фоновом режиме я сначала получаю -

Процесс вернул 255 (0xFF) время выполнения: 91,666 с Нажмите любую клавишу, чтобы продолжить.

Но каждый раз я получаю -

Процесс вернул -1073741819 (0xC0000005) время выполнения: 26,494 с Нажмите любую клавишу, чтобы продолжить.

#include <iostream>
#include <cstdlib>
#include <graphics.h>


using namespace std;



int main() {

    int gdriver = 9;
    int gmode = 2;
    int x;
    initgraph(&gdriver, &gmode, "");
    setbkcolor (WHITE);
    setcolor (BLACK);
    cleardevice();
    for (x = 260; x < 364; x = x + 5)
    {
        circle(x,240,60);
    }
    getch();
    closegraph();

    return 0;
}

person szentmihaly    schedule 05.05.2016    source источник
comment
третий аргумент в initgraph - это путь, который вы оставили пустым, как тогда он загрузит драйвер?   -  person piyushj    schedule 05.05.2016


Ответы (2)


Не заглядывая внутрь <graphics.h>, может показаться, что initgraph() объявлено как принимающее (неконстантный) char* в качестве третьего параметра — предполагается, что это выходной параметр, указывающий на записываемый char массив, в который initgraph() будет писать.

Помимо приведенного вами предупреждения, передача строковой константы "" в качестве аргумента приведет к неопределенному поведению, прекрасным примером которого является сбой.

Хотя мои замечания выше справедливы, изучив документацию, я бы предположил, что параметр не является выходным параметром, и что отсутствие const является просто плохой реализацией API, как и очевидное отсутствие каких-либо означает, чтобы определить, действительно ли инициализация прошла успешно или нет...

person Jeremy    schedule 05.05.2016
comment
Любые мысли о том, как решить эту проблему? Большое спасибо. - person szentmihaly; 05.05.2016
comment
Более полезно, я бы направил вас к утверждению в (как я предполагаю) документации, в которой говорится, что если pathtodriver имеет значение null, файлы драйвера (*.BGI) должны находиться в текущем каталоге. - person Jeremy; 05.05.2016
comment
Я нашел решение и опубликовал ответ. В любом случае, спасибо за ваше время и помощь! - person szentmihaly; 07.05.2016

Я нашел решение.

Проблема была в следующей библиотеке:

libbgi.a

Я пробовал несколько разных, но в конце концов я нашел правильный. Как только заменил на старый - графическое окно открылось и работало нормально, без вылетов.

Предупреждение:

устаревшее преобразование строковой константы в 'char*' [-Wwrite-strings]|

все еще там, но код работает отлично.

Спасибо за помощь в любом случае.

Ваше здоровье.

person szentmihaly    schedule 06.05.2016