nxNetwork.pas String и {$H+}

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
ssadragon
постоялец
Сообщения: 148
Зарегистрирован: 03.12.2012 20:21:35

nxNetwork.pas String и {$H+}

Сообщение ssadragon »

Нарыл недавно модуль nxNetwork.pas и пример его использования.
Так вот при отправке строки более 255 символов она режется до 255 символов, что логично, т.к. в нем не стоит директива {$H+}. НО если эту директиву добавить то происходит то что на скрине(((

P.S. Модуль и пример прилагается
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
hinst
энтузиаст
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Сообщение hinst »

а что там происходит? я что-то смотрел-смотрел на этот скрин, так и не понял, что там такого нехорошего(( происходит
ssadragon
постоялец
Сообщения: 148
Зарегистрирован: 03.12.2012 20:21:35

Сообщение ssadragon »

hinst писал(а):а что там происходит? я что-то смотрел-смотрел на этот скрин, так и не понял, что там такого нехорошего(( происходит

Слово 'test' отправляется через раз кракозябрами
Ism
энтузиаст
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Сообщение Ism »

ssadragon писал(а):
hinst писал(а):а что там происходит? я что-то смотрел-смотрел на этот скрин, так и не понял, что там такого нехорошего(( происходит

Слово 'test' отправляется через раз кракозябрами

Ну так если память выделена на 255 символов, то превышение пишет туда, где память не защищена, то есть может перезаписаться любым мусором. Обычно программа вылетает с ошибкой, но иногда запись в невыделенную память прокатывает и происходят глюки

Также возможно неправильно происходит инициализация строки при повторных операциях
ssadragon
постоялец
Сообщения: 148
Зарегистрирован: 03.12.2012 20:21:35

Сообщение ssadragon »

Ism писал(а):Ну так если память выделена на 255 символов, то превышение пишет туда

Какое может быть превышение у слова "test"?
Я же пишу что
ssadragon писал(а):если эту директиву добавить
происходит какая-то фигня.
Во всей программе использую эту директиву и не разу не было проблем, а в данном примере какая-то чертовщина творится
Alex2013
долгожитель
Сообщения: 3237
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

Может {$mode delphi} поможет ?
А вообще я думаю что там может быть применена конструкция типа ord(s[0]) (древний способ узнать длину строки ) Замени на Lenght(S) и все будет ок
И не забывай про UTF8 ! - эта сволочная кодировка может вылезать боком где угодно !
ssadragon
постоялец
Сообщения: 148
Зарегистрирован: 03.12.2012 20:21:35

Сообщение ssadragon »

Alex2013
Вообще проблема происходит при присвоении стринговой переменной значения

Код: Выделить всё

  If Not server.Opened Then
    exit;
  xs := 'Test';                             ---------------вот в этом месте происходит некорректное присвоение через раз
  memo1.Lines.Add(xs);
  If server.UDP Then
    TUDPServer(server).SendString(xs)
  Else
    TTCPServer(server).SendString(SpinEdit1.Value, xs);

этот кусок из модуля формы.
А если убрать {$H+}(ну и конечно же убрать галочку в "Использовать строки AnsiString" в параметрах проекта) из модуля nxNetwork то все становится нормально.
P.S. прошу прощения, немного недообъяснил суть проблемы.
Alex2013
долгожитель
Сообщения: 3237
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

xs := 'Test'+#0; ? (Возможно нет конца строки)
ssadragon
постоялец
Сообщения: 148
Зарегистрирован: 03.12.2012 20:21:35

Сообщение ssadragon »

Alex2013 писал(а):xs := 'Test'+#0; ? (Возможно нет конца строки)

Не помогло :cry:
Ответить