这是我的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?
输入值后并且不执行任何操作。 任何帮助将不胜感激!
答案 0 :(得分:5)
函数参数中的声明int **seats[]
为== int ***seats
,这意味着*seats[i]
的类型为int*
并且您正在为其分配一个数字,即不兼容的类型错误:
*seats[i] = 1;
^ ^ int
|
int*
incompatible types
addRes(&seats);
seats
在指针数组中,如果int*[50]
&seat
是数组指针且类型为{{1},则为&seat
is int*(*)[50]
其中函数参数类型为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)
来了解数组的长度。这是不对的!因为在addRes()
函数中seats
不是一个数组而是一个指针,所以它会给你地址的大小(但不是数组长度)。
是的,告知seats[]
函数中addRes()
的大小,发送一个名为length的额外参数,最后如下所示声明addRes()
(读取注释):
void addRes(int seats[], int length){
// access seat as
// seat[i] = 10;
// where i < length
}
从main()调用此函数,如下所示:
addRes(seats, 50);
// no need to use &
目前你还没有遇到的另一个问题,但是你很快就会遇到这样的问题,因为你将在函数addRes()
中运行scanf()需要额外的输入的代码。要解决此更改:scanf("%i\n", &s);
为scanf("%i", &s);
,不需要scanf()格式字符串中的额外\n
。
答案 1 :(得分: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.这个技巧对传递给函数的数组不起作用。您需要单独传递数组。
您可以通过以下方式修复它:
将地址的功能签名更改为:
void addRes(int seats[], int size)
在main中以下列方式之一传递大小:
直接:addRes(seats, 50);
间接地:addRes(seats, sizeof(seats)/sizeof(int));
请注意,以上只适用于 local 到此函数数组的范围,它不会对您作为函数的参数(或动态分配的数组)获取的数组起作用
另一个问题与scanf
有关,您应该放弃\n
。使用scanf("%i", &s);