4

这是我的main功能:

main(){

    int *seats[50] = {0};
    char x;

    do{
        printf("A-Add Reservation\tC-Cancel Reservation\n");
        scanf("%c", &x); 
    } while(x != 'a' && x != 'c');

    switch(x){
    case 'a':
        addRes(&seats); 
        break;
    default: 
        break;
    }
}

我正在尝试传递seats[]addRes()函数,以便我可以在addRes(). 这是功能:

void addRes(int **seats[]){
    int s, i, scount=0, j=0, k=0, yourseats[]={0};
    printf("How many seats do you require? ");
    scanf("%i\n", &s);
    for(i=0;i<=sizeof(*seats);i++){
        if(*seats[i] == 0)
            scount++;
    }
    if(scount >= s){
        for(i=0;i<=s;){
            if(*seats[i] == 0){
                yourseats[j]=i;
                *seats[i]=1;                
                i++; j++;
            }
            else i++;
        }
        printf("Your seat numbers are: \n");
        while(k < j){
            printf("%i\n", yourseats[k]); 
            k++;
        }   
    }
    else {
        printf("Sorry, there are not enough seats available.\n");
    }
}

它与警告一起编译:

Line 15 (*seats[i]=1;) Assignment makes pointer from integer without a cast.  
Line 53: (addRes(&seats);) Passing argument 1 of 'addRes' from incompatible pointer       type.
Line 3: (void addRes(int ** seats[]){) Expected 'int ***' but argument is of type  'int *(*)[50]'.

在运行程序时它得到

How many seats do you require?  

输入值后什么也不做。任何帮助将非常感激!

4

2 回答 2

5

函数参数中的声明int **seats[]是 == int ***seats,这意味着*seats[i]is的类型int*并且您正在为其分配一个数字,这是不兼容的类型错误:

*seats[i] = 1; 
  ^         ^ int  
  |        
    int* 

incompatible types 

下一个 addRes(&seats);

seats指针数组中,如果int*[50]该指针&seat数组指针并且类型&seatint*(*)[50]Where 函数参数类型为int ***,则其类型再次出现类型不兼容错误。
请注意,您还会从编译器收到一条合理的错误消息:Expected 'int ***' but argument is of type 'int * (*)[50]'.

建议:

正如我在你的代码中看到的那样,你没有seats[i]在你的函数中分配内存addRes(),所以据我所知,你不需要将seat[]数组声明为指针数组,但你需要简单的 int 数组。

更改 main() 中的声明:

int *seats[50] = {0};

应该只是:

int seats[50] = {0};
 // removed * before seats

接下来只需将seats[] 数组的名称传递给addRes()函数声明应该在的函数

addRes(int* seats)

or  addRes(int seats[]) 

它使您的工作在功能上非常简单,addRes()您可以访问其元素seats[i](并且无需使用额外的*运算符)。

数组长度:

sizeof(*seats)用于了解数组长度的代码中的另一个概念性问题。这是错的!因为 inaddRes()函数seats不是一个数组而是一个指针,所以它会给你地址的大小(但不是数组长度)。是的,
通知函数的大小发送一个称为长度的额外参数,所以最后声明如下(阅读注释): seats[]addRes()addRes()

void addRes(int seats[], int length){
     // access seat as 
     //  seat[i] = 10;
     // where i < length 
}

从 main() 调用此函数,如下所示:

addRes(seats, 50);
  // no need to use &

还有一个问题,目前您还没有遇到,但您将在运行您的代码时遇到 scanf() 需要额外enter的功能addRes()。要解决它,请更改:scanf("%i\n", &s);因为在 scanf() 中scanf("%i", &s);不需要额外\n的格式字符串。

于 2013-07-21T12:33:54.123 回答
4
int *seats[50] = {0};

这是一个整数指针数组,您所需要的只是一个实际数组,因此将*结果放入int seats[50] = {0};.

此外,您对数组的函数签名是错误的,void addRes(int seats[])会很好。

最后,要将数组传递给该新签名,您可以直接传递数组而无需任何一元地址运算符(当作为参数传递给函数时,数组将衰减为指针):

addRes(seats);

同样正如所指出的,在分配给数组元素时,您需要删除*

seats[i]=1;

绰绰有余。与if数组元素进行比较的语句等也是如此。

关于你的addRes功能:

for(i=0;i<=sizeof(*seats);i++)

您只能通过这种方式获得指针的大小,在 32 位机器上为 4。此技巧不适用于传递给函数的数组。您将需要单独传递数组。

您可以通过以下方式修复它:

  1. 将地址的函数签名更改为:

    • void addRes(int seats[], int size)
  2. 在 main 中通过以下方式之一传递大小:

    • 直接地: addRes(seats, 50);

    • 间接:addRes(seats, sizeof(seats)/sizeof(int));

请注意,上述内容仅适用于此函数数组范围的本地,它不适用于您作为函数参数获得的数组(或动态分配的数组)。

另一个问题是与scanf,你应该放弃\n。利用scanf("%i", &s);

于 2013-07-21T12:34:12.700 回答