Консольное приложение PDCurses TUI C++ Win32 — место чтения нарушения прав доступа
Вопрос
я скачал pdcurses исходный код и смог успешно включить Curs.h в свой проект, связал предварительно скомпилированную библиотеку и все хорошо.
После нескольких часов тестирования библиотеки я увидел tuidemo.c в папке demos, скомпилировал его в исполняемый файл и все получилось!именно то, что мне нужно для моего проекта.
Теперь проблема в том, что это код C, и я работаю над проектом C++ в VS C++ 2008.
Файлы, которые мне нужны, являются tui.c и tui.h, как я могу включить этот файл C в код C ++?Я видел несколько предложений здесь
но компилятор был не слишком доволен сотнями предупреждений и ошибок.
Как я могу продолжать включать/использовать то, что включает в себя TUI pdcurses!?
Спасибо
РЕДАКТИРОВАТЬ:
Я добавил оператор extern "C", поэтому мой тест теперь выглядит так, но я получаю ошибку другого типа
#include <stdio.h>
#include <stdlib.h>
using namespace std;
extern "C" {
#include <tui.h>
}
void sub0()
{
//do nothing
}
void sub1()
{
//do nothing
}
int main (int argc, char * const argv[]) {
menu MainMenu[] =
{
{ "Asub", sub0, "Go inside first submenu" },
{ "Bsub", sub1, "Go inside second submenu" },
{ "", (FUNC)0, "" } /* always add this as the last item! */
};
startmenu(MainMenu, "TUI - 'textual user interface' demonstration program");
return 0;
}
Несмотря на успешную компиляцию, во время выполнения выдается ошибка, что указывает на неправильный указатель:
0xC0000005: Access violation reading location 0x021c52f9
на линии
startmenu(MainMenu, "TUI - 'textual user interface' demonstration program");
Не знаю, куда идти дальше.еще раз спасибо.
Решение 2
Наконец-то получилось.Решение заключалось в следующих шагах:
Сначала я переименовал tui.c в tui.cpp.
Для заголовка tui.h я использовал точный тот же шаг упаковки кода, как описано здесь.
тогда в моем проекте я просто включил заголовок без какого-либо внешнего блока "C"
#include "tui.h"
Скомпилировал и всё заработало!
Другие советы
Если я не ошибаюсь (а я легко могу ошибаться), это связано с разницей в соглашениях о вызовах для C/C++.Попробуйте сделать обратные вызовы extern "C" и заставить их вызывать функцию C++.Назовите это батутом :)