Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите разобраться в преобразовании [D7, XP]


Страницы:   1 2 3 4 5 6 7 8 9 10 11

Zheksonz ©   (2009-07-03 09:48:00) 

Доброе утро. Помогите, застрял я(((
для записи в 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]
>
> Ты не понял, что мы сделали то, что ты просил.

Ну я уже говорил, что "объяснить" что-то автору словами невозможно!
Пока он не уйдёт с нулего уровня.


Страницы:   1 2 3 4 5 6 7 8 9 10 11

Наверх

Титульная страница Поиск, карта сайта Написать письмо