C к Python через БОЛЬШОЙ ГЛОТОК: не может стать пустым ** параметры для содержания их значения

Попробуйте:

Array.prototype.findKey = function(key){

  let res = [];

  function traverseChildren(input, lookFor) {
    //By default, imagine what we are looking at is JSON...
    let children = Object.keys(input);
    //... however, if it is an array, just stick with that.
    if (Array.isArray(input)){
      children = input;
    }
    //Go through everything in the target
    for (i = 0; i < children.length; i++) {
      //Have we found the *key* we are looking for?
      if (children[i] === lookFor && Array.isArray(input)) {
        //If so, record the value.
        res.push(input[lookFor]);
      } else {
        //If not, keep searching.
        traverseChildren(input[children[i]]);
      }
    }
  }

  traverseChildren(this, key);
  return res;
}
8
задан Community 23 May 2017 в 12:13
поделиться

2 ответа

Я соглашаюсь с кассиром, необходимо использовать ctypes вместо этого. Это всегда легче, чем размышление о typemaps.

Но, если Вы - тупик при использовании большого глотка, что необходимо сделать, делают typemap для void** это ВОЗВРАЩАЕТСЯ недавно выделенный void*:

%typemap (in,numinputs=0) void** (void *temp)
{
    $1 = &temp;
}

%typemap (argout) void**
{
    PyObject *obj = PyCObject_FromVoidPtr(*$1);
    $result = PyTuple_Pack(2, $result, obj);
}

Затем Ваш Python похож:

import test
success, p = test.Operation()
theAnswer = 0.0f
if success:
   theAnswer = test.GetFieldValue(p)
   test.Cleanup(p)

Править:

Я ожидал бы, что большой глоток обработает простое значением void* аргумент корректно самостоятельно, но на всякий случай, вот является кодом большого глотка для обертывания void* для GetFieldValue () и очистка ():

%typemap (in) void*
{
    $1 = PyCObject_AsVoidPtr($input);
}
7
ответ дан 5 December 2019 в 15:26
поделиться

Вы были бы готовы использовать ctypes? Вот пример кода, который должен работать (хотя он не тестируется):

from ctypes import *

test = cdll("mydll")

test.Operation.restype = c_bool
test.Operation.argtypes = [POINTER(c_void_p)]

test.GetFieldValue.restype = c_float
test.GetFieldValue.argtypes = [c_void_p]

test.Cleanup.restype = None
test.Cleanup.argtypes = [c_void_p]

if __name__ == "__main__":
    p = c_void_p()
    if test.Operation(byref(p)):
        theAnswer = test.GetFieldValue(p)
        test.Cleanup(p)
4
ответ дан 5 December 2019 в 15:26
поделиться
Другие вопросы по тегам:

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