2013-06-10 5 views
0

이 양식에 대한 질문은 이전에 요청되었지만 본인의 상황에 맞는 것을 찾는 데 어려움이 있습니다.잘못된 형식 인수/호환되지 않는 포인터 유형 C

C에 익숙해지기 위해 포인터와 관련된 문제, 특히 문자열 문제가 있습니다. 나는 계속 오류를 일으키지 않으며, 내가 계속 잘못하고있는 것에 대해 머리를 감쌀 수 없다.

사용자 이름 : 암호 키/값을 읽고 주어진 값과 비교할 프로그램을 작성 중입니다.

typedef struct { 
char user[BUF_MAX]; 
char pass[BUF_MAX]; 
} userpass; 

다음 코드 :

char *authThread(char *filename, char *request){ 

List_t logins; 
char user[BUF_MAX]; 
char pass[BUF_MAX]; 
char *saveptr = NULL; 
char *listptr = NULL; 

char *username = strtok_r(request, ":", &saveptr); 
char *password = strtok_r(NULL, ":", &saveptr); 

char *failCode = malloc(sizeof (char)*BUF_MAX); 
sprintf(failCode, "0:%s:0", username); 

char *successCode = malloc(sizeof (char)*BUF_MAX); 
sprintf(successCode, "1:%s:%s", username, ticketSecret); 

if (List_init(&logins)){ 

    //Retrieve all the user:pass pairs from the auth file 
    FILE *fp = fopen(filename, "r"); 
    while(fscanf(fp, "%s:%s", user, pass) != EOF){ 
    userpass new; 
    //PROBLEM LINES BELOW+++++++++++++++++++++++++++++++++ 
    strcpy(new->user, user); 
    strcpy(new->pass, pass); 
    List_add_tail(&logins, &new); 
    }//while 
    fclose(fp); 

    //See if the username/pass combination provided exists in the auth file 
    for (;;){ 
    userpass *next = NULL; 
    //PROBLEM LINE BELOW+++++++++++++++++++++++++++++++++ 
    List_next_node(&logins, &listptr, &next); 
    if (next == NULL) break; 

    //Match found, return required auth string 
    if (strcmp(next->user, username) == 0 && strcmp(next->pass, password) == 0){ 
     return successCode; 
    }//if 
    }//for 

    return failCode; 

}//if 
else{ 
    printf("Error creating auth list\n"); 
}//else 

}//authThread 

List_t는 링크리스트의 구현입니다, 나는이 userpass 구조체를 사용합니다. List_next_node 함수의 헤더는 다음과 같습니다.

int List_next_node (List_t *list, void **context, void **data); 

위의 오류가 발생한 두 줄에 레이블을 붙였습니다. 컴파일을 시도 할 때 두 가지 오류가 발생합니다. 처음 두 줄에는 invalid type argument of â->â이 있습니다. 나는이 문제를 모두 변수가 올바른 유형 없다는 의해 발생하는 것을 볼 수 있습니다 passing argument 2(3) of âList_next_nodeâ from incompatible pointer type

,하지만 난 그게 가능 볼 수 없습니다 :

한 두 번째 줄, 내가 얻을. 첫 번째 경우 new->user은 문자 배열이어야하며 user이어야합니다.

두 번째 경우에 List_next_node는 세 개의 매개 변수를 허용합니다. 리스트에 대한 포인터, 컨텍스트 포인터에 대한 포인터, 및 데이터 포인터에 대한 포인터를 포함한다. 내가 말할 수있는 한 모든 것이 그것이 있어야하는 유형입니다. 문자열 (char 배열)이 C에서 어떻게 작동하는지에 대해서만 상상할 수 있습니다.

답변

1

new이 스택에서 로컬로 선언됩니다. 당신은 (나는 당신의 질문에 그것을 볼 수 없습니다) List_add_tail의 구현에 따라

userpass new; 
strcpy(new.user, user); 
strcpy(new.pass, pass); 

userpass new; 
strcpy(new->user, user); 
strcpy(new->pass, pass); 

을 변경해야합니다 있도록 포인터 아니라,이 유일한 문제가되지 않을 수 있습니다 . newList_add_tail 뒤에 범위를 벗어나면 목록에 항목을 추가하지 않으면 목록에 다시 사용할 수있는 메모리가있는 포인터가 남아있게됩니다. 두 번째 인수에 userpass*의 복사본을 생성하지 않는 List_add_tail 경우

, 당신은

userpass* new = malloc(sizeof(*new)); 
strcpy(new->user, user); 
strcpy(new->pass, pass); 
List_add_tail(&logins, &new); 

(이 마지막 예제에서 주처럼 뭔가 코드를 변경해야 new 포인터는 우리가 그래서입니다 다시 회원에 액세스하려면 참조 연산자를 ->를 사용합니다.)

+0

을 기대하고, 마찬가지로

List_next_node(&logins, (void **) &listptr, (void **) &next); 

을'userpass'는 – tay10r

+0

@TaylorFlores 예, 그것은을위한 타입 정의의 데이터 형입니다 구조체, 질문에있는 코드 바로 위에 표시되었습니다. – simonc

+0

이전에 그런 식으로 사용 된 데이터 유형을 보지 못했습니다. 이상하게 보입니다. 이건'C++ '가 아닌가? 편집 : 고민, 구문 강조 나를 혼란 스러웠다. – tay10r

1

오류 1

당신은 01 변수를 정의을 userpass 구조로 사용하지만 포인터와 같은 내부 특성에 액세스합니다.그들은 범위 밖으로 이동하지 않도록 당신은 동적으로 userpass 구조를 할당해야

strcpy(new.user, user); 
strcpy(new.pass, pass); 

:

userpass new; 
... 
strcpy(new->user, user); // new->user is equivalent to (*new).user 
strcpy(new->pass, pass); 

는 대신, . 연산자를 사용합니다.

오류 2 유형 char **의 아직 기능이 void **를 기대하고있다

귀하의 인수 &listptr (그것은 경고입니다). 당신은 경고를 제거하기 위해 인수를 캐스팅 할 수 &nextuserpass **이며이 void **이 보이는

+0

답변 해 주셔서 감사합니다! 이것은 simonc이하지 않는 무언가를 다룹니다 ** -하지만 불행히도 나는 단지 하나의 응답만을 받아 들일 수 있습니다. 아마도 그들은 함께 편집되어야합니다. – JMcMinn

관련 문제