Доступ к месту записи нарушения с использованием CPLEX с VS2010

Я новичок в программировании на Си. Я использую библиотеку CPLEX в коде C ++ с использованием Visual Studio 2010. Я получаю нарушения прав доступа при выполнении некоторых действий.

О нарушении сообщается в функции void __cdecl _unlock, определенной в файле CRT mlock.c. Конкретной строкой является LeaveCriticalSection (_locktable [locknum] .lock) ;.

Сообщение об ошибке — необработанное исключение в 0x0f63443b: 0xC0000005: место записи нарушения прав доступа 0xeb43c7c4. Моя интерпретация заключается в том, что это проблема памяти, но я не уверен. Также я не знаю, как отследить блок памяти 0xeb43c7c4 в коде.

Ниже приведен стек вызовов:

    cplex124.dll!0fdd443b()
[Frames below may be incorrect and/or missing, no symbols loaded for cplex124.dll]
cplex124.dll!0fdd3bbb()
cplex124.dll!0fcd0610()
cplex124.dll!0fccfbfd()
cplex124.dll!0feb70fd()
cplex124.dll!0fede883()
>   name.exe!_unlock(int locknum)  Line 375 C
name.exe!_unlock_file2(int i, void * s)  Line 356 + 0x9 bytes   C
name.exe!printf(const char * format, ...)  Line 68 + 0x10 bytes C
name.exe!main(int argc, char * * argv)  Line 620 + 0xe bytes    C++
name.exe!__tmainCRTStartup()  Line 278 + 0x12 bytes C
kernel32.dll!7693ed6c()
ntdll.dll!7701377b()
ntdll.dll!7701374e()

Исходный текст для _unlock находится в файле mlock.c как:

void __cdecl _unlock (
int locknum
)
{
/*
* leave the critical section.
*/
LeaveCriticalSection( _locktable[locknum].lock );
}#ifdef _M_IX86
#pragma optimize("y",on)
#endif  /* _M_IX86 */

И источник для printf находится в файле printf.c как:

int __cdecl printf (
const char *format,
...
)
/*
* stdout 'PRINT', 'F'ormatted
*/
{
va_list arglist;
int buffing;
int retval;

_VALIDATE_RETURN( (format != NULL), EINVAL, -1);

va_start(arglist, format);

_lock_str2(1, stdout);
__try {
buffing = _stbuf(stdout);

retval = _output_l(stdout,format,NULL,arglist);

_ftbuf(buffing, stdout);

}
__finally {
_unlock_str2(1, stdout);
}

return(retval);
}

Если я удаляю ссылки для файлов концертов в свойстве проекта, я получаю то же сообщение об ошибке, но в файле tidtable.c, в _CRTIMP PFLS_GETVALUE_FUNCTION __cdecl __set_flsgetvalue () в строке: PFLS_GETVALUE_FUNCTION flsGetValue = FLS_GETVAL;

Буду признателен за любые советы.

Благодарю.

-1

Решение

Cplex — коммерческая решающая библиотека. Вероятно, они выпускают несколько разных версий DLL, о которой вы упоминаете, чтобы соответствовать различным типам сборки.

Кроме того, библиотеки этого типа обычно дают вам некоторую гибкость в определениях препроцессора, которые вы можете определить. Подробности смотрите в документации по cplex. Несовпадение определений может вызвать такие ошибки, как и использование среды выполнения, которая не поддерживает многопоточность с библиотекой, которая это делает.

Я также предложил бы взглянуть на GLPK, GNU Linear Programming Kit для альтернативы с открытым исходным кодом, если CPLEX окажется проблематичным.

-1

Другие решения

Других решений пока нет …