Форум программистов, компьютерный форум CyberForum.ru

Массив произвольной размерности и работа с ним - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.59
JollyRoger
2 / 2 / 0
Регистрация: 31.12.2012
Сообщений: 31
20.03.2013, 11:05     Массив произвольной размерности и работа с ним #1
Доброго времени суток. Появилась интересная задача: создать функцию для создания массива, размерность которого укажут в ходе программы(то есть не a[n] и n укажут-а а[q1][q2][q3][q4]..., и q1,q2... укажут, как и количество этих q, уже в процессе выполнения программы) и поменять местами первый с последним, второй с предпоследним и так далее элементы. Вопрос в следующем: как, собственно, создать такой массив, как сделать необходимое (изначально неизвестное) количество вложенных циклов для затрагивания всех элементов массива? Если вариантов несколько-то лучше самый простой и быстродейственный

З.Ы. Для количества вложенных циков-на ум приходит эллипсис, хотя с ним и гемор. А вот идей по созданию массива полный 0.
З.З.Ы. Создать строку вместо массива не предлагать-индусский код не для меня.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.03.2013, 11:05     Массив произвольной размерности и работа с ним
Посмотрите здесь:

C++ Даны две матрицы произвольной размерности
9. Матрица произвольной размерности, представленная раз* мерностями и динамическим массивом указателей на динамиче* ские массивы - строки матрицы. C++
Матрица произвольной размерности C++
Матрица произвольной размерности C++
Разработать класс Vector – геометрический вектор произвольной размерности C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
20.03.2013, 11:09     Массив произвольной размерности и работа с ним #2
Задача не интересная. Это даже не задача. Самое обычное выделение динамической памяти. new. Кол-во циклов у тебя уже известно, когда пользователь задаст размер массива.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
20.03.2013, 11:12     Массив произвольной размерности и работа с ним #3
Создать одномерный массив, размерности N = q1*q2*...*qn. А для доступа по n-мерным координатам сделать обертку, принимающую Point<N>.
JollyRoger
2 / 2 / 0
Регистрация: 31.12.2012
Сообщений: 31
20.03.2013, 11:29  [ТС]     Массив произвольной размерности и работа с ним #4
Vourhey, не смешно. Как выделять память через new я знаю, вопрос в том как создать массив произвольной РАЗМЕРНОСТИ а не РАЗМЕРА. То есть могут задать a[q1] а могут a[q1][q2][q3][q4][q5]...[q100500].
Tulosba, просил же не предлагать строку. Это не вариант.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
20.03.2013, 11:41     Массив произвольной размерности и работа с ним #5
Цитата Сообщение от JollyRoger Посмотреть сообщение
просил же не предлагать строку
У Вас, видимо, какое-то странное понятие "строки".
JollyRoger
2 / 2 / 0
Регистрация: 31.12.2012
Сообщений: 31
20.03.2013, 11:46  [ТС]     Массив произвольной размерности и работа с ним #6
Под строкой я имел в виду одномерный массив.
m1Rr0r
 Аватар для m1Rr0r
247 / 230 / 15
Регистрация: 05.02.2010
Сообщений: 3,213
Завершенные тесты: 2
20.03.2013, 12:40     Массив произвольной размерности и работа с ним #7
насколько я понимаю, произвольной размерности, нельзя создать
CollSpack
 Аватар для CollSpack
7 / 7 / 0
Регистрация: 21.01.2013
Сообщений: 55
20.03.2013, 12:50     Массив произвольной размерности и работа с ним #8
Вам лучше ознакомиться с STL - Vector.
И не придется создавать велосипед.
JollyRoger
2 / 2 / 0
Регистрация: 31.12.2012
Сообщений: 31
20.03.2013, 12:54  [ТС]     Массив произвольной размерности и работа с ним #9
Да я знаком. Вектор отличается от динамического массива тем, что можно количество элементов менять после того, как он создан, и тем, что для обмена элементов можно менять ссылки на них. Это не устраняет ни одной из 2х моих задач(создание многомерного массива и операции над ним).
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
20.03.2013, 13:01     Массив произвольной размерности и работа с ним #10
Кажется я понял, что нужно. По-моему тут рекурсия будет хорошим вариантом с точки зрения простоты реализации.
JollyRoger
2 / 2 / 0
Регистрация: 31.12.2012
Сообщений: 31
20.03.2013, 13:23  [ТС]     Массив произвольной размерности и работа с ним #11
Функция-рекурсия и для создания массива(используя то что ссылка на w[0]=*w) и для операций с ним, которая вызывает себя в цикле, но каждый раз уменьшая размерность на 1, и начинающая реальные операции только когда доходит до размерности в 1, то есть до строки...
Непросто, но да ладно. Есть только одна загвоздка в таком случае: w[0][0][0]=***w. И сколько этих звёздочек будет в массиве, знать заранее нельзя(размерность же). Как в таком случае передать ссылку на массив какой-то функции(в моём случае, функции перестановки)?

