Модераторы: Snowy, MetalFan, bems, Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка конвертации из string в real. 
V
    Опции темы
asres1
Дата 13.3.2011, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 12.10.2010
Где: Украина

Репутация: 1
Всего: 1



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

Есть такая вот инфа в файлике:

&s24  89.3122
\23
        0.00 0.000 1s
        0.50 0.00b 1 
        2.04 0.31    
        2.23 0.45w 1 
        2.86 0.89w 2 
        3.05 1.03    
        6.0825.46d 1s
        0.0025.460 1 
&s25  90.6722


Где первые рядок пустой. Нужно считать это и превратить в real




вот мой код.

Код


var
 f:textfile;
 n,st,st1:string;
 x,y:array[1..24] of string;
 x1,y1:array[1..24] of real;
i:integer;
begin

i:=0;                                
St1:=edit1.text;               // значение: "&s24". я её ввожу
temp :='';


DecimalSeparator:='.';  //разделитель по умолчанию

While not EOF(f) do
 begin
     readln(F,St);

 if pos (St1,St)<>0 then

     repeat
          begin
            readln(F,n);

         if pos(n,'\')=0 then                                      //чтение числа после "\"
           begin
             LengMas:=StrToInt(Copy(st,3,2));         //  <<<< это пашет
           end;

             x[i]:=(Copy(n,8,5));                            
             y[i]:=Copy(n,13,5);

        
             x1[i]:=StrToFloat(x[i]);                                         //<<<< ошибка
             y1[i]:=StrToFloat(y[i]);                                       //<<<< 


           end;
         until pos('&s',n)>0;                                           //читать до следующего знака                 

 end;



end;






StrToFloat выдаёт ошибку. ("" is not valid floating value)
Как мне избежать ошибки?  smile 








Это сообщение отредактировал(а) asres1 - 15.3.2011, 00:48
PM MAIL   Вверх
northener
Дата 14.3.2011, 02:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



Цитата(asres1 @  13.3.2011,  23:35 Найти цитируемый пост)
Как мне избежать ошибки? 

Разобраться с форматом файла и с форматом формирования в нём строк.
Может быть методом "проб и ошибок", если нет документации от авторов сего файла.

P.S. Можно "избежать ошибки" очень просто. Достаточно пустой части блока except. Но это плохое решение.  Bad Tips smile


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
asres1
Дата 14.3.2011, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 12.10.2010
Где: Украина

Репутация: 1
Всего: 1



Цитата
Разобраться с форматом файла и с форматом формирования в нём строк.

Форматирование файла менять нельзя. Это задание.
Цитата
Может быть методом "проб и ошибок", если нет документации от авторов сего файла.

ну собсна сюда и зашёл потому что проб и ошибок предостаточно.

Цитата
P.S. Можно "избежать ошибки" очень просто. Достаточно пустой части блока except.

такое пойдёт.  но вопрос чтоб каким то образом считывание началось на одну строку дальше.

Это сообщение отредактировал(а) asres1 - 14.3.2011, 18:37
PM MAIL   Вверх
northener
Дата 14.3.2011, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



Цитата(asres1 @  14.3.2011,  18:32 Найти цитируемый пост)
но вопрос чтоб каким то образом считывание началось на одну строку дальше.

Сначала сделать один раз readln(F), а уж потом
Код

While not EOF(f) do
 begin
     readln(F,St);



--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
asres1
Дата 14.3.2011, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 12.10.2010
Где: Украина

Репутация: 1
Всего: 1



Цитата(northener @ 14.3.2011,  19:28)
Цитата(asres1 @  14.3.2011,  18:32 Найти цитируемый пост)
но вопрос чтоб каким то образом считывание началось на одну строку дальше.

Сначала сделать один раз readln(F), а уж потом
Код

While not EOF(f) do
 begin
     readln(F,St);

Цитата
Сначала сделать один раз readln(F), а уж потом

Нипанятна. А в моём варианте разве нету такого? или после цикла который копирует в строку вставить readln?

Не могли бы вы поподробней обьяснить ( что это мне даёт). Ибо таким лёгким бы вариантом я бы и сам обошёлся. Или тут не так уж просто? 


С тем вариантом попытался повыдрючиваться. Оно то работает но ошибку памяти выдаёт по выходу из проги. Спарта какае-то  smile 

Это сообщение отредактировал(а) asres1 - 14.3.2011, 21:41
PM MAIL   Вверх
Keeper89
Дата 14.3.2011, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 9
Всего: 58



Файл прикрепить можешь?


--------------------
PM MAIL WWW   Вверх
BadBoy
Дата 15.3.2011, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 26.5.2007

Репутация: нет
Всего: нет



Цитата(asres1 @  13.3.2011,  23:35 Найти цитируемый пост)
x1[i]:=StrToFloat(x[i]);                                         //<<<< ошибка

Код

var
  fs: TFormatSettings;
begin
  fs.DecimalSeparator := '.';
  x1[i]:=StrToFloat(x[i], fs);

PM MAIL   Вверх
asres1
Дата 15.3.2011, 00:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 12.10.2010
Где: Украина

Репутация: 1
Всего: 1



Цитата(asres1 @  13.3.2011,  23:35 Найти цитируемый пост)
x1[i]:=StrToFloat(x[i]);                                         //<<<< ошибка

Код

var
  fs: TFormatSettings;
begin
  fs.DecimalSeparator := '.';
  x1[i]:=StrToFloat(x[i], fs);




Цитата
DecimalSeparator:='.';  //разделитель по умолчанию 

  smile 


Keeper89, ща залью.

Добавлено @ 00:39


Моя программка. Пароль "1"



Это сообщение отредактировал(а) asres1 - 15.3.2011, 00:40
PM MAIL   Вверх
BadBoy
Дата 15.3.2011, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 26.5.2007

Репутация: нет
Всего: нет



Цитата(asres1 @  15.3.2011,  00:26 Найти цитируемый пост)
Цитата
DecimalSeparator:='.';  //разделитель по умолчанию 
Всмысле? 
я не вижу где он используется.
Или в настройках региональных параметров '.' ?

еще раз! чтобы не зависеть от региональных параметров и не попасть в просак указывай ручками нужный в конкретной ситуации разделитель.

Кроме того, такой варинат вызова StrToFloat является потокобезопасным!

Код

function StrToFloatExt(const S: String; Separator: Char = '.'): Extended;
var
  fs: TFormatSettings;
begin
  fs.DecimalSeparator := Separator;
  Result := StrToFloat(S, fs);
end;


Это сообщение отредактировал(а) BadBoy - 15.3.2011, 01:01
PM MAIL   Вверх
asres1
Дата 15.3.2011, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 12.10.2010
Где: Украина

Репутация: 1
Всего: 1



Цитата
еще раз! чтобы не зависеть от региональных параметров и не попасть в просак указывай ручками нужный в конкретной ситуации разделитель.
Кроме того, такой варинат вызова StrToFloat является потокобезопасным!.

Спасибо за инфу, мануалы почитаю про него. 



Цитата
всмысле? 
я не вижу где он используется.


Перед циклом считывания файла. 14 строка. В моей проге он вызываеться при запуске формы. 



Это сообщение отредактировал(а) asres1 - 15.3.2011, 01:06
PM MAIL   Вверх
northener
Дата 15.3.2011, 01:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



Цитата(asres1 @  15.3.2011,  00:26 Найти цитируемый пост)
Моя программка. Пароль "1"


Keeper89, я уверен в этом, просил только файл с данными. Сам проект не очень интересен.
Файл с данными вы приложили, но он вызывает кучу вопросов о том формате, с которым записаны данные. (Гореть в огне тому, кто так сохраняет данные!)
Тогда давайте лучше начнем сначала по методу проб и ошибок. Основываясь на том файле с данными, который вы привели. Показывайте как читали этот файл начиная с первой строчки и хотя бы до 12-й.

Цитата

Разобраться с форматом файла и с форматом формирования в нём строк.

Форматирование файла менять нельзя. Это задание.

Я советовал разобраться с форматом файла, а не изменять сей формат. Вы очевидно с форматом пока не очень разобрались. Первая строка файла не "пустая", а содержит информацию. И, возможно, просто её пропускать - плохо. 
А далее куча вопросов, которую форум не выдержит. Можете обратиться ко мне в личку, но много времени уделить не смогу.

Это сообщение отредактировал(а) northener - 15.3.2011, 01:22


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
asres1
Дата 15.3.2011, 01:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 12.10.2010
Где: Украина

Репутация: 1
Всего: 1



Цитата

Файл с данными вы приложили, но он вызывает кучу вопросов о том формате, с которым записаны данные.

 Есть координаты(x,y) корабля в этом файле. по вводу циферки он должен строиться прогой. Координаты сделаны спецом так, чтоб мне их было трудно считать.
Шпангоуты,форштевени и прочая хрень не должна вас смущать. Покажите пожалуйсто как пропустить эти пробелы. Или хотя бы скажите что можно сделать. 


Цитата
 (Гореть в огне тому, кто так сохраняет данные!)

 smile  smile  smile 


Цитата

Тогда давайте лучше начнем сначала по методу проб и ошибок. Основываясь на том файле с данными, который вы привели. Показывайте как читали этот файл начиная с первой строчки и хотя бы до 12-й.


1) Я дохожу до нужного &s (они пронумерованы). В данном случае, &s21
  запускаю pos который находит в строке эту ерундовину. 
