Получение R6025 чистый виртуальный вызов

Я думаю, что меня как-то заблокировали ... Я продолжал думать, как сохранить имя переменной (например, L1) и передать его как переменную другой функции.

@ forward87: Ваше первое предложение уже разблокировало меня, и я понял, что **data можно обработать просто через словарь. Итак, в конце концов, мне просто нужно было преобразовать входной dict в список dicts для следующей функции, например, так (с некоторыми несущественными частями, отсекаемыми):

def propagate_parallel(RTs, cav_data, **ddata):
    keys = list(ddata.keys())
    values = list(ddata.values())
    futures = []
    res = []
    with confu.ProcessPoolExecutor(max_workers=32) as pool:
        for i in it.product(*values):
            futures.append(pool.submit(propagate, RTs=RTs,
                                       cav_data=cav_data,
                                       **dict(zip(keys, list(i)))))
    for fut in futures:
        res.append(fut)
    return res

Я, наконец, понимаю **kwargs, и что это может быть как диктат. Спасибо!

15
задан 1800 INFORMATION 22 October 2008 в 01:44
поделиться

3 ответа

Если Вы хотите поймать все катастрофические отказы, необходимо сделать больше, чем просто: SetUnhandledExceptionFilter

Я также установил бы обработчик аварийных прекращений работы, purecall обработчик, неожиданный, оконечный обработчик, и недопустимых параметров.

#include <signal.h>

inline void signal_handler(int)
{
    terminator();
}

inline void terminator() 
{
    int*z = 0; *z=13; 
}

inline void __cdecl invalid_parameter_handler(const wchar_t *, const wchar_t *, const wchar_t *, unsigned int, uintptr_t)
{
   terminator();
} 

И в Вашем основном помещает это:

 signal(SIGABRT, signal_handler);
 _set_abort_behavior(0, _WRITE_ABORT_MSG|_CALL_REPORTFAULT);

 set_terminate( &terminator );
 set_unexpected( &terminator );
 _set_purecall_handler( &terminator );
 _set_invalid_parameter_handler( &invalid_parameter_handler );

Вышеупомянутое отправит все катастрофические отказы на Ваш обработчик необработанных исключений.

16
ответ дан 1 December 2019 в 02:47
поделиться

Попытайтесь определить оскорбление, чистое виртуальный. Нет ничего в правилах C++, которые мешают Вам определять чистое виртуальное, и можно использовать это по ряду причин, наименьшее количество которого получает след на вызове. Единственный caviat является определением, должен быть вне объявления (virtual void bla() = 0 { } не допустимо).

-2
ответ дан 1 December 2019 в 02:47
поделиться

См. этот ответ здесь на вопрос, откуда “чистая виртуальная функция называет” катастрофические отказы прибывшими?.

Для помощи с отладкой этих видов проблем, в различных версиях MSVC, можно заменить purecall обработчик библиотеки времени выполнения. Вы делаете это путем предоставления собственной функции эту подпись:

int __cdecl _purecall(void)

и связывая его перед соединением библиотеки времени выполнения. Это дает ВАМ контроль того, что происходит, когда purecall обнаруживается. После того как Вы имеете контроль, можно сделать что-то более полезное, чем стандартный обработчик. У меня есть обработчик, который может обеспечить отслеживание стека того, где purecall произошел; посмотрите здесь: http://www.lenholgate.com/archives/000623.html для получения дополнительной информации.

(Обратите внимание, что можно также звонить _set_purecall_handler() устанавливать Ваш обработчик в некоторых версиях MSVC).

Так, в Вашем purecall обработчике сделайте свой мини-дамп.

12
ответ дан 1 December 2019 в 02:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: