Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.96/75: Рейтинг темы: голосов - 75, средняя оценка - 4.96
80 / 0 / 1
Регистрация: 06.11.2017
Сообщений: 16

Ошибка OSError: exception: access violation reading 0xFFFFFFFFFFFFFFFF

29.01.2020, 09:57. Показов 14971. Ответов 25
Метки нет (Все метки)

Добрый день!

Нужна помощь по обращению к DLL-ке через python.

В Dll функция возведения в квадрат массива double.

Код TestsExDLL.h:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include "extcode.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef struct {
    int32_t dimSize;
    double elt[1];
} DoubleArrayBase;
typedef DoubleArrayBase **DoubleArray;
 
/*!
 * TestsExDLL
 */
void __cdecl TestsExDLL(DoubleArray *ArrayIn, DoubleArray *ArrayOut);
 
MgErr __cdecl LVDLLStatus(char *errStr, int errStrLen, void *module);
 
/*
* Memory Allocation/Resize/Deallocation APIs for type 'DoubleArray'
*/
DoubleArray __cdecl AllocateDoubleArray (int32 elmtCount);
MgErr __cdecl ResizeDoubleArray (DoubleArray *hdlPtr, int32 elmtCount);
MgErr __cdecl DeAllocateDoubleArray (DoubleArray *hdlPtr);
 
void __cdecl SetExecuteVIsInPrivateExecutionSystem(Bool32 value);
 
#ifdef __cplusplus
} // extern "C"
#endif
Код обращения к dll в Pуthon:
Python
1
2
3
4
5
6
7
8
9
10
11
12
import ctypes
newlib = ctypes.CDLL(r'C:\\Users\\Admin\\Desktop\\IS2_Ex\\UPD16337\\TestsEXDLL.dll')
 
inputdata = [10.6, 25.2, 32.1, 41.4]
output = []
pinputdata = (ctypes.c_double * len(inputdata))(* inputdata)
poutputdata = (ctypes.c_double * len(inputdata))(* output)
 
newlib.TestsExDLL.restype = ctypes.c_void_p
newlib.TestsExDLL.argtypes = [ctypes.POINTER(ctypes.c_double), ctypes.POINTER(ctypes.c_double)]
 
newlib.TestsExDLL(pinputdata, poutputdata)
После выполнения кода выдает следующую ошибку:
newlib.TestsExDLL(pinputdata, poutputdata)
OSError: exception: access violation reading 0xFFFFFFFFFFFFFFFF

Dll создавалась средствами Labview. После создания проверялась на работоспособность в Labview. Проблем с выводом результата в labview - нет. Помогите разобраться в чем кроется ошибка (переполнение при чтении?).
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.01.2020, 09:57
Ответы с готовыми решениями:

ФАтальная ошибка unhandled access violation reading 0x0041 exception at 19E804B0H
При попытке копировать файл выходит эта ошибка компьютер отвечает всем системным требованиям программы ОС:Windows 10 Microsoft visual...

Автокад - фатальная ошибка: unhandled Access violation Reading 0x0000 Exception at 40403c90h
Уважаемые специалисты, прошу помочь советом в следующей проблеме: перестал запускаться Автокад 2009, при запуске открывается чертеж, и...

Ошибка Unhandled exception at 0x001EB509 in Gauss1.exe: 0xC0000005: Access violation reading location 0xCCCCCCD4
Программа должна генерировать и выводить на экран матрицу n x n. Однако, вылетает исключение: Unhandled exception at 0x001EB509 in...

25
80 / 0 / 1
Регистрация: 06.11.2017
Сообщений: 16
30.01.2020, 16:45  [ТС]
Лучший ответ Сообщение было отмечено Рыжий Лис как решение

Решение

Да, я примерно так и думал, буду пробовать. Проблема будет еще в том то массив ошибок из labview выходит как "variant", ну это уже 2 вопрос.

Добавлено через 3 часа 53 минуты
Добился работоспособности кода python c dll. Предварительно проверил на labview.

Отработан вариант второй: задание входных и выходных аргументов через указатель на массив + указатели количества чисел в массивах.

Собственно сам код:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import ctypes
import numpy as np
 
newlib = ctypes.CDLL('E:\\Desktop_Last\\IS2_Ex\\UPD16337\\TestsEXDLL.dll')
 
input = [10.6, 25.2, 32.1, 41.4]
output = np.full(len(input), 0)
 
bufferin = (ctypes.c_double * len(input))(*input)
bufferout = (ctypes.c_double * len(output))(*output)
 
newlib.TestsExDLL.restype = ctypes.c_void_p
newlib.TestsExDLL.argtypes = [ctypes.POINTER(ctypes.c_double), ctypes.POINTER(ctypes.c_double), ctypes.c_int, ctypes.c_int]
newlib.TestsExDLL(bufferin, bufferout, len(input), len(output))
 
result = np.frombuffer(bufferout)
 
print("inputdata = " + str(input))
print("result = " + str(result))
Результат:

