![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите разобраться в преобразовании [D7, XP]
Zheksonz © (2009-07-03 09:48:00)
Страницы: < 1 2 3 4 5 6 7 8 9 10 11 >
Доброе утро. Помогите, застрял я(((
для записи в COM порт используется функцияComPort.WriteStr(String_);
01 06 00 04 5000 - это первые шесть байт, 5000 имеет 2х байтовое значение, завершающими двумя байтами станут байты контрольной суммы.
формат этой записи, правильно воспринимаемый COM портом, следующий:String_ := #01#06#00#04#19#136 + crc16(String_);// ф-ция crc16 возвращает ещё два байта, в которых контрольная сумма всего этого набора данных, которые представлены в таком же виде... Как мне преобразовывать String_овывые или Integer_овские значения в этот формат???
Zheksonz (2009-07-05 11:00:00) [21]
> Думаю, что мало кто, кроме тебя, не знает, что такое код
> #19#136.
тогда почему столько времени мне пришлось объяснять, что '#19#136' меня не устраивает???
Zheksonz (2009-07-05 10:58:00) [22]
> Сергей М. © (05.07.09 10:48) [178]
впринципе это вариант... но вот как мне с функцией CRC16 быть???
function TForm1.crc16(seq:string):string;
var
i,j:integer;
CRC:word;
const
CRC_st:word=$FFFF;
CRC_1:word=$A001;
begin
CRC:=CRC_st;
for i:=1 to (length(seq)) do
begin
CRC:=CRC xor ord(seq[i]);
for j:=1 to 8 do
begin
if (CRC and 1)>0 then
begin
CRC:=CRC shr 1;
CRC:=CRC xor CRC_1;
end
else CRC:=CRC shr 1;
end;
end;
result:=chr(lo(CRC))+chr(hi(CRC)); // обойтись без chr???
end;
Sha (2009-07-05 10:56:00) [23]> Zheksonz (05.07.09 10:44) [177]
что конкретно неверно? результат устраивает?
> подтвердилось предположение, что '#19#136' - будет набором из 7ми строковых символов,
Ну, это все знают.
> а не кодом #19#136
Думаю, что мало кто, кроме тебя, не знает, что такое код #19#136.
Сергей М. (2009-07-05 10:48:00) [24]
> Zheksonz (05.07.09 01:12) [144]
Вот теперь понятно, что на самом делетребуется, с этого и надо было начинать.
А теперь скажи, на кой ляд тебе все эти "строковые преобразования" сдались, если они для выполнения задачи нужны как корове седло ?
В [40] приведен пример, делающий именно то что требуется и безо всяких "преобразований")..
Zheksonz (2009-07-05 10:44:00) [25]
s := WordToString2(UpDown1.Position);
ShowMessage(ZheksonzFormat(S) + #19#136);
всё перепроверил и подтвердилось предположение, что '#19#136' - будет набором из 7ми строковых символов, а не кодом #19#136
Юрий Зотов (2009-07-05 10:41:00) [26]> Sha © (05.07.09 09:05) [169]
> Юр, подозреваю, что ты все-таки не пробовал выполнить мой код.
Пробовал, чес-слово. Действительно, длина остается равной 1. Если ее устанавливать, как у тебя. А если не устанавливать, как у меня, то длина будет 2. Что и требовалось.
> Твой пример лишь доказывает, что длина локальной короткой строки
> инициализируется максимумом, а мой - что это делается однократно.
Так это и нужно было - однократная инициализация максимумом.
> Кстати, где-нить эта фича описана?
Фичу эту я помню еще со времен TP, читал где-то. Но где - сейчас, конечно фиг вспомнишь, прошло-то лет 15. Причем всегда эту фичу использовал (сам понимаешь, тысячи раз) и она всегда работала безукоризненно. Правда, с появлением в Delphi (по-моему, в D2) длинных строк короткие я уже практически не использую.
> Sha © (05.07.09 09:34) [172]
Убеждает. Похоже, по сравнению с TP в компиляторе что-то на этот счет изменилось. Поэтому соглашусь с тобой, что для определенности длину лучше выставлять явно. Вот еще пример для размышления на эту тему:
procedure TForm1.Button1Click(Sender: TObject);
var
S: ShortString;
begin
S := 'Вася';
ShowMessage(IntToStr(Length(S))); // Выводит 4
S := 'Пупкин';
ShowMessage(IntToStr(Length(S))); // Выводит 6
end;
Sha (2009-07-05 10:41:00) [27]> Zheksonz (05.07.09 10:27) [174]
Не надо приводить несвязанные между собой обрывки кода и говорить "на выходе", "при выполнении", "на выходе было", "такой формат не воспринимался" без примера вызова моей функции. Это не способствует взаимопониманию.
Приведи полностью код, содержащий вызов ZheksonzFormat,
и объясни, что тебя не устраивает: передаваемый параметр, функция или возвращаемый результат?
Zheksonz (2009-07-05 10:27:00) [28]
> Т.е. если на входе будет #19#136, то на выходе '#19#136'.
Caption := Format('#%d #%d', [Ord(S[1]), Ord(S[2])])вот этот код на выходе даёт '#19#136', и при выполненииStrn = #01#06#00#04 := Strn + S = '#19#136'; //на выходе было #01#06#00#04'#19#136', и такой формат не воспринимался, в отличие от #01#06#00#04#19#136.
Sha (2009-07-05 09:47:00) [29]> Zheksonz (05.07.09 02:01) [160]
> я так понимаю на выходе будет '#19#136', а мне такая строка не нужна... > мне нужно, чтобы строковая переменная была наполнена #19#136, а не '#19#136'... ну неужели не понятно???
Ты на миг допусти, что кому-то все может быть более понятно, чем тебе. Понятно?
Функция ZheksonzFormat из [159] отображает строку в твоем формате.
Т.е. если на входе будет #19#136, то на выходе '#19#136'.
Это позволит тебе судить о корректности входной строки.
Sha (2009-07-05 09:34:00) [30]Вот еще пример в подтверждение неразруливаемости:
function NoLength: ShortString;
var
i: integer;
begin
for i:=1 to 255 do Result[i]:='a';
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
ShowMessage(IntToStr(Length(NoLength)));
end;
Sha (2009-07-05 09:21:00) [31]дело в том, чтов случае
Sha (2009-07-05 09:20:00) [32]Кстати, вот это доказывает, что длина вообще не инициализируется.
procedure TForm1.Button2Click(Sender: TObject);
var
s: String2;
begin
ShowMessage(IntToStr(Length(s)));
end;
Этот пример у меня выводит 247. Если посмотреть асм код то оказывается дело в том в случае с WordToString2 компилятор при последующих присваиваниях будет ограничивать результат по длине (в нашем случае это 2) и работа часто оказывается ожидаемой (с вероятностью 254/256).
Но Zheksonz в [136], похоже, добился длины строки 0
Sha (2009-07-05 09:05:00) [33]> Юрий Зотов © (05.07.09 08:06) [168]
Юр, подозреваю, что ты все-таки не пробовал выполнить мой код.
Твой пример лишь доказывает, что длина локальной короткой строки инициализируется максимумом, а мой - что это делается однократно.
> То, что длину коротких строк устанавливать можно (в пределах объявленного максимума),
> но не обязательно (компилятор сам разрулит). Это еще со времен TP.
Не разрулит, проверял на Delphi 7. Кстати, где-нить эта фича описана?
Юрий Зотов (2009-07-05 08:06:00) [34]Sha © (05.07.09 00:36) [134]
>> Там короткая 2-х символьная строка.
> Ну и что?
То, что длину коротких строк устанавливать можно (в пределах объявленного максимума), но не обязательно (компилятор сам разрулит). Это еще со времен TP.
Попробуй выполнить это:
function WordToString2L(Value: word): String2;
begin
SetLength(Result, 2);
Result[1] := Char(Value div 256);
Result[2] := Char(Value mod 256)
end;
function WordToString2(Value: word): String2;
begin
Result[1] := Char(Value div 256);
Result[2] := Char(Value mod 256)
end;
procedure TForm1.FormCreate(Sender: TObject);
var
s: String2;
begin
s := WordToString2L($3231); // Здесь длина устанавливается
ShowMessage(Format('АШ. Length = %d (%d), S = %s (%d,%d)',
[Length(s), Byte(S[0]), s, Byte(S[1]), Byte(S[2])]));
s := WordToString2($3231); // Здесь длина НЕ устанавливается
ShowMessage(Format('ЮЗ. Length = %d (%d), S = %s (%d,%d)',
[Length(s), Byte(S[0]), s, Byte(S[1]), Byte(S[2])]));
end;
Результат один и тот же.
Zheksonz (2009-07-05 02:59:00) [35]к сожалению и сейчас проверить не могу, т.к. привод на работе, так что очередную порцию извинений прийдётся ждать пока я в реальных условиях не проверю работоспособность кода.
Юрий, Sha - персональное спасибо, в основном за то, что поверили в это безнадёжное дело.
П.С. существует ли вероятность, что при проверке окажется, что снова это не то, что нужно???
Zheksonz (2009-07-05 02:52:00) [36]sniknik © (05.07.09 02:38) [165]
а ведь Вы были правы!!! ещё до [165] я сделал именноShowMessage('#19#136' + ' !!! ' + #19#136 + ' !!! ' + #$13'€');и ахнул.
вот этот код:#$13'€'я отправлял на КОМ порт, в необходимом формате, а результат был нулевой... может накладывались какие-то незакомментированные, экспериментальные строки, может такой формат не подходит именно для отправки сообщения через эту функцию, на ком порт, но это не срабатывало. Ну и конечно же самый, пока, реальный вариант, что баран я тупорылый, на самом деле всё уже давно готово было, а я и себе и людям мозги парю.
Всем кто пытался прибить мою головную броню, спасибо.
И кстати, у меня есть и оправдание, ну как без него в такой ситуации???
это скорее ошибка по невнимательности, чем по глупости, т.к. я чуть ли не сразу получил этот формат числа, но по невнимательности не смог им воспользоваться.
sniknik (2009-07-05 02:38:00) [37]> на выходе будет '#19#136', а мне такая строка не нужна... мне нужно, чтобы строковая переменная была наполнена #19#136, а не '#19#136'...
либо строка, либо число, и оба варианта уже были рассмотрены... только не поняты, из-за упомянутого же уже отсутствия базовых знаний.
> ну неужели не понятно???
> для примера и я вам кое чего напишу:
> ShowMessage('#19#136' + ' !!! ' + #19#136);
из раннего
> то как преобразовать #$13'€'в #19#136 ???
ShowMessage('#19#136' + ' !!! ' + #19#136 + ' !!! ' + #$13'€');
круто да? а сколько попыток выше было, что это одно и то же, только представление разное. и все впустую.
толочь дальше воду в ступе, имхо, бессмысленно.
p.s.
Поросенок,
Который не мечтает стать беконом,
Бесперспективен.
Zheksonz (2009-07-05 02:24:00) [38]для примера и я вам кое чего напишу:
ShowMessage('#19#136' + ' !!! ' + #19#136);
Zheksonz (2009-07-05 02:19:00) [39]
> Германн © (05.07.09 02:10) [162]
вот и у кого нулевой уровень, если вы разницу между '#19#136' и #19#136 не видите???
Германн (2009-07-05 02:10:00) [40]
> Sha © (05.07.09 01:57) [159]
>
> > Zheksonz (05.07.09 01:47) [156]
>
> Ты не понял, что мы сделали то, что ты просил.
Ну я уже говорил, что "объяснить" что-то автору словами невозможно!
Пока он не уйдёт с нулего уровня.