Помощь - Поиск - Пользователи - Календарь
Полная версия: Обнуление строк при использовании файлов с кодом
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Shults99
После использования файлом блоков-функций из других 5-ти файлов
строки не обнуляются несмотря на то, что в каждом блоке-функции стоит
Delete(строка,1,20);. Т.е. тогда, когда используется следующая блок-
функция выводит результат с остатками строки предыдущего файла,
содержащего функцию со строкой.
В чем дело? Должны быть ответы и без хлама всякого, который выводится
из предыдущей блок-функции.
Вот пример файла программы
program prog24;
uses crt;
var
S1,S2,S3,S4,S5,S6:string;
i,L:integer;
{$I c:\prog23a}
{$I c:\prog23b}
{$I c:\prog23v}
{$I c:\prog23g}
{$I c:\prog23d}

begin

RightBlank(S1);
BlankDel(S2,S3);
Upper(S4,S5);
Newstr(S6,L);
Beep;

end.

и пример одного из 5 файлов, содержащих функции
(остальные подобны вплане того, что самостоятельно,
когда их переделываешь в программу они работают)
function Newstr(S6:string; L:integer):integer;
Var
i : integer;
Begin
WriteLn('Zapolnyaem stroku simvolami C. Zadaniye 23 b');
WriteLn('Vvedite kolichestvo simvolov L');
ReadLn(L);
FillChar(S6[i], L, 'C');
S5[0]:=#80; { Устанавливаем байт длины }
for i:=1 to 20 do
begin
Write(S6[i]);
end;
Writeln(' ');
Write('Nagmite Enter');
Delete(S6,1,20);
readln;
End;

klem4
пока не вникал что ты там написал, но если тебе надо "обнулить" строку, то зачем использовать delete ? Ведь можно s='';

а уж если ты исползуешь delete, то для полно очистки в той ф-и что ты привет, тебе нужно не delete(s, 1, 20) , a delete(s, 1, L)

вот если я правильно понял что ты хочешь.
Shults99
klem4
Все исправил - заменил на s=''; во всех файлах, которые имеют функции, да только та же самая картина - ответы то выдаются, но если, допустим, в ответе в строке изменились первые 3 символа, а остальные должны быть стерты s='';, то такого, на самом деле, нет - после первых трех правильных символов идет "птичий язык" - симолы в кодировке IBM или какой ещё не знаю+измененные старые ответы.
klem4
Так, для начала , зачем вот этот изврат ?

{$I c:\prog23a}
{$I c:\prog23b}
{$I c:\prog23v}
{$I c:\prog23g}
{$I c:\prog23d}



Добавлено :
Таак

function Newstr(S6:string; L:integer):integer;
Var
i : integer;
Begin
WriteLn('Zapolnyaem stroku simvolami C. Zadaniye 23 b');
WriteLn('Vvedite kolichestvo simvolov L');
ReadLn(L);
FillChar(S6[i], L, 'C'); // <- i не определена + что делает эта строчка ?
S5[0]:=#80; { Устанавливаем байт длины }
for i:=1 to 20 do
begin
Write(S6[i]);
end;
Writeln(' ');
Write('Nagmite Enter');
Delete(S6,1,20);
readln;
End;




может это мне уже к вечеру хреново, но помойму ты пытаешься заполнить неопределенный ЭЛЕМЕНТ строки СИМВОЛАМИ 'C' - это не имеет смысла вообще никакого помойму blink.gif
GoodWind
заполнять надо не элемент, а всю строку smile.gif
FillChar(S6, L, 'C'); 
Shults99
klem4
i:=1; поставил.
{$I c:\prog23a} - так написяно в учебнике - я велосипед изобретать не стал.

" FillChar(S6[i], L, 'C'); // <- i не определена + что делает эта строчка ? "

Она заполняет строку длиной L символами 'С' - как и задано в задаче.

GoodWind
Заполнять надо как раз диапазон длиной L

Господа! Просьба дать ответ - почему остаток строк при переходе уже ко второй функции
BlankDel(S2,S3);

содержит старые элементы, хоть я их и удаляю и использую другие S ?? До самого что-то не допирает.
S1,S2,S3,S4,S5,S6:string;
volvo
Правда? А что именно у тебя делает функция BlankDel мы должны сами догадаться? Хотя есть предположение, что ты просто не передаешь параметры, как Var, и поэтому все изменения не передаются в вызывающую программу...
klem4
Согласен с Volvo, я тоже об этом думал

