Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Активные темы » Embarcadero RAD Studio

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322

Открыть новую тему     Написать ответ в эту тему

V1s1ter



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
         
Обсуждаем новые возможности и баги
 
Просьба писать про Embarcadero RAD Studio XE5, XE6, XE7, XE8, 10.x (Seattle, Berlin,Tokyo)
  По вопросам скачивания - Тема в Варезнике (lite-версии тут)
  Вопросы по неюникодным версиям Delphi — шестая бумага
  Бесплатные Компоненты и утилиты для Delphi/BCB/FreePascal/Lazarus
  Коммерческие компоненты и утилиты для Delphi/BCB
  Вопросы по компонентам для Delphi, C++ Builder разных версий
  Новые языковые возможности, начиная с Delphi 2005 по XE4 — здесь, и New!здесь еще
  Англоязычный официальный форум Embarcadero — здесь
  Embarcadero Quality Central, веб интерфейс — здесь, новый Quality Portal тут
  Программирование на Delphi — викиверситет
  Другие ресурсы
   Предыдущие бумаги
 
     Вопросы ..XE4       Вопросы ..XE3    Вопросы ..XE2      
  Вопросы ..2009-XE    Вопросы ..<2009 / ч.5    Вопросы ..<2009 / ч.4      
  Вопросы ..<2009 / ч.3    Вопросы ..Delphi 2 / ч.2    Вопросы ..Delphi  

  Выключение встроенного эксперта Castalia  для XE8 (иногда помогает при вылетах и тормозах)  
  Полезные плагины(эксперты)

Всего записей: 948 | Зарегистр. 06-02-2007 | Отправлено: 15:25 11-09-2013 | Исправлено: Komandor, 18:58 18-03-2022
AlexCoRu

BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
stanzdor, а ляпнуть неподумавши - не лучше.

Всего записей: 911 | Зарегистр. 04-09-2003 | Отправлено: 20:59 28-07-2017 | Исправлено: AlexCoRu, 21:00 28-07-2017
d3adb33f



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
stanzdor
    Алкоголь нарушает функции мозга у взрослых, затрудняя обмен информацией между нейронами в мозжечке — структуре, отвечающей за обучение и координацию движений. Ухудшается связь между нейронами, изменяется их структура, и происходят некоторые другие нарушения, связанные с интоксикацией. Однако это не значит, что умирают целые клетки.  
   
Таким образом, слишком частое употребление алкоголя может привести к ухудшению функций мозга (в том числе памяти). Тем не менее, это происходит не потому, что клетки мозга гибнут, а потому, что нейроны не взаимодействуют так, как они должны взаимодействовать. Эффект похож на дорогу с выбоинами: она есть, но пользоваться ей становится всё сложнее и сложнее.
 
зы: то цитата.

Всего записей: 564 | Зарегистр. 08-10-2015 | Отправлено: 21:15 28-07-2017
AlexCoRu

BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
d3adb33f, гы, а курение, гомосексуализм, вайперы, голливуд?

Всего записей: 911 | Зарегистр. 04-09-2003 | Отправлено: 22:03 28-07-2017 | Исправлено: AlexCoRu, 22:04 28-07-2017
AlekXL



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
это бухло, или оно так и есть, что ближе к сорока начинаешь туго соображать, и часовой алгоритм обдумываешь сутки?  
 
на самом деле вопрос не праздный. На самом деле, из вашего опыта или опыта ваших знакомых -- когда, в каком возрасте  наступает срок годности кодера(не админа!) ??
--------
Вопрос по теме: пусть у меня есть некоторый файл, меняющийся время от времени, и мне нужно сделать бэкапы -- часовой, 3-х часовой, 9-часовой, и так далее -- переименовывая более старые бэкапы и добавляя новые -- есть ли такой готовый код или библиотека для такой задачи?

