рдЕрдЬрдЧрд░ рд╕реЗ рдбреАрдПрд▓рдПрд▓ рддрдХ рджреЛ рдЖрдпрд╛рдореА рд╕реВрдЪреА рдкрд╛рд╕ рдХрд░рдирд╛

рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░ред рдореИрдВрдиреЗ рдкрд╛рдпрдерди рд╕реЗ C / C ++ рд▓реЗрдЦ рдХреЛ рдереЛрдбрд╝рд╛ рдкреВрд░рдХ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред


рдЗрдВрдЯ, рдмреВрд▓, рдлреНрд▓реЛрдЯ рдЖрджрд┐ рдЬреИрд╕реЗ рдорд╛рдирдХ рдкреНрд░рдХрд╛рд░ рдкрд╛рд╕ рдХрд░рдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред рдкрд╛рдпрдерди рдЦреБрдж рдЗрд╕ рддрд░рд╣ рдХреЗ рдбреЗрдЯрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдЬрд▓реНрджреА рдХрд░реЗрдЧрд╛, рдФрд░ рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдХреЛ рднреА рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ C / C ++ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред


рд▓реЗрдХрд┐рди рдмрдбрд╝реЗ рдбреЗрдЯрд╛ рд╕рд░рдгрд┐рдпреЛрдВ рдХрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг, рдпрд╛ рдЗрд╕рд╕реЗ рднреА рдмреЗрд╣рддрд░ рджреЛ рдЖрдпрд╛рдореА рдбреЗрдЯрд╛ рд╕рд░рдгрд┐рдпреЛрдВ, рдпрд╛ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рджреЛ рдЖрдпрд╛рдореА рд╕рд░рдгрд┐рдпреЛрдВред


рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдЗрддрдирд╛ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдХрдИ рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЕрдЬрдЧрд░ рдЗрдВрдЯрд░рдкреНрд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдЕрдиреБрднрд╛рдЧреЛрдВ рдХреЛ рдХрд╛рдлреА рддреЗрдЬ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред


рдХрдЯ рдХреЗ рддрд╣рдд рджрд┐рдпрд╛ рдЧрдпрд╛ рдЙрджрд╛рд╣рд░рдг рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рд╕рднреА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред


рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рддреБрд░рдВрдд рджреЗрдВред


py_list2c_array.h


#ifndef _PY_LIST_2_C_ARRAY_H_ #define _PY_LIST_2_C_ARRAY_H_ #include <stdio.h> typedef struct { int value; wchar_t* name; } Item; extern "C" __declspec(dllexport) int sum_diagonal(Item** field, size_t size); #endif 

py_list2c_array.cpp


рдпрд╣рд╛рдБ рднреА рд╕рдм рдХреБрдЫ рдорд╛рдирдХ рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдореИрдВ wprint_ (*) тАЛтАЛрдХреА рддрд░рд╣ рдореБрджреНрд░рдг рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдиреЛрдЯ рдХрд░рддрд╛ рд╣реВрдВред


 // py_list2c_array.cpp:      DLL. // #include "stdafx.h" #include "py_list2c_array.h" extern "C" __declspec(dllexport) int sum_diagonal(Item** field, size_t size) { int result = 0; for(size_t i=0; i<size;++i) { for(size_t j=0; j<size; ++j) { if(i == j) { result += field[i][j].value; wprintf(L"%s\n", field[i][j].name); } } } return result; } 

py_list2c_array.py


рдФрд░ рдЕрдм рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рддред рдореИрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБрдУрдВ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рдкрд╛рдпрдерди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рджреВрдВрдЧрд╛ред


 import ctypes class PyItem: def __init__(self, value, name): self.value = value self.name = name class CItem(ctypes.Structure): _fields_ = [ ('value', ctypes.c_int), ('name', ctypes.c_wchar_p) ] def create_list(size): return [[PyItem(int(str(i+1)+str(j+1)), 'item{}{}'.format(i+1, j+1)) for j in range(size)] for i in range(size)] def py_list2c_array(py_list, size): rowType = CItem * size resultType = ctypes.POINTER(CItem) * size result = resultType() for i in range(size): row = rowType() for j in range(size): row[j] = CItem() row[j].value = py_list[i][j].value row[j].name = ctypes.c_wchar_p(py_list[i][j].name) result[i] = ctypes.cast(row, ctypes.POINTER(CItem)) return ctypes.cast(result, ctypes.POINTER(ctypes.POINTER(CItem))) if __name__ == '__main__': sLib = ctypes.cdll.LoadLibrary('./py_list2c_array.dll') size = 4 py_list = create_list(size) c_array = py_list2c_array(py_list, size) sLib.sum_diagonal.argtypes = [ctypes.POINTER(ctypes.POINTER(CItem)), ctypes.c_size_t] sLib.sum_diagonal.restype = ctypes.c_int result = sLib.sum_diagonal(c_array, ctypes.c_size_t(size)) print(': {}'.format(result)) 

рд╡рд┐рд╡рд░рдг


рдЖрдЗрдП ctypes рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреА рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕реВрдЪреА рдХреЛ py_list2c_array рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдкрд░ рдмрд╛рд░реАрдХреА рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗред


рд╕рд░рдгреА рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдЧреБрдгрд╛ рдХрд┐рдП рдЧрдП рддрддреНрд╡ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред


