Помощь - Поиск - Пользователи - Календарь
Полная версия: Описание строки в Function
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Shults99
Уважаемые гуру!
Есть трабла - помогите разобраться!
При создании модуля (имя.tpu) используется блок, где есть string.
Код
function RightBlank(S1,L,i:integer):integer;
begin
Writeln('Vvedite stroku S1');
readln(S1);
Writeln('Vvedite dlinu stroki L ( chislo do 20)');
readln(L);

begin
       while i<L
       do for i:=1 to L
       do Write(S1[i]);

end;

     readln;

end;


При нажатии Make (F9) выдается сообщение:

- Error 121: Invalid qualifier. -

Как её объявить правильно в этой строке (или ещё где?):
Код
function RightBlank(S1,L,i:integer):integer;

Задача такого типа
С целью формирования модуля XXX составить следующие блоки-утилиты:
1)функцию aaa
2)функцию bbb
3)процедуру ссс
Испытайте эти блоки в составе модуля XXX, также сохраните эти блоки в одноименных файлах.

Щас создаю блок ааа.
kent
Так как S1 у тебя строка так её нужно и описывать как строку:
Код
function RightBlank(S1 : String; L,i : integer) : integer;
begin
Writeln('Vvedite stroku S1');
readln(S1);
Writeln('Vvedite dlinu stroki L ( chislo do 20)');
readln(L);

begin
       while i<L
       do for i:=1 to L
       do Write(S1[i]);

end;

     readln;

end;
volvo
Shults99, можно вопрос?
Что вообще должна делать функция RightBlank, и что возвращать?
GoodWind
а зачем спрашивать пользователя о длине строки ? blink.gif
и зачем передавать в функцию значение S1 если оно все равно изменится сразу же после входа в нее (остальных параметров это, кстати, тоже касается) blink.gif
Guest
2 kent
) Эт понятно.., но ошибка как раз и выдается тогда, когда я вписываю описание string... Паскаль вообще эти символы выделяет другим цветом и потом просит запятую после S1 и перед String, а не двоеточие, как будто это перечисление переменных. В том то и проблема, что в function при создании модуля *.tpu я не могу дать описание типа String - вот и хочу узнать - можь строки как то в function и в модулях *.tpu как-то по-другому описываются?

2 volvo
Прога не в unite работает нормально (ниже). А когда хочешь её запихать в модуль ввиде function - выдает ошибку (см. выше).

Задание
С целью формирования модуля XXX составить следующие блоки-утилиты:
а) Функцию RightBlank(S,L), возвращающую строку длины L, началом которой является строка S, а далее пробелы.
б)
в)
...
Испытайте эти блоки в составе модуля XXX, также сохраните эти блоки в одноименных файлах.

Код

program prog23;
var
S1:string[20];
L,i:integer;
begin
Writeln('Vvedite stroku S1');
readln(S1);
Writeln('Vvedite dlinu stroki L ( chislo do 20)');
readln(L);

begin
       while i<L
       do for i:=1 to L
       do Write(S1[i]);

end;

     readln;

end.
GoodWind
то-есть rightBlank нечто вроде trim - только пробелы не отрезаются, а возвращается номер буквы, после которой идут _только_ пробелы ?

Цитата
Испытайте эти блоки в составе модуля XXX, также сохраните эти блоки в одноименных файлах.

а разве можно одинаково называть модуль и фнкцию внутри него blink.gif
hiv
А я понял, что так нужно:
function RightBlank(var S:string):integer;
var
S1 :string[20];
i :integer;
begin
Writeln('Vvedite stroku S1'); readln(S1);
Writeln('Vvedite dlinu stroki L ( chislo do 20)'); readln(L);

if length(S1)>=L then S:=copy(S1,1,L)
else
begin
S:=S1;
for i:=1 to L-length(S1) do S:=S+' ';
end;

RightBlank:=L;
end;

Т.е. если обрезка большая, то мы добавляем пробелы к S1 справа, чтоб все строки были под одну гребенку smile.gif (одной длины)
Guest
GoodWind
Чет не нашел в Паскале trim..

Модуль и функцию я одинаково не называю :o
Дож
Цитата
- Error 121: Invalid qualifier. -


Цитата
Неверный квалификатор

Возможные причины сообщения:



  • вы пытаетесь индексировать переменную, которая не является массивом


  • вы пытаетесь указать поля в переменной, которая не является записью


  • вы используете в качестве указателя переменную, которая не является указателем.





