Консольное приложение PDCurses TUI C ++ Win32 - Место чтения нарушения прав доступа - PullRequest
1 голос
/ 15 июня 2010

Я скачал pdcurses source и смог успешно включить curses.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 ]

0 голосов
/ 17 июня 2010

Наконец-то все заработало.Решение было в следующих шагах:

Сначала я переименовал tui.c в tui.cpp

Для заголовка tui.h ​​я следовал за точным тем же шагомоборачивая код, как описано здесь.

, тогда в мой проект я просто включил заголовок без какого-либо внешнего блока "C"

#include "tui.h"

Скомпилировано, и это сработало!

0 голосов
/ 17 июня 2010

Если я не ошибаюсь (и я мог легко быть), это связано с различием в соглашениях о вызовах для C / C ++ Попробуйте сделать обратные вызовы extern «C» и заставить их вызывать функцию C ++. Назовите это батутом :) 1001 *

...