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

» Вопросы по Embarcadero RAD Studio XE5-XE8,10.x(Seattle, Berl

Автор: xpin2013
Дата сообщения: 11.01.2015 19:26
landy
Так, вопросы обменника здесь не обсуждаем (будет в ПМ). Посмотрел XE3, красиво, но пострадал другой компонент - дерево, так что мне не подходит. В свете описанной ошибки выпуск задерживается дня на два.

Я то ребята за собой чищу. Убраю бяки.
Автор: AlekXL
Дата сообщения: 11.01.2015 22:26
xpin2013
все-таки это не баг, приведение
FDTable1.Bookmark к TBookMarkStr
то есть дин массива к AnsiString
--
скажем прямо, глупейшее дело.
Автор: xpin2013
Дата сообщения: 11.01.2015 23:16
AlekXL

Цитата:
все-таки это не баг, приведение FDTable1.Bookmark к TBookMarkStr то есть дин массива к AnsiString -- скажем прямо, глупейшее дело.

О, Вы же меня и просили выложить. Ответьте тогда почему преобразование TBookmarkStr в TBookmark работает без проблем вообще, а в обратную сторону в 20 процедурах без глюков в одной с глюком? Не вяжется неверное приведение типов.

(Динамические массивы это TBytes в 2010, а в XE7 это генерики всё же. Так что тут могут многие Вас не понять.)

AlekXL

Цитата:
то есть дин массива к AnsiString

сколько можно писать AnsiString не при чём, я состряпаю пример на конвертации WideString и TArray<Word>.


Кто нибудь нормальный то есть, чтобы ответить именно на этот вопрос, что ниже?:
А выдавать ошибку AV и вываливать GETMEM.inc в редактор пользователя, это у Вас называется хороший тон? Да это бред, господа. Умоляю ответьте на этот вопрос!


Что я сделал, чтобы заткнуть фонтан изобретений от генериков "XE3"?:

Код: [no]{$IFDEF VER280}{$DEFINE BM2}{$ENDIF}
...
{$IFDEF BM2}
type
//жаль что нельзя делать class operator Implicit!!!!
TBookmarkHelper = record helper for TBookmark
public function bm: TBookmarkStr; inline;
end;
{$ENDIF}
...
{$IFDEF BM2}
function TBookmarkHelper.bm: TBookmarkStr;
begin
if Length(Self) > 0 then
begin
SetLength(Result, Length(Self));
System.Move(Self[0], Result[1], Length(Self));
end else
Result := '';
end;
{$ENDIF}
...
Current := TBookmarkStr(Bookmark{$IFDEF BM2}.bm{$ENDIF});
[/no]
Автор: AlekXL
Дата сообщения: 11.01.2015 23:39

Цитата:
Динамические массивы это TBytes в 2010, а в XE7 это генерики всё же

TBytes -- это динамический массив, в XE7 и как и в 2010

Цитата:
сколько можно писать AnsiString не при чём, я состряпаю пример на конвертации WideString и TArray<Word>
конечно, и там будут проблемы.
WideString выделяется из системной кучи, а TArray - из кучи дефолтной для Delphi приложения , то есть например , FastMM
--xpin2013, то и другое -- глупейшая, нубская ошибка.
Автор: xpin2013
Дата сообщения: 11.01.2015 23:56
AlekXL

Цитата:
то и другое -- глупейшая, нубская ошибка.

Смотрите выше пост в конце:
Любые Ваши доводы, что я не прав будут комментироваться следующим кодом: Цитата: Current := TBookmarkStr(Bookmark{$IFDEF BM2}.bm{$ENDIF});
Опрос на тему кто ошибается закрыт.


Цитата:
TBytes -- это динамический массив, в XE7 и как и в 2010

Привожу копипаст для нубов утверждающих ересь.
>Delphi2010 (SysUtils.pas)
>TBytes = array of Byte;
В Delphi2010 все функции выделения памяти, счётчики изменения размеров совместимы со строками.
>Delphi XE7
>TBytes = TArray<Byte>;
Всё то же, только сделана неумелая попытка финализации переменной типа AnsiString с помощью функции _DynArrayClear. Это нормально что в функцию _DynArrayClear попадает адрес строки? Нет. Но главное

TBytes = array of Byte; <> TBytes = TArray<Byte>;


Добавлено:







Цитата:
Опрос на тему кто ошибается закрыт.

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

Код: [no]type
TBookmark2 = packed record
private
FValue: TBookmark;
public
class operator Implicit(AValue: TBookmark): TBookmark2;
class operator Implicit(AValue: TBookmark2): TBookmarkStr;
end;

{ TBookmark2 }

class operator TBookmark2.Implicit(AValue: TBookmark): TBookmark2;
begin
Result.FValue := AValue;
end;

class operator TBookmark2.Implicit(AValue: TBookmark2): TBookmarkStr;
begin
Result := TBookmarkStr(AValue.FValue);
AValue.FValue := nil;
UniqueString(Result);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
Current : TBookMarkStr;
V : Variant;
begin
Current := TBookmark2(FDTable1.Bookmark);
[/no]
Автор: AlekXL
Дата сообщения: 12.01.2015 08:41
xpin2013


Цитата:
Любые Ваши доводы, что я не прав будут комментироваться следующим кодом: Цитата: Current := TBookmarkStr(Bookmark{$IFDEF BM2}.bm{$ENDIF});

и что? хелпер копирует содержимое, а приведение в изначальном примере копирует указатель.

Цитата:
Опрос на тему кто ошибается закрыт.


ты ошибаешься, и это не признак ума, когда ошибки свои не хочешь признавать ..

Цитата:
>Delphi2010 (SysUtils.pas)
>TBytes = array of Byte;
В Delphi2010 все функции выделения памяти, счётчики изменения размеров совместимы со строками.
>Delphi XE7
>TBytes = TArray<Byte>;


а
TArray<T> = array of T;
таким образом, TBytes =array of Byte;
то же самое, что и в 2010


Цитата:
Всё то же, только сделана неумелая попытка финализации переменной типа AnsiString с помощью функции _DynArrayClear. Это нормально что в функцию _DynArrayClear попадает адрес строки? Нет

не так. Это в функцию LStrClr попадает адрес дин. массива.
Ты же строке Current впердолил указатель на динамический массив: вот , в эпилоге, LStrClr и освобождает память для блока, который считает строкой, но который строкой не является.
Разница между D2010 и XE7 может быть только в порядке финализации объектов.
То есть XE7 вызывает сначала DynArrayClear для безымянного массива, который ты вытащил выражением FDTable1.Bookmark, а потом уже LStrClr .

В Delphi 2010 могло быть иначе: сначала финализируется, наверное,строка Current(но , поскольку счетчик не будет нулевым вследствие ссылки от безымянной переменной-массива, то освобождения памяти там не происходит).
А потом финализируется безымянная посредством DynArrayClear .

Разница в том, что в случае с LStrClr в FreeMem передается указатель (p-sizeof(TStrRec)),
а в DynArrayClear -- указатель (p-sizeof(DynArrayRec)).
Они не одинаковые. Доходит?


Цитата:
Ошибок не возникает, правда - цена вопроса уже 1 буква - это цифра 2

ты сам то понимаешь смысл написанного, потому что я -- нет
Автор: xpin2013
Дата сообщения: 12.01.2015 12:00
AlekXL

Цитата:
и что? хелпер копирует содержимое, а приведение в изначальном примере копирует указатель.

Приведение для XE7 не нужно, приводится тот же тип к тому же, для D2010 нужно.


Цитата:
ты ошибаешься, и это не признак ума, когда ошибки свои не хочешь признавать ..

Только представь, Питер Нортон написал Нортон Коммандер. Когда нажимаем F3 он показывает внутренности файла в виде байтов, но его попросили показать как текст. Конечно он мог бы выделить такой же буфер как для байтов и перекопировать туда байты как AnsiChar, но увы DOS память была маленькая и про то, что желание не делать лишнюю копию считается ошибкой никто не знал от Нортона до Delphi 2010. Все ошибались...


Цитата:
Разница между D2010 и XE7 может быть только в порядке финализации объектов.


Цитата:
В Delphi 2010 могло быть иначе

Проверяется на раз:

Код: [no]procedure TForm2.Button1Click(Sender: TObject);
var
B: TBookmarkStr;
v: variant;
begin
Table1.Open;
B := TBookmarkStr(Table1.Bookmark);
v := null;
Table1.Bookmark := TBookmark(B);
end;[/no]
Автор: Eternal_Shield
Дата сообщения: 12.01.2015 12:24
xpin2013

Код:
1. Result := TBookmarkStr(AValue.FValue);
2. AValue.FValue := nil;
3. UniqueString(Result);
Автор: xpin2013
Дата сообщения: 12.01.2015 13:26
Eternal_Shield

Цитата:
В итоге: У вас гарантированная утечка памяти и новая правильная строка;

1) Во всех моих примерах используется ReportMemoryLeak:=True - утечки нет
2) UniqueString - копирует строку, присваивает ей счётчик 1 и обязательно!!!! обязательно делает декремент у исходной строки которая указывает на динамический массив - утечек нет.


