Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.07.2010, 10:10   #1
evgenext
Новичок
Джуниор
 
Регистрация: 02.07.2010
Сообщений: 3
По умолчанию Incompatible types: 'Integer' and 'Extended'

Здравствуйте.
Код:
uses
  SysUtils;
type
     TPoint=record
         x,y:real;
end;
var
     Points:array[1..30] of TPoint;
s,max,i,j,n:integer;
     begin
max:=0;
for i:=1 to n-1 do
    for j:=i+1 to n do begin
        s:=sqrt(sqr(points[i].x-points[j].x)+sqr(points[i].y-points[j].y));
        if s>max then begin
            max:=s;
            maxi:=i;
            maxj:=j;
        end;
        writeln('s=',s,'i=',i,'j=',j);
        readln;
    end;
Выдает ошибку Incompatible types: 'Integer' and 'Extended'.После строчки нахождения s.Помогите разобраться.
Сама задача:Даны координаты n точек на плоскости: (Xi, Yi), ..., (Хn, Yn) (n=30). Найти номера пары точек, расстояние между которыми наибольшее (считать, что такая пара единственная).

From artemavd: Во-первых. У нас принято код оформлять тегом #. Во-вторых. Будешь создавать в разных темах темы-клоны, быстро схлопочешь жесткий штраф от меня.

Последний раз редактировалось artemavd; 03.07.2010 в 10:30. Причина: надо
evgenext вне форума Ответить с цитированием
Старый 03.07.2010, 10:33   #2
Roof
Форумчанин
 
Аватар для Roof
 
Регистрация: 01.02.2007
Сообщений: 785
По умолчанию

У тебя
Код:
s,max,i,j,n:integer;
а вот функция sqrt возвращает не integer, а Extended
Код:
function Sqrt(const X: Extended): Extended;
т.е ты целочисленной переменной пытаешься присвоить дробное значение.
Оформляй код тэгами CODE - кнопка решеточка, в редакторе, где сообщение набираешь.
Изо всей благодати
В руках крепко сжатых
Я донесу только капли

Последний раз редактировалось Roof; 03.07.2010 в 10:39.
Roof вне форума Ответить с цитированием
Старый 04.07.2010, 10:07   #3
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

s:=trunc(sqrt(sqr(points[i].x-points[j].x)+sqr(points[i].y-points[j].y)));
если точность округления Вас устроит...
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}
Johnson вне форума Ответить с цитированием
Старый 04.07.2010, 11:08   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Код:
s:=trunc(sqrt(sqr(points[i].x-points[j].x)+sqr(points[i].y-points[j].y)));
если точность округления Вас устроит...
не учите новичка плохому!!
1) trunc - это не округление, а отбрасывание дробной части!
а во-вторых, зачем использовать округление там, где оно не нужно!?!?

p.s. достаточно так описать данные, чтобы всё компилировалось:
Код:
var
  Points:array[1..30] of TPoint;
  i,j,n:integer;
  maxi, maxj : integer;
  s,max : extended;
только автору топика это всё равно не поможет!
т.к.:
1) n - нужно задать (например, n := 30;
2) нужно заполнить массив координат точек - сами по себе они ниоткуда не появятся.
3) нет вывода результата...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.07.2010, 15:54   #5
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Да и вообще использование типа Extended вроде бы как возможно только при наличии арифметического сопроцессора...Как и Double и Single(по крайней мере, так было в TP 7)
_-Re@l-_ вне форума Ответить с цитированием
Старый 04.07.2010, 16:03   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Код:
uses
  SysUtils;
судя по этой строчке, речь идёт о Delphi - там с сопроцессором всё в порядке...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.07.2010, 16:07   #7
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Между прочим, арифметический сопроцессор не имеет никакого отношения к Delphi - сопроцессор - это
Цитата:
Для процессоров семейства x86 с 8086/8088 по 386, модуль операций с плавающей запятой был выделен в отдельную микросхему, называемую математическим сопроцессором. Для установки сопроцессора на плате компьютера предусматривался отдельный разъём.

Сопроцессор не является полноценным процессором, так как не умеет делать многих необходимых для этого операций (например, не умеет работать с программой и вычислять адреса памяти), являясь всего лишь придатком центрального процессора.

