Помощь новичкам

О как… Тогда у меня ещё 2 более простых вопроса:

  1. В википедии сказано что не все процессоры используют обратный порядок байтов, на компьютерах с привычным порядком байтов BinaryReader и BinaryWriter будут вести себя по другому?
  2. будет ли byte($01020304) на процессорах с привычным порядком байтов возвращать $01 вместо $04?

На самом деле все еще запутаннее и должно определяться экспериментально. В микропроцессорах фирмы IBM и совместимых с ними принят “обратный” порядок хранения данных (он же - “little endian”), Т.е. если у нас имеется число 2018(10)= 07 Е2(16), то его байты будут помещены в регистры процессора в виде Е2 07. У математиков это обратный порядок, потому что чем бит при записи “на бумажке” левее, тем он старше. В компьютерной памяти это фактически “прямой” порядок, потому что если байт с Е2 попадет в адрес N, то байт с 07 попадет в адрес N+1.

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

Мы никаких самостоятельных решений не принимаем!

Ещё 1, как так получается что побитовый сдвиг делается медленнее чем деление? Оно же более сложным должно быть? Или же это только у меня так странно работает? Вот программа которой я тестировал. Дебаг компилятора выключил, по Shift+F9 запустил.

begin
  
  var LT: System.DateTime;
  var IC := 1000000000;
  var res: integer;
  var i: integer := $12345678;
  
  
  LT := System.DateTime.Now;
  loop IC do res := i div 256;
  writeln(System.DateTime.Now - LT);
  
  
  LT := System.DateTime.Now;
  loop IC do res := i shr 8;
  writeln(System.DateTime.Now - LT);
  
  
  readln;
  
end.

изображение

Это у Вас компьютер наверное вражеский

Речь не персонально о ком-либо и даже не о конкретном PascalABC.NET. Речь о том, как отображать битовые цепочки именно цепочками, а не трактовать их, как числа.

В смысле “вражеский”? :sweat_smile:

image

1 лайк

Ну, у меня одинаково :slight_smile:

1 лайк
{$apptype 'windows'}
{$reference 'Microsoft.DirectX.dll'}
{$reference 'Microsoft.DirectX.Direct3D.dll'}
{$reference 'Microsoft.DirectX.AudioVideoPlayback.dll'}

uses DirectX, DirectX.Direct3D, DirectX.AudioVideoPlayback;

begin
  
end.

test.pas(2) : Ошибка при чтении сборки 'C:\Windows\assembly\GAC\Microsoft.DirectX\1.0.2902.0__31bf3856ad364e35\Microsoft.DirectX.dll'

Что ему может не нравиться? Так при чём с каждой из этих библиотек… Они вроде на компьютере установлены но находятся ни в каком ни GAC а на прямую в assembly:

DirectX это managed-библиотека написанная под .NET 1.1 на MC++. Такие dll не поддерживаются компилятором, так как System.Reflection их не умеет читать.

А как его тогда подключать?

никак. это невозможно.

  • Доктор, когда я делаю вот так, мне больно…
  • Голубчик, а Вы “вот так” больше не делайте!

Нет ну подождите, директ это одна из передовых графических библиотек, её надо хоть как то поддерживать. Это ни в какие ворота не лезет. Возможно надо как для OpenGL написать модуль, загрузив в него через external все функции и написать от руки все типы?

Вообще мне бы только доступ к пикселям экрана и видео карте на прямую, друзья подсказали что DirectX как раз разбирается с версиями видео карты и даёт возможность делать остальное самому. Есть другой способ?

Расскажите пожалуйста как работает packed:

type
  r1 = packed record
  
  end;

begin end.

Так же компилятор предлагал поставить array вместо record.

Я не знаю, когда и что ответят разработчики, но по-моему это анахронизм, сохраненный исключительно для совместимости. Если бы я был разработчиком, то после анализа лексему packed просто бы удалял.

Для начала надо найти что оно делает и альтернативы а потом уже удалять.

Ничего особого оно не делало. Экономило память путем упаковки данных. Для работы - распаковывало их, т.е. тратило процессорное время на упаковку-распакову - это была плата за экономию памяти. Сейчас памяти много, поэтому проще не упаковывать, чтобы потом не распаковывать.

1 лайк

Хотел только добавить, что модификатор packed в Паскале до сих пор иногда имеет смысл использовать (напр. в Turbo Pascal / Delphi или FreePascal) при описании структурированных типов данных для типизированных файлов, чтобы обеспечить более высокую совместимость по чтению/записи для разных компиляторов и сред исполнения, т.к. все данные в них будут записаны плотно, без платформо-зависимых “дыр” (правда, остается еще проблема endianness и представления/кодировки строк). Но в PABC.NET этот метод работать не будет – здесь это просто заглушка.

https://www.freepascal.org/docs-html/ref/refse14.html#QQ2-39-63

http://www.delphibasics.ru/Packed.php (очень сокращенно, но по-русски)

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