我正在尝试将指向数组的指针传递给2个函数,并且我遇到了一堆错误。 这是我的代码的一部分:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
struct tetromino {
int color;
int location[4][2];
};
int main()
{
int page[22][18]={0};
struct tetromino block[7][4];
block[1][0].color=13;
block[1][0].location[0][0]=9;
block[1][0].location[0][1]=-2;
block[1][0].location[1][0]=9;
block[1][0].location[1][1]=-1;
block[1][0].location[2][0]=8;
block[1][0].location[2][1]=0;
block[1][0].location[3][0]=9;
block[1][0].location[3][1]=0;
tet_effect(page,block[1][0]);
print(page);
}
void tet_effect(int *page,struct tetromino block)
{
int i;
for(i=0;i<4;i++)
{
page[block.location[i][0]][block.location[i][1]]=block.color;
}
return;
}
void print(int *page)
{
int i,j;
system("cls");
for (i=0;i<22;i++)
{
printf("|");
for (j=0;j<18;j++)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),page[i][j]);
printf("#");
}
printf("|\n");
}
printf("|");
for (j=0;j<18;j++)
{
printf("-");
}
printf("|");
return;
}
为什么我得到这个,我该怎么做?
答案 0 :(得分:2)
首先,您需要在调用它们之前提供每个函数的原型。
然后您需要将参数int *page
更改为int (*page)[18]
,因为当page
中的main
传递给这些函数时,它将转换为指向数组的第一个元素的指针page
。
由于array
的类型为数组,因此其第一个元素是数组。因此,array
将转换为指向数组类型的指针,即int (*)[18]
。
原型应该是
void tet_effect(int (*page)[18], struct tetromino block);
void print(int (*page)[18]);
答案 1 :(得分:1)
请注意,在您的环境中,您使用的是Microsoft编译器之一,类似于C89实现。
在回答您的问题时,我会参考您共享照片的警告和错误中提到的行号,而不是您共享的代码的行号。 (他们是不同的。)
第一次警告(橙色):
在第27行声明并定义 tet_effect 时,您可以定义其类型。但事实上它也出现在之前那个定义(第22行)意味着它已经被认为已被声明具有类型 int()。 (一个函数采用未指定数量的参数并返回 int 值。)
第一个错误(红色):
在第32行,你有:
page[block.location[i][0]][block.location[i][1]]=block.color;
页面的类型为 int * ,如第27行所示。因此,页面的类型[ 任何< / em> ] 是 int 。 int 不是数组也不是指针,因此后续的 [block.location [i] [1]] 无效。
第二次警告(橙色):
这与早期警告的错误相同。您尝试在第36行声明并定义 print ,但是您通过调用它意外地在第23行声明它的类型为 int()。
第二个错误(红色):
这与早期错误的错误相同。 页面的类型为 int * ,因此 page [i] 的类型为 int ,然后是 [j] 是错误,因为 int 不是数组。
答案 2 :(得分:0)
这里要提两件事......
您需要预先声明您的功能。如果没有前向声明,您的编译器将无法知道函数原型,并且根据最新的C11
标准,函数的隐式声明不再是标准C的一部分。
您将page
作为int *
传递,因此稍后您无法执行page[i][j]
,因为page[i]
会为您提供int
,反正。
也就是说,在您的main()
,page
类型为int [22][18]
,因此您可能无法将其传递给简单的int *
,您将需要函数参数是匹配类型,类似(int Innerpage[][18])
或类似的东西。