Форум: "Начинающим";
Текущий архив: 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