Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 29.11.2015, 22:41
Appolinariya_ Appolinariya_ вне форума
Прохожий
 
Регистрация: 26.09.2015
Сообщения: 13
Версия Delphi: Delphi 7
Репутация: 10
Печаль ошибка 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  
Старый 30.11.2015, 06:10
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

1. Второй аргумент функции vividposl имеет тип posl (массив). А функция, которая стоит там, возвращает тип boolean. Вот почему "несовпадение типов".
2. Даже после исправления, компилироваться не будет. Ошибка, скорее всего, будет, что не найдена перегруженная функция vividposl с типами параметров string, array (или как-то так), так как описание функции и ее вызов и рядом по передаваемым параметрам не лежали.
3. Строкой выше, вызов функции arifmpr, результат которй никуда не сохраняется, да и передаваемый парамет не инициализирован (там может находится любое значение, под дебагером, скорее всего, там 0, но никто ничего гарантировать не может), т.е. случайным образом там тоже может выскакивать ошибка.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
Appolinariya_ (30.11.2015)
  #3  
Старый 30.11.2015, 20:39
Appolinariya_ Appolinariya_ вне форума
Прохожий
 
Регистрация: 26.09.2015
Сообщения: 13
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Спасибо, что указали ошибки. Мне, как начинающему, еще сложно все понять. Можете помочь исправить?
Программу нужно написать через процедуры или функции, что я собственно и попыталась сделать. В процедуре vivodposl должны была выводится исходная последовательность и результат. Функцию использую в первый раз, но тут, как мне показалось, она к месту, так как результат программы "Да" или "Нет".
Ответить с цитированием
  #4  
Старый 01.12.2015, 01:21
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Проще не исправлять, а переписать.
Как-то так:
Код:
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.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 15:16.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter