Сишные аналоги

Любые обсуждения, не нарушающие правил форума.

Модератор: Модераторы

Сишные аналоги

Сообщение Matich » 03.10.2007 22:04:57

Код: Выделить всё
typedef union{
  short W;
  struct{
      byte l,h;
  } B;
} word;


Можно ли что-то похожее сделать на pascal?
Matich
новенький
 
Сообщения: 50
Зарегистрирован: 25.07.2007 21:42:57

Сообщение alexs » 03.10.2007 22:30:24

простейшая запись с вариантами
Код: Выделить всё
type
  TUnion = record
     case byte of
       1:(W:short);
       2:(h,l:byte);
     end
  end

кажется так - писал по памяти
вобще это в любом учебнике по паскалю есть
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Сообщение e-moe » 03.10.2007 23:31:01

можно еще и с Absolute поиграться ;)
e-moe
новенький
 
Сообщения: 31
Зарегистрирован: 27.09.2007 17:00:39

Сообщение Sergei I. Gorelkin » 03.10.2007 23:47:43

Тот тип, что описан - это WordRec
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение alexs » 04.10.2007 08:33:21

я ему принцип показал - а так, конечно - есть куча уже определённых типов - просто иногда полезно полазить по стандартным библиотекам - много интересного для себя узнаёш, иногда понимаеш, что ты - ВЕЛОСЕПЕДИСТ :-)

p.s. А интересно - человек не с LOR-а пришёл - там буквально на днях ьподобный вопрос задали...
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Сообщение Tariel » 04.10.2007 14:38:03

Не совсем правильно написано на паскале, если дословно переписывать:
Код: Выделить всё
type
  TB = record
     h,l:byte;
  end;
TUnion = record
     W:short;
     B:TB;
  end;
var
  word:TUnion;
Tariel
незнакомец
 
Сообщения: 3
Зарегистрирован: 04.10.2007 14:23:35

Сообщение Brainenjii » 04.10.2007 14:43:13

Можно и проще
Код: Выделить всё
Type
  TUnion = record
    W: ShortInt;
    TB: record
       h,l: Byte;
    End;
End;
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение alexs » 04.10.2007 15:49:50

я написал запись с вариантами - может просто я не понял сишный аналог- там запись - в записи?
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Сообщение Brainenjii » 04.10.2007 16:21:45

Вроде да, union - объединение struct'ов...
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Matich » 04.10.2007 18:47:42

На сях:
Код: Выделить всё
#include <stdio.h>

typedef union{
  short W;
  struct{
      unsigned char l,h;
  } B;
} word;


main(){
  word A;
  A.B.l = 0x10;
  A.B.h = 0x20;
  printf("%x", A.W);
  return 0;
}
//EOF


bash#./test
bash#2010




на FPC:
Код: Выделить всё
type
  TB = record
     h,l:byte;
  end;
TUnion = record
     W : word;
     B : TB;
  end;
var
  wrd : TUnion;

begin
  wrd.B.l := 10;
  wrd.B.h := 20;
  writeln(wrd.W);
  readln;
end.


#./test
#0
Matich
новенький
 
Сообщения: 50
Зарегистрирован: 25.07.2007 21:42:57

Сообщение bw » 04.10.2007 19:17:19

Код: Выделить всё
type
  TUnion = record
  case Boolean of
    False: (W: Word);
    True : (B: record
      l, h: Byte;
    end);
  end;

var
  U: TUnion;
begin
  U.B.l := $10;
  U.B.h := $20;
  WriteLn(HexStr(U.W, 4));
end.


..bw
Аватара пользователя
bw
постоялец
 
Сообщения: 359
Зарегистрирован: 01.12.2005 11:36:23
Откуда: Усть-Илимск

Сообщение Matich » 04.10.2007 19:35:37

bw

Спасибо.
Работает, но только вот немного не понятно с true и false.
Matich
новенький
 
Сообщения: 50
Зарегистрирован: 25.07.2007 21:42:57

Сообщение bw » 04.10.2007 20:25:24

Можешь использовать другие типы, обычно это Integer. Это такой синтаксис. Можно, например, сделать так:
Код: Выделить всё
type
  TUnion = packed record
  case Size: Byte of
    1: (B: record l, h: Byte; end);
    2: (W: Word);
  end;

var
  U: TUnion;
begin
  WriteLn(SizeOf(U));
  U.Size := 2;
  U.B.l := $10;
  U.B.h := $20;
  WriteLn('Word: ', HexStr(U.W, 4));
  WriteLn('Size: ', U.Size);
end.


Если в предыдущем примере размер структуры был равен 2 байтам, то в этом - трем.

..bw
Аватара пользователя
bw
постоялец
 
Сообщения: 359
Зарегистрирован: 01.12.2005 11:36:23
Откуда: Усть-Илимск


Вернуться в Потрепаться

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 3

Рейтинг@Mail.ru