Уважаемый, я пытаюсь отправить динамический массив в качестве параметра функции на C++, но он сообщает мне как ошибку, что переменная N находится вне контекста или не определена, как я могу решить эту ошибку? Следите за обновлениями. Привет.
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
void generarArreglo(int matriz[n][n]){
srand(time(NULL));
for(int i=0;i<=6;i++){
for(int j=0;j<=6;j++){
matriz[i][j]=rand()%99+1;
}
}
}
void imprimirArreglo(int matriz[n][n]){
for(int i=0;i<=6;i++){
for(int j=0;j<=6;j++){
cout<<matriz[i][j]<<"\t";
}
cout<<endl;
}
}
int main(){
int n;
cin >> n;
int matriz[n][n];
generarArreglo(matriz);
imprimirArreglo(matriz);
system("pause");
return 0;
}
Мое решение:
Вход:
Вылет из:
Ошибка возникает здесь:
И причина в том, что
n
он не существует для этих функций. Если бы это было постоянное значение, известное во время компиляции, вы могли бы исправить код так, чтобы:Но это не так. Поскольку вам уже предлагалось решение с использованием массива на основе двойных указателей, я предлагаю аналогичное решение с простыми указателями... или с одним вектором. Преимущество использования контейнеров STL заключается в том, что вы избегаете работы с кучей памяти, что обычно приносит большое облегчение:
И то же самое может быть достигнуто с помощью одного указателя... преимуществ перед двойным указателем в основном два:
Пример с простым указателем:
Ваш код
недействителен в C++. Размеры массива должны быть константами, а не переменными. Вам придется объявить его как указатель и выделить память на лету:
И вам, конечно, придется модифицировать все ваши функции.
РЕДАКТИРОВАТЬ
Для доступа через указатели это то же самое (я уверен, что в C, бросьте меня к волкам, если то же самое не произойдет в C++):
Если бы вместо уродливого и грязного C++ вы использовали простой C , вы могли бы использовать переменные для объявления массивов (в C11).
В C а
array
и аpuntero
эквивалентны. Если вы объявляете aarray[]
, компилятор выделяет память для указанного размера, и на самом деле вы используете указатель на эту память.РЕДАКТИРОВАТЬ 2
Почему вы используете 2
for
вложенных ? с чем вы используетеБлоки
array
памяти и , возвращаемые функциейcalloc()
,malloc()
и т.п. являются непрерывными в памяти . Просто представьте, что онarray[]
одномерный, но гораздо более длинный.РЕДАКТИРОВАТЬ 3
По вашим комментариям я вижу, что вы хотите учиться.
Версия 1.0. Патчи поддерживаются.
PS . Говорят, что для такого кода C / C++ доступен только для записи .
Предлагаю объявить массив в виде:
Только в качестве хорошей практики, потому что, если он объявлен динамически, хотя это делается автоматически, рекомендуется в конце концов память, которая была запрошена у системы, освобождаться вручную, однако, таким образом, это не обязательно. Другая вещь, которую я предлагаю, заключается в том, что передача массива в качестве параметра в виде указателя + размеры делает его гораздо более гибким при работе с массивом, если мы хотим внести последующие изменения в его размеры.