Цитата:
Потому что Alias - это Alias, а конкретный тип - это конкретный тип. У них разный Rtti. Это особенность реализации генериков в Delphi.

Нет, точнее не только генериков. Та же ошибка будет в DelphiXe7, В2010..D2009, D7, D6... далее не помню, ошибка та же, - это разные типы, когда счётчик располагается непостредственно в стеке.


Странно, поговорил с одним программистом, который ужасно любит спорить и знает джейсоны и тд, в общем я его считаю авторитетным. Он сказал только одно - имей ввиду, что при переходе на новую Делфи может не работать. Я спросил, а много что может не работать при переходе - он сказал да. Я ещё спросил, а правильно ли, что человек берущий на себя ответственность за преобразование данных имеет право преобразовывать и нести за это ответственность? Он сказал что эта формулировка даже лучше.

Добавлено:

Цитата:
В итоге: У вас гарантированная утечка памяти и новая правильная строка;

Проверяется как 2 пальца, ставим брейкпоинт на SysFreeMem с условием что адрес будет равен указателю на динамический массив - 8. Eternal_Shield знает почему -8.


http://forum.ru-board.com/topic.cgi?forum=33&topic=10884&start=5840#3
Там имеем AV со следующим стеком:
KERNELBASE.lstrlenA
USER32.GetClassNameA
Работа строк всё же была нарушена нововведениями.
Автор: AlekXL
Дата сообщения: 12.01.2015 18:52

