PDA

Просмотр полной версии : Вопросы кода



superregistr
28.07.2009, 23:21
По мере разработки игры неизбежно будут возникать вопросы, как написать то или се в коде. Поэтому решил создать соответствующую тему, в которой будем помогать друг другу.

Вот впервые столкнулся с проблемой в C++ создать многомерный динамический массив. У меня куча книг по C++ , но оказалось, что ни в одной толком ничего не написано и уж тем более ничего не объяснено по этому вопросу. Проблема такая: нужно создать трехмерный динамический массив и в дальнейшем присвоить ему значения. Как это сделать с помощью оператров new ?

Aku_Aku
28.07.2009, 23:55
поройся в в манах по STL (надеюсь знаеш что таеое)

на пример типа vector

многомерные строятся на его основе с помощью еще одного типа slice

о new забудь

superregistr
29.07.2009, 00:04
<div class='quotetop'>Цитата</div>
поройся в в манах по STL (надеюсь знаеш что таеое)[/b]
Не знаю.

<div class='quotetop'>Цитата</div>

на пример типа vector
многомерные строятся на его основе с помощью еще одного типа slice
[/b]
Что за типы? Мне динамическую величину создать надо и все. А точнее многомерный массив. И узнать как с ним работать. Как ему присвоить значения и как вдальнейшем с ним оперировать.

<div class='quotetop'>Цитата</div>

о new забудь
[/b]
В книгах рекомендуется new для создания и delete для удаления. Но там сложности с указателями возникают.

superregistr
29.07.2009, 00:15
Короче хочу создать трехмерный динамический массив типа float или GLfloat array[n][3][3], где n - число треугольников на сфере, 3 - число точек в треугольнике, 3 - число координат точки. Потом этот массив должен принять определенные значения, с помощью которых определяется следующий динамический массив (для следующей итерации), потом старый массив удаляется и создается заново с размерность нового. Старый принимает значения нового, потом новый удаляется. Все это происходит в цикле. Вот так вот.

superregistr
29.07.2009, 00:36
Как я понимаю нужно сделать указатель на указатель на указатель одномерного динамического массива и с ним уже оперировать. :huh:

Monster
29.07.2009, 01:11
В данной ситуации правильнее определить структуру/класс "ТреугольникType", после чего создать одномерный массив этого класса.

sweeper
29.07.2009, 07:17
...а также ссылки на соседние треугольники, хранение ребер как отдельных объектов, связи между ребрами, образующими общую границу, координаты центра, направления на центры соседних треугольников.

слайсы? не уверен, что это полезно. В чем принципиальная разница:
listobject[idx].X или
listobject.sliceX[idx] ?

Peter
29.07.2009, 08:15
vector<vector<vector<...>>>
или массив указателей на указатели на массивы :lol:
ps: на c++ не пишу

Aku_Aku
29.07.2009, 10:59
просто в C++ отсутствует встроенная поддержка массивов размерности больше 1. Была когда-то поддержка двумерных, унаследованая еще от С, но от неё отказались (сам как-то столкнулся) -- неэффективно.

Так что, сейчас возможности другие -- или использовать слайсы. Или, как уже предлагали, определять класс Triangle и хранить в масиве уже его.

<div class='quotetop'>Цитата</div>
Короче хочу создать трехмерный динамический массив типа float или GLfloat array[n][3][3], где n - число треугольников на сфере, 3 - число точек в треугольнике, 3 - число координат точки. Потом этот массив должен принять определенные значения, с помощью которых определяется следующий динамический массив (для следующей итерации), потом старый массив удаляется и создается заново с размерность нового. Старый принимает значения нового, потом новый удаляется. Все это происходит в цикле. Вот так вот.[/b]

Э-эх. :) Учить вас еще и учить.
Зачем тебе динамический массив здесь? В цикле?
У тебе что, количество вершин так резко меняется???
Ты что не понимаеш, что каждый раз создавая/удаляя массив занимаешся выделением/удалением памяти под него. :) Да еще в цикле. :shock:
Зачем тебе вообще динамический массив? Чем тебе не понравилась локальная переменная, которая стековая? :)

Столько народу,потратило столько времени, чтобы наработать достаточное количество готовых эффективных решений для С++. И все равно, каждый новичек тянет за собой тучу неэффективных, заученных из других языков.
А потом еще кричат -- "С++ плохой язык". :whistle:

http://www.codenet.ru/progr/cpp/stl/istl.php

Вот. Неплохое введение в СТЛ
чтобы не говорили что я посылаю куда-то не туда. :)

Вот цитата оттуда

<div class='quotetop'>Цитата</div>
Контейнеры

Библиотека STL имеет в своем арсенале элементы, называемые контейнерами. Контейнеры - это объекты, хранящие в себе другие объекты. В STL таких контейнеров десять:

vector - массив с произвольным доступом, чаще всего применяемый в тех случаях, когда надо последовательно добавлять данные в конец цепочки;[/b]

вообще
контейнеры СТЛ разработаны так, что их можно использовать как локальные стековые (а не динамические, хотя и как динамические можно) -- все сложности УЖЕ упрятаны внутри, нет нужды лезть разбиратся с указателями.

Хм...
я там немного ошибся
для такого массива лучше взять класс valarray

Aku_Aku
29.07.2009, 11:09
Вот.

http://www.dbebooks.ru/4/jazyki-programmir...istov-na-s.html (http://www.dbebooks.ru/4/jazyki-programmirovanija/ssvisual-c/3063-stl-dlja-programmistov-na-s.html)

Вообще книжку можно скачать

superregistr
29.07.2009, 11:30
Кто ищет, то найдет, кто хочет, тот добьётся.

[code]
//создание и удаления двухмерного динамического массива
int **pArr = new int*[dim1];
for (i = 0; i < dim1; i++) pArr[i] = new int[dim2];

for (i = 0; i < dim1; i++) delete[] pArr[i];
delete[]pArr;

//создание и удаления трехмерного динамического массива
int ***ppArr;
ppArr = new int**[dim1];
for (i = 0; i < dim1; i++) ppArr[i] = new int*[dim2];

for (i = 0; i < dim1; i++)
{

superregistr
29.07.2009, 11:49
<div class='quotetop'>Цитата(Aku_Aku * 29.7.2009, 10:59) 297575</div>

Э-эх. :) Учить вас еще и учить.
Зачем тебе динамический массив здесь? В цикле?
У тебе что, количество вершин так резко меняется???
Ты что не понимаеш, что каждый раз создавая/удаляя массив занимаешся выделением/удалением памяти под него. :) Да еще в цикле. :shock:
Зачем тебе вообще динамический массив? Чем тебе не понравилась локальная переменная, которая стековая? :)
[/b]
Мне всего 5 циклов (итераций) надо, чтобы получить хорошую сферу (см. прогу Генерала). Массив считатеся один раз и навсегда, просто потом его надо сохранить в файле и вдальнейшем уже грузить из файла :umnik:

Если во всех книгах рекомендуют определять многомерный динамический массив через указатели на одномерный и с помощью операторов new и delete, значит это неспроста, значит это не просто так :umnik:

Aku_Aku
29.07.2009, 12:14
<div class='quotetop'>Цитата</div>
Массив считатеся один раз и навсегда, просто потом его надо сохранить в файле и вдальнейшем уже грузить из файла[/b]

А вот если б ты не выдумывал велосипед, а прочитал бы ман, то знал бы, что у встроенных контейнеров СТЛ уже реализована функция записи в файл ;). Равно как и чтения.

А тебе еще со своим динамическим для этого еще с циклами возится.

<div class='quotetop'>Цитата</div>
Если во всех книгах рекомендуют определять многомерный динамический массив через указатели на одномерный и с помощью операторов new и delete, значит это неспроста, значит это не просто так[/b]

То такие специалисты книги пишут. :)
Кстати. А какие это "все книги"? Какого они года выпуска?

