-
программа, созданная в делфи7 работает 15 лет. в ней я передаю параметры в процедуру StoredProc таким образом:
Params[12].Asfloat := strtofloat(edit14.text);
Params[13].Asfloat := strtofloat(edit6.text);
Params[14].Asfloat := strtofloat(edit7.text);
.........
и так 120 параметров.
установил делфи2010, и в нем открыл исходники и откомпилировал.
после этого в момент передачи параметров такая ошибка:
Invalid Floating Point Operation
в результате долгих раздумий поменял способ передачи параметров на такой:
Params[12].value := strtofloat(edit14.text);
Params[13].value := strtofloat(edit6.text);
Params[14].value := strtofloat(edit7.text);
.........
После этого все стало работать без проблем.
и в другом месте у меня тоже есть такая передача параметров (как я описал вначале) , но там параметров не 120 а 2 или 3.
и когда параметров мало, то ошибка не возникает тоже.
Что это может быть? В делфи ХЕ6 тоже самое. а в делфи7 все работает без этих проблем.
-
> Что это может быть?
а проверить значение на котором возникает
Invalid Floating Point Operation
?
> все стало работать без проблем.
эээ... уверен? то что дельфя не смогла преобразовать, ты передал в варианте и стал преобразовывать сервер... он может не просто не сообщил, а подставил дефаулт, с потерей значения.
т.е. проблема могла просто "спрятаться" и отложится до тех пор пока в нее не упрутся.
> а в делфи7 все работает без этих проблем.
вообще ошибка о некорректных данных, что может быть на любой дельфе.
+ strtofloat зависит от настроек системы, т.е. еще и на разных машинах ошибка то будет(/возможна) то нет.
-
ошибка возникает в момент вызова хранимой процедуры ExecProc
передаю я не в варианте. потому что типы этих всех параметров я указал в Params этой процедуры. то есть они определены статически заранее , их тип я поставил ftFloat
некорректными данными быть не могут. программа работает 15 лет и каждый день в нее вводят тысячи значений через эту процедуру.
а именно при компиляции в новой делфи эта ошибка возникает с любыми значениями. да и значения там обычно просто нули или другие целые числа. делфи старая и новая стоит на 1 машине. то есть одинаковые настройки региональные, одниковое BDE и база
-
передаю я не в варианте.
вот твой вариант :
Params[14].value
и это именно variant
-
но этот самый параметр номер 14 у меня в свойствах StoredProc обозначен как ftFloat.
хотя в любом случае в Делфи7
Params[14].Asfloat := strtofloat(edit7.text);
работало 15 лет как часы.
а в новой делфи только через вариант работает
Params[14].value := strtofloat(edit7.text);
и опять же, если параметров мало то тоже работает .а именно если их сотня тогда ошибка
-
> Params[14].Asfloat := strtofloat(edit7.text);
> работало 15 лет как часы.
оно и сейчас должно работать... если данные правильные. поэтому желательно бы определить на каких конкретно ошибка. или зависимость ... ну если к примеру где в новой дельфе буфер уменьшили, а у тебя аж 120 параметров... т.е. если к примеру всегда валится на сотом, при том что в данных то же число строкой что рядом, и параметр того же типа... это было бы показательно.
> .а именно если их сотня тогда ошибка
... и параметры определены одинаково?
они же приводятся к тому типу что прописан (ты пишешь Asfloat, "внутри" стоит строка, получается строка с запятой, ну и понятно на выполнении для всех движков запятая признак перечисления, а не разделитель)
> одниковое BDE и база
BDE? еще живо? нда. а вы там случаем в новой дельфе под 64бита не компилите? и такое BDE тоже есть?
-
> а именно при компиляции в новой делфи эта ошибка возникает с любыми значениями.
если на компиляции то проще, поставь "use debug DCU" сделай билд, и после посмотри более конкретно место где ошибка (может реально что-то с буфером/аналогичным... как там вообще список формируется).
-
но этот самый параметр номер 14 у меня в свойствах StoredProc обозначен как ftFloat.
какая разница какого типа параметр,
если делфийское свойство Value имеет тип Variant.
никакой.
-
хорошо, попробую уменьшать количество параметров и при этом отлавливать на каком количестве перестанет возникать ошибка.
может точно буфер меньше в новых дельфях
а насчет данных-конечно я ради эксперимента ввожу абсолютно одинаковые данные, например одни 1 или одни нули. и в старой версии и в новой.
там где float там конечно только числа использую а не строку.
BDE по 64 разряда не использую, не подскажу
-
иногда голова конечно враг рукам.
взять то, что работало 15 лет без гемора,
и ничего не меняя в архитектуре, просто захотеть перекомпилировать это под новую среду.
причем еще и оставить БДЕ.
зачем.
-
> Params[12].Asfloat := strtofloat(edit14.text);
> Params[13].Asfloat := strtofloat(edit6.text);
> Params[14].Asfloat := strtofloat(edit7.text);
Я бы начал с того что проверил все эдиты. Вот что там? Лог надо вести:
Log.Add('edit14 == '+edit14.text);
Params[12].Asfloat := strtofloat(edit14.text);
Log.Add('edit6 == '+edit6.text);
Params[13].Asfloat := strtofloat(edit6.text);
Log.Add('edit7 == '+edit7.text);
Params[14].Asfloat := strtofloat(edit7.text);
Мож во всех эдитах точки, а в одном запятая затесалась?
-
проверять эдиты не надо.
их надо было бы проверять при
"xxx" is not floating point value
-
Как так не надо? А например во всех эдитах целые числа, в одном с десятичными? Или где-то ноль?
-
при этом исключение будет другое.
-
если децимал сепаратор не тот что у него в эдите, исключение будет другое.
-
во всех эдитах нули я пробовал забивать. то есть с данными все ок.
и опять же, в проге откомпилированной под старый делфи я забивал абсолютно такие же данные. теже нули или теже единицы. и ошибок не было.
методом долгих экспериментов я почти подошел к разгадке.
среди параметров были параметры не только числовые но и символьные, типа :
Params[12].Asstring := 'ddffdf';
Params[13].Asstring := 'ddffdf';
так вот, если этих строковых параметров больше 2-3 то и возникает ошибка!
а если их 2 или меньше, то все нормально!
причем я присваивал им именно такие как я указал выше значения. то есть не было там иероглифов в этих строках или какихто спецсимволов и тп.
похоже это какойто глюк новых версий делфи или связка "новое делфи-БДЕ".
если указать так:
Params[12].value := 'ddffdf';
Params[13].value := 'ddffdf';
то все ок
-
Просто "Invalid Floating Point Operation" - операция с числом. Чаще всего деление на ноль. А число-то из строки берётся.
Именно одинаковых? Строка из переменной/объекта или точно как показали - константой в коде?
Текст ошибки не изменился? Вылезает посреди задании параметров или при вызове процедуры или кого там?
-
1. убери бде.
2. вместо стапятисот параметров сделай один блоб-параметр (например xml)
-
в старой версии делфи нет никаких ошибок. то есть нет делений на ноль.
пробовал просто присваивать всем параметрам нули например.
все равно ошибка на новом делфи.
ошибка при вызове ExecProc
строка пробовал даже просто в коде прописывать ради эксперимента
то есть
Params[13].Asstring := 'ddffdf';
и ошибка возникает если таких строковых параметров больше 2-3. если меньше то ошибки нет.
-
насчет убрать БДЕ это понятно. но программа работает на крупном предприятии 15 лет.
именно с БДЕ
смысл менять архитектуру?
просто интересно было понять это глюк новых делфи в связке с БДЕ или что
-
смысл менять архитектуру?
а смысл перекомпиливать?
-
понять это глюк новых делфи в связке с БДЕ или что
у тебя эксепшен бдешный?
ни разу.
он поднимается не из бде.
так откуда мысли про какие-то связки?
-
120 параметров, которые биндятся по индексу вместо поимени......
ты вообще уверен, что когда дфм переколбашивался из д7 в хе то все они остались на своих местах?
-
захотелось просто перейти на более новый делфи. ведь неизвестно как будет старый делфи7 работать под новыми виндосами (8,10)
не ожидал такой засады от обычной процедуры.
мысль про связку возникла потому что малая вероятность что все делфи новее делфи7 имеют такой глюк.
а глюк связки более вероятен из-за устаревшей архитектуры БДЕ и новой делфи.
вот и ищу откуда ноги растут изза спортивного интереса.
поменяв ASSTRING на VALUE проблема исчезла.
поэтому так и оставлю, без смены архитектур.
-
>кгшзх
остались все на местах потому что когда поменял ASSTRING на VALUE то все заработало
при потере параметров при переколбасеньи были бы ошибки
-
а чем может быть чревато использование VALUE?
Params[12].value := strtofloat(edit14.text);
Params[13].value := strtofloat(edit6.text);
Params[14].value := strtofloat(edit7.text);
в литературе видел и такое присвоение , то есть это допустимо?
-
остались все на местах потому что когда поменял ASSTRING на VALUE то все заработало
вот как раз потому что полегчало от замены на value, я бы и не был так уверен что параметры сохранили индексы.
применив value ты получил доп. сервис вариантов по преобразованию типов.
что как бы и намекает на то, что параметры могли перемешаться по индексам по сравнению с D7
-
> Просто "Invalid Floating Point Operation" - операция с числом.
много кто с числами работает, даже размер фонта (строки) пересчитывают с их участием.
> Чаще всего деление на ноль.
не, там другая ошибка - "divide by zero".
> Params[13].Asstring := 'ddffdf';
в новых юникод по умолчанию... может и параметры widestring-ом сделать?
> ведь неизвестно как будет старый делфи7
известно, нормально работает, у нас до сих пор это основной инструмент и менять не собираются. для старых проектов уж точно. новые может быть, но тоже сомнения, тогда придется отказаться от кучи наработок, и все переписывать (под фаремонкей/под 64 битность и т.д. а менять просто чтобы скомпилировать другим, ничего не меняя... нафиг).
-
>кгшзх
в смысле перемешаться параметры по номерам?
ок, проверю
>sniknik
да я тоже не бегу впереди прогресса. понятно ,что то, что работает, трогать не нужно.
но не ожидал что в простом проекте сразу такие грабли будут непонятные.
и хотелось потихоньку переходить на поновей делфи.
насчет widestring- попробую
спасибо за советы
-
Был у меня такой код:
function MyFloatTest (fl : Single) : Single;
function MyFloatToIEEE(fl : Single) : Single;
//
var
fl : Single;
Data : PByte;
begin
//
fl := PSingle(Data)^;
fl := MyFloatTest(fl);
fl := MyFloatToIEEE(fl);
//
И работало оно.
А потом, как раз после переезда на новую версию,
иногда, в зависимости от фазы луны (как выяснилось - младших битов мантиссы MyFloato'в)
начало хромать.
Раскопки показали:
Project1.dpr.71: fl := MyFloatTest(fl);
0041C544 FF35BC3E4200 push dword ptr [$00423ebc]
0041C54A E8E9D4FFFF call MyFloatTest
0041C54F D91DBC3E4200 fstp dword ptr [$00423ebc]
0041C555 9B wait
Мораль:
Нечего на версию пенять, если вместо float у меня(тебя) xz.
-
>NoUser
я же писал что дело не в float а в стрингах:
среди параметров были параметры не только числовые но и символьные, типа :
Params[12].Asstring := 'ddffdf';
Params[13].Asstring := 'ddffdf';
так вот, если этих строковых параметров больше 2-3 то и возникает ошибка!
а если их 2 или меньше, то все нормально!
-
>sniknik
замена string на widestring не помогла
и путаницы параметров нет при конвертации.
как только я уменьшаю количество параметров типа string до 2 , сразу ошибка пропадает.
-
оставь и не трогай.
-
> замена string на widestring не помогла
а может наоборот... оно и "ломает"? -> по умолчанию string стал юникодом т.е. увеличился размер в 2 раза (считая в байтах) - переполнился буфер, ну параметры тоже где то складываются...
т.е. в D7 у тебя уже было на грани переполнения, с юникодом переполнилось...
есть там AnsiString в параметрах?
-
>sniknik
вот это уже мне кажется ближе к истине.
в параметрах есть несколько string.
их было штук 5. я стал для эксперимента уменьшать их количество. как только оставляю строковых параметров 2 штуки-ошибка пропадает.
причем дело не в их значениях. я пробовал просто присваивать им в коде значение типа "qwerty". неужели это уж такой огромные размер?)
-
>sniknik
спасибо!!!!!!
помог Ваш последний совет.
после замены:
Params[13].Asstring := 'ddffdf';
на
Params[13].Asansistring := 'ddffdf';
ошибка исчезла.
неужели 3 несчастных параметра со стрингом вызывали переполнение буфера? их значение то было просто пару английских букв
-
> их значение то было просто пару английских букв
а зарезервированный под них размер? не думаю, что в рабочем буфере была упаковка данных по значениям.
-
ясно. еще раз большое спасибо
То есть в новых дельфях в процедурах лучше не использовать обычный стринг а юзать ансистринг.
-
я имею в виду конечно процедуры Storedproc
-
из палитры BDE
-
Удалено модератором
-
Удалено модератором