Всего записей: 792 | Зарегистр. 24-04-2008 | Отправлено: 12:03 29-07-2017 | Исправлено: AlekXL, 12:03 29-07-2017
AlexCoRu

BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вот вам ссылочку, почитайте.

Всего записей: 911 | Зарегистр. 04-09-2003 | Отправлено: 16:39 29-07-2017 | Исправлено: AlexCoRu, 16:40 29-07-2017
asutp2

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Программисты на Cobol/Fortran не согласятся))) они сейчас до 80 лет спокойно программируют и в ус не дуют

Всего записей: 785 | Зарегистр. 22-10-2004 | Отправлено: 18:43 29-07-2017
KDPoid



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Академический интерес.
 
Undefined behavior и unspecified behavior в Delphi.
Бывает ли?
 
q := Foo(A) + Foo(b);
 
DoIt( Foo(a), Foo(b));
 
Гарантирован ли порядок вызова функции Foo?  
Может есть ещё какие-то неочевидные для редко практикующего ситуации?
 
Что-то ответ не нагугливается...

Всего записей: 404 | Зарегистр. 08-08-2006 | Отправлено: 09:07 30-07-2017
Eternal_Shield

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
KDPoid

Цитата:
Undefined behavior и unspecified behavior в Delphi.

Бывает. Особенно, когда метод возвращает managed тип, а-ля  

Цитата:
function Azaza: string;

или интерфейс. И вызывается в цикле.
 
Фиксится сменой сигнатуры на

Цитата:
procedure Azaza(out a: string);

По крайней мере, на ХЕ7 с таким сталкивался.  
 

Цитата:
Гарантирован ли порядок вызова функции Foo?  

Гарантирован. При вызове метода аргумент справа налево передаются (поэтому при вызове DoIt вызовется сначала Foo(b), потом Foo(a)), в остальных случаях слева направо. Это единственная особенность, которую надо учитывать)

Всего записей: 766 | Зарегистр. 18-05-2009 | Отправлено: 10:48 30-07-2017 | Исправлено: Eternal_Shield, 10:49 30-07-2017
d3adb33f



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
 
AlexCoRu
гы, а курение, гомосексуализм, вайперы, голливуд?

или сокращённо КГВГ.
так вроде stanzdor не жаловался на это ) ...

Всего записей: 564 | Зарегистр. 08-10-2015 | Отправлено: 11:42 30-07-2017 | Исправлено: d3adb33f, 11:43 30-07-2017
AlexCoRu

BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Бывает. Особенно, когда метод возвращает managed тип
На днях сталкнулся на 10.2: фунция возвращает variant, пока вызовы были вне цикла - всё шло замечательно, в цикле если VType был varString - исключение в System._LStrClr, другие типы - без исключения. Сделал также как Eternal_Shield, помогло.
Тогда сразу подумал, может я стек чем-то порчу?
Причём какой цикл был (for или while) - без разницы.

Всего записей: 911 | Зарегистр. 04-09-2003 | Отправлено: 11:45 30-07-2017 | Исправлено: AlexCoRu, 11:53 30-07-2017
kaz_av

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Eternal_Shield

Цитата:
Гарантирован

При дефолтном calling convention нет ни каких гарантий:
http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Procedures_and_Functions_(Delphi)#Calling_Conventions
 
AlexCoRu

Цитата:
если VType был varString - исключение в System._LStrClr, другие типы - без исключения.

Воспроизводимый пример покажи.
 

Цитата:
Сделал также как Eternal_Shield, помогло.

99.99% - твой косяк.

Всего записей: 437 | Зарегистр. 15-02-2006 | Отправлено: 14:37 30-07-2017 | Исправлено: kaz_av, 14:40 30-07-2017
Eternal_Shield

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kaz_av

Цитата:
При дефолтном calling convention нет ни каких гарантий

Примеры бы в студию ...

Всего записей: 766 | Зарегистр. 18-05-2009 | Отправлено: 14:42 30-07-2017
kaz_av

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Eternal_Shield