Monster
29.07.2009, 14:52
<div class='quotetop'>Цитата(Finansist&#39;s sworn brother * 29.7.2009, 13:30) 297582</div>

Кто ищет, то найдет, кто хочет, тот добьётся.


//создание и удаления двухмерного динамического массива
...
//создание и удаления трехмерного динамического массива
...

:harhar:
[/b]
Замечаю, что в программировании большинство новичков не желает следовать совету более опытных коллег. Если они задались целью пробить стену молотком им бесполезно указывать, что выйти через дверь проще и быстрее. В лучшем случае, они возьмут молоток побольше. Возможно, в этом есть какой-то высший смысл...
Но тогда зачем задавать вопросы на форуме?

superregistr
29.07.2009, 15:25
Monster
Да, чувак, ты сильно помог. Твой пост прямо кишит помощью. :huh1:

Ой, точнее, два твоих поста.

Каждый понемногу блеснул своими знаниями :) на этом помощь закончилась :(

Aku_Aku
29.07.2009, 15:53
Sorry pal

Но если ты воспринимаеш помощь как что-то другое, отличное от способности поделится толковой информацией по теме, подсказать.
Например если ждешь что тебя кто-то за ручку будет переводить через трудные места. Читать вместо тебя мануалы...

Знаеш. Мое желание помагать ты довольно таки серьозно подкосил. Такими претензиями. Может так случится? что в следующий раз, мне уже не захочется так морочится, подсказывать. Ограничусь емким и ясным -- RTFM.

Dr Gobbels
29.07.2009, 15:57
Дык, ФСБ, и хотел бы помочь - но толком не могу, мои познания в С++ ниже, чем нужно.

Могу только, несколько умозрительно, возможно, обратить твоё внимание на С#: мои собственные заморочки там разрешились с чарующей простотой (Петеру спасибо :bye:).

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

Monster
29.07.2009, 17:08
<div class='quotetop'>Цитата(Finansist&#39;s sworn brother * 29.7.2009, 17:25) 297609</div>

Monster
Да, чувак, ты сильно помог. Твой пост прямо кишит помощью. :huh1:

Ой, точнее, два твоих поста.
[/b]
Значит, на первый пост ты просто не обратил внимание? Тогда понятно.
Действительно, Aku_Aku, желание помогать подкосилось.

superregistr
29.07.2009, 18:39
Всем спасибо, кто искренне хотел помочь :) Форум программистов помог :.V.:

Aku_Aku
29.07.2009, 18:58
Какой именно? Если не секрет? ;)

superregistr
29.07.2009, 19:07
<div class='quotetop'>Цитата(Monster * 29.7.2009, 17:08) 297629</div>

желание помогать подкосилось.
[/b]
ну знаешь, твоми советами да мир перестроить.

Аку_Аку, тебе я ничего обидного не говорил, просто думаю стандартная библиотека шаблонов здесь (именно в этой проге) не к месту. Я имел в виду Монстра с его просто офигенным советом (как же я сам не догадался :huh1: ), а не тебя.

<div class='quotetop'>Цитата</div>
Знаеш. Мое желание помагать ты довольно таки серьозно подкосил. Такими претензиями. Может так случится? что в следующий раз, мне уже не захочется так морочится, подсказывать. Ограничусь емким и ясным -- RTFM. [/b]
Твое право. Это дело добровольное.

Aku_Aku
29.07.2009, 19:19
<div class='quotetop'>Цитата</div>
ну знаешь, твоми советами да мир перестроить.[/b]

уж какие есть

<div class='quotetop'>Цитата</div>
просто думаю стандартная библиотека шаблонов здесь (именно в этой проге) не к месту.[/b]

Интересно услышать твои аргументы, почему так?
Чем по-твоему постоянное ручное перевыделение памяти, плюс явное использование указателей, лучше?

Мне, понимаеш, хочется знать аргументацию человека, с которым мне может придется не один кил строк кода писать. ;)

<div class='quotetop'>Цитата</div>
Я имел в виду Монстра с его просто офигенным советом (как же я сам не догадался ), а не тебя.[/b]

Опять же вопрос. Чем его предложение такое неправильное?
Ведь таким образом тебе как минимум не пришлось бы писать кучу вложеных циклов.

<div class='quotetop'>Цитата</div>
Твое право. Это дело добровольное.[/b]

А всетаки. Можеш кинуть линку того профи-форума, где тебе оказали такую помощь? Просто интересно?

