![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Уважаемые участники форума. прошу помочь мне разобраться в следующем моменте:
на вход программы подаю массив из 192400 числовых данных. числовой формат - single с каждым числом необходимо проделать процедуру, чтобы поменять местами байты. в итоге в процессе выполнения программы на этапе переворачивания (свопинга) выскакивает ошибка invalid floating-point operation. если же переворачивать каждое число по отдельности по одному, а не в цикле, то все проходит нормально. пробовал переворачивать отдельно то число на котором вылетает ошибка, и предыдущее число и предшествующее - по отдельности все нормально. а если в цикле, то - беда. в чем дело? Код:
procedure TForm1.btn2Click(Sender: TObject);
var
ff:TextFile;
buf:Single;
dd:array [0..3] of byte absolute buf;
temp:byte;
i:integer;
f:TStringList;
y:Integer;
a:array [0..90035]of Single;
begin
f:=TStringList.Create;
f.LoadFromFile('G:\val.txt');
//setlength(a,192400);
// setlength(b,192400);
for y:=0 to 90035 do begin
a[y]:=StrToFloat(f[y]);
end;
AssignFile(ff,'e:\antiswap.txt');
Rewrite(ff);
//процедура которая переворачивает байты
for y:=0 to 90035 do begin
buf:=a[y] ;
for i:=0 to 1 do begin
temp:=dd[i];
dd[i]:=dd[3-i];
dd[3-i]:=temp;
end;
Writeln(ff,buf);
end;
CloseFile(ff);
f.Free;
ShowMessage('конец');
end;во вложенном файле - входные данные. их меньше чем 192400 так как пришлось примерно половину удалить, чтобы загрузить на форум. Последний раз редактировалось Tonyy, 02.06.2013 в 18:00. |
|
#2
|
||||
|
||||
|
Во-первых в том файле что ты выложил всего 90036 числа, а значит этот цикл уже будет некорректный:
Код:
for y := 0 to 192399 do
begin
a[y] := StrToFloat(f[y]);
end; Или ты думаешь что взяв корректное число типа Single и перемешав в нём байты как тебе вздумается ты получишь опять корректное число? Вот почитай что означает каждый байт в числе типа Single: Число одинарной точности |
|
#3
|
|||
|
|||
|
да, я извиняюсь, что размер цикла не соответствует файлу задания. просто я уже выложил сначала код, а потом пришлось редактировать файл задание, чтобы его можно было выложить на форуме.
цель не в том, чтобы получить корректное число. а в том, чтобы перевернутые числа записать потом в файл, где они должны храниться перевернутыми. |
|
#4
|
||||
|
||||
|
Функция StrToFloat использует системный разделитель целой и дробной части. У тебя в Windows'е скорее всего установлен разделителем запятая, а в том твоём файле разделитель точка - отсюда и ошибка. Используй переменную DecimalSeparator для изменения символа разделителя целой и дробной части.
Цитата:
Цитата:
|
|
#5
|
|||
|
|||
|
с разделителем все в порядке. часть чисел он переворачивает. работу прекращает на 553 по счету числе. отдельно и 553 и 554 по счету число переворачивается той же функцией.
|
|
#6
|
||||
|
||||
|
Цитата:
|