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

» Вопросы по Embarcadero RAD Studio XE2 (Pulsar)

Автор: stupid_user
Дата сообщения: 04.04.2012 13:33

Цитата:
Какой размер в байтах у твоей TMainLevels ?
iSize = SizeOf(TLevel) + ( SizeOf(TLevel)* количество элементов TLevel)

Цитата:
ЗАчем тебе это вообще нужно, чтобы была переменная длина ?
количество элементов TLevel заранее не известно. опытным путем установил что в текущий момент оно было 44 байта (8 байт TMainLevel + остальное из TLevel)

Автор: Arioch1
Дата сообщения: 04.04.2012 15:13

Цитата:
компилятор его должен знать заранее.

Количество должно быть определено до начала компиляции, либо же нельзя вставить массив.



Цитата:
Описывайте конечную цель, а не отдельные шаги

Если вы пытаетесь разобраться как что-либо сделать (а не сообщать об ошибке), начинайте с описания цели. И только потом описывайте конкретный шаг на пути к ней, который вы не смогли выполнить.

http://maddog.sitengine.ru/smart-question-ru.html#goal

Трудно угадывать что ты вообще хочешь сделать и зачем.

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


Цитата:
{$T+}

TLevel = packed record iValue1, iValue2, iValue3: Integer; end;
PLevel = ^TLEvel;

TMainLevels = packed record
iSize: Integer;
iReserved: Integer;
aLevels: array[0..0] of TLevel;

function SelfPtr: Pointer;
function NextItem: Pointer;
function SizeOf: Integer;

procedure CheckIdx(const i: integer); inline;
procedure setter(const idx: integer; const Value: PLevel); inline;
procedure getter(const idx: integer): PLevel; inline;
property Levels[I:integer]: PLevel read getter write setter;
end;


function TMainLevels.SizeOf: Integer;
begin
Result := SizeOf(TMainLevels) + (-1 + iSize)*SizeOf(TLevel);
end;

function TMainLevels.SelfPtr: Pointer;
begin Result := @iSize; // для разных типов - разный элемент первый
// возможно хватило бы @Self, не помню, проверять лень
end;

function TMainLevels.NextItem: Pointer;
begin Result := SelfPtr; Inc(Result, SizeOf); end;

procedure TMainLevels.CheckIdx(const i: integer);
begin
{$IfOpt R+}
if (i<0) or (i>= iSize) then
raise ERangeError.CreateFmt ('Levels are from #0 to #%d, access attempted to #%d', [iSize - 1, i]);
{$EndIf}
end;

{$UnDef WasRangeChecking}
{$IfOpt R+} {$Define WasRangeChecking} {$R-} {$EndIF}

procedure TMainLevels.setter(const idx: integer; const Value: PLevel);
begin
CheckIdx(idx);
aLevels[idx] := Value^;
end;

procedure TMainLevels.getter(const idx: integer): PLevel;
begin
CheckIdx(idx);
Result := @aLevels[idx];
end;
{$ifDef WasRangeChecking} {$R+} {$UnDef WasRangeChecking} {$EndIF}

.....

var ScanningPtr: Pointer;

.....
while ... do begin

if тип элемента TMainLevels then with TMainLevels(ScanningPtr)^ do begin
xyz := Levels[2]^.iValue2;
...
ScanningPtr := NextItem;
continue;
end;

if тип элемента какой-другой-тип then ...

if тип элемента какой-другой-тип then ...

end;



Другой вариант разбора структуры (парсинга) файлов был описан http://synopse.info/forum/viewtopic.php?pid=3950, там вместо записей использовали объекты (но не классы!). Впрочем, объекты скорее всего удалят в следующих версиях Дельфи рано или поздно.
Автор: stupid_user
Дата сообщения: 04.04.2012 15:27
Arioch1
спасибо! по твоему коду выбрал необходимые куски
Автор: Arioch1
Дата сообщения: 04.04.2012 15:30
да здесь по-моему все куски нужны.

но дело твоё
Автор: Frodo_Torbins
Дата сообщения: 04.04.2012 15:51
stupid_user
Не передавайте в функцию рекорды, передавайте в нее выделенный вручную кусок памяти, в который записывайте все нужные данные. Можно сделать вокруг этого красивую обертку в виде класса.
Автор: delover
Дата сообщения: 09.04.2012 17:45
Man_Without_Face


stupid_user
У сишных программ на этот счёт есть шаблон, который сможет понять программист который когда либо в глаза видел TList ранних версий дельфи, не XE2. Массив объявляется максимальной длинны которую позволит компилятор - как правило 4 гигобайта массив. Далее выделяется память равная количество элементов помноженное на длину элемента - выделяется под массив. Через GetMem(N*Sizeof) - это делается вручную. Динамические массивы Delphi позваляют не делать этого в ручную и они не подходят по двум причинам.


Код: [no]packed record
count: byte;
a: array of TMyType;
end;[/no]
Автор: Arioch1
Дата сообщения: 10.04.2012 12:10

Цитата:
как правило 4 гигобайта массив

