На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
  
> Приведение типов для массивов - Delphi
    Вот код:
    ExpandedWrap disabled
      unit Unit31;
       
      interface
       
      uses
        Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
        Dialogs;
       
       
      type
        TfMain = class(TForm)
          procedure FormShow(Sender: TObject);
        private
          { Private declarations }
        public
          { Public declarations }
        end;
       
        TETPBuf = array[0..9] of Byte;
        TETPReadBuf = array[Byte] of Byte;
       
      var
        fMain: TfMain;
        RealRD : TETPReadBuf;
       
      implementation
       
      {$R *.dfm}
      function Test(RD : TETPBuf): Boolean;
      begin
        Result:=RD[0] = 0;
      end;
       
      procedure TfMain.FormShow(Sender: TObject);
      begin
        Test(TETPBuf(RealRD));
      end;
       
      end.

    Не понимаю с какого перепуга в строке
    ExpandedWrap disabled
      Test(TETPBuf(RealRD));
    компилятор показывает ошибку Invalid typecast?
    Или я чего-то пропустил в букваре Дельфи? Прикреплённый файлПрикреплённый файлTestTCArr.rar (3,35 Кбайт, скачиваний: 58)
      Размер не совпадает, такое приведение только через указатели.

      This error message is issued for type casts not allowed by the rules. The following kinds of casts are allowed:
      ...
      A variable reference to any type of the same size.
      (на самом деле Float->Ordinal запрещено)

      Разрешено приведение таких, например, типов:

      ExpandedWrap disabled
         TETPReadBuf = array[1..10] of Byte;
         TETPReadBuf = array[0..4] of Word;


      Аналогичный случАй - заработает, если раскомментировать поле y, причем в обе стороны Int-Rec и Rec-Int

      ExpandedWrap disabled
        type
          TRec = packed record
            x: Byte;
            //y: Byte;
            Z: WideChar;
          end;
         
        var
          F: TRec;
         
        function A(R : Integer): Boolean;
        begin
          Result := R = 0;
        end;
         
        begin
          A(Integer(F));
      Сообщение отредактировано: MBo -
        Цитата northener @
        Или я чего-то пропустил в букваре Дельфи?

        :yes:
        Прямое приведение типа TETPBuf(Х) возможно только в случае, когда SizeOf(X) = SizeOf(TETPBuf). В противном случае нужно использовать (явное или неявное) приведение типа через указатели. Например:
        ExpandedWrap disabled
          type
            pTETPBuf = ^TETPBuf;
            ...
          //вариант 1
          function Test(const RD : TETPBuf): Boolean;
          Test(pTETPBuf(@RealRD)^);
          //вариант 2
          function Test(RD : pTETPBuf): Boolean;
          Test(@RealRD);
          //вариант 3 - самый простой и безопасный с неявным приведением типа и передачей кол-ва элементов массива
          function Test(RD : array of byte): Boolean;
          Test(RealRD);
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0284 ]   [ 18 queries used ]   [ Generated: 2.05.24, 22:43 GMT ]