rowType = CItem * рдЖрдХрд╛рд░


рдПрдХ рд╕рд░рдгреА рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдмрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред


рдореИрдВ ctypes.POINTER () рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдиреАрдЪреЗ рдмрддрд╛ рджреВрдВрдЧрд╛ред рдкрд░рд┐рдгрд╛рдо = ctypes.POINTER (CItem) * рдЖрдХрд╛рд░


рдЗрд╕рдХреЗ рдмрд╛рдж, рдкрд░рд┐рдгрд╛рдореА рд╕рд░рдгреА рдмрдирд╛рдПрдБ .result = resultType ()


рдФрд░ рд▓реВрдк рдореЗрдВ рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХреЛ рдПрдХ рдЖрдпрд╛рдореА рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рддреЗ рд╣реИрдВ редrow = rowType ()


рдЗрд╕рдХреЗ рдмрд╛рдж, рдиреЗрд╕реНрдЯреЗрдб рд▓реВрдк рдореЗрдВ, рд╕рд░рдгреА рдХрд╛ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдмрдирд╛рдПрдВ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ python.row [j] = CItem () рдХреА рд╕реВрдЪреА рд╕реЗ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдорд╛рди рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВ


row [j] .value = py_list [i] [j] .value
рдкрдВрдХреНрддрд┐ [j] .name = ctypes.c_wchar_p (py_list [i] [j] .name)


рдлрд┐рд░ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рддреНрдпреЗрдХ рдмрдирд╛рдИ рдЧрдИ рд░реЗрдЦрд╛ рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреА рдПрдХ рд╕рд░рдгреА рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдкрд░рд┐рдгрд╛рдореА рд╕рд░рдгреА рдХреЗ рд╕реЗрд▓ рдХреЛ рд╕реМрдВрдкрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред


рдореИрдВ ctypes.cast () рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦреВрдВрдЧрд╛ .result [i] = ctypes.cast (рдкрдВрдХреНрддрд┐, ctypes.POINTER (CItem))
рдФрд░ рд╣рд╛рдВ, рдкреВрд░реЗ рд╡реНрдпреВрдЕрд░ рдХреЛ рдкреЙрдЗрдВрдЯрд░ рдореЗрдВ рдмрджрд▓реЗрдВред ctypes.cast (рдкрд░рд┐рдгрд╛рдо, ctypes.POINTER (ctypes.POINTER (CItem)))


ctypes.POINTER


Ctypes рдореЗрдВ ctypes.POINTER () рд╣реИ - рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╕реВрдЪрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: ctypes.POINTER (CItem) рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ CItem () рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╕реВрдЪрдХ рд╣реИред
рддрджрдиреБрд╕рд╛рд░, рд▓рд╛рдЗрди рдХреЗ рд╕рд╛рде: ctypes.POINTER (ctypes.POINTER (CItem)) рд╣рдо рд╕рдВрдХреЗрдд рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ CItem рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХ рд╣реИ, рдпрд╛ C ++ CItem ** A рдореЗрдВ ctypes.pointer () рд╣реИ ред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкреЙрдЗрдВрдЯрд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: рдЖрдЗрдЯрдо = CItem ()


рд╕реВрдЪрдХ = ctypes.pointer (рдЖрдЗрдЯрдо)


рдЙрдиреНрд╣реЗрдВ рднреНрд░рдорд┐рдд рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХрд╛ рдЕрд░реНрде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╣реИред


ctypes.cast ()


рдЕрдм рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рдлрд╝рдВрдХреНрд╢рди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ ctypes.cast ()ред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди C ++ рд╕реЗ рдХреБрдЫ рд╣рдж рддрдХ static_cast () рдХреЗ рд╕рдорд╛рди рд╣реИред


рдпрд╣ рдЖрдкрдХреЛ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд▓рд╛рдХрд╛рд░ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред


рд╕рд░рдгреА рдкреНрд░рдХрд╛рд░ рдмрдирд╛рддреЗ рд╕рдордп, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: rowType = CItem * 4


row = rowType ()


рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдкрдВрдХреНрддрд┐ CItem рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ 4 рддрддреНрд╡реЛрдВ рдХрд╛ рдПрдХ рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рд╣реИред


рдмреЗрд╢рдХ, рдЗрд╕ рд░реВрдк рдореЗрдВ, рд╣рдо рдЗрд╕ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдВрдЧреЗред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдЙрди рдкрд░ рдХрд╛рд╕реНрдЯ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ: array_pointer = ctypes.cast (рдкрдВрдХреНрддрд┐, ctypes.POINTER (CItem))


рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, array_pointer рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 4 CItem рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдПрдХ рд╕рдВрдХреЗрддрдХ рд╣реИред


рдкрд╣рд▓рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдПрд░реЗ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╡рд╣ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рджрд┐рдП рдЧрдП рдХреНрд╖реЗрддреНрд░ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдареАрдХ рд╣реИ, рдпрд╣ ctypes рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЗрдЯрд╛ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╕рдордп рдореБрдЦреНрдп рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рддрд╛ рд╣реИред


рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рдЖрдкрдХреЛ рдЕрдзрд┐рдХ рддреЗрдЬрд╝реА рд╕реЗ рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрджреНрднреБрдд ctypes рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред

Source: https://habr.com/ru/post/hi466575/


All Articles