2011-07-03 6 views
1

sqlite3_get_tableによって生成された結果配列を に渡して、別の関数で呼び出された関数に渡そうとしています。 は、配列をmain関数に戻すことができないことを除いて、すべて正常に動作しています。 char **sql_resultsと正確に置き換えられますか?ここでは、コードです:ANSI Cとsqlite3_get_table:結果配列を呼び出し関数に戻す方法は?

int main() 
{ 
    char **sql_results = 0; // help here 

    sql_select_table("GetAirports", query_string, AIRPORTS_DATABASE, 
      sql_results, &RecordCount, 
      &ColumnCount); 

    for (int i = 0; i < ColumnCount; i++) 
     printf("%s\n", sql_results[i]); // Generates "EXC_BAD_ACCESS" 

} 

void sql_select_table(const char *query_name, const char *sql_query, 
       const char *sql_database, 
       char **sql_results, int *RecordCount, 
       int *ColumnCount) 
{ 
    sqlite3_get_table(open_database, sql_query, 
       &sql_results, RecordCount, 
       ColumnCount, &error_msg); 

} 
+0

申し訳ありませんが、コードブロック内で太字の書式設定を行う方法はありません。私は何かを読みやすくするためにそれをすべて削除しました、私は太字の欠如が問題を理解しにくくしないことを願っています。 – sarnold

答えて

0

あなたはsql_select_tableのいずれかの引数のアドレスを取得しようとしている、それはあなたがそれがないと思う何をしませんが。 &sql_resultsはローカル変数のアドレスに過ぎません。sql_resultsmain()に変更することはできません。

代わりに、このようなsql_select_tablechar***を渡す:

/* Note that sql_results is now a char*** */ 
void sql_select_table(const char *query_name, const char *sql_query, 
       const char *sql_database, 
       char ***sql_results, int *RecordCount, 
       int *ColumnCount) 
{ 
    sqlite3_get_table(open_database, sql_query, 
       sql_results, RecordCount, 
       ColumnCount, &error_msg); 

} 

int main() 
{ 
    char **sql_results = 0; 

    /* Note the & on sql_results */ 
    sql_select_table("GetAirports", query_string, AIRPORTS_DATABASE, 
      &sql_results, &RecordCount, 
      &ColumnCount); 

    for (int i = 0; i < ColumnCount; i++) 
     printf("%s\n", sql_results[i]); // Generates "EXC_BAD_ACCESS" 

} 

も、sqlite3_get_tableは推奨されている:

これは、後方互換性のために維持され、従来のインターフェースです。このインターフェイスの使用は推奨されません。

だから、代わりにsqlite3_execを使い始めたいと思うかもしれません。

+0

MU、それは動作します!私は何時間も費やしてこれを手に入れました。私はsqlite3_execを使い始めましたが、私が開発していたコールバックルーチンはすべて、get_tableがすでに提供しているものを達成しようとしていたことがわかりました。たぶん私は彼の方が良くなると思いますが、廃止予定のバージョンを削除することはできますが、今のところはずっと簡単です。 – MonkeyBusiness