inputdata = [10.6, 25.2, 32.1, 41.4]
result = [ 112.36 635.04 1030.41 1713.96]

Вариант первый с заданием входных/выходных аргументов как Array Handle Pointer выложу позже.
0
80 / 0 / 1
Регистрация: 06.11.2017
Сообщений: 16
03.02.2020, 07:56  [ТС]
Выкладываю вариант 1 по обращению к dll, но не рабочий пока что:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
from ctypes import *
import ctypes
import numpy as np
 
newlib = ctypes.CDLL('E:\\Desktop_Last\\IS2_Ex\\UPD16337\\TestsEXDLL.dll')
 
input = [10.6, 25.2, 32.1, 41.4]
output = np.full(len(input), 0)
 
 
class ARRAYIN(Structure):
    _fields_ = [("dimSize", c_int), ("elt", POINTER(c_double))]
 
 
bufferin = ARRAYIN(len(input), (c_double * len(input))(*input))
 
 
class ARRAYOUT(Structure):
    _fields_ = [("dimSize", c_int), ("elt", POINTER(c_double))]
 
 
bufferout = ARRAYOUT(len(output), (c_double * len(output))(*input))
 
newlib.TestsExDLL.restype = ctypes.c_void_p
newlib.TestsExDLL.argtypes = [ctypes.POINTER(ARRAYIN), ctypes.POINTER(ARRAYOUT)]
 
print(type(bufferin))
print(bufferin)
newlib.TestsExDLL(bufferin, bufferout)
 
result = np.frombuffer(bufferout)
При выполнении получаю следующую ошибку:

newlib.TestsExDLL(bufferin, bufferout)
OSError: exception: access violation reading 0x0000000000000004

Судя по файлу заголовка:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include "extcode.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef struct {
    int32_t dimSize;
    double elt[1];
} DoubleArrayBase;
typedef DoubleArrayBase **DoubleArray;
 
/*!
 * TestsExDLL
 */
void __cdecl TestsExDLL(DoubleArray *ArrayIn, DoubleArray *ArrayOut);
 
MgErr __cdecl LVDLLStatus(char *errStr, int errStrLen, void *module);
 
/*
* Memory Allocation/Resize/Deallocation APIs for type 'DoubleArray'
*/
DoubleArray __cdecl AllocateDoubleArray (int32 elmtCount);
MgErr __cdecl ResizeDoubleArray (DoubleArray *hdlPtr, int32 elmtCount);
MgErr __cdecl DeAllocateDoubleArray (DoubleArray *hdlPtr);
 
void __cdecl SetExecuteVIsInPrivateExecutionSystem(Bool32 value);
 
#ifdef __cplusplus
} // extern "C"
#endif
входной/выходной массив задан теперь структурой.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
03.02.2020, 08:07
Цитата Сообщение от Vofffchik Посмотреть сообщение
typedef DoubleArrayBase **DoubleArray;
Меня этот тип данных смущает. Указатель на указатель. А мы передаём в функцию ещё один указатель… Итого три указателя.
0
80 / 0 / 1
Регистрация: 06.11.2017
Сообщений: 16
03.02.2020, 10:25  [ТС]
Убрал указатели, но на выходе тоже самое:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
from ctypes import *
import ctypes
import numpy as np
 
newlib = ctypes.CDLL('E:\\Desktop_Last\\IS2_Ex\\UPD16337\\TestsEXDLL.dll')
 
input = [10.6, 25.2, 32.1, 41.4]
output = np.full(len(input), 0)
 
 
class ARRAYIN(ctypes.Structure):
    _fields_ = [("dimSize", c_int), ("elt", c_double * len(input))]
 
 
bufferin = ARRAYIN(len(input), (c_double * len(input))(*input))
 
 
class ARRAYOUT(ctypes.Structure):
    _fields_ = [("dimSize", c_int), ("elt", c_double * len(output))]
 
 
bufferout = ARRAYOUT(len(output), (c_double * len(output))(*output))
 
newlib.TestsExDLL.restype = ctypes.c_void_p
newlib.TestsExDLL.argtypes = [ARRAYIN, ARRAYOUT]
 
print(type(bufferin))
print(bufferin)
newlib.TestsExDLL(bufferin, bufferout)
 
result = np.frombuffer(bufferout)
newlib.TestsExDLL(bufferin, bufferout)
OSError: exception: access violation reading 0x0000000000000004

В параметрах прототипа к dll в labview вот что:

void TestsExDLL(Array1DDouble ***ArrayIn, Array1DDouble ***ArrayOut);

и это работает.
0
80 / 0 / 1
Регистрация: 06.11.2017
Сообщений: 16
05.02.2020, 12:47  [ТС]
To Рыжий Лис:

нашел на вот этом форуме нечто похожее:



но смущает то что указателем становится вся структура, и задать значение уже невозможно. Т.е.:


Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from ctypes import *
import ctypes
import numpy as np
 
newlib = ctypes.CDLL('E:\\Desktop_Last\\IS2_Ex\\UPD16337\\TestsEXDLL.dll')
 
