IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Обсуждение "Многократного удаления из строки", Разделено
Client
сообщение 5.11.2010 9:21
Сообщение #1


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


[вставка]
Я (Lapp) вклинился сюда, чтоб привести ссылку на ту тему в FAQ, о которой идет речь:
Многократное удаление символов из строки
[конец вставки]


Цитата
Дело в том, что Delete - это не мгновенная операция
Эм... я вот не нашел исходник этой процедуры и не знаю насколько она "не мгновенная". А move - уже не в счет? Хотя, видимо, тоже долго работает...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 6.11.2010 13:07
Сообщение #2


Гость






TarasBer, насколько я вижу,
Цитата
j := Low(S); 
for i := Low(S) to LS do
if Good(S[i]) then begin
S[j] := S[i];
Inc(j);
end;
LS := j;

Это для статического массива, у которого полезная длина хранится в отдельной переменной.

может привести к неправильному результату:

procedure print_arr(const arr: array of integer; n: integer);
var i: integer;
begin
write('<', n:2, '> ');
for i := 0 to pred(n) do write(arr[i]:3);
writeln;
end;

const
size = 10;

var
arr: array[1 .. size] of integer;
real_size: integer;

i, j: integer;
b: boolean;

begin
real_size := size;
for i := 1 to size do
begin
arr[i] := i mod 2;
end;

print_arr(arr, real_size);

j := Low(arr);
for i := Low(arr) to real_size do
if arr[i] <> 0 then { Good(X) => (X <> 0) }
begin
arr[j] := arr[i];
Inc(j);
end;
real_size := j;

print_arr(arr, real_size);
end.




Running "f:\programs\pascal\tst_fq.exe "
<10> 1 0 1 0 1 0 1 0 1 0
< 6> 1 1 1 1 1 0



Казалось бы чего проще, LS := j - Low(S)? Но только это не решит проблемы. Массивы могут индексироваться не только с 1, 2, и так далее. А и с 0, и с (-1). А при первом отрицательном индексе (при цикле до LS) будет Range-Check Error. Я бы предложил:
j := Low(S); 
for i := Low(S) to High(S) do
if Good(S[i]) then begin
S[j] := S[i];
Inc(j);
end;
LS := j - Low(S);


Сообщение отредактировано: volvo - 6.11.2010 13:28
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 22.07.2025 10:43
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"