Цитата:
правильно ли, что человек берущий на себя ответственность за преобразование данных имеет право преобразовывать и нести за это ответственность?

ты имеешь право выстреливать себе в ногу.
Но код, который написанный с подобным подходом, в свой проект я бы не включил.

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


Цитата:
Я вообще уже поражаюсь - все делают громкие заявления, но никто кроме меня свои слова под отладчиком не проверяет
Я проверял твой код под отладчиком XE7. Детально, на уровне буфера и ассемблера.

---
Все, хватит. Это не баг компилятора. Тебе многие опытные уже сказали, что ты не прав и в чем. Дальше дело твое.
--
Я даже понимать начинаю, для каких программистов было придуман managed код.
Автор: SuPriTo
Дата сообщения: 12.01.2015 19:28
Кто-нибудь использовал Slim Reader/Writer (SRW) Locks
_http://msdn.microsoft.com/en-us/library/windows/desktop/ms683483%28v=vs.85%29.aspx
_http://msdn.microsoft.com/en-us/library/windows/desktop/aa904937%28v=vs.85%29.aspx
Можете пример использования скинуть?
Автор: xpin2013
Дата сообщения: 12.01.2015 19:53
AlekXL

Цитата:
Это не баг компилятора.

Да я же уже писал - разобрался с этим. Из _LStrLAsg исключили
CMP [EDX-Skew].StrRec.elemSize,1
компилятор не причём и гереники тоже, этот грех на мне. При преобразовании уже не происходит копирования, жить с багами тоже не хочу. Я же писал, как дальше быть.
Eternal_Shield

Цитата:
3. UniqueString(Result);


Цитата:
3. Вы создаёте новую правильную строку

Как оказалось, не правильную. Вообще UniqueString было пижонством, мной двигало желание показать что можно обойтись исключительно строками, но это не есть правильно. Последний вариант:

Код: [no]class operator BookmarkStr.Implicit(AValue: BookmarkStr): TBookmarkStr;
var
L: Integer;
begin
L := Length(AValue.FValue);
if L > 0 then
begin
SetLength(Result, L);
System.Move(AValue.FValue[0], Result[1], L);
end else
Result := '';
AValue.FValue := nil;
end;
...
Current := BookmarkStr(Bookmark)[/no]
Автор: landy
Дата сообщения: 12.01.2015 20:08

Цитата:
Можете пример использования скинуть?

Сравнение и модуль
Автор: DYUMON
Дата сообщения: 12.01.2015 20:11
Народ, а не кто не в курсе, можно ли в xe7 вернуть старые иконки как xe2? вроде на какой то предыдущей версии это отключалось.
Автор: SuPriTo
Дата сообщения: 12.01.2015 20:45
landy
Спасибо.

Цитата:
Сравнение

А есть сравнение для TJclMultiReadExclusiveWrite? Что-то в гугле не нашел по быстрому.
DYUMON
Удать файл ModernTheme200.bpl из папки $(BDSBIN). Студия один раз ругнется, а потом перестанет, и все иконки сделаются привычными.
Автор: landy
Дата сообщения: 12.01.2015 22:33

Цитата:
А есть сравнение для TJclMultiReadExclusiveWrite? Что-то в гугле не нашел по быстрому.

Я тоже готовых результатов тестов не находил, однако, самому проверить недолго. Но, ты уверен, что производительность в твоем случае упирается именно в механизм семафоров? Также, наверное, стоит рассмотреть неблокируемые структуры..
Автор: SuPriTo
Дата сообщения: 12.01.2015 23:03
landy
Я сейчас пишу библиотеку. Пока не тестировал, смотрю, какие блокировки лучше использовать. Собственно и спрашиваю по этому.

Цитата:
Также, наверное, стоит рассмотреть неблокируемые структуры..

Например?
Автор: landy
Дата сообщения: 13.01.2015 08:27

Цитата:
Например?

Например, lockfree-структуры из OmniThreadLibrary

Но, вообще, лучше сперва требования сформулировать - может, у тебя там только чтения и добавления элементов, тогда вообще можно без блокировок и структур обойтись, только на разделяемой памяти с обновлением заголовка через InterlockedIncrement.
Автор: Andryshok
Дата сообщения: 13.01.2015 08:48
Я вот давно бросил бесперспективную дельфю...., но вот на днях нужно было сваять одну мелочь под win32 - я накатил XE7 и упс..... где делись компоненты шелла ShellTreeView ? Что это за бред
Автор: landy
Дата сообщения: 13.01.2015 09:34

Цитата:
где делись компоненты шелла  ShellTreeView ?

Вполне себе лежит в \Embarcadero\Studio\15.0\lib\win32\debug\Vcl.Shell.ShellCtrls.dcu, просто его нужно ставить руками теперь.
Автор: MGAlex
Дата сообщения: 13.01.2015 10:36

Цитата:
Студия один раз ругнется, а потом перестанет

