Matriz como parámetro C++

Estimados estoy intentando enviar un arreglo dinámico como parámetro a una función en C++ pero me dice como error que la variable N está fuera de contexto o no está definida, como puedo resolver ese error? Quedo atento. Saludos.

#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;
}
1
задан 11.11.2016, 23:35
4 ответа

Ошибка случается здесь:

void generarArreglo(int matriz[n][n]){ // <<--- AQUI!!!
  // ...
}

void imprimirArreglo(int matriz[n][n]){ // <<--- AQUI!!!

И мотив - что n он не существует для этих функций. Если бы это была стоимость постоянная и известная во время компиляции, ты смог бы parchear такой код, который:

const int n = 5;

void generarArreglo(int matriz[n][n]){ // OK
  // ...
}

Но это не случай. Поскольку уже они предложили тебе решение используя массив на основе двойных указателей, я предлагаю тебе сходное решение с простыми указателями... или с единственным вектором. Преимущество в том, чтобы использовать спорщики STL состоит в том, что ты избегаешь бороться с динамической памятью, что обычно предполагает, как общая норма, большое смягчение:

void generarArreglo(std::vector<int>& matriz){
  srand(time(NULL));
  for( int i=0; i<matriz.size(); i++)
    matriz[i]=rand()%99+1;
}

void imprimirArreglo(std::vector<int>& matriz, int n){
  for(int i=0;i<n;i++){
    for(int j=0;j<n;j++){
      cout<<matriz[i*n+j]<<'\t';
    }
    cout<<'\n';
  }
}

int main(){
  int n;
  cin >> n;
  std::vector<int> matriz(n*n,0);
  generarArreglo(matriz);
  imprimirArreglo(matriz, n);
  system("pause");
  return 0;
}

И то же самое могли бы получать с простым указателем... преимущества на двойном указателе звук, главным образом, два:

  • Только требуют резерва и освобождения
  • Память совсем группировалась, что способствует использованию кэш-памяти системы.

Пример с простым указателем:

void generarArreglo(int* matriz, int length){
  srand(time(NULL));

  while( length-- )
  {
    *matriz=rand()%99+1;
    ++matriz;
  }
}

void imprimirArreglo(int* matriz, int n){
  for(int i=0;i<n;i++){
    for(int j=0;j<n;++j,++matriz){
      cout<<*matriz<<'\t';
    }
    cout<<'\n';
  }
}

int main(){

  int n;
  cin >> n;
  int* matriz = new int[n*n];
  generarArreglo(matriz, n*n);
  imprimirArreglo(matriz, n);
  delete[] matriz;

  system("pause");
  return 0;
}
2
ответ дан 24.11.2019, 12:38
  • 1
    Нет versió n, в котором получается массив ссылкой. –  PaperBirdMaster 14.11.2016, 09:54
  • 2
    Спасибо за помощь, и explicació n. Я quedó очень ясный!! @eferion –  Stevn 15.11.2016, 16:26

Мой SoluciГіn: Введенные

#include <iostream>
#include <stdlib.h>
#include <time.h>

using namespace std;

void generarArreglo(int **matriz, int rows, int cols){
    srand(time(NULL));
    for(int i=0;i<rows;i++){
        for(int j=0;j<cols;j++){
            matriz[i][j]=rand()%99+1;
        }
    }
}

void imprimirArreglo(int **matriz, int rows, int cols){
    for(int i=0;i< rows;i++){
        for(int j=0;j< cols;j++){
            cout<<matriz[i][j]<<"\t";
        }
        cout<<endl;
    }
}

int main(){
    int n;
    cin >> n;
    int rows , cols;
    rows = cols = n;
    int** matriz = new int*[rows];
    for (int i = 0; i < rows; ++i)
        matriz[i] = new int[cols];
    generarArreglo(matriz, rows, cols);
    imprimirArreglo(matriz, rows, cols);
    return 0;
}

: Вышедшие

4

:

98  79  6   19  
11  2   96  95  
63  33  11  93  
80  36  70  50
2
ответ дан 24.11.2019, 12:38

Твой код

int matriz[n][n];

он не является действительным в C ++. Размеры массива должны быть постоянными, не изменчивыми. Ты будешь должен объявлять ее как указатель, и размещать memória на движении:

int *matriz;
matriz = calloc( n, n );

И ты будешь должен изменять все твои функции, просвет.

Я ИЗДАЮ

Чтобы соглашаться посредством указателей, он равен (я уверен в C, бросьте меня в волков, если в C ++ он не перемещает то же самое):

int *matriz = calloc( n, n );

matriz[0][0] = *matriz;
matriz[0][1] = matriz[2];
matriz[1][0] = matriz[n] = matriz[n][0]

Если бы вместо некрасивого поступка и грязного C ++ ты использовал C плоскость, ЕСЛИ БЫ ты мог использовать переменные, чтобы заявлять arrays (в C11).

В C, один array и один puntero они эквивалентные. Если объявлять один array[], составитель размещает память для указанного размера, и действительно то, что ты используешь, является указателем в эту память.

Я ИЗДАЮ 2

Porqué ты используешь 2 for укрытые? С которым ты использовал

int *idx;
for( idx = matriz; idx < n * n; ++ idx ) {
 . . .
}

array и блоки памяти, возвращенные из-за calloc(), malloc() и сходные они смежные в памяти. Просто, представь, что его один array[] единственного размера, но гораздо более длинный.

Я ИЗДАЮ 3

Из-за твоих комментариев, я вижу тебя с желаниями изучения.

#include <iostream>
#include <stdlib.h>
#include <time.h>

void generarArreglo( int *matrix, int size ){
  srand( time( NULL ) );

  while( size -- )
    *matrix++ = rand( ) % 99 + 1;
}

void imprimirArreglo( int *matrix, int ancho, int size ) {
  int pos = 0;

  while( size-- ) {
    ::std::cout << "[" << *matrix++ << "]";
    if( ! ( ++pos % ancho ) )
      ::std::cout << ::std::endl;
  }

 ::std::cout << ::std::endl;
}

int main( ) {
  int *matriz;
  int n;

  ::std::cin >> n;
  matriz = (int *)calloc( n, n );

  generarArreglo( matriz, n * n );
  imprimirArreglo( matriz, n, n * n );

  system( "pause" );
  return 0;
}

Версия 1.0. Допускаются заплаты.

PD - Из-за кода как этот, говорят, что C/C ++ - одинокого написание.

1
ответ дан 24.11.2019, 12:38
  • 1
    tendré который признавать pará такие метры как указатели?? –  Stevn 11.11.2016, 23:28
  • 2
    Я верю в то, что как array tambié n ты valdrá n, они взаимозаменяемые (в C, в C ++ я не уверен). Так или иначе, с указателями он má s легкий что совсем, что ты связал в твоем có я говорю. –  Trauma 11.11.2016, 23:30
  • 3
    está сформируй, как я могу ссылаться на элемент внутри массива? –  Stevn 11.11.2016, 23:31
  • 4
    В конце концов объявлять это, как array - то же самое, что и объявлять это как указатель, notació n договоренности он одинокий " syntactic sugar" следовательно, я думаю, что он имеет razó n @Trauma, deberí схвати пробовать с malloc(), calloc(). Те podrí чтобы помогать много исследовать относительно Asignació n Diná слюда Памяти –  Alejandro Montilla 11.11.2016, 23:36
  • 5
    @Xam, Хотя есть какие-то mí nimas различия, правда состоит в том, что он пошел из-за ошибки. Я má s có способ в C, и я traspapeló . Как подозрения, podrí чтобы использовать matriz = new int[n][n];. –  Trauma 02.01.2018, 07:21

Я предлагаю, чтобы он объявил себе массив формы:

int mat[n][n];

Только как хорошая практика, потому что, если он высказывается динамической формы, хотя это делается автоматически, он рекомендуемый, что в конце концов освободил вручную память, которая требовалась в систему, однако, таким образом, не надо. Другое, которое я предлагаю, состоит в том, что, когда размеры перемещают массив как параметр как указатель +, это способствует тому, чтобы он был гораздо более гибким во время работы с массивом, если мы хотим сделать ему последующие изменения в Ваших размерах.

0
ответ дан 24.11.2019, 12:38
  • 1
    Это, что ты комментируешь, - VLA (" Variable-Length Array) и не - caracterí stica созерцаемая в está ndar C ++ (однако sí está в está ndar C99 C). Это означает, что, если оно ты функционирует, он, потому что который diseñ ó составитель así он это захотел..., но то же самое с другим составителем тебе не везет –  eferion 12.11.2016, 01:29
  • 2
    @eferion: Это está ясно –  Isaac Vega 12.11.2016, 04:19