а не 2 ? в Win32 на приложение целиком отводится только 2.
от силы, в спец-версиях Windows, три.
Автор: Frodo_Torbins
Дата сообщения: 10.04.2012 12:50
Arioch1
Декларироваться может и четыре, но реально даже один выделить не получится. Правда никто и не пытается.
Автор: Arioch1
Дата сообщения: 10.04.2012 13:18
xe2 win32 mode

const mx = high(cardinal) - 1000;
type tx = array [0..mx] of byte;

[DCC Error] Main.pas(35): E2100 Data type too large: exceeds 2 GB
[DCC Fatal Error] Test.dpr(5): F2063 Could not compile used unit 'Main.pas'
Автор: Frodo_Torbins
Дата сообщения: 10.04.2012 13:57
Arioch1
Речь шла не о делфи.
Автор: delover
Дата сообщения: 10.04.2012 16:41
Arioch1
Спасибо за поправку, - 4. Я про Delphi2 ну или 2010. Реально не предполагалось занимать места ограниченные системой. Речь действительно о типах Си, но в приложении к Делфи.
Автор: Arioch1
Дата сообщения: 10.04.2012 16:48
а тогда вообще не имеет значение ограничение компилятора.

Выключаешь Range Checking, делаешь массив [0..0] и понеслась.

Я вот не помню, включает ли Pointer Math такую Сишную фишку, что указатель и массив - это один и тот же тип.
Скорее всего нет, потому чт опо уммолчанию выключен Typed Pointer.

Добавлено:
Впрочем, при сканировании массива, проще сделать указатель на 1-й элемент, а потом его в цикле увеличивать
IMHO
Автор: delover
Дата сообщения: 10.04.2012 20:59
Arioch1
Вы начали отлично а аконцовка лучше бы Вы этого никому больше не говорили. Мароз или параноя там, но у техники - как у инструмента есть свои места.
Автор: Arioch1
Дата сообщения: 10.04.2012 21:06
Ы? что конкретно сказать то хотел ?
Автор: delover
Дата сообщения: 10.04.2012 21:09
сорри тогда не былор времени.

Цитата:
а тогда вообще

Тогда вообще имеют ограничения только способности компилятора. А системные ограничения это бунус к Виза кард банк. Если вспомните дорогу - приходите.
Автор: A_V
Дата сообщения: 10.04.2012 21:20
Arioch1

Цитата:
от силы, в спец-версиях Windows, три

Что за спец-версии? Это всмысле ключ /3GB?

Цитата:
Я вот не помню, включает ли Pointer Math такую Сишную фишку, что указатель и массив - это один и тот же тип

{$POINTERMATH ON}? ну не один и тот-же тип конечно, но обращаться через [] к указателю можно.
Автор: Arioch1
Дата сообщения: 10.04.2012 21:27
ну не знаю как сейчас, а раньше на w2k /3gb работал только c Enterprise Server edition
Автор: delover
Дата сообщения: 11.04.2012 17:12
Arioch1
Ой [no]:00[/no]. Перечитал пост предыдущий, простите, я не успел дописать - пришли гости накричала жена и всё такое. Думаю Вы поняли что я имел ввиду дорогу к компилятору. Дорог компилятор. Про накакие териториальные разногласия в интернете просто не умею думать - некогда.

Цитата:
Если вспомните дорогу - приходите...

Приходите к мысли что компилятору важен компилятор, а не знание ситемы либо компьютера.
Автор: 7Gluk7
Дата сообщения: 14.04.2012 02:16
А в хе2 должны работать автоподсказки в редакторе (вывод списка после набора "...->")?
Установил хе2 ап4 на win7 x64 sp1, в c++builder после набора "...->" думает полсекунды, но списка не выдает (по ctrl+space работает). В delphi все работает.
Автор: Lena44
Дата сообщения: 14.04.2012 11:20
На Win XP в c++builder хе2 ап4 после набора "...->" все работает.
Автор: SevereK20
Дата сообщения: 14.04.2012 13:07
Lena44
никто не сталкивался в делфе XE2 с проблемой, когда после установки каких-либо компонентов среда отказывалась загружаться, ругаясь на отсутствие fmx161.bpl ?
Автор: Arioch1
Дата сообщения: 14.04.2012 14:25
обычно такое бывает после обновления. Ибо версии FMX менялись чуть не с каждым аплейтом.
помогала переустановка начисто с последней ISOшки, или иногда "восстановления" из установщика оттуда же.