input = [10.6, 25.2]
output = np.full(len(input), 0)
 
 
class Arr(Structure):
    _fields_ = [("dimSize", c_int), ("elt", c_double * len(input))]
 
 
darr = POINTER(Arr)
 
ArrayIn = darr(len(input), (c_double * len(input))(*input))
print(ArrayIn)
Ошибка:

ArrayIn = darr(len(input), (c_double * len(input))(*input))
TypeError: POINTER expected at most 1 arguments, got 2

Питон видит структуру как один целый аргумент.

Добавлено через 15 минут
Еще одно наблюдение, не понимаю как это возможно:

сам код:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from ctypes import *
import ctypes
import numpy as np
 
newlib = ctypes.CDLL('E:\\Desktop_Last\\IS2_Ex\\UPD16337\\TestsEXDLL.dll')
 
input = [10.6, 25.2]
output = np.full(len(input), 0)
 
 
class Arr(Structure):
    _fields_ = [("dimSize", c_int), ("elt", c_double * len(input))]
 
 
ArrayIn = Arr(len(input), (c_double * len(input))(*input))
print(ArrayIn)
print(np.frombuffer(ArrayIn))
ArrayOut = Arr(len(output), (c_double * len(output))(*output))
 
newlib.TestsExDLL.restype = c_void_p
newlib.TestsExDLL.argtypes = [POINTER(Arr), POINTER(Arr)]
 
s_obj = newlib.TestsExDLL(byref(ArrayIn), byref(ArrayOut))
Результат выполнения строк

print(ArrayIn)
print(np.frombuffer(ArrayIn))

следующий

<__main__.Arr object at 0x0000021A7FA68148>
[9.88e-324 1.06e+001 2.52e+001]


Всего кода:

s_obj = newlib.TestsExDLL(byref(ArrayIn), byref(ArrayOut))
OSError: exception: access violation reading 0x0000000000000002

Почему в массиве ArrayIn первое значение 9.88e-324, а не сама длина 2?
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
05.02.2020, 12:54
Цитата Сообщение от Vofffchik Посмотреть сообщение
Почему в массиве ArrayIn первое значение 9.88e-324, а не сама длина 2?
Нет, там правда 2 записывается:
Python
1
2
ArrayIn = Arr(len(input), (c_double * len(input))(*input))
print(ArrayIn.dimSize)
Только при выводе на консоль, почему-то интерпретируется как float

Добавлено через 1 минуту
Понял, потому что мы в frombuffer преобразуем в double.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.02.2020, 12:54

Ошибка: Unhandled exception at 0x772115de in TimeShift.exe: 0xC0000005: Access violation reading location 0x00041000.
всем привет! При использовании двумерного массива постоянно появляется ошибка :Unhandled exception at 0x772115de in TimeShift.exe:...

Объект приходит пустым (стертым?) к for циклу. Exception thrown: read access violation. it was 0xFFFFFFFFFFFFFFFF
Здравствуйте! Заранее прошу прощения что прикрепляю весь код, боюсь упустить важное. Я в виде практики пытаюсь написать клон Space...

Exception thrown at 0x77D75BCA (ntdll.dll): 0xC0000005: Access violation reading location 0x0000
Есть задача Есть решение Основное приложение: #include &quot;stdafx.h&quot; #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include...

Ошибка Access violation reading location 0x00000003
Функция должна вывести предложение на украинском языке и напечатать каждое слово с большой буквы. Ошибка в этой строке: if (((**(pw - 1)...

ошибка Access violation reading location 0x00000066
Ошибка : Unhandled exception at 0x100e14cf (msvcr100d.dll) in 3.4.exe: 0xC0000005: Access violation reading location 0x00000066. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Новые блоги и статьи
[golang] Конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов.
alhaos 10.06.2026
Задача Реализовать конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов. Сигнатура func Fetch(urls string, maxConcurrent int) Result Пример urls :=. . .
[golang] Состояние гонки (race condition)
alhaos 10.06.2026
Состояние гонки (race condition) Состояние гонки (Race Condition) — это ошибка, возникающая при одновременном доступе нескольких горутин к одним и тем же данным без должной синхронизации. При этом. . .
Взрослые отношения, и почему они не получаются
kumehtar 09.06.2026
Когда в детстве ребёнок не получает от родителей чего-то важного, он лишается не просто приятных переживаний, а основы для формирования определённых внутренних качеств и навыков. Если ребёнок не. . .
[golang] Worker Pool
alhaos 09.06.2026
Worker Pool Worker Pool — паттерн конкурентной обработки задач в Go. Суть: фиксированное количество горутин-воркеров читают задачи из общего канала и пишут результаты в общий канал результатов. . . .
[golang] Pipeline
alhaos 08.06.2026
Pipeline Pipeline — паттерн конкурентной обработки данных в Go. Суть: данные проходят через цепочку независимых стадий, каждая из которых работает в своей горутине и общается с соседями через. . .
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь lIs4oanZS9Y
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru