これは私がしばらく前に尋ねた質問の続きです。引数を返す関数の型マップを作成する
前の質問では、インターフェイス ファイルは次のとおりです。
%module test
%{
#include "header.h"
%}
%inline %{
%immutable;
struct FieldFetch {
int status;
int type;
char *value;
};
%mutable;
struct FieldFetch gaiaTextReaderFetchField(gaiaTextReaderPtr reader, int field_num) {
struct FieldFetch result;
result.status = gaiaTextReaderFetchField(reader, field_num, &result.type, &result.value);
return result;
}
%}
%ignore gaiaTextReaderFetchField;
%include "header.h"
次に、structs.h にある gaiaTextReaderPtr 構造体を解決する必要があります。この構造体は次のコードの一番下にありますが、全体像を示すためにその中に他の構造体も含めました。
SWIG opaque データ型が作成されている行に下線を引きました
/** Virtual Text driver: MAX number of fields */
#define VRTTXT_FIELDS_MAX 65535
/** Virtual Text driver: MAX block size (in bytes) */
#define VRTTXT_BLOCK_MAX 65535
/** Virtual Text driver: TEXT value */
#define VRTTXT_TEXT 1
/** Virtual Text driver: INTEGER value */
#define VRTTXT_INTEGER 2
/** Virtual Text driver: DOUBLE value */
#define VRTTXT_DOUBLE 3
/** Virtual Text driver: NULL value */
#define VRTTXT_NULL 4
/**
Container for Virtual Text record (line)
*/
struct vrttxt_line
{
/* a struct representing a full LINE (aka Record) */
/** current offset (parsing) */
off_t offset;
//__^________________________________________________________SWIGTYPE_p_off_t
/** line length (in bytes) */
int len;
/** array of field offsets (where each field starts) */
int field_offsets[VRTTXT_FIELDS_MAX];
//__^________________________________________________________SWIGTYPE_p_int
/** number of field into the record */
int num_fields;
/** validity flag */
int error;
};
/**
Container for Virtual Text record (line) offsets
*/
struct vrttxt_row
{
/* a struct storing Row offsets */
/** Line Number */
int line_no;
/** start offset */
off_t offset;
//__^________________________________________________________SWIGTYPE_p_off_t
/** record (line) length (in bytes) */
int len;
/** number of fields into this record */
int num_fields;
};
/**
Container for Virtual Text block of records
*/
struct vrttxt_row_block
{
/*
/ for efficiency sake, individual Row offsets
/ are grouped in reasonably sized blocks
*/
/** array of records [lines] */
struct vrttxt_row rows[VRTTXT_BLOCK_MAX];
/** number of records into the array */
int num_rows;
/** min Line Number */
int min_line_no;
/** max Line Number */
int max_line_no;
/** pointer to next item [linked list] */
struct vrttxt_row_block *next;
};
/**
Container for Virtual Text column (field) header
*/
struct vrttxt_column_header
{
/* a struct representing a Column (aka Field) header */
/** column name */
char *name;
/** data type: one of GAIA_NULL_VALUE, GAIA_INT_VALUE, GAIA_DOUBLE_VALUE, GAIA_TEXT_VALUE */
int type;
};
/**
Container for Virtual Text file handling
*/
typedef struct vrttxt_reader
{
/* the main TXT-Reader struct */
/** array of columns (fields) */
struct vrttxt_column_header columns[VRTTXT_FIELDS_MAX];
/** FILE handle */
FILE *text_file;
//__^________________________________________________________SWIGTYPE_p_FILE
/** handle to ICONV converter object */
void *toUtf8; /* the UTF-8 ICONV converter */
//__^________________________________________________________SWIGTYPE_p_void
/** field separator character */
char field_separator;
/** text separator character (quote) */
char text_separator;
/** decimal separator */
char decimal_separator;
/** TRUE if the first line contains column names */
int first_line_titles;
/** validity flag */
int error;
/** pointer to first block of records [linked list] */
struct vrttxt_row_block *first;
/** pointer to last block of records [linked list] */
struct vrttxt_row_block *last;
/** array of pointers to individual records [lines] */
struct vrttxt_row **rows;
//__^________________________________________________________SWIGTYPE_p_p_vrttxt_row
/** number of records */
int num_rows;
/** current Line Number */
int line_no;
/** max number of columns (fields) */
int max_fields;
/** current buffer size */
int current_buf_sz;
/** current buffer offset [parsing] */
int current_buf_off;
/** I/O buffer */
char *line_buffer;
/** current field buffer */
char *field_buffer;
/** array of field offsets [current record] */
int field_offsets[VRTTXT_FIELDS_MAX];
//__^________________________________________________________SWIGTYPE_p_int
/** array of field lengths [current record] */
int field_lens[VRTTXT_FIELDS_MAX];
//__^________________________________________________________SWIGTYPE_p_int
/** max field [current record] */
int max_current_field;
/** current record [line] ready for parsing */
int current_line_ready;
} gaiaTextReader;
/**
Typedef for Virtual Text file handling structure
\sa gaiaTextReader
*/
typedef gaiaTextReader *gaiaTextReaderPtr;
解決のためにどんな助けも大歓迎です!よろしくハンク
パート 2
1:開発担当者の 1 人が void toUtf8 について次のように述べています。
こんにちはハンク、
「void *」ポインターは、単に一般的な不透明なメモリポインターです。基本的にハンドルです。
特定のコンテキストでは、「void *toUtf8」は、ICONV が必要とする内部構造体を参照します。参照されるオブジェクトは、gaiaCreateUTF8Converter() への以前の呼び出しによって作成される必要があり、gaiaFreeUTF8Converter() を呼び出す前または後に破棄されることが期待されます。gaiaFreeUTF8Converter() を呼び出すたびに、このポインタを引数として渡す必要があります。
Java/SWIG の観点からすると、これは単純に、そのまま正確にやり取りされる定数値です。(このポインターを直接変更、アクセス、または逆参照しようとすると、簡単に災害 == システム クラッシュが発生する可能性があります)
さようならサンドロ
2: 他にもいくつかの構造体があります。これらはgg_structs.hの最後のもので、次の使用に問題があります。
/** COORDs mem-array */
double *Coords; /* X,Y [vertices] array */
今のところ、私はちょうど入れました:
%apply double[] {double *};
これで解決しましたが、これが正しいかどうかはわかりません。アレイを個別にターゲットにする必要がありますか? 実際、それが作成したクラスを見て、それが示しているのは間違っていると確信しています:
public void setCoords(double[] value) {
gg_structsJNI.gaiaLinestring_Coords_set(swigCPtr, this, value);
}
public double[] getCoords() {
return gg_structsJNI.gaiaLinestring_Coords_get(swigCPtr, this);
}
正しく機能するために、これには : int インデックスが必要ではありませんか? ダブルの場合、私はこれを行いました:
%ignore Coords;
%include "gg_structs.h"
%extend gaiaLinestring {
void setCoords(int index, double value) {
$self->Coords[index] = value;
}
double getCoords(int index) {
return $self->Coords + index;
}
}
3: AbstactSequentialList を実装するプロキシの提供について詳しく知りたいです。これは動的プロキシと呼ばれるものですか?