А насчёт установки компонентов - скорее всего это совпадение.
В крайнем случае устаналивался не компонент а какой-нибудь Expert-плагин, типа OpenWire Editor
Автор: shyub
Дата сообщения: 15.04.2012 09:38
[more] Подскажите пожалуйста.
На днях скачал для пробы RAD Studio XE2 with Update 1 v16.0.4276.44006 (с лекарством). Цель - попробовать и если понравится, то подумать о приобретении лицензии на C++Builder XE2. Установилась без проблем, однако:
1. Final Builder не запускается (скорее всего не подходит лекарство от самой RAD Studio). Вообще, для чего нужна эта утилита?
2. Старые проекты, сделанные в C++Builder 2009 не компилируются (выходит ошибка), хотя проекты Borland C++Builder-6 работают. Это у меня "кривые руки" или так должно быт?
3. Делаю небольшой проект в C++Builder XE2 (форма, пара кнопок и т.п.). При компиляции выдаёт Warning W8123, т.е. не может найти h-файлы, причём указывает места поиска в папке "Документы", где их даже теоретически быть не должно. Но проект всё-таки компилируется и работает. Как от них (Warning-ов) избавиться? Можно, конечно их просто отключить, но хотелось бы исключить саму причину.
4. Где можно найти более - менее толковое описание по работе с FireMonkey?
5. Проект, сделанный в C++Builder XE2 не работает в С++Builder 2009, но интересный парадокс: Прилагаемые примеры работают как в C++Builder XE2 так и в С++Builder 2009. В чём здесь хитрость или их писали вообще на C++Builder-6 ?
Заранее благодарю за ответы.
[/more]
Автор: deks
Дата сообщения: 16.04.2012 13:29
7Gluk7

Дело может быть в IDEFixPack, установите последнюю версию 4.8.

SevereK20

Такая беда происходит, когда ставятся бинарники компонентов, откомпилированные для RAD Studio XE2 Update1-2 на RAD Studio Update 3 или 4. С некоторыми апдейтами повышался номер версии пакета FireMonkey - с fmx160 до fmx161 и fmx162. В этом ничего страшногj нет - просто соглашайтесь грузить пакеты "еще раз" и запомните - какой пакет ругается при загрузке. После загрузки откройте нужный пакет и пересоберите его (build). Придется еще раз согласиться на "грузить в следующий раз". После пересборки пакета он будет линкован с нужной версией FMX.

Добавлено:
shyub

Final Builder - это build сервер для автоматизации сборки вашей программы на build-машине. если вы не используете Continuous integration - то эта программа вам не особо нужна. Кроме того, в состав студии входит урезанная версия. Если так необходимо - не сложно приобрести upgrade до полноценной версии.

Описанные вами глюки при сборке пакетов совершенно невнятные. Не знаю как про C++, но проекты Delphi компилируются без особых танцев с бубном. Если так все глючит, я бы рекомендовал попробовать сначала собрать примеры, входящие в студию - они должны гарантированно компилироваться. Если примеры собираются, то с вашей установкой студии все ок. Дальше я бы посоветовал создать пустой проект, и в него руками добавить нужные файлы - и уже этот проект компилировать - а не "апгрейдить" проект до новой версии. Так поменьше будет непонятных глюков.

Кроме того, в XE2 ввели "пространства имен" (namespace вида Windows.*), и для Delphi по-умолчанию включаются "псевдонимы" для поиска юнита в нужном пространстве имен. Если настройки проекта глючат, то компилятор может не найти самых очевидных файлов.

Кроме того, в XE2 есть ряд изменений в логике работы, например Autoincrement version number - теперь там как в MS Build в отдельные поля версии ставятся цифры, производные от времени сборки проекта (см шапку).

Про FireMobkey лучше всего читать в wiki на сайте Embarcadero. Закатайте последний Help Update - там статей про FMX добавлено очень много. Кроме того, много информации есть в вебинарах и блогах - смотрите на DelphiFeeds (как .ru, так и .com)
Автор: Frodo_Torbins
Дата сообщения: 16.04.2012 20:12
shyub
Попробуйте удалить *.*proj файлы этих проектов.
Автор: ppkp
Дата сообщения: 17.04.2012 12:16
Иногда при запуске приложения (обычно большого) с опцией Release - Pulsar зависает намертво, только топором можно перезапустить. Может быть там баги в IDE. Существуют ли IDEFix'ы для Update 4? Если да, подскажите, пожалуйста, URL этих IDEFix'ов.
Автор: Arioch1
Дата сообщения: 17.04.2012 12:31
Первое сообщение в теме - Например DDevExtensions от Andy. У него так же есть хороший плагин IDE FixPack - там и ссылка есть

может какой-нибудь ибко-умный фаервол-антивирус мешается, типа Comodo Defense+ ?
Автор: ppkp
Дата сообщения: 17.04.2012 12:47
Arioch1
Большое спасибо за ответ. Но мне не нужно "Adds productivity features", а фиксов для XE2 я там не увидел. По поводу фаерволла - у меня KIS2012.

Прошу прощения за невнимательность. Увидел IDE Fix Pack 4.8
Автор: Arvur
Дата сообщения: 17.04.2012 12:57
ppkp
IDE FixPack это "must have". Имхо
Автор: Arioch1
Дата сообщения: 17.04.2012 13:18
Возможно вам стоит настроить KIS на полное игнорирование Дельфи и всех программ, которые она создаёт и запускает

А вообще может быть что угодно.

Например долго и непонятно тормозил в XE2 стандартный file open dialog
Виноват оказался TeamViewer - кто бы мог подумать о возможной связи...

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738

Предыдущая тема: Как сделать offline версию сайта со встроенным браузером?


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