Цитата:
Примеры бы в студию ...

10.2:

Код:
 
program Project1;
 
{$APPTYPE CONSOLE}
 
{$R *.res}
 
uses
  System.SysUtils;
 
function _int : Integer;
begin
 
 writeln('int');
 result := 0;
 
end;
 
function _int64 : int64;
begin
 
 writeln('int64');
 result := 0;
 
end;
 
Procedure test(a,b,c,d : Integer);
Begin
End;
 
begin
 
 test(_int, _int64, _int, _int64);
 
 writeln('OK');
 readln;
 
end.
 

Win32:

Цитата:
 
int64
int64
int
int
OK

Win64:

Цитата:
 
int
int64
int
int64
OK

Undefined во всей красе.

Всего записей: 437 | Зарегистр. 15-02-2006 | Отправлено: 14:53 30-07-2017 | Исправлено: kaz_av, 14:59 30-07-2017
AlexCoRu

BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kaz_av почти так:

Код:
{$IFDEF UNICODE}
      TVarData(Result).VType := varUString;
      SetString(UnicodeString(TVarData(Result).VString), PAnsiChar(P), L);
{$ELSE}
      TVarData(Result).VType := varString;
      SetString(AnsiString(TVarData(Result).VString), PAnsiChar(P), L);
{$ENDIF}

а если вместо Result параметр out Value: Variant - без ошибок.

Всего записей: 911 | Зарегистр. 04-09-2003 | Отправлено: 15:18 30-07-2017 | Исправлено: AlexCoRu, 15:21 30-07-2017
kaz_av

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AlexCoRu

Цитата:
почти так

А можно всё же воспроизводимый?
 
В общем, косяк твой, скорее всего, в том, что начальное значение результата функции тоже undefined (поэтому приведение VString к строке довольно смело, без предварительной инициализации). Когда ты используешь out-параметр, то для упраляемых типов дельфя предварительно очищает его, поэтому в функцию передаётся инициализированная дефолтным значением переменная.
 
Добавлено:
AlexCoRu
В общем, если телепатировать дальше, то картина следующая. У тебя есть функция возвращающая Variant. При работе в цикле, начальное значение результата функции (оно всегда является undefined) соответствует результату предыдущей итерации. Соответственно, с таким кодом ты будешь падать после любой итерации, когда результатом была не строка, а результат текущей итерации должен быть строковым. Решение простое: по VType определять наличие управляемого типа и финализировать его руками, (например, для строки: UnicodeString(VString) := ''), а потом уже присваивать другое значение.

Всего записей: 437 | Зарегистр. 15-02-2006 | Отправлено: 15:38 30-07-2017 | Исправлено: kaz_av, 16:17 30-07-2017
Eternal_Shield

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kaz_av
1. Int64 не передаётся через регистры. Только через стек. Если у метода _int64 сделаете возврат Integer, то будет тоже самое, что и на win64.
2. Используемое по-умолчанию соглашение register ограничивает кол-во арументов до 2-х или 3-х в зависимости от того, классовый метод это или "голый". Превышение этого числа = передача через стек. У вас в примере 4.
3. Сравнение передачи аргументов на разных платформах - это весьма интересно. Забавно, что нет ARM'a в appendix'e.
 
Повторяю вопрос: сможете предоставить пример undefined behavior в рамках ОДНОЙ платформы.
 
Спасибо.

Всего записей: 766 | Зарегистр. 18-05-2009 | Отправлено: 18:09 30-07-2017 | Исправлено: Eternal_Shield, 18:14 30-07-2017
kaz_av

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Eternal_Shield

Цитата:
1. Int64 не передаётся через регистры. Только через стек.

Там Int64, внезапно, не передаётся.
 

Цитата:
Превышение этого числа = передача через стек. У вас в примере 4.

Хоть это и не имеет значения, но:

Цитата:
If more than three parameters qualify as register parameters, the first three are passed in EAX, EDX, and ECX, and the remaining parameters are pushed onto the stack in order of declaration.

 

Цитата:
3. Сравнение передачи аргументов на разных платформах - это весьма интересно

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

Цитата:
Забавно, что нет ARM'a в appendix'e.

Сам проверишь.
 

Цитата:
Повторяю вопрос: сможете предоставить пример undefined behavior в рамках ОДНОЙ платформы

Обтекай.

Всего записей: 437 | Зарегистр. 15-02-2006 | Отправлено: 18:21 30-07-2017
KDPoid



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Повторяю вопрос: сможете предоставить пример undefined behavior в рамках ОДНОЙ платформы.  

 
К чему себя ограничивать?
Если я пишу некоторый код, и вдруг выясняется, что он работает по разному в зависимости от версии компилятора или целевой платформы... Или даже работает одинаково, но Embarcadero не может гарантировать, что так будет и впредь, то да, - это оно самое. unspecified behavior.
"Оно отработает, но способом, который мы посчитаем лучше, и не можем обещать, что это всегда будет один и тот же способ."
 
Embarcadero так и пишет:  
For the register and pascal conventions, the evaluation order is not defined.

Всего записей: 404 | Зарегистр. 08-08-2006 | Отправлено: 18:42 30-07-2017
AlexCoRu

BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Код:
program Project1;
 
{$APPTYPE CONSOLE}
 
type
  TDataRecord = record
    F1: Int64;
    F2: array [0..11] of AnsiChar;
  end;
  PDataRecord = ^TDataRecord;
 
function GetDataPtr(Buffer: PDataRecord; Index: Integer): Pointer;
begin
  case Index of
    0: Result := @Buffer.F1;
    1: Result := @Buffer.F2;
    else Result := nil;
  end;
end;
 
function GetDataSize(Buffer: PDataRecord; Index: Integer): Integer;
begin
  case Index of
    0: Result := SizeOf(Buffer.F1);
    1: Result := SizeOf(Buffer.F2);
    else Result := 0;
  end;
end;
 
function GetDataValue(Buffer: Pointer; Index: Integer): Variant;
var
  P: Pointer;
  L: Integer;
begin
  P := GetDataPtr(Buffer, Index);
  if not Assigned(P) then Exit;
  case Index of
    0:
    begin
      TVarData(Result).VType := varInt64;
      TVarData(Result).VInt64 := PInt64(P)^;
    end;
    1:
    begin
      L := GetDataSize(Buffer, Index);
      if L = 0 then Exit;
      TVarData(Result).VType := varUString;
      SetString(UnicodeString(TVarData(Result).VString), PAnsiChar(P), L);
    end;
  end;
end;
 
var
  Data: TDataRecord;
  I: Integer;
  V: Variant;
begin
  Data.F1 := 1;
  Data.F2 := 'DataData';
  for I := 0 to 1 do
  begin
    V := GetDataValue(@Data, I);
  end;
end.

 
В реальном коде GetDataPtr и GetDataSize сложнее.

Всего записей: 911 | Зарегистр. 04-09-2003 | Отправлено: 21:10 30-07-2017 | Исправлено: AlexCoRu, 21:16 30-07-2017
kaz_av

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AlexCoRu
Всё именно так, как я и говорил Фиксится двумя строками:

Код:
 
function GetDataValue(Buffer: Pointer; Index: Integer): Variant;
var
  P: Pointer;
  L: Integer;
  v : Variant; // 1
begin
 
  result := v; // 2
 
  P := GetDataPtr(Buffer, Index);
 

В этом коде ещё и утечка есть, если поменять местами инт и строку.

Всего записей: 437 | Зарегистр. 15-02-2006 | Отправлено: 21:25 30-07-2017
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Активные темы » Embarcadero RAD Studio


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru