Как создать двумерный массив произвольного размера?
От: spectre Россия spectre.50megs.com
Дата: 17.02.04 19:43
Оценка:
Здравствуйте!


Я пытаюсь создать двумерный массив:

double* arr;
arr = new double[Y][X];

и получаю ошибку
cannot convert double(*)(1) to double*

хотя при создании одномерного массива
double* arr;
arr = new double[Y];
работает.

Разъясните, пожалуйста ситуацию, как же создать двумерный массив?
Re: Как создать двумерный массив произвольного размера?
От: VNG Беларусь https://organicmaps.app/
Дата: 17.02.04 19:52
Оценка:
Здравствуйте, 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 Израиль  
Дата: 17.02.04 19:57
Оценка: +1
Здравствуйте, VNG, Вы писали:

S>>Разъясните, пожалуйста ситуацию, как же создать двумерный массив?


VNG>
VNG>double** arr = new double*[Y];
VNG>for (int i = 0; i < Y; ++i) p[i] = new double[X];
VNG>


Не проще ли?

  double* arr;
  arr = new double[Y * X];


Удалено избыточное цитирование. -- ПК.
Re[3]: Как создать двумерный массив произвольного размера?
От: VNG Беларусь https://organicmaps.app/
Дата: 17.02.04 20:01
Оценка:
Здравствуйте, 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]: Как создать двумерный массив произвольного размера?
От: vadim77 Израиль  
Дата: 17.02.04 20:08
Оценка:
Здравствуйте, 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]: Как создать двумерный массив произвольного размера?
От: VNG Беларусь https://organicmaps.app/
Дата: 17.02.04 20:13
Оценка:
Здравствуйте, 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 Россия  
Дата: 17.02.04 20:41
Оценка:
V>Не проще ли?
Многомерные массивы — ЗЛО! Завтра товарищ захочет передать такой массив в функцию и мы в очередной раз увидим вопрос из этой серии.
Да здравствует мыло душистое и веревка пушистая.
Re: Как создать двумерный массив произвольного размера?
От: LaptevVV Россия  
Дата: 18.02.04 06:49
Оценка:
Здравствуйте, spectre, Вы писали:

S>Я пытаюсь создать двумерный массив:


S>double* arr;

S>arr = new double[Y][X];

S>и получаю ошибку

S>cannot convert double(*)(1) to double*

Брось использовать массивы и переходи на векторы. По крайней мере вектор сам за памятью следит

Удалено избыточное цитирование. -- ПК.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Как создать двумерный массив произвольного размера?
От: Bell Россия  
Дата: 18.02.04 07:22
Оценка:
Здравствуйте, spectre, Вы писали:

S>Здравствуйте!


S>Разъясните, пожалуйста ситуацию, как же создать двумерный массив?



std::vector< std::vector<double> > arr;
Любите книгу — источник знаний (с) М.Горький
Re: Как создать двумерный массив произвольного размера?
От: Lorenzo_LAMAS  
Дата: 18.02.04 07:27
Оценка:
Если одна из размерностей известна, то можно так

int (*p)[10] = new int[n][10];
Of course, the code must be complete enough to compile and link.
Re[4]: Как создать двумерный массив произвольного размера?
От: spectre Россия spectre.50megs.com
Дата: 18.02.04 07:36
Оценка:
Здравствуйте, Vamp, Вы писали:

V>>Не проще ли?

V>Многомерные массивы — ЗЛО! Завтра товарищ захочет передать такой массив в функцию и мы в очередной раз увидим вопрос из этой серии.
Здравствуйте Vamp, Вы прям прорицатель. Хотел задать такой вопрос, но теперь решели всё-таки пользоваться одномерным массивом.
Re[5]: Как создать двумерный массив произвольного размера?
От: Кодт Россия  
Дата: 18.02.04 08:16
Оценка:
Здравствуйте, spectre, Вы писали:

S>Здравствуйте, Vamp, Вы писали:


V>>>Не проще ли?

V>>Многомерные массивы — ЗЛО! Завтра товарищ захочет передать такой массив в функцию и мы в очередной раз увидим вопрос из этой серии.
S>Здравствуйте Vamp, Вы прям прорицатель. Хотел задать такой вопрос, но теперь решели всё-таки пользоваться одномерным массивом.

Я в который раз порекомендую книжку "Язык Си в вопросах и ответах", где тема голых многомерных массивов освещена достаточно подробно.

