0

armadillo c++ では、いくつかの API を使用し、Oracle occi を使用して値を Oracle テーブルに挿入しようとしましたが、次のようなエラーが発生しました:-

/home/oracle/Desktop/project/armadillo-4.450.4/include/armadillo_bits/typedef_elem.hpp:79: error:                 typedef arma::s32 arma::sword
/usr/include/oracle/11.1/client/ociap.h:10830: error: reference to ‘sword’ is ambiguous
/usr/include/oracle/11.1/client/oratypes.h:227: error: candidates are: typedef int sword

私のサンプルコードは次のとおりです。 - main.cpp

#include <stdio.h>
#include <iostream>
#include "db_manager.h"
#include <armadillo>
using namespace arma;
int glbsize;//this variable is global it is declared in global_variables.h
mat glbmtrx;//this variable is global it is declared in global_variables.h
void add()
{
    double deter;
    int ppp=0;
    mat z;
    mat x = randu<mat>(4,4);
    mat y = randu<mat>(4,4);
    z=x+y;
    mystruct strct;
    strct.mymatrix=z;//variable from comm.structure 
    glbmtrx=strct.mymatrix;//varible from glb.variables
    deter= det(z);  
    db_manager db;
    db.load_determinant(deter);
}
int main()
{
    add();
    return 0;
}

db_manager.cpp

#include "db_manager.h"
#include <sstream>
#include <iostream>
#include <sstream>
#include <fstream>
using namespace oracle::occi;
using namespace std;
Environment *env;
Connection  *con;
void db_manager::load_determinant(double det)
{      
    mystruct strct;
    strct.deter_size=det;//var from comm.structure
    string user = "user";
    string passwd = "p@$$word";
    string db = "localhost:1521/sisdba";
    env = Environment::createEnvironment((Environment::Mode)(Environment::OBJECT|Environment::THREADED_MUTEXED));
    con = env->createConnection(user, passwd, db);
    Statement *stmt = NULL;
    ResultSet *rs = NULL;
    string concat1="";
    concat1=static_cast<ostringstream*>(&(ostringstream()<<det))->str();
    string sql="insert into determinanit_table values('"+concat1+"')";
    stmt = con->createStatement(sql);
    stmt->executeUpdate(sql);
    env->terminateConnection (con);
    Environment::terminateEnvironment (env);
}

db_manager.h

#include "includes/global_variables.h"
#include <occi.h>
class db_manager
{
public:
    db_manager(void);
    ~db_manager(void);
            void load_determinant(double det);  
};

common_struct.h

#include <armadillo>
using namespace arma;
using namespace std;

struct mystruct
{
    mat mymatrix;
    double deter_size;
};

global_variable.h

#include "../includes/common_structures.h"
using namespace arma;
extern int glbsize;
extern mat glbmtrx;

メイクファイル:

excute:main.o db_manager.o
    g++ -o excute main.o db_manager.o \
    -I/home/oracle/Desktop/sum_result/armadillo-4.450.4/include -DARMA_USE_BLAS -DARMA_USE_LAPACK -DARMA_DONT_USE_WRAPPER -lblas -llapack \
    -I/usr/include/oracle/11.1/client \
    -L$(ORACLE_HOME)/lib -lclntsh -locci
%.o: %.cpp
    g++ -c -o $@ $< -ggdb \
    -I/home/oracle/Desktop/sum_result/armadillo-4.450.4/include -DARMA_USE_BLAS -DARMA_USE_LAPACK -DARMA_DONT_USE_WRAPPER -lblas -llapack \
    -I/usr/include/oracle/11.1/client \
    -L$(ORACLE_HOME)/lib -lclntsh -locci
clean:
    rm *.o excute
4

1 に答える 1

1

コードに関するいくつかのコメント:

  • グローバル変数 ( mat glbmtrx;in main.cpp) には注意してください。ライブラリ armadillo もグローバル変数を使用して動作する場合、すべてのグローバル変数の割り当て順序について保証はありません。のコンストラクタによって使用されるグローバル変数の前に変数glbmtrxが割り当てられるmatと、問題が発生します。本当に必要な場合は、Singleton Patternを使用することをお勧めします。
  • In :ヘッダー ファイルをcommon_struct.h呼び出さないでください。using名前空間間に競合を作成できます。あなたのアプリケーションと私のアプリケーションをマージしたいとします。アプリケーションで名前付きのクラスを使用すると、ファイルが原因で参照されるためvector、競合なしで呼び出すのは複雑になります。vectorstd::vector
  • 実際、名前空間の競合が原因で問題が発生している可能性があります。決して呼び出さず、呼び出すusing namespace stdクラス/関数に常に追加することをお勧めします。複数のライブラリを一緒に使用するときは、呼び出しを行わずusing namespace xxx、常にグローバル名を使用します。
于 2015-04-22T10:36:10.890 に答える