Здравствуйте, spectre, Вы писали:
S>double* arr; S>arr = new double[Y][X];
S>и получаю ошибку S>cannot convert double(*)(1) to double*
S>Разъясните, пожалуйста ситуацию, как же создать двумерный массив?
double** arr = new double*[Y];
for (int i = 0; i < Y; ++i) p[i] = new double[X];
Удалено избыточное цитирование. -- ПК.
Re[2]: Как создать двумерный массив произвольного размера?
Здравствуйте, vadim77, Вы писали:
V>Не проще ли?
V>
V> double* arr;
V> arr = new double[Y * X];
V>
Так ведь spectre потом захочет писать arr[i][j] = 3.14, а в вашем варианте так не получится.
Хотя конечно можно делать arr[i*X + j]. Но опять же, как товарищ spectre пожелает.
Re[4]: Как создать двумерный массив произвольного размера?
Здравствуйте, VNG, Вы писали:
VNG>Здравствуйте, vadim77, Вы писали:
V>>Не проще ли?
V>>
V>> double* arr;
V>> arr = new double[Y * X];
V>>
VNG>Так ведь spectre потом захочет писать arr[i][j] = 3.14, а в вашем варианте так не получится. VNG>Хотя конечно можно делать arr[i*X + j]. Но опять же, как товарищ spectre пожелает.
Не знаю, на знаю... мне кажеться что вызывать new Y + 1 кол-во раз и потом возиться с delete, череcчур большой overhead...
Re[5]: Как создать двумерный массив произвольного размера?
Здравствуйте, vadim77, Вы писали:
VNG>>Так ведь spectre потом захочет писать arr[i][j] = 3.14, а в вашем варианте так не получится. VNG>>Хотя конечно можно делать arr[i*X + j]. Но опять же, как товарищ spectre пожелает.
V>Не знаю, на знаю... мне кажеться что вызывать new Y + 1 кол-во раз и потом возиться с delete, череcчур большой overhead...
Ну если нужен человеку такой синтаксис
arr[i][j] = 3.14
то черт с ним с overhead...
Удалено избыточное цитирование. -- ПК.
Re[3]: Как создать двумерный массив произвольного размера?
Здравствуйте, Vamp, Вы писали:
V>>Не проще ли? V>Многомерные массивы — ЗЛО! Завтра товарищ захочет передать такой массив в функцию и мы в очередной раз увидим вопрос из этой серии.
Здравствуйте Vamp, Вы прям прорицатель. Хотел задать такой вопрос, но теперь решели всё-таки пользоваться одномерным массивом.
Re[5]: Как создать двумерный массив произвольного размера?
Здравствуйте, spectre, Вы писали:
S>Здравствуйте, Vamp, Вы писали:
V>>>Не проще ли? V>>Многомерные массивы — ЗЛО! Завтра товарищ захочет передать такой массив в функцию и мы в очередной раз увидим вопрос из этой серии. S>Здравствуйте Vamp, Вы прям прорицатель. Хотел задать такой вопрос, но теперь решели всё-таки пользоваться одномерным массивом.
Я в который раз порекомендую книжку "Язык Си в вопросах и ответах", где тема голых многомерных массивов освещена достаточно подробно.
Выбор одномерного массива в качестве первичного носителя "рулит и побеждает".
Над ним можно сделать разные надстройки, в частности,
* трансляцию вектора индексов в линейный индекс и обратно: i=(x*sy*sz+y*sz+z)
* аллокаторы многомерного массива (в множестве блоков и в едином блоке): double***arr3d=alloc3d(sx,sy,sz)
Перекуём баги на фичи!
Re[6]: Как создать двумерный массив произвольного размера?
К>Я в который раз порекомендую книжку "Язык Си в вопросах и ответах", где тема голых многомерных массивов освещена достаточно подробно.
Я вот не понимаю. Зачем они вообще были введены в язык при отсутствии человеческой их поддержки?
Да здравствует мыло душистое и веревка пушистая.
Re: Как создать двумерный массив произвольного размера?
Здравствуйте, spectre, Вы писали:
S>Я пытаюсь создать двумерный массив:
S>double* arr; S>arr = new double[Y][X];
S>и получаю ошибку S>cannot convert double(*)(1) to double*
Прочитай в третьем издании Строуструпа про valarray и slice — там все описано очень понятно, и ты получаешь преимущества реализации на одномерном массиве без потери приятного синтаксиса адресации.
Здравствуйте, jazzer, Вы писали:
S>>Разъясните, пожалуйста ситуацию, как же создать двумерный массив?
J>Прочитай в третьем издании Строуструпа про valarray и slice — там все описано очень понятно, и ты получаешь преимущества реализации на одномерном массиве без потери приятного синтаксиса адресации.
Ну а если есть boost, то используй boost::multi_array и не знай проблем :)
Здравствуйте, Vamp, Вы писали:
К>>Я в который раз порекомендую книжку "Язык Си в вопросах и ответах", где тема голых многомерных массивов освещена достаточно подробно. V>Я вот не понимаю. Зачем они вообще были введены в язык при отсутствии человеческой их поддержки?
Ну, причины чисто исторические — совместимость с С.
Но с техпор довольно много всего понаделано — пора перестать их использовать и начать юзать вектор и прочие контейнеры. В крайнем случае — свое накропать.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[7]: Как создать двумерный массив произвольного размера?
Здравствуйте, Vamp, Вы писали:
К>>Я в который раз порекомендую книжку "Язык Си в вопросах и ответах", где тема голых многомерных массивов освещена достаточно подробно. V>Я вот не понимаю. Зачем они вообще были введены в язык при отсутствии человеческой их поддержки?
1. Си не противоречит сам себе.
Массив элементов произвольного типа — это тип.
Указатель на элемент произвольного типа — это тип.
Доступ к элементам массива и элементам по указателю унифицирована.
Делаем соответствующие замыкания...
Это к вопросу о многомерных массивах.
// То есть ты можешь держать массив массивов
T arr[X][Y];
typedef T TY[Y];
TY arr[X];
TY& ty = arr[x];
T v = arr[x][y];
// можешь - массив указателей на начала массивов
T* arr[X];
typedef T *PT;
PT arr[X];
PT ty = arr[x];
T v = arr[x][y];
// можешь - наоборот: указатель на начало массива массивов
T (*arr)[Y];
TY *arr;
TY& ty = arr[x];
v = arr[x][y];
// или указатель на начало массива указателей
T **arr;
PT *arr;
PT ty = arr[x];
v = arr[x][y];
2. Передача массива...
Массив произвольного размера T arr[???] — для работы с ним минимально необходим указатель на начало:
T *begin = &arr[0] = arr;
T v = begin[k];
Массив известного размера T arr[N] — можно использовать указатель на тип этого массива
T (*array)[N] = &arr;
T v = (*array)[k];
Массив с размером известным во время исполнения, — способы передать эту информацию варьируются — как по содержанию,
T *begin = &arr[0]; int n;
T *end = &arr[n];
int cb = sizeof(T)*n;
Поскольку нет предпочтений между любым из этих способов — право выбора отдаётся программисту.
Естественно, с явной семантикой.
(В отличие от васика и дельфи, где имеется некая структура arrayinfo; в васике это скорее всего VARIANT).
Перекуём баги на фичи!
Re[5]: Как создать двумерный массив произвольного размера?
Здравствуйте, Ozone, Вы писали:
O>А как же быть с такой ситуацией, когда ты хочешь, например, текстовый файл записать в один массив? Куду ты денешься от char** str?
А почему сразу не char*** words?
Проблема разбиения большого текста на что-то более мелкое — это нетривиальная архитектурная задача.
Сильно зависит от содержимого и от того что ты хочешь с ним сделать.
И уж по-любому хранить большие данные в голых структурах (а не в контейнерах) — это не зло, но глупо.
Перекуём баги на фичи!
Re[8]: Как создать двумерный массив произвольного размера?