Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Delphi (до версии 2009) - часть 5

Автор: apnss
Дата сообщения: 11.04.2010 11:58
Frodo_Torbins

Цитата:
Проследите, чтобы и библиотеки и приложение использовали общий менеджер памяти.


в случае использования widestring это не обязательно и бесполезно т.к. при работе с widestring юзаются функции SysAllocString, SysReallocString , SysFreeString , а следовательно используется системный менеджер памяти (изначально это было сделано для совместимости с COM)

и опять же повторюсь на 2009м все работает как часы. На самом деле уже принято решение, выделен бюджет и ресурсы на создание своих dll с расширенным функционалом совместимым с д2010.
Автор: V1s1ter
Дата сообщения: 11.04.2010 12:02
svs123456789
Сразу определись план или 3D иначе будут проблемы.
Если 3D, то однозначно
Цитата:
opengl или directx

Есть куча билиотек. Вот например Omega sdk, Asphyre, GLScene, или вот наборчик от KSDev BlockEngine, DXScene, VGScene.
Очень важно знать какие действия будут кроме визуализации, например, как заносить исходжные данные, где их хранить, как редактировать и т.п.
В принципе, если речь идет о редакторе, то у меня есть собственное готовое решение на OpenGL, вот пример редактора, который я использую для тестирования.
http://www.onlinedisk.ru/file/403777/
Версия не последняя, но полное представление даст.
Автор: Odysseos
Дата сообщения: 11.04.2010 12:11
Bonivur

А разве Вы что-то упоминали про оптимизацию? И разве Вы где-то сформулировали критерий, что такое - логичнее? Компьютер устроен не так, как человеческий мозг, ему надо "объяснить", что такое "логичнее". То есть - надо описать все критерии, согласно которым надо выбирать именно такое, а не иное, расположение нот на грифе в каждом случае, обощить эти случаи, а потом запрограммировать.

...Вернемся к началу - я ведь с самого начала спросил, абстрактная ли задача, или это - на самом деле реальный построитель аппликатур? Если б это была задача для лабораторной (например) - она бы решалась легко и просто. Если же это реальная задача, да еще и с требованиями находить удобную позицию для пальцев - то это, простите, уже достаточно сложная задача, чтоб решать ее просто так, из чистого интереса.
Автор: Bonivur
Дата сообщения: 11.04.2010 12:34
Odysseos
Вопрос не в логичности. Алгоритм, который я ищу, должен находить ВСЕ возможные позиции для данного аккорда - удобные и неудобные. Предложенный Вами находит лишь одну позицию для аккорда, что, согласитесь не достаточно для решения задачи. Возможно ли изменить Ваш алгоритм так, чтобы он продолжал находить другие варианты аккорда в данной позиции? Так вот вопрос в том, возможно ли решить такую задачу перебором (циклами)? Если да, то как задать параметры окончания цикла? Как узнать, что все возможные варианты были уже найдены? Вот основная проблема - механизм решения.
Автор: Odysseos
Дата сообщения: 11.04.2010 13:33
Bonivur

Возможно ли изменить Ваш алгоритм так, чтобы он продолжал находить другие варианты аккорда в данной позиции?

Изменить - вряд ли. А вот написать именно для поиска всех - конечно, можно.

Нужны новые структуры данных - нечто вроде:


Код:
type
TStringNum = 1 .. 6;
TStringTune = record
Tune: TTune;
Pos: Integer;
end;
TStringTunes = array of TStringTune;
var
AllChordTunes: array [TStringNum] of TStringTunes;
Автор: Bonivur
Дата сообщения: 11.04.2010 14:33
Я так понял нужно 6 массивов для каждой струны, чтобы держать данные по нотам и соответствующим позициям? То есть допустим,

struna[1].Tune = F;
struna[1].Pos=1;
struna[3].Tune=A;
struna[3].Pos=2 etc ?

Потом значит 6 циклов один-в-другом чтобы перебрать все варианты? И еще - возможно что на одной струне будут найдены 2 ноты для данного аккорда, на другой 1 а на третьей вообще ни одной. Как быть?
Автор: svs123456789
Дата сообщения: 11.04.2010 15:40
можно будет потом посмотреть на эту прогу про аккорды?
Автор: Odysseos
Дата сообщения: 11.04.2010 16:40
Bonivur

Я так понял нужно 6 массивов для каждой струны, чтобы держать данные по нотам и соответствующим позициям?

Нет. Нужно по одному динамическому массиву на каждую струну, _всего_ шесть массивов.