Выбор одномерного массива в качестве первичного носителя "рулит и побеждает".
Над ним можно сделать разные надстройки, в частности,
* трансляцию вектора индексов в линейный индекс и обратно: i=(x*sy*sz+y*sz+z)
* аллокаторы многомерного массива (в множестве блоков и в едином блоке): double***arr3d=alloc3d(sx,sy,sz)
Перекуём баги на фичи!
Re[6]: Как создать двумерный массив произвольного размера?
От: Vamp Россия  
Дата: 18.02.04 08:30
Оценка:
К>Я в который раз порекомендую книжку "Язык Си в вопросах и ответах", где тема голых многомерных массивов освещена достаточно подробно.
Я вот не понимаю. Зачем они вообще были введены в язык при отсутствии человеческой их поддержки?
Да здравствует мыло душистое и веревка пушистая.
Re: Как создать двумерный массив произвольного размера?
От: jazzer Россия Skype: enerjazzer
Дата: 18.02.04 08:38
Оценка:
Здравствуйте, spectre, Вы писали:

S>Я пытаюсь создать двумерный массив:


S>double* arr;

S>arr = new double[Y][X];

S>и получаю ошибку

S>cannot convert double(*)(1) to double*

Прочитай в третьем издании Строуструпа про valarray и slice — там все описано очень понятно, и ты получаешь преимущества реализации на одномерном массиве без потери приятного синтаксиса адресации.

Удалено избыточное цитирование. -- ПК.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: Как создать двумерный массив произвольного размера?
От: jazzer Россия Skype: enerjazzer
Дата: 18.02.04 08:43
Оценка:
Здравствуйте, jazzer, Вы писали:

S>>Разъясните, пожалуйста ситуацию, как же создать двумерный массив?


J>Прочитай в третьем издании Строуструпа про valarray и slice — там все описано очень понятно, и ты получаешь преимущества реализации на одномерном массиве без потери приятного синтаксиса адресации.


Ну а если есть boost, то используй boost::multi_array и не знай проблем :)
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[4]: Как создать двумерный массив произвольного размера?
От: Ozone Россия  
Дата: 18.02.04 10:54
Оценка:
Здравствуйте, Vamp, Вы писали:

V>>Не проще ли?

V>Многомерные массивы — ЗЛО!

А как же быть с такой ситуацией, когда ты хочешь, например, текстовый файл записать в один массив? Куду ты денешься от char** str?
Re[7]: Как создать двумерный массив произвольного размера?
От: LaptevVV Россия  
Дата: 18.02.04 11:03
Оценка:
Здравствуйте, Vamp, Вы писали:

К>>Я в который раз порекомендую книжку "Язык Си в вопросах и ответах", где тема голых многомерных массивов освещена достаточно подробно.

V>Я вот не понимаю. Зачем они вообще были введены в язык при отсутствии человеческой их поддержки?
Ну, причины чисто исторические — совместимость с С.
Но с техпор довольно много всего понаделано — пора перестать их использовать и начать юзать вектор и прочие контейнеры. В крайнем случае — свое накропать.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[7]: Как создать двумерный массив произвольного размера?
От: Кодт Россия  
Дата: 18.02.04 11:44
Оценка: 4 (1)
Здравствуйте, 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;

так и по форме:
foo(T*begin, T*end);

struct arrayinfo { T*begin,*end; };
foo(arrayinfo a);

foo(arrayinfo* a);




Поскольку нет предпочтений между любым из этих способов — право выбора отдаётся программисту.
Естественно, с явной семантикой.
(В отличие от васика и дельфи, где имеется некая структура arrayinfo; в васике это скорее всего VARIANT).
Перекуём баги на фичи!
Re[5]: Как создать двумерный массив произвольного размера?
От: Кодт Россия  
Дата: 18.02.04 12:10
Оценка:
Здравствуйте, Ozone, Вы писали:

O>А как же быть с такой ситуацией, когда ты хочешь, например, текстовый файл записать в один массив? Куду ты денешься от char** str?


А почему сразу не char*** words?

Проблема разбиения большого текста на что-то более мелкое — это нетривиальная архитектурная задача.
Сильно зависит от содержимого и от того что ты хочешь с ним сделать.

И уж по-любому хранить большие данные в голых структурах (а не в контейнерах) — это не зло, но глупо.
Перекуём баги на фичи!
Re[8]: Как создать двумерный массив произвольного размера?
От: Vamp Россия  
Дата: 18.02.04 12:28
Оценка:
К>1. Си не противоречит сам себе.
....
И тем не менее, использовать их настолько неудобно, что я практически не знаю людей, которые их используют.
Да здравствует мыло душистое и веревка пушистая.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.