Я знаю, что вопросы этой формы были заданы раньше, но мне трудно найти тот, который подходит для моей ситуации.Недопустимый аргумент типа/несовместимый указатель типа C
Как кто-то пытается привыкнуть к C, у меня возникают проблемы с указателями, в частности с Строками. У меня есть небольшое количество ошибок, которые продолжают возникать, и я не могу окутать голову в то, что я продолжаю делать неправильно.
Я пишу программу, которая будет читать имя пользователя: пароль/значения, а затем сравнивать их с заданными значениями. Для этого я использую UserPass-структуру:
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 является реализацией связанного списка. Заголовок функции 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 принимает три параметра; указатель на список, указатель на указатель контекста и указатель на указатель данных. Насколько я могу судить, все должно быть таким, каким оно должно быть. Я могу только представить себе, что это проблема с тем, как работают строки (то есть массивы символов).
это выглядит как 'userpass' тип данных – tay10r
@TaylorFlores Да, это ЬурейеЕ для struct, показанный чуть выше кода в вопросе – simonc
Я просто не видел тип данных, использованный ранее, выглядит странно. Разве это не '' C++'? Edit: nevermind, подсветка синтаксиса меня сбила с толку. – tay10r