Потом значит 6 циклов один-в-другом чтобы перебрать все варианты?

Можно так, да.

И еще - возможно что на одной струне будут найдены 2 ноты для данного аккорда, на другой 1 а на третьей вообще ни одной. Как быть?

Как я уже указал выше - динамические массивы. Цикл по пустой струне просто не выполняется.
Автор: Bonivur
Дата сообщения: 11.04.2010 17:23
Odysseos
Спасибо. Буду пробовать...

P.S. Как обратиться к массиву AllChordTunes?
AllChordTunes[1].Pos:=1; - не получается. Не встречался с такими массивами записей. Помогите плиз.
Автор: Odysseos
Дата сообщения: 11.04.2010 18:12
Bonivur

Как обратиться к массиву AllChordTunes?

Динамический массив в Delphi (начиная с 3-й версии, кажется, они появились) - это массив переменной длины, длину которого можно менять "на лету" процедурой SetLength(dyn_array, new_length). Также можно прлучить его длину - Length(dyn_array), индекс первого - Low(dyn_array), и последнего - High(dyn_array), - элементов (в текущих реализациях Delphi динамические массивы всегда индексируются от 0 до Length() - 1, но это может измениться в будущем, потому лучще использовать именно Low и High; собственно, это касается всех массивов, не только динамических - чтобы в случае изменения индексации не лазать по всему коду и не искать все куски, где есть проход по элементам массива).

AllChordTunes же - это массив массивов, причем - в каждой ячейке статического массива находится динамический массив. То есть - для того, чтоб добавить новую ноту для струны n, надо сделать следующее:


Код:
SetLength(AllChordTunes[n], Length(AllChordTunes[n]) + 1);
AllChordTunes[n][High(AllChordTunes[n])].Pos := ...;
AllChordTunes[n][High(AllChordTunes[n])].Tune := ...;
Автор: apnss
Дата сообщения: 11.04.2010 18:23
сорри, что влезаю в разговор, но, имхо, в вашем случае проще юзать TList, а если элемент структуры можно идентифицировать строкой, то TStringList (AddObject, IndexOf).

Использование динамических массивов, для которых часто выполняется SetLength, приводит к сильной фрагментации памяти выделенной приложению
Автор: Bonivur
Дата сообщения: 11.04.2010 20:21
Odysseos
Про Low, High, SetLengh, Length я знал. А вот про использование массива массивов нет Спасибо. Сижу пыхтю, но пока не получается сваять рабочий цикл.

apnss
Попробую и TList.
Автор: Odysseos
Дата сообщения: 11.04.2010 20:24
apnss

Использование динамических массивов, для которых часто выполняется SetLength, приводит к сильной фрагментации памяти выделенной приложению

Во-первых - TList (а равно и TStringList) переаллоцируют память ровно так же (просто реже).

Во-вторых - какой смысл городить огород с написанием собственного класса элементов списка (или хотя бы с динамическим выделением/освобождением памяти под записи - что, кстати тоже будет вызывать фрагментацию памяти) для записи из двух элементов и для алгоритма, где этих переаллокаций - в реальной работе - будет максимум две?..
Автор: apnss
Дата сообщения: 11.04.2010 21:08
во-первых перераспределяется память только под изменяемые элементы списка, а не под весь массив в случае динамического массива... по большому счету при работе с ТList'ом идет многоразовое использование памяти в виду того что размер элементов структуры указаетли на которые хранит список зачастую одинаков. в случае дин массива КАЖДОЕ использование SetLength приводит к созданию копии этого массива +- дельта.

во-вторых есть такая вещь как ООП, слыхали? так вот что по вашему мнению к ней ближе динамический массив или все же объект содержащий список?
Автор: Odysseos
Дата сообщения: 11.04.2010 23:03
apnss

О-о-оххх...

во-первых перераспределяется память только под изменяемые элементы списка

Ну, считаем:

1. вариант с дин. массивом:

- добавляем первый элемент - выделяем память под 8-мь байт
- добавляем второй элемент - перевыделем память под 16-ть байт
- и так еще пять раз (потому что дин. массивов 6-ть)
- освобождаем все шесть блоков - каждый раз одной операцией

2. вариант в TList'ом и указателями:

