|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
06.11.2011, 22:42 | #11 |
Пользователь
Регистрация: 05.11.2011
Сообщений: 16
|
GunSmoker, в MessageBox нормально отображалось содержимое строки. Ошибок не возникало. MessageBox использовался для поиска этой ошибки.
Если s: string; s:='Блаблабла'; MessageBox(0, pchar(s),'000',0); Какая тут проблема? "Код целиком" - весь лист. Эти переменные - уровня модуля. Кстати, string тоже оканчивается нулём. Последний раз редактировалось Didim; 06.11.2011 в 22:45. |
06.11.2011, 22:46 | #12 |
Старожил
Регистрация: 13.08.2009
Сообщений: 2,581
|
Чёрным по белому написал, что при ss[i] используется больше данных, чем при PChar(ss). Откуда следует, что если с ss[i] проблема, а с PChar(ss) проблемы нет, то причина сидит в этой разнице.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
|
06.11.2011, 22:52 | #13 |
Пользователь
Регистрация: 05.11.2011
Сообщений: 16
|
GunSmoker, что Вы хотите сказать? Неправильно использовался MessageBox, или не допустимо добавление rst:=rst+ss[l]?
Следует из этой ошибки. Строка ss содержит символы, но символы недоступны как ss[l]; Чтобы вопросов не было, добавлю: l - больше нуля, и меньше длины строки.. Последний раз редактировалось Didim; 06.11.2011 в 22:55. |
06.11.2011, 22:55 | #14 | |
Старожил
Регистрация: 13.08.2009
Сообщений: 2,581
|
Почитайте вот это: http://www.transl-gunsmoker.ru/2009/09/pchars.html и вот это: http://docwiki.embarcadero.com/RADSt...g_String_Types
Я не знаю, как ещё объяснить. Цитата:
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
|
|
06.11.2011, 23:06 | #15 |
Пользователь
Регистрация: 05.11.2011
Сообщений: 16
|
GunSmoker, ошибка возникает именно в этом месте. Перед возникновением ошибки (т.е., до rst:=rst+ss[l]) строка ss проверяется, и имеет длину 16 символов. Строку можно даже посмотреть: она существует... Как это вдруг ss[l] и даже ss[l-4] моментально оказывается нулевым адресом??? Это происходит в начале цикла, на первом же заходе!
Если бы ошибка была в другом месте, строка уже была бы нулевой. Какая может быть проблема, кроме библиотечной? Pchar не имеет никакого отношения к этой ошибке. Преобразование делалось только для MessageBox. Но стока проверялась и length... А появляется она из ReadLn(fr1,ss). Последний раз редактировалось Didim; 06.11.2011 в 23:17. |
06.11.2011, 23:16 | #16 | ||
Старожил
Регистрация: 13.08.2009
Сообщений: 2,581
|
Цитата:
На словах получается что ты контролируешь проблему проблемными же средствами (у тебя "не работает" строка и ты проверяешь её же строковыми функциями). Это примерно как доказать самому себе, что ты не сошёл с ума. Бесполезное занятие. Цитата:
Вот простой пример: Код:
Обрати внимание, что AV возникает не в месте проблемы (I := 2), а далеко от неё (на end). Так же и у тебя: В ПРИВЕДЁННОМ ТОБОЙ КОДЕ С SS НЕТ ОШИБОК!!! Сколько раз ещё нужно это сказать, чтобы дошло? Если не понятно. Автомобиль врезался в дерево. Ты можешь сколько угодно искать проблему в этом дереве, но исходная проблема сидит в другом месте (водитель пьян, неисправные тормоза, превышение скорости, кошка на дороге и т.п.). Так доступнее? P.S. Чтобы не было недоразумений: я не говорю, что у тебя в точности эта проблема, что в примере. Это был пример не связанности места возникновения AV с его причиной.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
|
||
06.11.2011, 23:25 | #17 |
Пользователь
Регистрация: 05.11.2011
Сообщений: 16
|
GunSmoker, не бесполезное. Все ошибки так отлавливаются. Тут выясняется, что до этой операции строка имеет нормальное состояние, и не нулевой адрес. Ошибка, которую Вы приводите в пример, была бы сразу обнаружена.
Посмотрите на приведённый код! Длина строки на входе в процедуру проверяется length, которое и даёт значение l. А while проверяет, что l>0. Т.е., l находится в пределах длины строки! Ваши варианты того, что может быть со строкой такого, что обращение к ss[l] вызывает ошибку... А я думаю о том, что при этой операции запрашивается память для увеличения длины принимающей строки... Последний раз редактировалось Didim; 06.11.2011 в 23:29. |
06.11.2011, 23:32 | #18 |
Форумчанин
Регистрация: 05.11.2011
Сообщений: 102
|
Ребятки, ну что вы спорите...
может, мой совет очень туп и бесполезен, но может попробовать объявить такое Код:
я совсем ничего не понимаю Последний раз редактировалось Camaro Chevelle; 06.11.2011 в 23:34. |
06.11.2011, 23:33 | #19 | ||
Старожил
Регистрация: 13.08.2009
Сообщений: 2,581
|
Я сейчас головой об стол буду стучать.
В приведённом коде ошибок НЕТ. Ваше упорство по скрытию кода достойно лучшего применения. Цитата:
P.S. Цитата:
В данном случае, если ты действительно хочешь "выяснить, что до этой операции (какой?) строка имеет нормальное состояние, и не нулевой адрес", то открой CPU отладчик. И посмотри, чем "до" отличается от "после".
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
|
||
06.11.2011, 23:34 | #20 | |
Старожил
Регистрация: 13.08.2009
Сообщений: 2,581
|
Цитата:
Опытный программист на 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 |