superregistr
29.07.2009, 23:56
ИХМО, обидно после 2-х недельной кропотливой работы над алгоритмом и над реализацией его в коде получать плевки в свой адрес.

ЗЫ Исходники выложил, переделай прогу с помощью стандартной библиотеки шаблонов, заодно и посмотрю как она работает.

sweeper
30.07.2009, 08:12
<div class='quotetop'>Цитата(Finansist&#39;s sworn brother * 30.7.2009, 1:56) 297690</div>

ИХМО, обидно после 2-х недельной кропотливой работы над алгоритмом и над реализацией его в коде получать плевки в свой адрес.
[/b]Привыкай, Микрософт уже тридцать лет такие плевки получает.

superregistr
18.08.2009, 08:32
В книге Мейерса "Эффективное использование STL" автор обсуждает, почему использование контейнеров лучше чем динамический массив. Единственный его аргумент, вы можете забыть потом delete[].

superregistr
10.11.2009, 13:26
Форум разработчиков: http://forum.developing.ru/showthread.php?p=71475

PS Там помогут, если задать правильный и интересный вопрос, но только по прошествии некоторого времени :umnik: (хотя гораздо быстрее разобраться самому ;) )

superregistr
15.11.2009, 23:50
Ломаю сейчас голову, как записать контейнер-вектор, состоящий из чисел типа флоат, в файл. Максимум, что удалось: записать в файл символ типа чар. Если б это удалось, то программка-пример "рельеф на сферической Земле" была бы почти в кармане.

superregistr
16.11.2009, 18:52
Форум по Qt4 и всякому другому: http://www.forum.crossplatform.ru

Eugene7
17.11.2009, 05:35
<div class='quotetop'>Цитата(humanist * 16.11.2009, 2:50) 314821</div>

Ломаю сейчас голову, как записать контейнер-вектор, состоящий из чисел типа флоат, в файл. Максимум, что удалось: записать в файл символ типа чар. Если б это удалось, то программка-пример "рельеф на сферической Земле" была бы почти в кармане.
[/b]

[code]
vector<float> vect;

superregistr
17.11.2009, 15:29
Спасибо, я все же приверженец библиотеки Qt. STL и msdn конечно хорошо, но оказывается все также реализовано и в Qt4.

[code]
#inсludе<QIODevice>
//...
QVector<float> A; // аналог (vector<float> A;) из STL

Eugene7
17.11.2009, 16:26
<div class='quotetop'>Цитата</div>
Спасибо, я все же приверженец библиотеки Qt. STL и msdn конечно хорошо, но оказывается все также реализовано и в Qt4[/b]
Забавно :)
Во первых, msdn - это не библиотека, это огромная, полторагиговая справка, по сути библия программиста. В ней есть информацию очень о многом.
Во вторых - где ты увидел STL? fopen/fwrite это стандартные С++ функции, существовали еще до STL, и никак с ней не связаны вообще.
STL - это Standart Template Library, или библиотека шаблонов. В основном в ней реализованы контейнеры. И кстати, наиболее быстрая реализация, в отличии от постороних библиотек.
Я тебе привел пример самой стандартной записи в файл, работающей на любой платформе. А вообще в файл можно писать хоть на QT, WinApi, MFC, DirectX и многом другом. Даже через питоновские скрипты можно сохранять в файл :)

В третих, QT - это библиотека для десктоп приложений. Игры ты на ней не напишешь.
Ах да, для коммерческого использования она платная. Даже использование из неё контейнеров и записи в файл привяжет любую программу к некоммерческому распостронению, или придется выложить от двух до почти четырех тысяч долларов :)

И наконец, зачем вообще задаешь вопрос?

edit. Почитал всю тему, понял. Зря я полез отвечать :(

superregistr
17.11.2009, 19:09
<div class='quotetop'>Цитата</div>
msdn - это не библиотека, это огромная, полторагиговая справка, по сути библия программиста. В ней есть информацию очень о многом.
[/b] Я не знал, решил, что ты про какую-то библиотеку говоришь. Я непрофессиональный программист, скорее начинающий.

<div class='quotetop'>Цитата</div>

где ты увидел STL
[/b]

<div class='quotetop'>Цитата</div>

vector<float> vect;
vect.push_back(4.4);
vect.push_back(5.5);
vect.push_back(444.6);
[/b] ;)