- выделяем память под сам объект TList (х.з. знает, сколько, лень смотреть - но байт 30-40 наверняка)
- выделяем 16-ть байт под внутренний дин. массив указателей (TList инициализируется с Capacity = 4, 4 * SizeOf(Pointer) = 16)
- добавляем первый элемент - выделяем память под 8-мь байт записи (в TList'е ничего не меняется, потому как Count < Capacity)
- добавляем второй элемент - выделяем память под 8-мь байт записи (в TList'е ничего не меняется, потому как Count < Capacity)
- и так еще пять раз
- освобождаем для каждого TList'а по 8-мь байт для каждого элемента (6 * 2 = 12 освобождений)
- освобождаем сами TList'ы - еще шесть освобождений

Сами посчитаете, где тут больше аллокаций/реаллокаций/освобождений?

во-вторых есть такая вещь как ООП, слыхали?

А Вы поговорку про пушку и воробьев слыхали? Зачем использовать ООП для 10-ти строчного алгоритма?
Научитесь правильно выбирать иснтрументы и распределять силы - приходите.

так вот что по вашему мнению к ней ближе динамический массив или все же объект содержащий список?

Если под объектом, содержащим список, имеется в виду TList - то это еще тот пример ООП, ага

...Я так думаю, что пора завязывать с флудом и троллингом.
Автор: apnss
Дата сообщения: 12.04.2010 00:10
1. нет не так Учите матчасть
память под дин массив выделяется сразу под все элементы, а не так как вы описали
2. если уж все равно по юнитам ходили не нужно было торопиться, а взглянуть на то что в основе TList лежит как раз дин масcив поинтеров . а арифметика у каждой делфи своя. и пытаться описать логику стандартных объектов дело неблагодарное.

Цитата:
А Вы поговорку про пушку и воробьев слыхали?

Так зачем вы в делфи подались. Линейный турбо паскаль рулит.

Цитата:
Зачем использовать ООП для 10-ти строчного алгоритма?

порядок должен быть во всем. особенно при использовании модульного метода программирования когда код пишется под многоразовое использование. А не как у вас. ФОРМАЛЬНЫЙ ПОДХОД К РЕШЕНИЮ ЗАДАЧ (АБЫ ОТСТАЛИ) ни к чему не приведет. Разве что к постоянному переписыванию одних и тех же алгоритмов раз за разом т.к. разобраться в том, что написали ранее дороже, чем написать с изново. и тут мы приходим к

Цитата:
Научитесь правильно выбирать инструменты и распределять силы - приходите.

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

Цитата:
TList - то это еще тот пример ООП

А чем хоть он вам не угодил ? На нем 50% всех компонентов сделано или по его подобию.

Цитата:
Я так думаю, что пора завязывать с флудом и троллингом.

согласен - пустой разговор
Автор: psa1974
Дата сообщения: 12.04.2010 01:46

Odysseos

Цитата:
Научитесь правильно выбирать иснтрументы и распределять силы - приходите.

apnss

Цитата:
нет не так Учите матчасть

А вы не подеретесь... А если серьезно - давайте как-то все-таки терпимее друг с другу, что-ли ... Не надо таких громких лозунгов, ага.
Автор: Odysseos
Дата сообщения: 12.04.2010 01:58
apnss

нет не так Учите матчасть

Послушайте-ка, тролль, хамить хватит.


память под дин массив выделяется сразу под все элементы, а не так как вы описали


Код:
SetLength(dyn_array, 1); // выделили память под первый элемент
SetLength(dyn_array, Length(dyn_array) + 1); // перевыделили память для Length() + 1 элементов
Автор: psa1974
Дата сообщения: 12.04.2010 03:29
Odysseos
apnss
Будьте так добры, перенесите вашу полемику о том, кто прав, кто неправ в личку и бейте там морду друг другу сколько влезет. Пока обсуждались программирование гитар, струн, бубнов и других музыкальных инструментов, - это нормально. Но когда пошла перепалка, и рвание тельняшек на груди, это уже перебор. Думаю, что выскажу общее мнение, если скажу, что читать ваши буйные эмоции как минимум не интересно, а по существу является оффтопом и напрягает. Реально, избавте от этого.

ЗЫ: обсуждение вопроса про гитары тоже уже затянулось, и тоже было бы неплохо перенести это обсуждение в личку, ибо вряд ли кого-то, кроме автора вопроса эта тема еще заинтересует.
Автор: apnss
Дата сообщения: 12.04.2010 09:39
psa1974

приношу извинения за причиненные неудобства

А Odysseos предлагаю продолжить истерить и брызгать слюной в этой теме http://forum.ru-board.com/topic.cgi?forum=33&topic=11124
Автор: ShIvADeSt
Дата сообщения: 12.04.2010 10:56
Обсуждение гитары изначально следовало вести в ОТДЕЛЬНОМ топике, так как здесь рассматриваются типовые вопросы, то есть вопросы на которые ответ дается в два три поста. Что то более глобальное лучше сразу спрашивать отдельно. И суть не потреяется и кому надо будут помогать.
Автор: svs123456789
Дата сообщения: 12.04.2010 11:24
печать в дэлфи:
сначала помещал строки в ричэит и затем его же методом и печатал...

постепенно кол-во строк выросло....

как добавлять колонтитулы и номер страницы на каждую страницу?

Автор: Bonivur
Дата сообщения: 12.04.2010 12:07
ShIvADeSt
При всем уважении...
Вопрос касался не частного случая связанного именно с гитарными аккордами, а алгоритма нахождения всех возможных вариантов сочетания элементов массива с учетом соответствующих ограничений и условий. Что вообщем-то, очень даже "общая темаматика".
Автор: ShIvADeSt
Дата сообщения: 12.04.2010 12:56
Bonivur

Цитата:
Вопрос касался не частного случая связанного именно с гитарными аккордами, а алгоритма нахождения всех возможных вариантов сочетания элементов массива с учетом соответствующих ограничений и условий. Что вообщем-то, очень даже "общая темаматика".

Данная тема изначально задумывалась как что то типа ФАКа (типа как сделать паузу, как сменить заголовок). То есть вопрос и в паре постов ответ. Обсуждение более менее серьезных вещей (а перебор с вариациями из этой оперы) предполагалось выделять в отдельные топики (как пример цветное мемо), автору проще найти ответы на свой вопрос, да и разговор получается более предметный. Но это на усмотрение автора вопроса, я могу только порекомендовать вынести тему отдельно
Автор: V1s1ter
Дата сообщения: 12.04.2010 13:00
svs123456789

Цитата:
как добавлять колонтитулы и номер страницы на каждую страницу?

С TRichEdit давно не работал, так что возможно ошибаюсь, но по моему TRichEdit не имеет готового механизма работы с номерами страниц и колонтитулами, поэтому думаю так: при печати создать "новый" документ (можно экземпляр TRichEdit) с вставленными строками с номером страницы и колонтитулами и переформатированный под заданный размер листа. Это типа по существу, но хотел порекомендовать отказатся от стандартного TRichEdit, а воспользоваться, если это возможно, связкой RichView+ScaleRichView или WPTools. Рекомендую потому, что требования к функциям может расширится и лучше иметь компонент уже готовый к "расширению".
Автор: svs123456789
Дата сообщения: 12.04.2010 15:00

Цитата:
отказатся от стандартного TRichEdit, а воспользоваться, если это возможно, связкой RichView+ScaleRichView или WPTools. Рекомендую потому, что требования к функциям может расширится и лучше иметь компонент уже готовый к "расширению".

а разве там есть колонтитулы ?
Автор: V1s1ter
Дата сообщения: 12.04.2010 15:48
svs123456789

Цитата:
а разве там есть колонтитулы ?

Вы посмотрите демку и все поймете, в кратце это уже готовый (естественно упрощенный) MS Word, включая и колонтитулы и таблицы и т.п.

Добавлено:
В догонку.
Естественно с уже готовым интерфейсом пользователя, но можно и все програмно сделать. К стати с библиотекой для плана здания (или чего там) определились?
Автор: Man_Without_Face
Дата сообщения: 14.04.2010 16:48
Доброго времени суток, может кто нибудь поможет устранить проблему: Стоит CodeGear 2009 (c 2007 тоже самое) + SyBase 8.0. Открываю любой проект, компонент TDataBase при connected в true выдает ошибку: An error occurred while attempting to initialize the Borland Database Engine (error 2501$). Недавно все было нормально, вроде ничего не крутил, в настройках BDE и ODBC вроде все нормально. Если открыть проект из BDS 2006 то все нормально.
Автор: AviDen
Дата сообщения: 14.04.2010 17:30
Man_Without_Face, BDE error 2501 = "Insufficient memory for this operation."
Попробуй поиграть с увеличением параметров SHAREDMEMSIZE, MAXBUFSIZE и MAXFILEHANDLES.
Автор: Man_Without_Face
Дата сообщения: 15.04.2010 08:34
AviDen
В BDE администраторе -> configuration -> system -> init поставил SHAREDMEMSIZE, MAXBUFSIZE и MAXFILEHANDLES в два раза больше... не помогло.


Добавлено:
Все проблему решил, просто нужно было удалить одну программку.

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

Предыдущая тема: Clipper 5


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.