为什么编译器为参数2显示[Error]不兼容的类型

时间:2017-03-01 01:15:01

标签: c

最初,我想创建一个用户输入用户名和密码的程序。程序检查两者是否在编码结构内。如果输入正确,程序将显示一定数量。

但是我已经省略了剩下的代码,因为我总是在isValid上得到错误。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct accounts{
    char unList[50];
    int pinList;
    float amtList;

}account;


int isValid(char inputUN[], struct accounts);




int main(int argc, char *argv[]) {


    account newAccs[10];
    char unList[][32] = {"franklin", "woods", "phillips", "gomez", "burns", "porter", "griffin", "spencer", "hanson", "johnson"};

    char inputUN[32];
    int index;

    printf("Enter Username: ");
    scanf("%s", &inputUN);
    printf("Enter PIN: ");
    scanf("%d", &inputPin);


    index = isValid(inputUN, newAccs);
    printf("%d", index);

return 0;
}


int isValid(char inputUN[], struct accounts acount){

    int index;

    for(index = 0; index < 32; index++){
        if (strcmp(inputUN, acount.unList) == 0){
            index = index;
        }
    }
return index;
}

注意:我不需要原始程序的代码。我只是想知道为什么我总是会收到错误:&#39; isValid&#39;的argument2的类型不兼容。 我也缩短了我的代码,仅用于我的目的。

2 个答案:

答案 0 :(得分:3)

newAccs是这些结构的数组,它会在将第一个元素传递给函数时衰减为指向第一个元素的指针。

因此,如果您想使用指针,则需要您的函数接受account *。如果您需要单个帐户元素,则需要传递一个,例如使用newAccs[4]

您选择哪一个取决于您的意图(由于它不是基于您当前的isValid功能,现在有点难以辨别您想要去哪种方式尽管存在for循环,但使用任何数组索引。

举例来说,这是一个功能(我认为可能是你所追求的,基于所提供的信息),它贯穿整个帐户集并检查用户名是否存在在其中一个条目中。它将返回该条目的索引,如果未找到则返回-1:

int findUN (char *userName, account *accountList, int accountSz) {
    int idx;
    for (idx = 0; idx < accountSz; idx++)
        if (strcmp (userName, accountList[idx].unList) == 0)
            return idx;
    return -1;
}

然后用类似的东西来调用它:

int idx = findUN (inputUN, newAccs, sizeof(newAccs) / sizeof(*newAccs));

你会注意到我已经完成了两个的事情。第一种是接受指针到一个帐户结构(指向数组中十个中第一个的指针)。

第二种是传递该数组的大小,基本上是整个数组的字节大小除以该数组中一个元素的字节大小。

那是因为数组衰减成指针不会让你以后提取数组大小。为此,您需要单独传递它。

答案 1 :(得分:0)

方法isValid期望accounts的单个实例作为第二个参数,但是在调用方法时您将数组传递给它。

因此,您需要将方法签名更改为

int isValid(char inputUN[], struct accounts *);

或在将方法调用为

时从数组中传递accounts的单个实例
isValid(inputUN, newAccs[someindex]);