Здравствуйте, Гость
Воскресенье, 22.10.2017, 23:26
Главная Главная страница форума Регистрация Вход
Новые сообщения Участники форума Правила форума Поиск
Страница 1 из 11
Модератор форума: Ekz 
Форум » Все о Delphi » Синтаксис » Ошибка при округлении. (Что делать?)
Ошибка при округлении.
DJ_ЕвсДата: Вторник, 04.08.2009, 23:46 | Сообщение # 1
Ранг 6
Группа: Проверенные
Сообщений: 165
Награды: 3
Репутация: 1
Статус: Offline
Имеется массив значений в формате Real. Вхожу в цикл FOR, начинаю их читать, и БАЦ! При округлении всегда ошибка...
В чём глюк? Где логика и как так бывает?

Code
procedure chtototam;
var i,Value:integer;
begin
For i:=1 to 95 do
begin
Value:=Round(Massif[i]); //ЗДЕСЬ ВСЕГДА ОШИБКА! Я В ШОКЕ!!!
deistvie1;
deistvie2;
****
end;
end;


ПРОЙДИ ТЕСТ!!!!!
http://FIDO20.ru/test.php?4052&c=bbea2a1

Сообщение отредактировал DJ_Евс - Вторник, 04.08.2009, 23:49
 
skycarДата: Среда, 05.08.2009, 01:49 | Сообщение # 2
Ранг 6
Группа: Проверенные
Сообщений: 116
Награды: 5
Репутация: 31
Статус: Offline
Какая ошибка? Неверное округление или компилятор выбивает ошибку?
И какого размера массив? Он статичен или динамичен? Быть может, ты пытаешься обратиться к элементу по индексу, больше размера массива smile


Сообщение отредактировал skycar - Среда, 05.08.2009, 03:00
 
POGiMplayerДата: Среда, 05.08.2009, 04:21 | Сообщение # 3
Ранг 1
Группа: Проверенные
Сообщений: 17
Награды: 0
Репутация: 0
Статус: Offline
Или возможно в deistvie1;
deistvie2; происходят исключения.
 
AdminДата: Среда, 05.08.2009, 08:27 | Сообщение # 4
Ранг 10
Группа: Пользователи
Сообщений: 1268
Награды: 16
Репутация: 2
Статус: Offline
Поставь точку останова, погляди, может быть не на каждом шаге (ну ты написал всегда, наверное уже делал), а может и вправду ошибка в deistvie1. Поидее все верно.

Не оказываю помощь через личные сообщения и ICQ
 
DigyДата: Среда, 05.08.2009, 15:16 | Сообщение # 5
Ранг 3
Группа: Проверенные
Сообщений: 71
Награды: 0
Репутация: 1
Статус: Offline
сделай "Value" глобальной переменной, у меня такие ошибки часто вылезают

><))'>
 
DJ_ЕвсДата: Среда, 05.08.2009, 17:15 | Сообщение # 6
Ранг 6
Группа: Проверенные
Сообщений: 165
Награды: 3
Репутация: 1
Статус: Offline
Обычный одномерный статический Array[0..95] of single;
Ошибка стопудово именно на нём! Его комментирую, всё работает. (Random вместо массива)
Просто там что-то с числами напутано.


ПРОЙДИ ТЕСТ!!!!!
http://FIDO20.ru/test.php?4052&c=bbea2a1

 
POGiMplayerДата: Среда, 05.08.2009, 17:41 | Сообщение # 7
Ранг 1
Группа: Проверенные
Сообщений: 17
Награды: 0
Репутация: 0
Статус: Offline
Показывай полностью код - где выполняется работа с массивом.
 
DJ_ЕвсДата: Среда, 05.08.2009, 17:48 | Сообщение # 8
Ранг 6
Группа: Проверенные
Сообщений: 165
Награды: 3
Репутация: 1
Статус: Offline
Code
procedure redraw2;
var i, YPos: LongInt;
     YVal : Single;
     FFTData : TFFTData;
begin
BASS_ChannelGetData(TabSon[1].GetStream, @FFTData, BASS_DATA_FFT1024);
Form1.DXDraw1.surface.Canvas.Pen.Color := ClAqua;
   for i := 0 to 95 do
     begin
     YVal := Abs(FFTData[i + 5]);
     YPos := Trunc((YVal) * 500); //Тут ошибка.
     Form1.DXDraw1.Surface.Canvas.MoveTo(11 + i, 300);
     Form1.DXDraw1.Surface.Canvas.LineTo(11 + i, 300 - YPos);
     end;
end;

Вот.


ПРОЙДИ ТЕСТ!!!!!
http://FIDO20.ru/test.php?4052&c=bbea2a1

 
AdminДата: Четверг, 06.08.2009, 15:49 | Сообщение # 9
Ранг 10
Группа: Пользователи
Сообщений: 1268
Награды: 16
Репутация: 2
Статус: Offline
Trunc это не округление а выделение целой части.
Может быть в LongInt не влазит число? попробуй int64


Не оказываю помощь через личные сообщения и ICQ
 
DJ_ЕвсДата: Пятница, 07.08.2009, 18:30 | Сообщение # 10
Ранг 6
Группа: Проверенные
Сообщений: 165
Награды: 3
Репутация: 1
Статус: Offline
Вот оно чё, михалыч! biggrin

ПРОЙДИ ТЕСТ!!!!!
http://FIDO20.ru/test.php?4052&c=bbea2a1

Сообщение отредактировал DJ_Евс - Суббота, 08.08.2009, 09:26
 
AdminДата: Пятница, 07.08.2009, 23:28 | Сообщение # 11
Ранг 10
Группа: Пользователи
Сообщений: 1268
Награды: 16
Репутация: 2
Статус: Offline
ты трассировкой прогони программу, погляди че получается, какие цифры и посмотрим...

Не оказываю помощь через личные сообщения и ICQ
 
DJ_ЕвсДата: Суббота, 08.08.2009, 00:27 | Сообщение # 12
Ранг 6
Группа: Проверенные
Сообщений: 165
Награды: 3
Репутация: 1
Статус: Offline
Что-то я не понимаю...
Написал такое!

Code
Function MyTrunc(X: Single): LongInt;
Var i: LongInt;
begin
   For i:=0 to 40 do
     If X > i then result := i;
   If X > 40 then result := 40;
end;

procedure redraw3(FFTData : TFFTData; X, Y : Integer);
         var i, YPos, DrawPoint : LongInt; YVal : Single;
        begin
         Form1.DXDraw1.Surface.Canvas.Pen.Color := clAqua;
          for i := 0 to 128 do begin
            YVal := Abs(FFTData[(i * 1) + 5]);
            if YVal > 40 then YVal := 40;
            YPos := MyTrunc(YVal);
            if YPos > 40 then YPos := 40;
            DrawPoint := YPos;
            begin
              Form1.DXDraw1.Surface.Canvas.MoveTo(X + i, Y + 40);
              Form1.DXDraw1.Surface.Canvas.LineTo(X + i, Y + 40 - DrawPoint);
            end;
          end;
end;

Ну чему тут глючить? Кто угадает, где выходит ошибка? biggrin


ПРОЙДИ ТЕСТ!!!!!
http://FIDO20.ru/test.php?4052&c=bbea2a1

 
Форум » Все о Delphi » Синтаксис » Ошибка при округлении. (Что делать?)
Страница 1 из 11
Поиск:

Copyright DelphiDevelop.ru © 2008-2017
Хостинг от uCoz