Одна из схем взаимодействия центрального процессора и сопроцессора, применяемая, в частности, в x86 сопроцессорах, реализуется следующим образом:
Сопроцессор подключен к шинам центрального процессора, а также имеет несколько специальных сигналов для синхронизации процессоров между собой.
Часть командных кодов центрального процессора зарезервирована для сопроцессора, он следит за потоком команд, игнорируя другие команды. Центральный процессор, наоборот, игнорирует команды сопроцессора, занимаясь только вычислением адреса в памяти, если команда предполагает к ней обращение. Центральный процессор делает цикл фиктивного считывания, позволяя сопроцессору считать адрес с адресной шины. Если сопроцессору необходимо дополнительное обращение к памяти (для чтения или записи результатов), он выполняет его через захват шины.
После получения команды и необходимых данных сопроцессор начинает её выполнение. Пока сопроцессор выполняет команду, центральный процессор выполняет программу дальше, параллельно с вычислениями сопроцессора. Если следующая команда также является командой сопроцессора, процессор останавливается и ожидает завершения выполнения сопроцессором предыдущей команды.
Также существует специальная команда ожидания (FWAIT), принудительно останавливающая процессор до завершения вычислений (если для продолжения программы необходимы их результаты).
_-Re@l-_ вне форума Ответить с цитированием
Старый 04.07.2010, 16:49   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
(по крайней мере, так было в TP 7)
вот именно что в TP и в те времена.
сейчас на крайняк есть эмуляция сопроцессора.
(и сейчас процы имеют его)

не надо умничать
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 04.07.2010 в 16:59.
Пепел Феникса вне форума Ответить с цитированием
Старый 04.07.2010, 22:08   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Пепел Феникса, спасибо, коллега.


Цитата:
Сообщение от _-Re@l-_
Между прочим, арифметический сопроцессор не имеет никакого отношения к Delphi
_-Re@l-_, поучите меня, поучите...
только учтите, что я, в отличии от Вас сталкивался с машинами, где мат.сопроцессор был на материнке отдельно, и с машинами, где его не было...

и могу добавить, что в TP7 (про который в данной теме и речи не было, ну раз уж затронули...) в опциях компилятора можно включить эмуляцию сопроцессора.

Цитата:
{$E} Emulation Switch
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
Enables or disables linking with an
80x87-emulating run-time library

Syntax: {$E+} or {$E-}
Default: {$E+}
Type: Global
Menus: [X] Emulation

Target:
Real mode, Protected mode The $E directive
enables or disables linking with a run-time
library that emulates the 80x87 numeric
coprocessor if one is not present.

The {$N+,E+} State When you compile a program
in the {$N+,E+} state, the compiler links with
the full 80x87 emulator.

The resulting .EXE file can be run on any
machine, regardless of whether that machine
has an 80x87. If an 80x87 is present, the
program will use it; otherwise, the run-time
library emulates it.

The {$N+,E-} State In the {$N+,E-} state, the
compiler links with a substantially smaller
floating-point library, which can only be used
if an 80x87 is present at run time.

The {$E} (80x87 emulation) switch has no
effect if used in a unit; it applies only to
the compilation of a program.

The {$N-,E+} State If the program is compiled
in the {$N-} state, and if all the units used
by the program were compiled with {$N-}, then
an 80x87 run-time library is not required, and
the 80x87 emulation switch is ignored.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 05.07.2010, 08:03   #10
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Цитата:
и могу добавить, что в TP7 (про который в данной теме и речи не было, ну раз уж затронули...) в опциях компилятора можно включить эмуляцию сопроцессора.
Уж простите, не знал. Но спасибо - я нашёл как это сделать, и теперь и Extended, и Double, и Single - всё работает
_-Re@l-_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Error] Unit1.pas(40): Incompatible types: 'Integer' and 'Extended BETONOMESHALKA Общие вопросы Delphi 9 15.03.2014 17:26
Incompatible types: 'String' and 'Text' eshik Помощь студентам 3 21.04.2010 00:41
Ошибка [Error] UPER.pas(57): Incompatible types: 'Integer' and 'Pointer' Pirotexnik Общие вопросы Delphi 4 27.03.2009 11:04
Delphi Incompatible types Iogan Gamba Puti Помощь студентам 1 19.06.2008 13:45