зы
i:=1 тебе там не нужно, до цикла for ты ее не используешь.


Добавлено

Цитата
" FillChar(S6[i], L, 'C'); // <- i не определена + что делает эта строчка ? "

Она заполняет строку длиной L символами 'С' - как и задано в задаче.


В твоем случае она этого не делает, тебе же объяснили, не FillChar(S6[i], L, 'C'); , а FillChar(S6, L, 'C');
Shults99
volvo
Я думал, что будет достаточно того, что я привел в первом своем посте.
Принцип построения функций в файлах один и тот же - всего их 5: всё постить не хоцца чо та.
Вот функция BlankDel - она из строки с пробелами делает строку без пробелов.

function BlankDel(S2,S3:string):integer;
var
i,n:integer;
begin
Writeln('Vvedite stroku S2 c probelami. Zadaniye 23 v');
readln(S2);
begin
n:=0;
for i:=1 to 20
do if S2[i]<>' ' then
begin
S3[i-n]:=S2[i];
end
else n:=n+1;

{Proverka sodergimogo S2}
Writeln('');
Writeln('Kopiya Stroki S2 (bez probelov)');
for i:=1 to 20 do
begin
Write(S3[i]);
end;
end;
Writeln(' ');
Write('Nagmite Enter');
S2:='';
S3:='';
{ Delete(S2,1,20);
Delete(S3,1,20);}
readln;
end;

Ещё раз - что значит передавать параметры, как var ? И куда это писать?
klem4
Елки - палки ! Поставиь в заголовках функций var ! и как-то ты жестоко пробелы удаляешь ... вот так не проще ?

 while(pos(' ', s)<>0) do
delete(s, pos(' ',s), 1);
volvo
Shults99,

function BlankDel(Var S2,S3:string):integer;

Должно заработать...
Shults99
klem4
В следующий раз - без ёлы-палы. Не хочешь, не отвечай - пойду на другой форум. angry.gif
Пробелы удаляются и ладно. Сдирать просто коды откуда-то - пошлятина. Если буду программить после заданий на Паскале - буду и более простые алгоритмы составлять.

volvo klem4
Ни х..чего не работает!!
volvo
Так, заканчиваем сеанс гадания. Заархивируй все файлы и присоедини архив к сообщению (вместе с ПОЛНЫМ заданием, что именно ты хочешь, чтобы программа делала), тогда может быть ошибка и будет найдена. Иначе (по кускам программы) этого сделать невозможно...

Цитата
Пробелы удаляются и ладно.
Ну-ну... Вот они у тебя и удаляются, что ты ошибку найти не можешь...
Shults99
... ok
volvo
Значит, так: все прекрасно работает... Просто для того, чтобы это откомпилировалось, надо добавить самой первой строкой программы:
{$V-}
, иначе Паскаль не позволяет передавать тип String[20] в параметр, имеющий просто тип String (т.е. длина строк должна совпадать идеально... {$V-} снимает это ограничение)...

А вот насчет процедуры NewStr - ты неправильно заполняешь строку...
 FillChar(S6, L, 'C'); { Здесь все в порядке }
S5[0]:=#80; { Во-первых, почему S5 а не S6 ??? }

ну, и потом, я так понял, что это - пример из Борландовского файла помощи для Турбо-Паскаля? Но ведь там описана строка длиной в 80 символов, а ты откуда взял это самое число 80?
Вот правильный вариант для твоего случая:
FillChar(S6, L, 'C');
S6[0] := Chr(L); { <--- устанавливаешь длину строки !!! }
WriteLn(S6); { <--- именно так !!! }

Если ты не печатаешь строку через WriteLn, а печатаешь посимвольно, то смысла в использовании FillChar просто нет, т.к. тут самое главное - правильно установить длину строки, и сделать это так, чтобы WriteLn отобразил строку корректно !!! Символ за символом-то ясно, что оно будет в любом случае выдавать правильный результат... Вот и у тебя строка заполнена неверно, а результат будет выдаваться похожий на правду...
Shults99
Наконец-то все работает.
Только ещё с 1-цы начинать
FillChar(S6[1], L, 'C'); { Здесь все в порядке }
S5[0]:=#80; { Во-первых, почему S5 а не S6 ??? }

Фух.. Спасибо.. всем.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.