2011-12-24 4 views
0

함수가있는 my_main.c, my_func.c, 선언이있는 my_func.h라는 파일이 3 개 있습니다. 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); 

에서 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; 
} 

에서

#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 파일에있는 함수의 사용자 이름과 암호. 그러나 주 모듈에서 선언 된 변수는 접근 가능하고 읽을 수있는 반면 가치는 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"; 

그리고 메인에서 액세스 할 수와 변경, 당신은 내용을 보여주기 위해 위와 같은 명령을 할 수 있습니다.

이렇게하는 것의 이점은 모든 정보가 함께 저장된다는 것입니다. 예를 들어, 여러 명의 사용자가있는 경우 로직의 작은 오류로 인해 암호와 이름이 섞이지 않을 것입니다. 또한 연결된 목록을 사용하면 목록에있는 항목 수 (예 : 목록을 탐색하여 항목 수를 계산할 수 있습니다)를 nodes 목록에 포함 할 수 있습니다.

이 정보가 유용하게 활용되기를 바랍니다. 변수의 중복 정의를 피하기 위해 건배

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

+0

OP 질문은 링크 된 목록과 관련이 없습니다 ... 간단한 포인터 - 투 - 포인터 혼란입니다. 이 답변은 현재 솔루션이 작동하지 않는 이유에 대해 영업 이익을 계몽하지 않습니다 ... 영업 담당자가 직면하고 있지 않더라도 (복잡성 및 유지 관리 가능성) 답변자가 알지 못하는 문제에 대한 대안 "솔루션"을 제공합니다. . – Steve

+0

초기 문제 해결에 대한 좋은 답변을 이미 보았으므로 OP가 실험에 흥미가 있었고 다른 방법을 시도하는 경우를 대비하여 대체 솔루션을 게시했습니다. 개인적으로, 나는 그런 경험을 배우는 것을 즐긴다. 그래서 그들의 목적을 해결하는 다른 관점을 도입하고 있었다. – gkiar

+0

iKiair 매우 흥미롭고 유용한 대안을 주셔서 감사합니다. 나는 이것을위한 약간의 시간을 확실히 보낼 것이다! –

0

, 당신은 소스 파일에 변수를 정의하고 다른 번역 단위 변수에 대해 알 수 있도록 헤더에 extern 키워드를 사용해야합니다.

편집 : 당신은 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**, 즉 : my_main (&mysql_user_name&mysql_password)에서 함수를 호출 할 때

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

그런 다음 mysql_user_namemysql_password의 주소를 전달합니다.

이러한 문자열 리터럴은 읽기 전용이며 sql_user으로 전달되는 두 포인터는 모두 "root""1234" 문자열을 가리키고 있음을 유의하십시오.

+0

그는 동일한 변수에 대해 중복 정의가 어디에 있습니까? 그 비트가 아니라면 포인터에 포인터를 사용해야하는 이유에 대한 더 나은 설명이기 때문에 +1 할 것입니다. – Steve

+0

@Steve :'char * mysql_user_name; '과'char * mysql_password;'*를 사용하면 여러 소스에 포함되어있을 때 링크 할 때 중복 심볼 오류가 발생할 수 있습니다. 나는 그것이 가치가 있다고 생각했기 때문에 그 부분을 추가했다. 편집 : Woops 내가 지금 볼, 그들은 단지 선언 및 헤더에 정의되지 않았습니다. 나는 아직도 그것이 미래를 주목할 가치가 있다고 생각한다. 어쨌든 나는 그에게 문제가 있다고 말하지 않았다. 만약 그가 여러 가지 정의를했다면 문제가 생길 것이다. – AusCBloke

+0

그가 할 수있는 모든 가능한 실수를 비판한다면 헤더 가드에 대해 뭔가 추가해야 할 것입니다. – Steve