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

Вниз

Проблемка с указателями   Найти похожие ветки 

 
_Mouse_   (2006-09-14 12:56) [0]

Уважаемый мастера, что-то я запутался с указателями. Помогите разобраться.

Есть у меня массив (цепочка) байт:
type TArray = array[0..159999] of byte; PArray = ^TArray;
И сами переменные с которыми работаю:
PObj : PArray;
MW : WORD;
MDW : DWORD;

Допустим PObj содержит следующую цепочку чисел:
26 0 14 118 103 216 105 .... и тд.
0-й байт я пропускаю.
Мне надо в MW (2-х байтовое число) получить 014 (1 и 2-й байт в цепочке) и в MDW (4-х байтовое число) получить  1986517097 (3-6 байты в цепочке).

Делаю так: (Для этого ввел еще 2 переменных: pMW :PWORD и pMDW : PDWORD)


pMW := PWORD(@PObj^[1]);
MW := pMW^;
pMDW := PDWORD(@PObj^[3]);
MDW := pMDW^;


В итоге получаются совсем другие числа. Кто может подсказать что не так?


 
Elen ©   (2006-09-14 13:05) [1]


> _Mouse_

попробуй move(pobj[1],pmw,2); и move(pobj[3],pmdw,4).


 
Elen ©   (2006-09-14 13:10) [2]

p.s. и не забывай перед этой операцией обнулять pMW и pMDW...


 
_Mouse_   (2006-09-14 13:25) [3]

Получается что числа в Делфи идут с конца в начала. Т.е старший байт - последний. А у меня в цепочке - старший байт - первый.
Как проще переконвертировать в нужный мне формат?


 
Reindeer Moss Eater ©   (2006-09-14 13:27) [4]

Заведи переменную PByte

делай Inc(pb) для перебора элементов

В нужном месте присваивай PWORD PDWORD значение pb
И используй ^ для доступа к значениям (если в массиве половинки в нужном порядке)


 
Slym(RO)   (2006-09-14 13:28) [5]

Обратная запись байтов...
надо не 014, а 140


 
han_malign ©   (2006-09-14 13:31) [6]


> Получается что числа в Делфи идут с конца в начала. Т.е старший байт - последний. А у меня в цепочке - старший байт - первый.

- классический Network Order(aka Big-endian)  - надо переставлять байты руками для получения - принятого у Intel - Litle-endian:
Winsock2 - ntohs, ntohl
или таки MDW:= PObj[i] shl 24 or PObj[i+1] shl 16 or PObj[i+2] shl 8 or PObj[i+3];

А Delphi здесь не причем...


 
Elen ©   (2006-09-14 13:33) [7]


> _Mouse_

А ты старший ставь в обратном порядке


 
Slym(RO)   (2006-09-14 13:34) [8]

ReverseString


 
han_malign ©   (2006-09-14 13:42) [9]


> Получается что числа в Делфи идут с конца в начала.

- а числа(в Делфи, и в любых других приложениях работающих на процессорах с Little-endian организацией памяти) - как раз, идут "с начала в конец" - младший байт - 0-й, старший - последний...
http://www.cs.umass.edu/~verts/cs32/endian.html


 
_Mouse_   (2006-09-14 15:50) [10]

ясненько ... всем спасибо.


 
Anatoly Podgoretsky ©   (2006-09-14 20:38) [11]

Нету ни какого начали и конца, есть порядок байт, в относительных адресах.
А начало и конец - это религиозные соображения адептов той или другой системы. Если мыслить в порядке возрастания адресов, то у Интела естественный, а у IBM противоестественный, но так у IBM было и два нуля, +0 и -0, а может еще и есть. Но это внутреннее дело IBM и связано с ранним развитием компьютерной науки, Интел пришел позже и учел данные ошибки, создав удобный процессор и систему.



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

Форум: "Основная";
Текущий архив: 2006.10.22;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.123 c
15-1157915187
VirEx
2006-09-10 23:06
2006.10.22
Биоритмы ...или Астрология всё-таки ложь?


2-1159899021
majer_rv
2006-10-03 22:10
2006.10.22
вставить строку в файл


2-1159702149
Фиббоначи
2006-10-01 15:29
2006.10.22
Последовательность Фиббоначи


1-1157801018
guav
2006-09-09 15:23
2006.10.22
Прозрачный ТМемо


2-1159689059
lex85
2006-10-01 11:50
2006.10.22
Listview





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский