2011-12-24 11 views
0

私は3つのファイルmy_main.c、my_func.cと関数とmy_func.hの宣言を持っています。 my_mainでCの基本、文字列またはポインタの転送

:このコードprogemで

my_func.h

#include <my_global.h> 
#include <mysql.h> 
#include <string.h> 

char* mysql_user_name; 
char* mysql_password; 

int sql_user(char* mysql_user_name, char* mysql_password); 
int sql_table_length(char* database, char* dtable, char* mysql_user_name, char* mysql_password); 

#include "my_func.h" 

char* database = "mydatabase"; 
char* dtable = "mytable"; 

sql_user(mysql_user_name, mysql_password); 
sql_table_length(database, dtable, mysql_user_name, mysql_password); 
my_func.cで

#include "my_func.h" 

int sql_user(char* mysql_user_name, char* mysql_password) 
{ 
    mysql_user_name = "root"; 
    mysql_password = "1234"; 
    return 0; 
} 

がエラーなしでコンパイルし、私が取得したいですmy_func.cファイル内の関数からのユーザー名とパスワード しかし、メインモジュールで宣言された変数は到達可能であり、読み込み可能ですが、値は0x0になります。 この設定でメインでユーザー名とパスワードを取得するにはどうすればよいですか?

+1

mysql_user_nameの定義が複数あるのでリンクしないでください... –

+1

Kerrek、これは#ifndefの中にありますが、私はここでコードを短くしました...とにかく助けてくれてありがとう。 –

答えて

7

変更sql_user()に:

int sql_user(char** mysql_user_name, char** mysql_password) 
{ 
    *mysql_user_name = "root"; 
    *mysql_password = "1234"; 
    return 0; 
} 

そして、それを呼び出す:

sql_user(&mysql_user_name, &mysql_password); 
+0

うわー、ありがとう。チャームのような作品! –

1

を第一に、私はそうのようなユーザー情報のためstructリンクリストを作成し提案することがあります。

typedef struct my_users{ 
    char *mysql_user_name; 
    char *mysql_password; 
    USER *next; // points to the next user in your list if you have more than one, otherwise point to NULL 
} USER; 

そしてそれを(情報を変更するために)呼び出すとき、あなたはそれint sql_user(USER *user);としての機能に、コール

user->mysql_user_name = "root"; 
user->mysql_password = "1234"; 

でそれを変更し、メインからアクセスするには、内容を表示するために、上記と同じコマンドを行うことができます。

このようにすると、すべての情報が一緒に保存されるという利点があります。たとえば、複数のユーザーがいる場合、パスワードと名前はロジックの小さなエラーによって混同されることはありません。また、リンクされたリストを使用すると、リスト内をどれくらいの数だけ覚えているかを知ることができます。

この情報が役に立ちましたら幸いです。変数の重複定義を回避するために乾杯

This should show you more about linked lists if you're interested.

+0

OPの質問はリンクされたリストとは関係ありません。単純なポインタ間の混乱です。この答えは、現在のソリューションがうまくいかない理由についてOPを啓発するものではありません...回答者が直面しているかどうかわからない問題(複雑性と保守性)に代わる "ソリューション" 。 – Steve

+0

すでに初期の問題を解決して良い答えが掲載されているのを見て、私はOPが実験や別の方法を試したいと思った場合に備えて代替ソリューションを投稿しました。個人的に、私はそのような経験を学ぶのを楽しむので、彼らの目的を解決するために別の視点を導入していました。 – gkiar

+0

iKiairは非常に興味深く、使用可能な選択肢をありがとう。私は確かにこれのためにいくつかの時間を過ごすでしょう! –

0

、あなたはソースファイルであなたの変数を定義し、他の翻訳単位は、変数について知っているように、ヘッダにexternキーワードを使用する必要があります。

EDIT:mysql_user_namemysql_passwordは、単にそれはいつもの練習なので、私はただ単にそれを指摘したかった、ヘッダファイルで宣言されているので、あなたは変数を定義しなかった場合は、上記の問題を持っていませんリンカエラーが発生します。

また、sql_user()は、あなたがそれをやりたいと思っているものをやっていません。

int sql_user(char* mysql_user_name, char* mysql_password) 
{ 
    mysql_user_name = "root"; 
    mysql_password = "1234"; 
    return 0; 
} 
ローカル変数を mysql_user_name引き起こして

mysql_password"root""1234"を指すように。あなたはsql_userに渡されたポインタを変更したい場合は、char**、すなわちを使用します。

int sql_user(char** mysql_user_name, char** mysql_password) 
{ 
    *mysql_user_name = "root"; 
    *mysql_password = "1234"; 
    return 0; 
} 

my_main&mysql_user_name&mysql_password)から関数を呼び出すときにmysql_user_namemysql_passwordのアドレスを渡します。

これらの文字列リテラルは読み取り専用であり、sql_userに渡される2つのポインタはすべて同じ"root""1234"文字列を指していることにも注意してください。

+0

彼はどこで同じ変数の重複定義をしていますか?そのビットではない場合は、私はポインターへのポインターを使用する必要がある理由のより良い説明だから+1します。 – Steve

+0

@Steve: 'char * mysql_user_name;'と 'char * mysql_password;' *を持つと、複数のソースに含まれている場合、リンク時に重複シンボルエラーが発生する可能性があります。私はそれが注目に値すると思ったので、その部分を追加しました。編集:私は今見て、彼らはちょうど宣言され、そのヘッダーで定義されていません。私はまだそれが将来のために注目に値すると思います。とにかく、私は彼がその問題を抱えているとは言わなかった。もし彼が複数の定義をしていれば、それは問題を引き起こすだろう。 – AusCBloke

+0

彼が*できた可能性のあるすべての誤解を批判するなら、おそらくヘッダーガードについて何かを追加する必要があるでしょう。 – Steve

関連する問題