CollSpack, я и не хочу создавать велосипед, поэтому и написал сюда
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
20.03.2013, 13:27     Массив произвольной размерности и работа с ним #12
Цитата Сообщение от JollyRoger Посмотреть сообщение
Есть только одна загвоздка в таком случае: w[0][0][0]=***w. И сколько этих звёздочек будет в массиве, знать заранее нельзя. Как в таком случае передать ссылку на массив функции?
Ну можно передавать *ptr, по сути без разницы. Разница будет только на последнем этапе, когда нужно будет выделять память непосредственно под тип данных, но это тоже решаемо.
P.S. ты путаешь указатели и ссылки.
JollyRoger
2 / 2 / 0
Регистрация: 31.12.2012
Сообщений: 31
20.03.2013, 13:39  [ТС]     Массив произвольной размерности и работа с ним #13
Да я их вообще не различаю(указатели и ссылки) :о Разве это не одно и то же?
всмысле *ptr? Я знаю только один метод правильно послать массив n-той размерности в функцию: послать указатель n-той степени(то есть (n)w, вместо (n)-нужное количество звёздочек)+размерность отдельно посылать. Есть альтернатива части с n-тым количеством звёздочек?
SummerRain
 Аватар для SummerRain
325 / 324 / 17
Регистрация: 16.12.2012
Сообщений: 544
20.03.2013, 13:51     Массив произвольной размерности и работа с ним #14
Ссылка должна быть прикреплена к конкретному объекту, а указатель может быть сам по себе.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
20.03.2013, 13:52     Массив произвольной размерности и работа с ним #15
Цитата Сообщение от JollyRoger Посмотреть сообщение
Разве это не одно и то же?
Нет, скажем так: ссылки - это удобные указатели (с некоторыми ограничениями)


Цитата Сообщение от JollyRoger Посмотреть сообщение
Я знаю только один метод правильно послать массив n-той размерности в функцию: послать указатель n-той степени(то есть (n)w, вместо (n)-нужное количество звёздочек)+размерность отдельно посылать. Есть альтернатива части с n-тым количеством звёздочек?
На самом деле пока память выделяется под указатели совсем не важно сколько звездочек. Т.е. в рекурсии в каждом вызове можно использовать указатель с 2 звездочками, этого будет достаточно.
Другое дело что потом работать с этим N-мерным массивом хз как, если только опять через рекурсию, и то там костыли городить придеться.
JollyRoger
2 / 2 / 0
Регистрация: 31.12.2012
Сообщений: 31
20.03.2013, 14:26  [ТС]     Массив произвольной размерности и работа с ним #16
Окей-с, попробуем...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
**char arr_create(char* IdOfType, char **atop, int *dim_arr, int dim, int curr_dim=0){
//IdOfType-пока не нужен, для простоты будем создавать массив int'ов
//atop-ссылка большей на 1 размерности, чем наша. a[7] это atop от a[7][x];
//dim_arr-массив интов, содержит размерности массива
//dim-количество размерностей
//curr_dim-размерность в которой работаем, если не задано то 0
 int i;
 if(dim==curr_dim-1){   //то есть если это последняя размерность, ниже спускаться некуда. тут создаём строку int'ов.
  int **asdf=new int[dim_arr[curr_dim]];
  return asdf;
 }
 //else не пишу, return завершит выполнение функции если будет тот случай
 for(i=0;i<dim_arr[curr_dim];i++) arr_create(IdOfType, atop[i], dim_arr, dim, curr_dim+1);
}
Что-то вроде этого?) мне выдаёт ошибку "expected unqualified-id before 'char' " в первой строке функции. Вообще не совсем понял схему передачи ссылок с **...
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
20.03.2013, 14:30     Массив произвольной размерности и работа с ним #17
**char
что это?
Tulosba
20.03.2013, 14:40
  #18

Не по теме:

Цитата Сообщение от Vourhey Посмотреть сообщение
**char
что это?
Это значит: сначала надо освоить инструмент, а потом уже этим инструментом что-то делать.

JollyRoger
2 / 2 / 0
Регистрация: 31.12.2012
Сообщений: 31
20.03.2013, 14:48  [ТС]     Массив произвольной размерности и работа с ним #19
Это указатель на указатель на чар. Как я понял, Kastaneda имел в виду что у нас есть (n)w, где (n)-нужное количество звёздочек, и это указатель. Как *w его передать нельзя, но если сделать указатель на него-выйдет **r, и его уже можно передавать. Хотя я считаю, что если r-указатель на (n)w, то это будет (n+1)r, а не (2)r.
хз вообще
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.03.2013, 14:50     Массив произвольной размерности и работа с ним
Еще ссылки по теме:

C++ Задано массив строк произвольной длины. Отформатировать данный массив по ширине поля.
C++ Из двух целочисленных массивов различной размерности сформировать общий массив. Упорядочить полученный массив
C++ Характеристический многочлен матрицы произвольной размерности

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
20.03.2013, 14:50     Массив произвольной размерности и работа с ним #20
Цитата Сообщение от JollyRoger Посмотреть сообщение
Это указатель на указатель на чар.
Это не он.
Yandex
Объявления
20.03.2013, 14:50     Массив произвольной размерности и работа с ним
Ответ Создать тему
Опции темы

Текущее время: 18:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru