Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.11.2011, 22:15   #1
Didim
Пользователь
 
Регистрация: 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.
Didim вне форума Ответить с цитированием
Старый 05.11.2011, 22:45   #2
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Ошибка где-то в другом месте. Порча памяти или что-то вроде него.

Range Check Error попробуйте включить. FastMM в отладочном режиме.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 05.11.2011, 23:36   #3
Tronix
Форумчанин
 
Аватар для Tronix
 
Регистрация: 15.06.2010
Сообщений: 740
По умолчанию

Ваще какой-то вышеприведенный код кривой. Что нужно сделать? Если слово больше трех букв - добавить его к rst?
Чтобы понять рекурсию, сперва нужно понять рекурсию.
Tronix вне форума Ответить с цитированием
Старый 06.11.2011, 03:04   #4
Camaro Chevelle
Форумчанин
 
Регистрация: 05.11.2011
Сообщений: 102
По умолчанию

$r+ вероятно надо включить
Camaro Chevelle вне форума Ответить с цитированием
Старый 06.11.2011, 14:33   #5
Didim
Пользователь
 
Регистрация: 05.11.2011
Сообщений: 16
По умолчанию

Tronix, почему кривой? Это реверс.

Camaro Chevelle, включение RangeCheck не помогает.

GunSmoker, я думаю, проблема - в библиотеке. С выделением памяти, с переполнением какой-нибудь переменной, и т.п.

ss - не нулевая, и l не может выйти за границы строки. Но ошибка появляется именно здесь: rst:=rst+ss[l];

Если выше поставить Messagebox, и передать ему ss, он нормально отображает, а на следующем шаге - на добавлении в rst - возникает эта ошибка. Если попытаться скопировать ss[l] в другу строку, чтобы передать в Messagebox, возникает эта же ошибка. Адрес ss[l] - недоступен.
Didim вне форума Ответить с цитированием
Старый 06.11.2011, 15:35   #6
Camaro Chevelle
Форумчанин
 
Регистрация: 05.11.2011
Сообщений: 102
По умолчанию

а насколько длинная строка-то? если не очень, попробуй размести вместе с ней по абсолютному адресу массив из символов и оперируй с ним, а не со строкой
Camaro Chevelle вне форума Ответить с цитированием
Старый 06.11.2011, 18:57   #7
Didim
Пользователь
 
Регистрация: 05.11.2011
Сообщений: 16
По умолчанию

Camaro Chevelle, маленькая, не более 30. Так и сделал. Просто ошибка очень странная: или я чего-то не знаю, или такой быть не должно.
Didim вне форума Ответить с цитированием
Старый 06.11.2011, 19:02   #8
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

MessageBox принимает PChar, а добавление в rst требует String.

У тебя часом не DLL?
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 06.11.2011, 22:29   #9
Didim
Пользователь
 
Регистрация: 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
Didim вне форума Ответить с цитированием
Старый 06.11.2011, 22:35   #10
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

А вы вообще понимаете чем PChar от String отличается?

Передача строки в MessageBox (и, вероятно, просмотр её в отладчике) работает с PChar - т.е. как с нуль-терминированной строкой. Для успешности этой операции достаточно, чтобы указатель строки указывал на блок данных с нулём в конце.

Строковые операции (вроде сложения строк и [i]) работают непосредственно со строкой (String). Что означает, что не только содержание строки должно быть доступно, но и служебный заголовок со счётчиками до данных.

А вообще - код целиком в студию. Включая скрины диалогов с ошибками.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Странная ошибка при работе с вводом значения (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