|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
ошибка Incompatible types
При вызове процедуры vivodposl (62 строка кода) выдает ошибку Incompatible types
Программа проверяет, является ли введенная последовательность арифметической прогрессией. Но какую последовательность не введешь, всегда ответ Нет. Укажите, пожалуйста, ошибку Код:
type posl=array [1..100] of real; stroka=string[30]; var a:posl; i,n:integer; procedure vvodposl(var a:posl;const namefile:stroka); var fin: textfile; i,n:integer; begin assignfile(fin,'f1.txt'); reset(fin); readln(fin,n); for i:=1 to n do read(fin,a[i]); close(fin); end; procedure vivodposl(namefile:stroka;const a:posl;i,n:integer;zag:stroka;flag,arifmpr:boolean); var j:integer; fout:text; begin assign(fout,namefile); if flag then rewrite(fout) else append(fout); writeln(fout,zag); for i:=1 to n do write(fout,a[i]:3:2); writeln(fout); if arifmpr=true then write(fout,'Da') else write(fout,'Net'); close(fout); end; function arifmpr(a:posl; i:integer):boolean; var d:real; k:boolean; begin d:=a[2]-a[1]; k:=true; for i:=2 to n-1 do if a[i+1]-a[i]=d then result:=true else k:=false; if k=false then result:=false else end; begin vvodposl(a,'f1.txt'); arifmpr(a,i); vivodposl('f1.txt',arifmpr(a,i)); end. |
#2
|
|||
|
|||
1. Второй аргумент функции vividposl имеет тип posl (массив). А функция, которая стоит там, возвращает тип boolean. Вот почему "несовпадение типов".
2. Даже после исправления, компилироваться не будет. Ошибка, скорее всего, будет, что не найдена перегруженная функция vividposl с типами параметров string, array (или как-то так), так как описание функции и ее вызов и рядом по передаваемым параметрам не лежали. 3. Строкой выше, вызов функции arifmpr, результат которй никуда не сохраняется, да и передаваемый парамет не инициализирован (там может находится любое значение, под дебагером, скорее всего, там 0, но никто ничего гарантировать не может), т.е. случайным образом там тоже может выскакивать ошибка. |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
Appolinariya_ (30.11.2015)
|
#3
|
|||
|
|||
Спасибо, что указали ошибки. Мне, как начинающему, еще сложно все понять. Можете помочь исправить?
Программу нужно написать через процедуры или функции, что я собственно и попыталась сделать. В процедуре vivodposl должны была выводится исходная последовательность и результат. Функцию использую в первый раз, но тут, как мне показалось, она к месту, так как результат программы "Да" или "Нет". |
#4
|
|||
|
|||
Проще не исправлять, а переписать.
Как-то так: Код:
program ArifmTest; {$APPTYPE CONSOLE} type Tposl=array [1..100] of real; Tstroka=string[30]; var a : Tposl; n : integer; procedure vvodposl(const namefile:Tstroka; var lst : Tposl); var fin: textfile; i:integer; begin assignfile(fin,namefile); reset(fin); readln(fin,n); for i:=1 to n do read(fin,lst[i]); close(fin); end; procedure vivodposl(namefile:stroka; lst : Tposl; IsRewrite : Boolean); var i : Integer; begin assign(fout,namefile); if IsRewrite then rewrite(fout) else append(fout); for i:=1 to n do write(fout,lst[i]:3:2); writeln(fout,''); if IsArifm(lst)=true then write(fout,'Da') else write(fout,'Net'); writeln(fout,''); close(fout); end; function IsArifm(a:posl):boolean; var d:real; i:integer; begin Result := True if n > 1 Then Begin d:=a[2]-a[1]; for i:=2 to n-1 do Begin Result := (a[i+1]-a[i])=d; If Not Result Then Break; End; End; end; begin vvodposl('f_in.txt', a); vivodposl('f_out.txt',a,false); end. |