麻烦的数组和指针的功能在c

时间:2015-12-24 07:35:42

标签: c arrays function pointers

我正在尝试将指向数组的指针传递给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;  
}

以下是错误: errors

为什么我得到这个,我该怎么做?

3 个答案:

答案 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)

这里要提两件事......

  1. 您需要预先声明您的功能。如果没有前向声明,您的编译器将无法知道函数原型,并且根据最新的C11标准,函数的隐式声明不再是标准C的一部分。

  2. 您将page作为int *传递,因此稍后您无法执行page[i][j],因为page[i]会为您提供int,反正。

  3. 也就是说,在您的main()page类型为int [22][18],因此您可能无法将其传递给简单的int *,您将需要函数参数是匹配类型,类似(int Innerpage[][18])或类似的东西。