2013-05-06 6 views
-1

Я новичок в программировании на C. Я использую библиотеку CPLEX в коде на C++, используя visual studio 2010. У меня возникают нарушения при выполнении некоторых действий.Доступ к записи с использованием CPLEX с VS2010

Нарушение сообщается в функции 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_GETVALUE;

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

Спасибо.

+0

Не могли бы вы предоставить свой источник, особенно метод '_unlock' и код, который вызывает' printf'? – leander

+0

Я добавил источники в вопрос. – user1372020

+0

Вероятно, вы повредили свой стек или кучу кода, прежде чем вы вызовете код библиотеки. Вы должны посмотреть на свой код и на «некоторые действия», о которых вы говорите. –

ответ

-1

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

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

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

+0

Спасибо, я связал CPLEX в соответствии с руководством пользователя IBM (http://my.gl.fudan.edu.cn/teacherhome/xlsun/ccqp/c_cpp.html). Кроме того, я установил библиотеку времени выполнения для многопоточного (/ MT). Это то, о чем вы говорите? – user1372020

+0

@ user1372020, так что вы используете версию CPLEX для версии с несколькими версиями статической версии? Это касается того, что именно упоминается в этом ответе. Это может быть неправильно для вашей конкретной сборки. Из документа, который вы связали, есть другие возможные варианты, основанные на вашем проекте. Я бы тоже посмотрел на них. – WhozCraig

+0

Благодарим, да, релиз-многопоточность (/ MT) - это то, что я использовал, так как вы предложили мне также попробовать многопоточную DLL (/ MD) с дополнительными каталогами, но я все равно получаю то же сообщение об ошибке. – user1372020

Смежные вопросы