|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
05.11.2011, 22:15 | #1 |
Пользователь
Регистрация: 05.11.2011
Сообщений: 16
|
Странная ошибка при обработке строки
l:=length(ss)-1;
if l<2 then exit; while l>0 do begin rst:=rst+ss[l]; l:=l-1; end; После обработки около 340 кб текста, на одном и том же слове, постоянно возникает ошибка (обращение к нулевому адресу) при попытке прочитать значение ss[l]. l=16, в ss - соответствуюющее количество знаков. Нельзя прочитать ни ss[l-1], ни ss[l-4], и вообще ничего из ss... И не только в rst, но и в любую другую строку. Переменную ss можно вывести в MessageBox, но скопировать отдельные символы ss[l-x] в специальную строку нельзя: возникает эта же ошибка. Проблема решена превращением ss и rst в массивы. Но хочется понять причину этой странной ошибки. Последний раз редактировалось Didim; 05.11.2011 в 22:19. |
05.11.2011, 22:45 | #2 |
Старожил
Регистрация: 13.08.2009
Сообщений: 2,581
|
Ошибка где-то в другом месте. Порча памяти или что-то вроде него.
Range Check Error попробуйте включить. FastMM в отладочном режиме.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
|
05.11.2011, 23:36 | #3 |
Форумчанин
Регистрация: 15.06.2010
Сообщений: 740
|
Ваще какой-то вышеприведенный код кривой. Что нужно сделать? Если слово больше трех букв - добавить его к rst?
Чтобы понять рекурсию, сперва нужно понять рекурсию.
|
06.11.2011, 03:04 | #4 |
Форумчанин
Регистрация: 05.11.2011
Сообщений: 102
|
$r+ вероятно надо включить
|
06.11.2011, 14:33 | #5 |
Пользователь
Регистрация: 05.11.2011
Сообщений: 16
|
Tronix, почему кривой? Это реверс.
Camaro Chevelle, включение RangeCheck не помогает. GunSmoker, я думаю, проблема - в библиотеке. С выделением памяти, с переполнением какой-нибудь переменной, и т.п. ss - не нулевая, и l не может выйти за границы строки. Но ошибка появляется именно здесь: rst:=rst+ss[l]; Если выше поставить Messagebox, и передать ему ss, он нормально отображает, а на следующем шаге - на добавлении в rst - возникает эта ошибка. Если попытаться скопировать ss[l] в другу строку, чтобы передать в Messagebox, возникает эта же ошибка. Адрес ss[l] - недоступен. |
06.11.2011, 15:35 | #6 |
Форумчанин
Регистрация: 05.11.2011
Сообщений: 102
|
а насколько длинная строка-то? если не очень, попробуй размести вместе с ней по абсолютному адресу массив из символов и оперируй с ним, а не со строкой
|
06.11.2011, 18:57 | #7 |
Пользователь
Регистрация: 05.11.2011
Сообщений: 16
|
Camaro Chevelle, маленькая, не более 30. Так и сделал. Просто ошибка очень странная: или я чего-то не знаю, или такой быть не должно.
|
06.11.2011, 19:02 | #8 |
Старожил
Регистрация: 13.08.2009
Сообщений: 2,581
|
MessageBox принимает PChar, а добавление в rst требует String.
У тебя часом не DLL?
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
|
06.11.2011, 22:29 | #9 |
Пользователь
Регистрация: 05.11.2011
Сообщений: 16
|
GunSmoker, в MessageBox пишу Pchar(ss), и здесь проблем нет: нормально выводится содержимое ss. Ошибка - на следующем шаге: rst:=rst+ss[l];
То же и со специальной чистой строкой, которая должна была передаваться в MessageBox, чтобы эту ошибку определить es:=es+ss[l]; Т.е., rst в ошибке не участвует. И нельзя именно ss[l] взять (или - добавить в другую), а ss целиком - можно. И со значением l ошибка не связана: оно было в пределах длинны строки. Ошибка отлавливалась по специфической длине "проблемной" строки - 16 символов. ss[l-4] - тоже давало ошибку. Это не dll |
06.11.2011, 22:35 | #10 |
Старожил
Регистрация: 13.08.2009
Сообщений: 2,581
|
А вы вообще понимаете чем PChar от String отличается?
Передача строки в MessageBox (и, вероятно, просмотр её в отладчике) работает с PChar - т.е. как с нуль-терминированной строкой. Для успешности этой операции достаточно, чтобы указатель строки указывал на блок данных с нулём в конце. Строковые операции (вроде сложения строк и [i]) работают непосредственно со строкой (String). Что означает, что не только содержание строки должно быть доступно, но и служебный заголовок со счётчиками до данных. А вообще - код целиком в студию. Включая скрины диалогов с ошибками.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Странная ошибка при работе с вводом значения (dev C++) | Николай ПН | Помощь студентам | 2 | 21.06.2011 11:56 |
ошибка при обработке функции класса "missing type specifier - int assumed" | askerpro | Общие вопросы C/C++ | 8 | 02.06.2010 23:09 |
Ошибка при обработке StringGrid + использование XPManifest | noname_06 | Общие вопросы Delphi | 3 | 18.01.2009 20:52 |
программа на си по обработке строки | riptror | Общие вопросы C/C++ | 1 | 20.11.2007 20:54 |
Странная ошибка при выполнении | okolobaxa | Общие вопросы Delphi | 2 | 03.07.2007 00:47 |