Я могу предположить только одно- ты используешь запрещенные символы в назв переменной( [ ] ^ @ . )
А вообще скажи че-нить поконкретнее, а то приводишь рабочие коды и говоришь, что нечто измененное не работает...
hiv
Но все равно бы сделал так:
function RightBlank(S:string; L:integer):string;
var
S1 :string;
i :integer;
begin
if length(S)>=L then S1:=copy(S,1,L)
else
begin
S1:=S;
for i:=1 to L-length(S) do S1:=S1+' ';
end;

RightBlank:=S1;
end;

GoodWind
Цитата
Чет не нашел в Паскале trim..

это не Паскалевая функция... даже не помню в каких языках она есть... кажется в FoxPro smile.gif
trim это обрезка ведущих пробелов. бывают TrimRight, TrimLeft, TrimAll
Shults99
Ответы, кому интересно было

Код
program prog23;
uses utils;
var
S1,S2:string[20];
L,i,n,H,T:integer;
begin
Writeln('Vvedite deistviya, kotorye hotite vipolnit');
begin


Beep(H,T);
RightBlank(S1);

End;
End.


модуль

Код

unit utils;
interface
Uses Crt;

procedure Beep(H,T:integer);
function RightBlank(S1:string):integer;

Implementation

procedure Beep;

Begin

Sound(H);        { Zvuk c visotoi H Hz }
Delay(T);        { Na T millisekund }
NoSound;           { Viklucheniye dynamika }

End;

function RightBlank(S1:string):integer;
var
{S1:string[20];}
i,L:integer;
begin
Writeln('Vvedite stroku S1');
readln(S1);
Writeln('Vvedite dlinu stroki L ( chislo do 20)');
readln(L);

begin
       while i<L
       do for i:=1 to L
       do Write(S1[i]);

end;

     readln;

end;

End.
volvo
Shults99, ну и как это связано с заданием?
Цитата(Guest @ 19.09.2005 15:00)
Задание
С целью формирования модуля XXX составить следующие блоки-утилиты:
а) Функцию RightBlank(S,L), возвращающую строку длины L, началом которой является строка S, а далее пробелы.

Ты же хотя бы свои-то посты читай !!! angry.gif
Shults99
volvo
Не понял что-то... Да все равно, как она называется, эта функция! Она использует строку (S1 или S - без разницы) и использует переменную L - все больше ничего не надо. То, что там ещё процедура Beep - это из той части задания, которую я сделал сам до этого.
Или я не так понял?

Кстати, всем спасибо за участие.

hiv
thnks, но я все же использовал свой вариант.
volvo
Цитата
Не понял что-то...
Объясняю: ты привел задание, в котором говорится, что функция должна получать 2 (два) параметра - строку и число. Внимание, вопрос: Что принимает твоя функция из поста №12?
Shults99
Ответ:
1) Строку
Writeln('Vvedite stroku S1');
readln(S1);


2) Число
Writeln('Vvedite dlinu stroki L ( chislo do 20)');
readln(L);


.. извините, если тупой, но что значит "функция должна получать 2 (два) параметра"? Возвращать 2 параметра?

.."С целью формирования модуля XXX составить следующие блоки-утилиты:
а) Функцию RightBlank(S,L), возвращающую строку длины L, началом которой является строка S, а далее пробелы...." - Вроде все сходиться.
Shults99
Смутно начинаю предполагать, что RightBlank(S,L) и RightBlank(S) - разные вещи, но что тогда надо сделать для RightBlank(S,L) не понимаю..
volvo
Да пойми, что твоя функция должна получать ОДНОВРЕМЕННО и строку, и число, иначе в ней смысла-то нету... Вот таким должно быть определение функции:
Function RightBlank(s1: string; L: integer): string;

А у тебя она как описана? Принимает один параметр, ТОЛЬКО строку:
function RightBlank(S1:string):integer;
Нестыковка... А где число? Оно должно передаваться, а не запрашиваться у пользователя внутри функции...

Цитата
что тогда надо сделать для RightBlank(S,L) не понимаю..

См. пост №10 - hiv уже все сделал...
Shults99
Дошло. Прикреплю вариант hiva к ответу просто текстовым файлом,
но переделывать не буду. Вот убивайте меня - не буду. У нас 12 часов ночи, у меня радость победы - а препады пусть идут в пень.
Всё.
rolleyes.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.