警告:格式'%s'期望的类型为'char *',但是参数2的类型为'char(*)[2000]'

时间:2020-07-03 17:23:33

标签: c linux unix parallel-processing openmp

所以我在Linux上使用C编写用于生活游戏的代码,但是我得到了这个警告!此警告是什么意思,我该如何解决?我写的代码是:

#include <stdio.h>
#include <string.h>
#include <omp.h>
#include <stdlib.h>
#include <assert.h>
#define MAX_N 2000
int plate[2][(MAX_N + 2) * (MAX_N + 2)];
int which = 0;
int n;
int live(int index){
   return (plate[which][index - n - 3] 
       + plate[which][index - n - 2]
       + plate[which][index - n - 1]
       + plate[which][index - 1]
       + plate[which][index + 1]
       + plate[which][index + n + 1]
       + plate[which][index + n + 2]
       + plate[which][index + n + 3]);
}
void iteration(){
#pragma omp parallel for schedule(static)
   for(int i = 1; i <= n; i++){
       for(int j = 1; j <= n; j++){
           int index = i * (n + 2) + j;
           int num = live(index);
           if(plate[which][index]){
               plate[!which][index] =  (num == 2 || num == 3) ?
                   1 : 0;
           }else{
               plate[!which][index] = (num == 3);
           }
       }
   }
   which = !which;
}
void print_plate(){
   for(int i = 1; i <= n; i++){
       for(int j = 1; j <= n; j++){
           printf("%d", plate[which][i * (n + 2) + j]);
       }
       printf("\n");
   }
   printf("\0");
}
int main(){
   int M;
   char line[MAX_N];
   memset(plate[0], 0, sizeof(int) * (n + 2) * (n + 2));
   memset(plate[1], 0, sizeof(int) * (n + 2) * (n + 2));
   if(scanf("%d %d", &n, &M) == 2){
       for(int i = 1; i <= n; i++){
           scanf("%s", &line);
           for(int j = 0; j < n; j++){
               plate[0][i * (n + 2) + j + 1] = line[j] - '0';
           }
       }
       for(int i = 0; i < M; i++){
           iteration();
       }
       print_plate();
   }
   return 0;
}

如果能帮助我解决问题,将不胜感激,因为我认为这应该可以正常工作。

2 个答案:

答案 0 :(得分:3)

你有这个:

scanf("%s", &line);

line的类型为char[2000](MAX_N)。通过使用它的地址运算符,您得到的是char(*)[2000]类型。摆脱&,您将输入char[2000],它会衰减到您需要的char*

答案 1 :(得分:0)

代码中有一些错误:

  1. 您正试图通过在line函数中进行寻址来扫描变量scanf()。如果您从此处删除与号&,则可以解决此问题。

    first answer of this question中已经提供了解释的答案。

  2. 使用以下语句:

    printf("\0"); // format contains a (null)
    

    完全没有意义。您正在尝试打印不存在的内容-空值。

  3. 编译指示:

    #pragma omp parallel for schedule(static)
    

    根据-Wunknown-pragmas标志将被忽略。