2012-03-21 19 views
1

私は、データベースの結果から整数またはブールこの方法を取得しようとしているしますCの基礎、のconst unsigned char型*が整数またはブール

bool tblexist = false; 
int t_exists = 0;  

tblexist = (bool)sqlite3_column_text(chkStmt, 1); 
t_exists = atoi(sqlite3_column_text(chkStmt, 1)); 

を...しかし、誰もが働きません。引数1を初期化

に 'のconst unsigned char型*' から無効な変換 'のconstのchar *'
:sqlite3_column_textから
期待値(chkStmt、1)は常に0または1 である。しかし、私はエラーメッセージが表示されます'int atoi(con​​st char *)'の
|| ===構築が完了しました:2個のエラー、0個の警告=== |

どのようにこれを解決し、エレガントな方法で整数またはブールを取得するには?

+0

変更されたタグはCからC++に変更され、 'bool'および' false'はC++固有のものです。 –

+0

@JoachimPileborg:どうやって 'atoi'を使うの? C++? :) –

+0

@Alsあまり「C++」ではなく、まだ使用することができます。 :) –

答えて

2

最初の行を、bool意志に変換しようとしています文字列ポインタがNULLでなければ常に "true"になるので、常にtrueを返します。あなたはこれを使用したい場合は、これを処理する方法がいくつかあります:秒

// 1. Dereference pointer to get first character in string 
tblexist = (*sqlite3_column_text(chkStmt, 1) != '0'); 

// 2. Using string comparison 
tblexist = (strcmp(sqlite3_column_text(chkStmt, 1), "0") != 0); 

は、代わりにこれを試してみてください。

t_exists = atoi((const char *) sqlite3_column_text(chkStmt, 1)); 

sqlite3_column_textはタイプconst unsigned char *を返しますがconst char *atoi望んでいるためです。

+0

最後に逆参照で取得します。ありがとうございました。 –

0

atoiまたはそれに類する変換は、使用するのに費用がかかります。クエリは、2つ(またはそれ以上)の列を要求しない限り、すべての

const unsigned char _TRUE = '1'; 
const unsigned char* dbDATA = sqlite3_column_text(chkStmt, 1); 
bool exists = (_TRUE == dbDATA[0]); //i assume you are expecting "0" or "1" from DB 
+0

データベースへのアクセスに比べてコストがかかりますか? –

+0

ここにsegfaultがあります。bool bool exists =(_TRUE == dbDATA [0]); –

0

まずは、列は、0から始まるインデックスが付けられ、sqlite3_column_text(..., 1)第二列を返します。

あなたはポインタの値を間接参照する必要がありますので、第二に、関数は、文字列へのポインタを返し、そこに文字列を変換:

const char *data = sqlite3_column_text(chkStmt, 0); 
int val = atoi (data); // for ascii representation of a number 
+0

はい、私は2番目の列から値が必要です。あなたの例の最初の行に 'const unsigned char *'から 'const char *'への変換が無効です。 –

関連する問題