Уважаемые коллеги! Попал в ситуацию. В общем есть устройство которое на запрос возвращает структуру вида:
hours1:BYTE;
minutes1:BYTE;
value1:INT;
rele1:BYTE;
hours2:BYTE;
minutes2:BYTE;
value2:INT;
rele2:BYTE;
hours3:BYTE;
minutes3:BYTE;
value3:INT;
rele3:BYTE;
hours4:BYTE;
minutes4:BYTE;
value4:INT;
rele4:BYTE;
hours5:BYTE;
minutes5:BYTE;
value5:INT;
rele5:BYTE;
hours6:BYTE;
minutes6:BYTE;
value6:INT;
rele6:BYTE;
я создаю такую структуру (тип А) и делаю переменную A_var: A;
Из устройства эти структура приходит просто в виде упорядоченного набора байт (массив). Т.е. та структура которую я указал только последовательно побайтно.
Переписываю этот массив в переменную A_var посредством указателя pt:POINTER TO A:
pt:=ADR(kadr[4]);
A_var:=pt^;
И в итоге некоторые байты переписываются с каким-то странным смещением на 1 байт, в общем некорректно. Вот сижу и не пойму то ли лыжи не едут, то ли у меня образованности не хватает. Если есть нюансы при работе с указателями подскажите плиз.
Чтобы понять рекурсию нужно понять рекурсию
Если я правильно понял - идут 6 пакетиков по 5 байт ?
Или тот девайс - плк-слейв, а это его структура ?
PS
Мне привычней - т-щ ))
идет один пакет длиной 30 байт, который нужно просто переложить в соответствующую структуру. Тот девайс Слейв. Только не ПЛК, а регулятор с протоколом WAKE.
На данный момент взял все захардкодил, но выглядит это ужасающе порнографично. Однако работает безотказно если не учитывать, разницу в объеме кода...
Чтобы понять рекурсию нужно понять рекурсию
Что делать ?
1.STRUCT_A
h,m : byte;
val : int;
rele : byte;
VAR
V : array [1..6] of STRUCT_A;
M : array [1..6,1..5] of byte;
2.Принять данные в M
3.Переложить M в V
for i := 1 to 6 do
V[i].h := M[i,1];
V[i].m := M[i,2];
V[i].val := 256 * M[i,4] + M[i,3]; (* или 256 * M[i,3] + M[i,4] ?*)
V[i].rele := M[i,5];
end_for
Кто виноват ? (кратко)
1.просто выравнивание
2.выравнивание структур особенно
спасибо! Смысл ясен)) Получается, что при инициализации структуры контроллер отводит память под неё как ему за хочется, а если мы инициализируем массив, то тут уже отводится последовательное кол-во байт. Вобщем следовало бы догадаться. Однако получится ли заполнить массив V [0..6] за раз посредством указателя? Или снова вмешается выравнивание в структуре лежащей по адресу V[i]? Что-то мне кажеся что вмешается. В таком случае получается не многим проще, чем захардкодить это переложение.
Чтобы понять рекурсию нужно понять рекурсию