Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.09.17;
Скачать: CL | DM;

Вниз

записи и указатели   Найти похожие ветки 

 
ак   (2006-08-24 09:45) [0]

Есть такая задача. Даны две числа (тип данных - byte), надо эти числа "свести" в одно (в word), соответственно, в старший и младший байты так, чтобы потом можно было их снова оттуда корректно "вытащить в byte".

Очевидно, есть как минимум три возможности: через побитовый сдвиг, "различную форму записи" и указатели. С 1-м вариантом всё нормально, вот с остальными проблемка.

Второй вариант - "различная форма записи":

type TWBRec =
         record
         case Bool: boolean of
         true: (wint: word);
         false: (bint1, bint2: byte)
         end;

Тогда переменную этого типа данных можно просматривать в двух "вариантах" (они оба "ссылаются" на одну и ту же область памяти), верно? Например, пишу:

  var WBRec: TWBRec;
       i, j: byte;
  ...
  WBRec. wint := 65535;
  i := WBRec.bint1;
  j := WBRec.bint1;
... и в i, j должно записаться по 255. Ведь так? Но у меня почему-то не получается, числа совсем не те.

Третий вариант - указатели:
 var
    Pbint: ^byte;
    wint: word;
    pint1, pint2: byte;  

 wint := 65535;
 Pbint := @wint;

...тогда Pbint должен указывать на 1-й байт этого числа,
а Pbint := Pbint + 1 на второй, правильно?. Вот только на втором операторе выдаётся ошибка: "Данный оператор ("+"?) не применим к этому типу данных (Pointer - ?)". Но указатели ведь можно складывть с числами (это насколько я понимаю соответствует сдвигу адреса на то кол-во байт на которое "ссылается" указатель ). Тогда в чём моя ошибка?

Помогите, plz...


 
begin...end ©   (2006-08-24 09:56) [1]

> ак   (24.08.06 09:45)

> type TWBRec =
>         record

type
 TWBRec = packed record

> Pbint := Pbint + 1

Inc(Pbint)


 
ак   (2006-08-24 10:02) [2]

begin...end ©   (24.08.06 09:56) [1]

type
TWBRec = packed record


А какая разница - упакованная запись или нет?

Inc(Pbint)

И это что, как-то отличается от Pbint := Pbint + 1?


 
Anatoly Podgoretsky ©   (2006-08-24 10:07) [3]

К Pointer не применима адресная математика.


 
Kos[UFO] ©   (2006-08-24 10:07) [4]

type
 T4Bytes=record
   b1,b2,b3,b4:byte;
 end;
 TRec=record
   case Bool: boolean of
     true: (w: word);
     false: (b1, b2, b3: byte)
   end;
 PRec=^TRec;
var
r1,r2:trect;
rec:TRec;
begin

rec.Bool:=true;
rec.b1:=1;
rec.b2:=5;
rec.b3:=13;
memo1.Lines.Add(inttostr(sizeof(rec)));
memo1.Lines.Add(inttostr(T4Bytes(rec).b1));
memo1.Lines.Add(inttostr(T4Bytes(rec).b2));
memo1.Lines.Add(inttostr(T4Bytes(rec).b3));
memo1.Lines.Add(inttostr(T4Bytes(rec).b4));

Запусти


 
ак   (2006-08-24 10:09) [5]

К Pointer не применима адресная математика.

... это вообще что означает, что Inc(Pbint) - правильно, а  (Pbint := Pbint + 1 ) - нет


 
default ©   (2006-08-24 10:09) [6]

ак   (24.08.06 10:02) [2]
"А какая разница - упакованная запись или нет?"
см хелп, как разница? одна работает другая дразница:)
"И это что, как-то отличается от Pbint := Pbint + 1?"
в логике, Inc смещает указатель на позицию следующего элемента в зависимости от типа указателя
запрещая Pbint := Pbint + 1? тем самым на уровне компилятора идёт отгораживание от потенциальных ошибок при работе со смещениями указателя


 
ак   (2006-08-24 10:16) [7]

Благодарю begin...end, Kos[UFO]б Anatoly Podgoretsky и default за помощь.


 
Sapersky   (2006-08-24 12:22) [8]

Ещё, в таком варианте

TWBRec = record
 case Bool: boolean of
   true: (wint: word);
   false: (bint1, bint2: byte)
 end;

в запись кроме word"а и byte"ов будет включена переменная Bool: boolean
Если она не нужна - писать "case boolean of..."
А packed здесь влияет только на общий размер записи, если убрать Bool - то вообще разницы быть не должно.


 
ак   (2006-08-25 09:13) [9]

И тебе, Sapersky, спасибо большое ...(остальные извините - такой вот я вежливый :-)))) )



Страницы: 1 вся ветка

Текущий архив: 2006.09.17;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.04 c
1-1154589474
Mechanic
2006-08-03 11:17
2006.09.17
TGraphicControl не принимает MouseWheel


3-1152568889
the_kola
2006-07-11 02:01
2006.09.17
Пустая БД Access


1-1154875143
ancot
2006-08-06 18:39
2006.09.17
Как правильно зарегистрировать наследника TFrame


15-1156777577
Kerk
2006-08-28 19:06
2006.09.17
Мир


6-1145771824
Junior
2006-04-23 09:57
2006.09.17
Блокировка соединения по ip/MAC адресу