Не совсем так. Нужно нажать кнопку "No", когда появится сообщение с вопросом нужно ли попытаться найти и загрузить библиотеку ModernTheme200.bpl при следующем старте студии. Иначе сообщение будет появляться каждый раз при старте.
Вообще, могли бы в настройках сделать возможность выбирать нужную тему. Мне больше по душе старая тема. Хотя, после установки Office 2013 мне он показался жутко неудачным в плане иконок и оформления. А потом привык и все устраивает, а 2010 офис уже кажется непривычным. А с учетом косяков Outlook 2010 вообще кошмар


Цитата:
просто его нужно ставить руками теперь

Что-то они перемудрили. BDE нужно ставить отдельно, ShellTreeView вручную.
Автор: landy
Дата сообщения: 13.01.2015 10:55

Цитата:
Что-то они перемудрили. BDE нужно ставить отдельно, ShellTreeView вручную

Это всё теперь deprecated (а BDE вообще давно пора закопать). Вот более подробная нота
Автор: dred2k
Дата сообщения: 13.01.2015 12:06
Еще, к примеру, отказались от Web.Win.Sockets.pas (начиная с XE6, кажется) - зачастую популярные TTcpClient/TTcpServer.
Тоже лежат теперь в примерах (Samples\Object Pascal\VCL\InetWinSockets) и требуют ручной установки.
Автор: Andryshok
Дата сообщения: 13.01.2015 17:24
Да они там походу вообще сбрендили.... лучше бы компилятор под линукс делали чем людей какой то ерундой путать, + я еще раз не пожалел что завязал с дельфей.
Автор: xpin2013
Дата сообщения: 13.01.2015 17:39

Цитата:
Да они там походу вообще сбрендили....

Не совсем ещё, но могут. Когда появился .NET все деньги бросили на создание Delphi8, которая даже win32 не компилила. Потом вышла D2005 .Net + win32 который ничем не отличался от D7. Со временем Микрософт осознал, что больше уже не захватит у рынка и перестал вливать в .NET больших денег. Дельфисты осознали это и потихоньку .NET отпочковался от среды разработки в виде продукта, которым мало интересуются. Сейчас Дельфи кидает все средства в захват мобильного рынка, но когда уже будет всё, то вполне возможно все эти мобилы так же отпочкуются как и .NET. Важно, чтобы за это время произошло меньше глупостей, но мы на это повлиять не можем.

Добавлено:
А вот преподаватели наши до сих пор учат, что за сишарпом будущее. Их программа может поменяться только через 10 лет, так что учите .NET
Автор: ChSerg
Дата сообщения: 13.01.2015 20:14

Цитата:
я еще раз не пожалел что завязал с дельфей

И на чем же остановили свой выбор?
Автор: Andryshok
Дата сообщения: 14.01.2015 06:11
ChSerg PHP , Javascript .... вобщем веб разработка, это конечно другой сегмент рынка но все же
Автор: Eternal_Shield
Дата сообщения: 14.01.2015 11:50
Возил я картошку на McLaren MP4-12C (так страдал, так страдал, не дай бог каждому), но потом оказалось, что ТАЗ лучше подходит для этих целей ... не MP4-12C, но всё же ...
Автор: AlekXL
Дата сообщения: 14.01.2015 13:05

Цитата:
Возил я картошку на McLaren MP4-12C (так страдал, так страдал, не дай бог каждому), но потом оказалось, что ТАЗ лучше подходит для этих целей ... не MP4-12C, но всё же ...

во-во.
Каждому своё
Автор: Andryshok
Дата сообщения: 14.01.2015 13:09

Цитата:
Возил я картошку на McLaren MP4-12C
Некорретное сравнение, нынешняя политика Embarcadero и отсутствие спроса на разработку по на Delphi привели к такому положению дел..., да что там говорить, большинство более менее вменяемых заказчиков сразу плюются как предложишь разработку прикладного по на дельфи, это факт и бизнес, даже в рынке прикладного по Net рулит ну и C++. Да чуть не забыл - про мобильную разработку на делбфях уже давно ходят легенды..

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129

Предыдущая тема: Отмена встречи в Outlook из Excel VBA


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