2) Начинаю новый цикл. Считываю до следуюсчего &s 
3) Считываю значение после \ ( в моём случае \23), которое означает размер масива координат-я его должен буду сделать динамическим.

 Пытаюсь отконвертить в риал оно мне толдычит про пустую строку =) 




Это сообщение отредактировал(а) asres1 - 15.3.2011, 01:28
PM MAIL   Вверх
Keeper89
Дата 15.3.2011, 01:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 9
Всего: 58



Формат файла конечно тот еще. Накидаю свой вариант как время будет, а пока ТС пусть думает в собственном потоке )


--------------------
PM MAIL WWW   Вверх
asres1
Дата 15.3.2011, 01:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 12.10.2010
Где: Украина

Репутация: 1
Всего: 1



Цитата
Формат файла конечно тот еще. Накидаю свой вариант как время будет, а пока ТС пусть думает в собственном потоке ) 


буду думать значит  smile 


PM MAIL   Вверх
northener
Дата 15.3.2011, 01:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



Цитата(asres1 @  15.3.2011,  01:23 Найти цитируемый пост)
Я дохожу до нужного &s (они пронумерованы). В данном случае, &s21

А они всегда располагаются в файле по порядку их номеров? Или могут быть расположены произвольно? Я не про номер, а про содержание "секции" &sхх.
Понял. Это шпангоуты.  Их порядок задан координатой.
Отдаю вопрос на откуп Keeper89. 


Это сообщение отредактировал(а) northener - 15.3.2011, 01:55


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0660 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.