<div class='quotetop'>Цитата</div>
STL - это Standart Template Library, или библиотека шаблонов. В основном в ней реализованы контейнеры. И кстати, наиболее быстрая реализация, в отличии от постороних библиотек.
[/b] Qt4 быстрее работает со своей собственной библиотекой, полностью аналогичной STL.

<div class='quotetop'>Цитата</div>
В третих, QT - это библиотека для десктоп приложений. Игры ты на ней не напишешь.[/b]
Здрасьте. В QT я использую OpenGL для графики. Это+собственные возможности QT дают все, чтобы писать игры. Тоже самое я мог бы сделать скажем на GLUT, только у QT возможностей больше.

<div class='quotetop'>Цитата</div>
Ах да, для коммерческого использования она платная.[/b] Есть коммерческая версия и свободная версия. Разница лишь в том, что если ты используешь свободную версию, то должен выкладывать открытый код вместе с релизом.

<div class='quotetop'>Цитата</div>
И наконец, зачем вообще задаешь вопрос?
[/b] Почему только я один задаю вопросы???

<div class='quotetop'>Цитата</div>
Почитал всю тему, понял. Зря я полез отвечать :( [/b] Не расстраивайся! Лучше присоединяйся к проекту!

ЗЫ
Вдруг кому-нибудь еще пригодиться:
[code]
// #inсludе<QIODevice>
// ...
QVector<float> A1;
// определяю вектор A1
//...
// записываю вектор A1 в текстовый файл
QFile file1("file.txt");
file1.open(QIODevice::WriteOnly);
QTextStream out1(&file1);
for (int i=0; i<A1.size(); i++)
out1 << A1[i]

Monster
17.11.2009, 19:44
<div class='quotetop'>Цитата(sweeper * 30.7.2009, 10:12) 297713</div>

<div class='quotetop'>Цитата(Finansist&#39;s sworn brother * 30.7.2009, 1:56) 297690

ИХМО, обидно после 2-х недельной кропотливой работы над алгоритмом и над реализацией его в коде получать плевки в свой адрес.
[/b]Привыкай, Микрософт уже тридцать лет такие плевки получает.
[/b][/quote]
Sweeper, отвечу, хотя и с сильным запозданием. :shy2:
Аналогии с мелкомягкими здесь нет. Они получают свои плевки за качество работы (которое, кстати говоря, в последие годы стало намного лучше).
Я же высказался по поводу того, что автор задавая вопрос, не вникает в ответы и решает задачу своим способом.
Мне знаком такой тип людей, доказывать им бесполезно, они должны дойти до всего сами.
Хозяин - барин, конечно, но зачем тогда задавать вопросы, мне так и непонятно.

superregistr
17.11.2009, 22:31
<div class='quotetop'>Цитата</div>
Я же высказался по поводу того, что автор задавая вопрос, не вникает в ответы и решает задачу своим способом.[/b] Ну вообщем, ты неправ тут. Я стал использовать вектора вместо возни с динамическими массивами, так что ответы оказались полезными.

Eugene7
17.11.2009, 23:02
Когда тебе писали об этом, ты не принял, и решил по своему через new/delete(кстати, за такое решение в нормальных софтовых фирмах увольняют ныне в кризисные времена). Потом дошел сам до векторов. Все как он и написал.


По поводу того, что ты мне ответил, спорить не охото, отвечу кратко.
Вектор stl я взял для примера, речь то шла о том, КАК ложить в файл, а не ЧТО ложить туда. Можно было взять хоть нативный интегеровский массив. Не суть важно.
Считаешь что QT быстрее? Считай, спорить не буду. Со временем возможно изменишь мнение.
И по поводу открытия исходного кода - ты лишь дополнил мои слова. Написав КОММЕРЧЕСКУЮ программу(продаваемую за деньги), ты не захочешь выкладывать её исходники :) Так что, как я и сказал, либо для некоммерческого использования, либо выложить 2-4к баксов( http://qt.nokia.com/products/pricing )

superregistr
18.11.2009, 11:58
<div class='quotetop'>Цитата(Eugene7 * 17.11.2009, 23:02) 315054</div>

Когда тебе писали об этом, ты не принял, и решил по своему через new/delete(кстати, за такое решение в нормальных софтовых фирмах увольняют ныне в кризисные времена). Потом дошел сам до векторов.[/b] Здесь идет речь про процесс перехода от неизвестного к известному. Неизвестное всегда кажется пугающим, сложным, непонятным. Известное, наоборот, кажется ясным, легким, простым. Когда речь шла о векторах, они были мне неизвестны. Главное, что произошел переход от неизвестного и известному.

<div class='quotetop'>Цитата</div>

Вектор stl я взял для примера, речь то шла о том, КАК ложить в файл, а не ЧТО ложить туда. Можно было взять хоть нативный интегеровский массив. Не суть важно.
[/b]
может я и что-то не так понял, спорить не буду.

<div class='quotetop'>Цитата</div>

Считаешь что QT быстрее? Считай, спорить не буду. Со временем возможно изменишь мнение.
[/b] Собственно вопрос: ты работал на QT? Можно пользоваться кроссплатформенной библиотекой GLUT для OpenGL (это собственная библиотека для OpenGL). Не знаю, может она и по-быстрее. Но QT мне кажется по-мощнее. О существовании других библиотек мне неизвестно, если знаешь, подскажи. Borland C++ и Microsoft Visual C++ не в счет, т.к. некроссплатформенные.

<div class='quotetop'>Цитата</div>

И по поводу открытия исходного кода - ты лишь дополнил мои слова. Написав КОММЕРЧЕСКУЮ программу (продаваемую за деньги), ты не захочешь выкладывать её исходники :) [/b]
Вся разница в том какой исходник. Я могу удалить из исходника своего все комментарии, попробуй разберись что там и где. Каждый программист знает, что проще написать свою программу, чем разобраться в чужой. Формально я соблюдаю лицензионное соглашение и выкладываю открытый код. Другое дело, что без коментариев и объяснений он бесполезен.

swan
18.08.2010, 11:34
Помри, бот хренов :)

