1

C ++内から外部Cライブラリ(libsvm)を使用しています。を使用してクラスヘッダーファイルにヘッダーファイルを挿入します

extern "C"{
#include "svm.h"
}

このライブラリには、svm_modelという構造体が含まれています。また、いくつかの入力パラメーターを指定すると、struct svm_modelに(malloc)スペースを割り当て、それへのポインターを返す関数も含まれています。機能は

svm_model *svm_train(input_parameters)

私のコード(C ++)では、クラスにstructsvm_modelポインターである変数を作成します。私のヘッダーファイルでは

class myClass
{
public:
  int do_something();
private:
  struct svm_model *m_data;
}

「do_something()」内で、次の方法でsvm_trainを正常に呼び出しました。

struct svm_model *test = svm_train(input_parameters);

しかし、結果をm_dataに書き込みたいときはいつでも、segmentation_faultが発生します。これは

m_data = svm_train(input_parameters);

しかし、私がそうする場合にも起こります

struct svm_model *test = svm_train(input_parameters);
m_data = test;

実は、そうしても気づきました

printf("hello: %p\n", m_data);

また、クラッシュします。したがって、クラス内の構造体(他の場所で定義されている)へのポインターの使用には問題があると思われますが、どこにもヒントは見つかりませんでした。クラスコンストラクターでNULLに初期化しようとしましたが、何も変更されません。

どんな助けでも大歓迎です。

4

3 に答える 3

6

単にクラッシュした場合

  printf ("hello: %p\n", (void*)m_data);

その後、おそらく問題は他の場所と以前にあります。printfその関数を呼び出すthisと無効(おそらくNULL?)であるか、メモリヒープの状態が非常に悪いように見えます。

Linuxでは、g++ -Wall -g最近のコンパイラでコンパイルすることをお勧めします(GCC 4.8がリリースされたばかりです)。警告が表示されなくなるまでコードを改善します。次にgdbvalgrindを使用してさらにデバッグします。

libsvmまた、デバッグ情報とすべての警告を使用してコンパイルすることもできます(または、単にそのパッケージのデバッグバリアントを使用します)。

于 2013-03-24T16:25:47.533 に答える
1

ファイルsvm.hにはすでに

extern "C" {

宣言。したがって、代わりに:

extern "C"{
#include "svm.h"
}

単に行う:

#include "svm.h"

また、構造体キーワードを何度も繰り返す必要はありません。したがって、代わりに:

struct svm_model *m_data;

行う:

svm_model *m_data;
于 2013-03-24T16:34:59.090 に答える
0

さて、ちょうど問題を見つけました、そしてそれは確かに報告された以外の場所にありました。何が起こったのかというと、明示的に作成していなくても、myClassのSTLベクトルを作成し、そのようなベクトルの最初の要素のメソッドにアクセスしていました。

std::vector<myClass> dummy;
dummy[0].do_something();

すべてが適切にコンパイルされていることを考えると、コードのこの部分で問題が発生する可能性があるとは思いませんでした。

助けてくれてありがとう。

于 2013-03-24T17:39:26.383 に答える