Use boost::multi_array.
Como en su ejemplo, lo único que necesita saber en tiempo de compilación es el número de dimensiones. Aquí es el primer ejemplo en la documentación:
#include "boost/multi_array.hpp"
#include <cassert>
int
main() {
// Create a 3D array that is 3 x 4 x 2
typedef boost::multi_array<double, 3> array_type;
typedef array_type::index index;
array_type A(boost::extents[3][4][2]);
// Assign values to the elements
int values = 0;
for(index i = 0; i != 3; ++i)
for(index j = 0; j != 4; ++j)
for(index k = 0; k != 2; ++k)
A[i][j][k] = values++;
// Verify values
int verify = 0;
for(index i = 0; i != 3; ++i)
for(index j = 0; j != 4; ++j)
for(index k = 0; k != 2; ++k)
assert(A[i][j][k] == verify++);
return 0;
}
Edit: Como se sugiere en los comentarios, here is a "simple" example aplicación que le permiten definir el tamaño de la matriz multidimensional en tiempo de ejecución, pidiendo desde la entrada de la consola. Aquí es un ejemplo de salida de esta aplicación de ejemplo (compilado con la constante diciendo que es 3 dimensiones):
Multi-Array test!
Please enter the size of the dimension 0 : 4
Please enter the size of the dimension 1 : 6
Please enter the size of the dimension 2 : 2
Text matrix with 3 dimensions of size (4,6,2) have been created.
Ready!
Type 'help' for the command list.
>read 0.0.0
Text at (0,0,0) :
""
>write 0.0.0 "This is a nice test!"
Text "This is a nice test!" written at position (0,0,0)
>read 0.0.0
Text at (0,0,0) :
"This is a nice test!"
>write 0,0,1 "What a nice day!"
Text "What a nice day!" written at position (0,0,1)
>read 0.0.0
Text at (0,0,0) :
"This is a nice test!"
>read 0.0.1
Text at (0,0,1) :
"What a nice day!"
>write 3,5,1 "This is the last text!"
Text "This is the last text!" written at position (3,5,1)
>read 3,5,1
Text at (3,5,1) :
"This is the last text!"
>exit
Las partes importantes en el código son la principal función de donde obtenemos las dimensiones del usuario y crear la matriz con:
const unsigned int DIMENSION_COUNT = 3; // dimension count for this test application, change it at will :)
// here is the type of the multi-dimensional (DIMENSION_COUNT dimensions here) array we want to use
// for this example, it own texts
typedef boost::multi_array< std::string , DIMENSION_COUNT > TextMatrix;
// this provide size/index based position for a TextMatrix entry.
typedef std::tr1::array<TextMatrix::index, DIMENSION_COUNT> Position; // note that it can be a boost::array or a simple array
/* This function will allow the user to manipulate the created array
by managing it's commands.
Returns true if the exit command have been called.
*/
bool process_command(const std::string& entry, TextMatrix& text_matrix);
/* Print the position values in the standard output. */
void display_position(const Position& position);
int main()
{
std::cout << "Multi-Array test!" << std::endl;
// get the dimension informations from the user
Position dimensions; // this array will hold the size of each dimension
for(int dimension_idx = 0; dimension_idx < DIMENSION_COUNT; ++dimension_idx)
{
std::cout << "Please enter the size of the dimension "<< dimension_idx <<" : ";
// note that here we should check the type of the entry, but it's a simple example so lets assume we take good numbers
std::cin >> dimensions[dimension_idx];
std::cout << std::endl;
}
// now create the multi-dimensional array with the previously collected informations
TextMatrix text_matrix(dimensions);
std::cout << "Text matrix with " << DIMENSION_COUNT << " dimensions of size ";
display_position(dimensions);
std::cout << " have been created."<< std::endl;
std::cout << std::endl;
std::cout << "Ready!" << std::endl;
std::cout << "Type 'help' for the command list." << std::endl;
std::cin.sync();
// we can now play with it as long as we want
bool wants_to_exit = false;
while(!wants_to_exit)
{
std::cout << std::endl << ">" ;
std::tr1::array< char, 256 > entry_buffer;
std::cin.getline(entry_buffer.data(), entry_buffer.size());
const std::string entry(entry_buffer.data());
wants_to_exit = process_command(entry, text_matrix);
}
return 0;
}
Y se puede ver que adherirse a un elemento de la matriz, que es muy fácil: sólo tiene que utilizar el operador() como en las siguientes funciones:
void write_in_text_matrix(TextMatrix& text_matrix, const Position& position, const std::string& text)
{
text_matrix(position) = text;
std::cout << "Text \"" << text << "\" written at position ";
display_position(position);
std::cout << std::endl;
}
void read_from_text_matrix(const TextMatrix& text_matrix, const Position& position)
{
const std::string& text = text_matrix(position);
std::cout << "Text at ";
display_position(position);
std::cout << " : "<< std::endl;
std::cout << " \"" << text << "\"" << std::endl;
}
Nota: compilé esta aplicación en VC9 + SP1, recibí solo algunas advertencias olvidables.
No puedo entender cómo funciona esto en C. – Guge
que se supone que es para C++ –
También debe mostrar cómo leer en las dimensiones de std :: cin (como se solicita en la pregunta) –