PavelZ
24.08.2010, 06:16
<div class='quotetop'>Цитата</div>
Ну вообщем, ты неправ тут. Я стал использовать вектора вместо возни с динамическими массивами, так что ответы оказались полезными.
[/b]
Товарищи и вправду хотят помочь, каждый по своему, ты же, либо из-за сильно буйного темперамента, либо отсутствия такта, либо и то и другое вместе посылаешь всех подальше. Если не хочешь будь всегда одним, научись сдерживать эмоции и быть тактичным к окружающим.

В QT и вправду почти всё есть, для программирования, игру на ней сделать можно. Но любой универсальный инструмент имеет один серьёзный недостаток -- монструозность. Да во многих случаях достаточно для работы пассатижей, и гвоздь забить и тут же его вытащить, гайку открутить, тот же гвоздь выровнять... Но профессионал пользуется большим количеством простых, но имеющих специальное применение инструментов. Да, ты говоришь, что профессионалом не являешься, да понятно стремление взять универсальный набор на все случаи жизни... Но не отказывайся от предложений использовать удобные профессиональные инструменты, валяющиеся под ногами.

Опытные программисты всё таки предпочитают использовать несколько лёгких библиотек, посмотри вес своей программы в комплекте с QT, да и скорость её работы оставляет желать лучшего, как бы ты тут не распинался. В то же время ни чего необычного в твоём поведении нет. Начинающий часто предпочитает набить шишки сам, чем прислушиваться к чужому мнению, это особенность человеческого поведения, даже более скажу -- особенность работы человеческого мозга, когда информация лучше усваивается в процессе проб и ошибок, нежели копировании наработок других людей. Иногда это даже приносит положительный результат, ты можешь случайно сделать что-то лучше других. В большинстве своём, мы поступая подобным образом, только тратим время впустую, гениями не всем суждено родится к сожалению.

В любом случае удачи :)

General
29.08.2010, 01:04
Самые используемые алгоритмы
http://habrahabr.ru/blogs/algorithm/102889/#habracut