он массив читает из сокета, и наверняка объявил его байтовым, соответственно траснслятор поставил вв адресах куда пришлось
он массив читает из сокета, и наверняка объявил его байтовым, соответственно траснслятор поставил вв адресах куда пришлось
таким кодом у меня получилось перегрузить плк, когда указатель становится не кратным четырем, единственное чего я не добился, чтоб изначально указатель принял не кратное четырем значение, почему это вдруг транслятор, как Вы пишите, должен раздавать адреса на куда попало?Код:VAR flag : BOOL; count : INT:=0; result : REAL; inPtr : POINTER TO BYTE; outPtr : POINTER TO REAL; stuff : ARRAY[0..7] OF BYTE; tik : TON; END_VAR (* @END_DECLARATION := '0' *) IF tik.Q THEN inPtr:=ADR(TEMPO); stuff[count]:=inPtr^; inPtr:=inPtr+1; stuff[count+1]:=inPtr^; inPtr:=inPtr+1; stuff[count+2]:=inPtr^; inPtr:=inPtr+1; stuff[count+3]:=inPtr^; outPtr:=ADR(stuff[count]); flag:=NOT DWORD_TO_BOOL(outPtr MOD 4); (* IF flag THEN*) result:=outPtr^; (* END_IF; *) count:=(count+1) MOD 5; END_IF; tik(IN:=NOT tik.Q,PT:=T#2s); END_FUNCTION_BLOCK
Bad programmers worry about the code. Good programmers worry about data structures and their relationships
среди успешных людей я не встречала нытиков
Барбара Коркоран
в описании переменных, перед stuff объявите байтовую переменную... у вас объявлены 4 байтные переменные, real и два указателя - транслятор произвел выравнивание, а затем под них вставил байтовый массив, который естественно получился выровненным
получается надо писать код неправильно чтоб обрести проблемы
![]()
Bad programmers worry about the code. Good programmers worry about data structures and their relationships
среди успешных людей я не встречала нытиков
Барбара Коркоран
ну вобщем то байт перед массивом "помог" перегрузить плк, но теперь вопросов стало еще больше, я как раз рассчитывал на булеву переменную в начале объявления, которая создаст смещение на байт и не даст выполнится кратности для массива. Но оказалось, что совместно с интом она выравняла как раз кратно 4, тогда почему это не сделал добавленный байт. И еще получается что объявленные ПОУ тоже получают адреса кратные четырем, хотя и не проверил на живом плк
Bad programmers worry about the code. Good programmers worry about data structures and their relationships
среди успешных людей я не встречала нытиков
Барбара Коркоран
Потому что выравнивается каждая (!) переменная соответственно своему типу. Если добавленный байт смещает всё после себя, то смещается всё опять же с выравниванием. Указатели сами по себе 32-битные, и поэтому следующий за outPtr массив stuff окажется на кратном 32 битам адресе. Например, было:я как раз рассчитывал на булеву переменную в начале объявления, которая создаст смещение на байт и не даст выполнится кратности для массива. Но оказалось, что совместно с интом она выравняла как раз кратно 4, тогда почему это не сделал добавленный байтПоставим байт в начале:DWORD - адрес 0
DWORD - адрес 4
ARRAY OF BYTE - адрес 8Заметьте, что массив остался выровнен, а на адресах 1-3 образовалась дырка. Попробуем переставить байт к массиву:BYTE - 0
DWORD - 4
DWORD - 8
ARRAY OF BYTE - 12Вот теперь массив на некратном четырём адресе. Но можно поменять тип массива:DWORD - 0
DWORD - 4
BYTE - 8
ARRAY OF BYTE - 9Теперь дыра на 9, 10 и 11. Такие дела.DWORD - 0
DWORD - 4
BYTE - 8
ARRAY OF REAL - 12
Последний раз редактировалось Yegor; 16.07.2016 в 20:56.