TypeError: невозможно получить доступ к упакованной функции с аргументом с двойным указателем - PullRequest
1 голос
/ 22 ноября 2011

Я очень новичок в Swig и получил странную ошибку TypeError, когда я получаю доступ к функции с двойным указателем в качестве аргумента.

Вот мои файлы:

Example.hpp

#ifndef _EXAMPLE_HPP
#define _EXAMPLE_HPP

class Example {
public:
    void test_cc(char * c0, char * c1);
    void test_cd(char * c0, double d0);
    void test_cdp(char * c0, double * d0);
};

#endif // _EXAMPLE_HPP

Example.cpp

#include "Example.hpp"

void Example::test_cc(char * c0, char * c1) {}
void Example::test_cd(char * c0, double d0) {}
void Example::test_cdp(char * c0, double * d0) {}

Example.i

%module Example
%{
#include "Example.hpp"
%}

#include "Example.hpp"

и, наконец, мой тестовый файл test_Example.py:

#!/usr/bin/env python

import Example

E = Example.Example()

E.test_cc("Hello","World");
E.test_cd("Hello",42);
E.test_cdp("Hello",42);

Когда я запускаю ./test_Example.py, я получаю сообщение об ошибке

Traceback (most recent call last):
  File "./test_Example.py", line 9, in <module>
    E.test_cdp("Hello",42);
  File "Example.py", line 77, in test_cdp
    def test_cdp(self, *args): return _Example.Example_test_cdp(self, *args)
TypeError: in method 'Example_test_cdp', argument 3 of type 'double *'

Доступ к функции test_cc работает, test_cd также ... почему бы не test_cdp?

Где моя ошибка?

1 Ответ

1 голос
/ 22 ноября 2011

Я думаю, что ваша проблема на самом деле в:

void test_cd(char * c0, double * d0);

и что ваш аргумент должен быть double, а не double*.

В отношении вашегоcomment

Ваш код:

E.test_cc("Hello","World");
E.test_cd("Hello",42);

Ваши прототипы:

void test_cc(char * c0, char * c1);
void test_cd(char * c0, double d0);

«Hello» и «World» - это строковые литералы, которые затухают при вводеconst char *.Итак, они указатели.Когда вы передаете c0 и c1 в test_cc, это нормально, потому что он ожидает указатель.

, в то время как c0 - указатель в test_cd, d0 - нет - d0 имеет тип double, НЕ указатель на удвоение.Таким образом, вместо этого вы должны передать указатель на двойное число.

Это можно сделать, создав двойное значение в стеке и передав его адрес:

double hi_mom = 83.2;
test_cd("some string" &hi_mom);

или объявивуказатель и указатель на переменную стека, передавая это в:

double hi_mom = 83.2;
double* ptr = &hi_mom;
test_cd("some string", ptr);

или объявляя указатель, указывающий на динамическую память, и передавая его в:

double* ptr = new double(83.2);
test_cd("some string", ptr);
delete ptr;

Хотя я быпо возможности избегайте 3-го.

Редактируйте снова ...

http://www.dalkescientific.com/writings/NBN/c_extensions.html

показывает рабочий пример того, как вызывать код Cот питона включая прохождение дубля.Ищите iterate_point в коде Python и C, чтобы увидеть, как он работает.У вас не должно быть указателя на двойное число, оно должно быть обычным двойным, как было сказано ранее.

...