Инициализация серии массивов с циклами for в C ++ - PullRequest
0 голосов
/ 25 апреля 2011

Я пытаюсь создать серию многомерных массивов с циклами for.Пользователь должен ввести количество массивов для инициализации.Я хочу что-то вроде этого:

int i;
printf("Enter the number of arrays you want: ");
scanf("%d",i)
for(int j=0;j<i;j++){
     long double x(j)[size][size];
}

, если я введу 5, я хочу иметь x0, x1, x2, x3 и x4.

Возможно ли это вообще ??

Спасибо за любую помощь.

С наилучшими пожеланиями, Эмре.

Ответы [ 3 ]

1 голос
/ 25 апреля 2011

Если вы работаете в C ++, вам лучше использовать std::vector как:

//single dimensional array of double of size 20
std::vector<double>  v1double (20);      
//use like v[i] where  0 <= i < 20

//two dimensional array of double of size  (10 * 20)
std::vector<std::vector<double> >  v2double(10, v1double ); 
//use like v[i][j] where  0 <= i < 10 and 0 <= j < 20

//three dimensional array of double of size (5 * 10 * 20)
std::vector<std::vector<std::vector<double> >  v3double (5, v2double); 
//use like v[i][j][k] where  0 <= i < 5 and 0 <= j < 10 and 0 <= k < 20
1 голос
/ 25 апреля 2011

Набор многомерных массивов - это то же самое, что и многомерный массив с еще одним измерением.

Кроме того, несколько вещей о встроенных массивах:

  • В C ++ размеры встроенного массива должны основываться на постоянной времени компиляции.Вы не можете рассчитать размер, прочитать его из файла, получить его из пользовательского ввода и т. Д.
  • Чтобы создать встроенный массив с переменным размером, вы должны выделить память и использовать ее как указатель
  • Чтобы распределение встроенного массива было переносимым между C и C ++, вы должны использовать malloc и убедиться, что позже вы вызовете free для всего, что вы получили от malloc (что иногда можеточень трудно понять правильно)

Если вы используете C ++ и вам не нужно компилировать код с помощью компилятора C, я рекомендую использовать vector вместо встроенного массива,Векторы не обязательно должны иметь постоянный размер, и их можно изменять каждый раз, когда вы захотите изменить их размер, часто без вызова malloc или new в вашем коде

Один из способов сделать это будет выглядеть следующим образом:

#include<iostream>
#include<vector>

int main(int argc, char* argv[])
{
    std::cout << "Enter the number of arrays you want:" << std::endl;

    const int size = 4;
    const int initial_value = 0;
    int i;
    std::cin >> i;

    std::vector<int> sub_sub_array(size, initial_value);
    std::vector<std::vector<int> > sub_array(size, sub_sub_array);
    std::vector<std::vector<std::vector<int> > > array(i, sub_array);

    array[0][1][2] = 5;

    // Print out the full array contents
    for(size_t i = 0; i < array.size(); ++i)
    {
        for(size_t j = 0; j < size; ++j)
        {
            for(size_t k = 0; k < size; ++k)
            {
                std::cout << "(" << j << ", " << k << ") - " << array[i][j][k] << ", ";
            }
            std::cout << "\n";
        }
        std::cout << "\n";
    }
}

Введите необходимое количество массивов:
2

(0, 0) - 0, (0, 1) - 0, (0,2) - 0, (0, 3) - 0,
(1, 0) - 0, (1, 1) - 0, (1, 2) - 5 , (1, 3) - 0,
(2, 0) - 0, (2, 1) - 0, (2, 2) - 0, (2, 3) - 0,
(3, 0) - 0,(3, 1) - 0, (3, 2) - 0, (3, 3) - 0,

(0, 0) - 0, (0, 1) - 0, (0, 2) - 0, (0, 3) - 0,
(1, 0) - 0, (1, 1) - 0, (1, 2) - 0, (1, 3) - 0,
(2, 0) - 0, (2, 1) - 0, (2, 2) - 0, (2, 3) - 0,
(3, 0) - 0, (3, 1) - 0, (3, 2) - 0, (3, 3) - 0,

Редактировать:

Единственная проблема с вышеуказанным решением состоит в том, что выможет или не сможет использовать его в коде, который ожидает встроенный массив.Судя по вашим комментариям, вам это нужно.

Если ваш существующий код может принимать по одной строке за раз, то вышеуказанное решение будет работать.Если он может принимать только 2d массив, вам придется использовать другую векторную структуру.См. Этот вопрос, почему:

Передать вложенный вектор C ++ как многомерный массив встроенного стиля

Если вам нужен набор смежных 2d-массивов, вот некоторыепараметры:

std::vector<int*> array_instances(i);
for(size_t j = 0; j < array_instances.size(): ++j)
    array_instances[j] = new int[size * size];

for(size_t j = 0; j < array_instances.size(); ++j)
    existing_code(array_instances[j]);

// When done with the arrays
for(size_t j = 0; j < array_instances.size(): ++j)
    delete[] array_instances[j]; // Make sure to include the brackets after "delete"

или:

std::vector<int> template_array(size * size, 0);
std::vector<std::vector<int> > array_instances(i, template_array);

for(size_t j = 0; j < array_instances.size(); ++j)
    existing_code(&array_instances[j][0]);
1 голос
/ 25 апреля 2011

Редактировать : Только что заметил, что вы используете C ++. В этом случае std :: vector, безусловно, является наиболее удобным решением. Если вам интересно, как это сделать с простыми массивами в стиле C, тогда читайте дальше ...


Ты не можешь так делать. Вам нужно создать трехмерный массив (или массив двумерных массивов, в зависимости от вашей точки зрения ...)

Как всегда в случае с C, выделение памяти является проблемой ... Вы можете статически распределить:

long double x[N][size][size];

(N определяется во время компиляции. Убедитесь, что оно достаточно велико. Также, если N действительно большое, объявите массив статически (либо как глобальная переменная, либо с ключевым словом static). Если нет, вы можете получить переполнение стека.)

Или вы можете использовать динамическое выделение памяти:

long double (*x)[size][size]; // x is a pointer to size by size arrays
x = malloc(n * sizeof(*x));
//You can now use x[j][a][b]...

Может быть, с typedef дела обстоят лучше (даже я не уверен на 100%, что правильно объяснил массив в последнем примере ...):

typedef long double typename_here[size][size];
typename_here *x;
x = malloc(n * sizeof(typename_here);

Кстати, причина, по которой ваш текущий код не работает,

  1. Синтаксис x(j) вымышлен:)
  2. Переменные, объявленные внутри цикла, являются внутренними для этого блока. Это означает, что вы не можете получить к ним доступ после тела цикла.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...