Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.09.17;
Скачать: [xml.tar.bz2];

Вниз

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

 
ак   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.048 c
15-1156691988
Konstantin555
2006-08-27 19:19
2006.09.17
Что означает сигнал компьютера в виде сирены?


10-1123495556
Nick Denry
2005-08-08 14:05
2006.09.17
Можно ли средсвами TMediaPLayer


15-1156694224
Griha
2006-08-27 19:57
2006.09.17
Скрыть от приложения деактивацию его окна (WM_ACTIVATE)


2-1156418569
zdm
2006-08-24 15:22
2006.09.17
true false


3-1152881652
oleg_v
2006-07-14 16:54
2006.09.17
Файл–сервер





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский