#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
их в качестве типа аргумента. Это предупреждает читателей, что происходит что-то С-подобное.