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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.11.2011, 23:37   #21
Camaro Chevelle
Форумчанин
 
Регистрация: 05.11.2011
Сообщений: 102
По умолчанию

Didim, выложи своё детище, ну...
Camaro Chevelle вне форума Ответить с цитированием
Старый 06.11.2011, 23:48   #22
Didim
Пользователь
 
Регистрация: 05.11.2011
Сообщений: 16
По умолчанию

GunSmoker, нет такого варианта, кроме ошибок, связанных с выделением памяти и т.п. Сделал массивом, и больше проблемы нет.

Если есть строка s длиной 10 символов, длина проверена, но вдруг обращение s[5] вызывает ошибку... Я именно об этом говрю: строка приходит в нормальном состоянии, поэтому исключены ошибки и в других местах. Проверено и состояние строки, и значение l... Тут нет вариантов.


Код:
while not EOF(fr1) do
begin
ReadLn(fr1,ss);
rstr;
WriteLn(fr2,rst);
rst:='';
end;
rstr и есть вызов процедуры, которую я тут привёл уже.



___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 07.11.2011 в 09:57.
Didim вне форума Ответить с цитированием
Старый 07.11.2011, 09:56   #23
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Didim,
если Вам хочется узнать, в чём была ошибка в вашем прошлом коде, то давайте продолжим разбираться.
я не пойму, почему Вам не выложить ЦЕЛИКОМ исходный код программы?!!

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

1) описание переменных, приведите, пожалуйста.
особенно интересует, какого типа rst ? (и где она задаётся? Глобальная переменная?)

2) дайте, пожалуйста ПОЛНЫЙ текст процедуры rstr (начиная со строчки procedure rstr; ...)


___________

GunSmoker, завидую Вашему терпению и настойчивости.
Похоже, автора темы проблема с тем, что его первоначальный код не работал волнует НАМНОГО меньше, чем Вас...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.11.2011, 11:58   #24
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Похоже, автора темы проблема с тем, что его первоначальный код не работал волнует НАМНОГО меньше, чем Вас...
Примерно так оно и есть. Я не просто так это пишу, а с корыстными целями
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 08.11.2011, 10:45   #25
Didim
Пользователь
 
Регистрация: 05.11.2011
Сообщений: 16
По умолчанию

Serge_Bliznykov, если выложить всё, будет выдано предназначение и всякое личное, что там присутствует. Пришлось бы переименовывать названия, пути... Но тут приведено всё, что нужно: видите, что содержимое строки ss берется из файла ReadLn(fr1,ss), и сразу передаётся в процедуру rstr, в которой и возникает ошибка.

Строка берется:

Код:
while not EOF(fr1) do
begin
ReadLn(fr1,ss);
rstr;
обрабатывается:

Код:

l:=length(ss)-1;

if l<2 then exit;

while l>0 do begin
rst:=rst+ss[l];
l:=l-1;
end;
И возвращается, чтобы быть записаной в другой файл:

Код:
WriteLn(fr2,rst);
rst:='';
end;
Почем-то невозможно объяснить, что до rst:=rst+ss[l], где возникает ошибка, строка ничем не испорчена.

Уже писал тут, что переменные rst и ss имели тип string.

Код:
procedure TForm3.Rstr();
var
l: integer;
begin
l:=length(ss)-1;
if l<2 then exit;
rst:='';
while l>0 do begin
rst:=rst+ss[l];
l:=l-1;
end;
end;
Между ReadLn(fr1,ss); и этой процедурой со строкой ничего не происходит. А из ReadLn приходит нормальная строка.

И есть такой вопрос: при rst:=''; выделенная память осовобождается? Или - нет, и на следующем цикле запрашивается новая порция?

Последний раз редактировалось Didim; 08.11.2011 в 11:13.
Didim вне форума Ответить с цитированием
Старый 08.11.2011, 10:57   #26
Didim
Пользователь
 
Регистрация: 05.11.2011
Сообщений: 16
По умолчанию

GunSmoker, Вы сами говорите:


Цитата:
Строковые операции (вроде сложения строк и [i]) работают непосредственно со строкой (String). Что означает, что не только содержание строки должно быть доступно, но и служебный заголовок со счётчиками до данных.
Если они оказываются испорченными, то это и есть ошибка библиотеки. В случае со string, "служебный заголовок со счётчиками до данных" недоступны для изменений. Я не контролирую их обработку. Это в случае с массивом можно выйти за границы массива, поскольку индексом распоряжается программист. Тут мог бы быть вариант выхода индекса за пределы строки, но есть проверка длины строки, и значение индекса не выходит за пределы.

Последний раз редактировалось Didim; 08.11.2011 в 11:02.
Didim вне форума Ответить с цитированием
Старый 08.11.2011, 11:24   #27
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Didim, Вы издеваетесь?!!

я же задал Вам два простых вопроса. Где ответ на первый?!
ГДЕ ОПИСЫВАЕТСЯ переменная rst ?! Какого она типа?

я уже молчу о том, что глобальные переменные - ЭТО ЗЛО!!
Особенно там, где в них НЕТ необходимости!!
например, вариант 1
Код:
procedure TForm3.Rstr(const ss : string; var MyRst : string);
var
  l: integer;
begin
  MyRst := ss;
  l:=length(ss)-1;
  if l<2 then exit;
  MyRst :='';
  while l>0 do begin
     MyRst:= MyRst+ss[l];
     l:=l-1;
   end;
end;
вариант 2 (ещё более предпочтительный) вместо процедуры использовать ФУНЦИЮ:
Код:
function TForm3.Rstr(const ss : string) : string;
var
  l: integer;
  rst : string;
begin
  Result := ss;
  l:=length(ss)-1;
  if l<2 then exit;
  rst := '';
  while l>0 do begin
     rst:= rst+ss[l];
     l:=l-1;
   end;
   Result := rst;
end;

Вы же играете в каких-то скрытных партизан...
Ну и ладно. Продолжайте свои игры, наступайте на грабли, обвиняйте разработчиков Delphi в том, что у них "есть ошибка библиотеки"...
Хозяин - барин...


p.s. всё хотел спросить, а зачем минус 1 в строчке l := length(ss)-1;
Вас что, последний символ строки не интересует!

Последний раз редактировалось Serge_Bliznykov; 08.11.2011 в 11:26.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 08.11.2011, 11:51   #28
Didim
Пользователь
 
Регистрация: 05.11.2011
Сообщений: 16
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Didim, Вы издеваетесь?!!
Я же задал Вам два простых вопроса. Где ответ на первый?!
ГДЕ ОПИСЫВАЕТСЯ переменная rst ?! Какого она типа?
И я уже отвечал:

Цитата:
Сообщение от Didim Посмотреть сообщение
Уже писал тут, что переменные rst и ss имели тип string.
Цитата:
Сообщение от Didim Посмотреть сообщение
Эти переменные - уровня модуля.
Цитата:
я уже молчу о том, что глобальные переменные - ЭТО ЗЛО!!
Особенно там, где в них НЕТ необходимости!!
Да. Это касается и строк.
Время, затраченное на обработку:

С использованием строк 2734
С использованием массивов 609

Больше ничего не менялось.


Цитата:
p.s. всё хотел спросить, а зачем минус 1 в строчке l := length(ss)-1;
Вас что, последний символ строки не интересует!
Не нужен. И в Си - то же самое: size_t l=strlen(s)-1;
Иначе, печатает |
Кстати, с той же задачей справляется за 128 милисекунд

Тут весь код реверса стоило засунуть между ReadLn и WriteLn. Ещё лучше - всю задачу засунуть в dll на Си.

Последний раз редактировалось Didim; 08.11.2011 в 12:01.
Didim вне форума Ответить с цитированием
Старый 08.11.2011, 12:57   #29
Camaro Chevelle
Форумчанин
 
Регистрация: 05.11.2011
Сообщений: 102
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
вариант 2 (ещё более предпочтительный) вместо процедуры использовать ФУНЦИЮ
это ещё почему интересно он более предпочтительный-то?
Camaro Chevelle вне форума Ответить с цитированием
Старый 08.11.2011, 14:59   #30
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
это ещё почему интересно он более предпочтительный-то?
ну, это субъективное, моё мнение.
в данной случае данная процедура ИЗМЕНЯЕТ одну переменную.
Мне кажется ЛОГИЧНЕЕ, если будет видно, что именно она делает (а конкретно ВОЗВРАЩАЕТ перевёрнутую строку).
Это раз.
и второе.
Вместо
Цитата:
Код:
while not EOF(fr1) do
begin
  ReadLn(fr1,ss);
  rstr;
  WriteLn(fr2,rst);
  rst:='';
end;
будет:
Код:
while not EOF(fr1) do
begin
  ReadLn(fr1,ss);
  WriteLn(fr2,rstr(ss));
end;
Разве так не проще, удобнее, нагляднее, красивее?
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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