несовместим с параметром типа "int *" - PullRequest
1 голос
/ 21 января 2012

Это моя последняя версия для gameoflife. У меня есть эта ошибка, которую я не могу исправить. Пожалуйста, помогите мне решить эту проблему:

1 IntelliSense: аргумент типа "int (*)[50]" несовместим с параметром типа "int *"
линия 79 print(board, HEIGHT, WIDTH);

void print(int *board, int rows, int cols) 
{
    int x, y;
    char c;
    for (y = 0; y < rows; y++) {
        for (x = 0; x < cols; x++) {
            if (*(board + y*cols + x) == 1)
                printf("X");
            else
                printf(" ");
        }
        printf("\n");
    }
    printf("Press any key to continue:\n");
    getchar();
}

Ответы [ 6 ]

1 голос
/ 21 января 2012

Эта ошибка означает, что вы пытаетесь передать функции аргумент типа «массив из 50 указателей на int», в то время как она должна получать аргумент типа «указатель на int» (который также может быть массивом).

В вашем случае сигнатура вашей функции print(), вероятно, должна измениться, чтобы получить int board[][WIDTH] вместо int *, которое она получает сейчас.

Изменение подписи также требует изменения кода функции, поэтому строка

if (*(board + y*cols + x) == 1)

Должен быть изменен на:

if (board[y][x] == 1)
0 голосов
/ 21 января 2012

почему бы вам не сделать то, что вам сказал sverre, так как многомерный массив - это действительно абстракция, которую компилятор предоставляет, чтобы не выполнять математику, которую вы сделали, чтобы найти элементы row_th и col_th

просто назовите это как print ((int *) board, HEIGHT, WIDTH);

0 голосов
/ 21 января 2012

вы объявляете

void print(int *board, int rows, int cols) 

, но в других используемых вами функциях

foo(int board[][WIDTH], int rows)

либо сохраняете то же самое, либо объявляете как

(int **board, int rows, int cols )
0 голосов
/ 21 января 2012

Ваш board является двойным массивом.Он имеет как высоту, так и ширину.Когда вы ожидаете аргумент *board в вашей печати, вы на самом деле ожидаете массив только с одним измерением.Чтобы ошибка исчезла, вы должны передать int (*board)[WIDTH].

Когда вы передаете двумерный массив в функцию, вы должны включить размер одного из измерений.Таким образом, ваш board[HEIGHT][WIDTH] должен быть передан, по крайней мере, с информацией о его ширине.Итак: board[][WIDTH].Вы можете взять эти пустые [] и записать их в виде указателя перед платой.

Итак, в вашем главном вы вызываете свою функцию правильно, но вы должны отредактировать заголовок своей функции так:1011 *

 void print(int (*board)[WIDTH], int rows, int cols){
0 голосов
/ 21 января 2012
 void print(int *board, int rows, int cols)
 ...
 int board[HEIGHT][WIDTH];
 ...
 print(board, HEIGHT, WIDTH);

Первый параметр вашей функции print имеет тип int *board, но вы вызываете функцию с аргументом типа int (*)[50].

. Вы должны исправить прототип функции print (и body) для работы с параметром правильного типа (т. е. int (*)[50]).

0 голосов
/ 21 января 2012

Ваша функция печати ожидает указатель на int, но вы передаете 2-мерный массив, который распадается на указатель на 1-мерный массив.Либо приведение доски к int*, либо преобразование print() для обработки двумерного массива.

Приведение вызова будет выглядеть примерно так:

print((int *)board, HEIGHT, WIDTH);

Преобразование print() ввзять двумерный массив в качестве аргумента будет выглядеть примерно так:

void print(int board[][WIDTH]) 
{
    int x, y;
    char c;
    for (y = 0; y < HEIGHT; y++) {
        for (x = 0; x < WIDTH; x++) {
            if (board[y][x] == 1)
                printf("X");
            else
                printf(" ");
        }
        printf("\n");
    }
    printf("Press any key to continue:\n");
    getchar();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...