Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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


Ответ
 
Опции темы
Старый 15.11.2010, 03:30   #1
Prisioner
Google user
Пользователь
 
Регистрация: 20.09.2010
Сообщений: 27
По умолчанию Ошибка компилятора "Comparing signed and unsigned types"

Здравствуйте!

Есть процедура, которая строит график и по нему определяет некоторые значения (код приведён ниже)
Процедуре отправляют два массива (значения x и y), их длину (мне почему-то так проще было её отправить чем через length() в самой процедуре, не помню почему), а так же некоторые значения x и y (Pnas и H в процедуре), для которых она по уже построенному графику потом ищет значения.

На отмеченные строчки в процедуре компилятор ссылается ошибкой
Цитата:
Comparing signed and unsigned types - widened both operands
Помогите разобраться с ошибкой или объясните хотя бы, что это за ошибка. Из найденного в гугле не нашёл понятного объяснения.

Код процедуры:
Код:
procedure draw_arc(x: array of real; y: array of real; count: integer; Pnas: real; H: real);
var s: string;
    xmp, ymp, x0, y0, yc, xmax, ymax, xnas, ynas, rad, xzab, yzab: integer;
    i: integer;
	
//Получения координат из значений
function xcord(x:real): integer;
begin
result:=x0+round(x/(1.1*max_x)*(xmax-x0));
end;

function ycord(y:real): integer;
begin
result:=y0+round(y/(1.1*max_y)*(ymax-y0));
end;

begin
//Создание и размещение формы
Form3:= TForm3.Create(Application);
Form3.Visible:=True;
Form3.Left:=Form1.Left+20;
Form3.Top:=Form1.Top+20;

//Находим начала и концы осей
xmp:=Form3.Image1.Width;
ymp:=Form3.Image1.Height;
x0:=round(xmp*0.1);
y0:=round(ymp*0.1);
xmax:=round(0.9*xmp);
ymax:=round(0.9*ymp);

//Находим максимальные значения полученных данных
max_x:=x[0];
max_y:=y[0];
for i:=1 to count-1 do begin
if x[i]>max_x then max_x:=x[i];
if y[i]>max_y then max_y:=y[i];
end;

//Рисуем
With Form3.Image1.Canvas do
begin
//Рисуем оси
MoveTo(x0, ymax);
LineTo(x0, y0);
LineTo(xmax, y0);

//Значения по оси абсцисс
//Отмечает значения из массива x
Pen.Color:=RGB(0,0,0);
for i:=0 to count-1 do begin
MoveTo(xcord(x[i]), y0);
LineTo(xcord(x[i]), y0-5);
s:=FloatToStr(x[i]);
TextOut(xcord(x[i])-round(TextWidth(s)/2), y0-5-(1 + i mod 2)*TextHeight(s), s);
end;

//Значения по оси ординат
//Отмечает 10 значений с равным шагом от 0 до максимального значения
for i:=1 to 10 do begin
yc:=round((y0-ymax)/11*i);
MoveTo(xmax, y0-yc);
LineTo(x0, y0-yc);
s:=FloatToStr(round(10*yc/(y0-ymax)*1.1*max_y)/10);
TextOut(x0-TextWidth(s)-5, y0-yc-round(TextHeight(s)/2), s);
end;

//Подписи осей
TextOut(x0-5-TextWidth('H, м'), ymax-5, 'H, м');
TextOut(xmax, y0-5-TextHeight('P, МПа'), 'P, МПа');

Pen.Color:=RGB(0, 0, 255);
Pen.Width:=2;
MoveTo(xcord(x[0]), ycord(y[0]));
for i:=1 to count-1 do
  LineTo(xcord(x[i]), ycord(y[i]));

//Давление насыщения
xnas:=xcord(Pnas);
ynas:=y0;
//Встаем в точку на оси X и идём вниз в поисках синего пикселя
while Pixels[xnas,ynas]<>rgb(0, 0, 255) do inc(ynas); //В этой строке ошибка компилятора
//Рисуем пунктирные линии к точке
Pen.Color:=rgb(0,0,0);
Pen.Width:=1;
Pen.Style:=psDot;
MoveTo(xnas, y0);
LineTo(xnas, ynas);
LineTo(x0, ynas);
//Рисуем точку
Brush.Color:=rgb(0,0,255);
rad:=4;
Ellipse(xnas-rad, ynas-rad, xnas+rad, ynas+rad);
//Подписываем точку
Brush.Color:=rgb(255,255,255);
s:='Pнас = '+FloatToStr(Pnas)+' МПа';
TextOut(xnas+rad+3, ynas-TextHeight(s), s);

//Расчетное забойное давление
xzab:=x0;
yzab:=ycord(H);
//Встаём в точку на оси Y и идём вправо в поисках синего пикселя или конца графика
while (Pixels[xzab,yzab]<>rgb(0, 0, 255)) and (xzab<>xmax+1) do inc(xzab); //В этой строке ошибка компилятора
//Получаем из координаты значение давления и пишем в глобальную переменную для других процедур.
if xzab=xmax+1 then Pzab_r:=max_x else Pzab_r:=RoundTo((xzab-x0)*(1.1*max_x)/(xmax-x0), -2);

//Забойное давление
xzab:=xcord(max_x);
yzab:=ycord(H);
Brush.Color:=rgb(0,0,255);
rad:=4;
Ellipse(xzab-rad, yzab-rad, xzab+rad, yzab+rad);
Brush.Color:=rgb(255,255,255);
s:='Pзаб';
TextOut(xzab+rad+3, yzab-TextHeight(s), s);
end;
end;
Отметил строчки, на которые ссылается компилятор.

P.S. Для тестовых примеров вроде бы всё работает корректно, но сам факт наличия этих ошибок немного смущает и наталкивает на мысль, что в некоторых случаях возможны сбои.

Последний раз редактировалось Prisioner; 15.11.2010 в 03:40. Причина: Изменил название темы
Prisioner вне форума Ответить с цитированием
Старый 15.11.2010, 03:43   #2
WhiteSpirit
Пользователь
 
Регистрация: 28.05.2010
Сообщений: 82
По умолчанию

Это не ошибка, а предупреждение (Warning), в данном случае тип TColor, знаковое 4-х байтовое целое, сравнивается с беззнаковым значением, возвращаемым функцией RGB
Код:
TColor = -$7FFFFFFF-1..$7FFFFFFF;
function RGB(r, g, b: Byte): COLORREF;
COLORREF = DWORD;
Ничего страшного в этом нет, на результат вычислений не влияет
WhiteSpirit вне форума Ответить с цитированием
Старый 15.11.2010, 03:46   #3
Prisioner
Google user
Пользователь
 
Регистрация: 20.09.2010
Сообщений: 27
По умолчанию

Спасибо, вы меня успокоили
Prisioner вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка компилятора... p1r2o3 Общие вопросы .NET 3 11.09.2010 13:36
Глюк компилятора или ошибка в задаче? i.pas C++ Builder 6 29.08.2010 18:49
Ошибка при запуске компилятора Игорь1979 Помощь студентам 2 29.03.2010 18:34
Ошибка компилятора. LARGEADDRESSAWARE Fantom101 Общие вопросы C/C++ 1 12.09.2009 05:20
Ошибка компилятора??? KIRILL_FR Общие вопросы Delphi 10 25.04.2008 13:38