He escrito el siguiente código pero muestra el error

use of parameter outside function body before ‘]’ token

El código es

#include <iostream>
using namespace std;
int n=10;
void a(int s[n][n])
{
    cout<<"1";
}
int main()
{
    int s[n][n]={0};
    a(s);
}

Estoy tratando de pasar una matriz multidimensional de tamaño variable usando una variable global. No quiero usar vectores en esto.

5
shivank01 27 feb. 2018 a las 19:39

4 respuestas

La mejor respuesta

Ya ha recibido respuestas que explican el por qué . Estoy ofreciendo esto solo como una cuestión de integridad para C ++. Personalmente, aunque no entiendo por qué estás evitando vectores, ofrecen una solución más intuitiva o agradable. Dentro de su función para manejar los vectores, siempre puede consultar std::vector<>.size() para asegurarse de permanecer dentro de los límites o std::vector<>.at() y detectar la excepción que se produce al acceder fuera de los límites. Sin embargo, su pregunta particular también puede resolverse mediante plantillas. A continuación se muestra su código, ligeramente modificado, con comentarios para ilustrar. Probé usando gcc 4.8.5:

#include <iostream>
using namespace std;

// Made constant so that the compiler will not complain
// that a non-constant value, at compile time, is being
// used to specify array size.
const int n=10;

// Function template.  Please note, however, this template
// will only auto-gen functions for 2D arrays.
template<int lb>
void a(int s[][lb])
{
    // output the last element to know we're doing this correctly
    // also note that the use of 9 hard-codes this function template
    // to 2D arrays where the first dimension is always, at least, 10
    // elements long!!!!!!
    cout << s[9][lb - 1] << endl;
}

int main()
{
    int s[n][1];
    s[9][0] = 15;
    a<1>(s); // explicitly call template with the size of the last dimension
    a(s); // Call the same function generated from the previous call

    int t[n][2];
    t[9][1] = 17;
    a(t); // compiler implicitly determines the type of function to generate
}
1
Andrew Falanga 27 feb. 2018 a las 17:17

En primer lugar, C ++ no tiene matrices de longitud variable , por lo que en lugar de int s[n][n]={0}; debería usar std::vector<std::vector<int>> s(10,std::vector<int>(10));

En segundo lugar, cómo pasar una matriz 2D a una función,

void a(std::vector<int> **s,int rows, int cols){
        cout<<"1";
        /* stuff with 2D array */
}
2
Achal 27 feb. 2018 a las 16:51

Su tamaño de matriz debe ser constante. Prueba esto.

#include <iostream>
using namespace std;
const int n=10;

void a(int s[n][n])
{
    cout<<"1";
}
int main()
{
    int s[n][n]={0};
    a(s);
}
0
Eduard Rostomyan 27 feb. 2018 a las 16:51

No puedes Su función a () necesita conocer la última dimensión, que es la longitud de cada fila en la matriz. Debe pasar esto como un parámetro adicional a su función.

void a(int * matrix, int rows, int columns) {
   int row = ...
   int column = ...
   if (row < rows && column < columns) {
      cout << matrix[row*columns + column];
   }
}

int main() {
   ...
   a(&s[0][0], 10);
   ...
0
A Fog 27 feb. 2018 a las 16:55