не удается преобразовать «int (*)[L][W]» в ‘int*’

#c #pointers #function-pointers

Вопрос:

Я пытаюсь ссылаться на 2d массив в параметрах функции void, функция будет вызываться в основном, но я получаю ошибку:

 mmm.cpp:26:31: error: cannot convert ‘int (*)[L][W]’ to ‘int*’
                                     ^~~~~~~~~~~~~~~
 

Это мой код:

 #include <iostream>
#include <ctime>
using namespace std;

void generateRandemMatrix(int L ,int W , int * arr[L][W] ){


   for (int i=0; i<L; i  ){

    for (int j=0; j<W; j  ){
        arr[i][j] = rand();
    }

   }

 }

int main() {

int *p;
int L = 10;
int W = 10;
int arr[L][W];
generateRandemMatrix(L,W, amp;arr);

}
 

Комментарии:

1. int arr[L][W]; является VLA и не является стандартным C . Используйте std::vector<std::vector<int>> вместо этого, если L и W не являются постоянными выражениями ( constexpr ).

2. Это первая ошибка, которую вы получаете при компиляции? (Это было не для меня, когда я копировал и компилировал ваш код.) Вы должны устранить первую ошибку, прежде чем беспокоиться о других, так как другие могут быть (определенно являются в вашем случае) артефактами предыдущих ошибок.

Ответ №1:

Без std::вектор

 void generateRandemMatrix(size_t L, size_t W, int *a)
{
    int (*arr)[W] = (int (*)[W])a;

    for (size_t i = 0; i < L; i  )
    {
        for (size_t j = 0; j < W; j  )
        {
            arr[i][j] = rand();
        }
   }

 }

int main() {

    int *p;
    size_t L = 10;
    size_t W = 10;
    int arr[L][W];
    generateRandemMatrix(L,W, amp;arr[0][0]);

}
 

Комментарии:

1. int (*arr)[W] = (int (*)[W])a; недопустим C . Он полагается на расширения VLA, которые gcc имеет по умолчанию.

2. Если вы собираетесь играть в подобные игры с указателями, по крайней мере, используйте void *a их в качестве типа аргумента. Это предупреждает читателей, что происходит что-то С-подобное.