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

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

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

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

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

Сообщение Matich »

Код: Выделить всё

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


Можно ли что-то похожее сделать на pascal?
Аватара пользователя
alexs
долгожитель
Сообщения: 4067
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

простейшая запись с вариантами

Код: Выделить всё

type
  TUnion = record
     case byte of
       1:(W:short);
       2:(h,l:byte);
     end
  end

кажется так - писал по памяти
вобще это в любом учебнике по паскалю есть
e-moe
новенький
Сообщения: 31
Зарегистрирован: 27.09.2007 17:00:39

Сообщение e-moe »

можно еще и с Absolute поиграться ;)
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

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

Сообщение alexs »

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

p.s. А интересно - человек не с LOR-а пришёл - там буквально на днях ьподобный вопрос задали...
Tariel
незнакомец
Сообщения: 3
Зарегистрирован: 04.10.2007 14:23:35

Сообщение Tariel »

Не совсем правильно написано на паскале, если дословно переписывать:

Код: Выделить всё

type
  TB = record
     h,l:byte;
  end;
 TUnion = record
     W:short;
     B:TB;
  end;
var
  word:TUnion;
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

Можно и проще

Код: Выделить всё

Type
  TUnion = record
    W: ShortInt;
    TB: record
       h,l: Byte;
    End;
End;
Аватара пользователя
alexs
долгожитель
Сообщения: 4067
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

я написал запись с вариантами - может просто я не понял сишный аналог- там запись - в записи?
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

Вроде да, union - объединение struct'ов...
Matich
новенький
Сообщения: 50
Зарегистрирован: 25.07.2007 21:42:57

Сообщение Matich »

На сях:

Код: Выделить всё

#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
Аватара пользователя
bw
постоялец
Сообщения: 359
Зарегистрирован: 01.12.2005 10:36:23
Откуда: Усть-Илимск
Контактная информация:

Сообщение bw »

Код: Выделить всё

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
Matich
новенький
Сообщения: 50
Зарегистрирован: 25.07.2007 21:42:57

Сообщение Matich »

bw

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

Сообщение bw »

Можешь использовать другие типы, обычно это 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
Ответить