Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
money и currency
|
|||
|---|---|---|---|
|
#18+
Написал я extended proc на дельфи. Все работает за исключением одного, неправильно понимается тип money. По хелпу, тип соответствующий money есть currency, хранятся оба в 8 байтах да и диапозон одинаковый. функция в dll следующая: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Так вот например передаю я 2,365 а получаю 10157597655,04. Еще мне непонятно почему MaxLen = 4 а Len = 8. Что я сделал неправильно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2002, 17:28 |
|
||
|
money и currency
|
|||
|---|---|---|---|
|
#18+
Вызывает подозрение вот это строчка: MoveMemory(pointer(Money), ptrMoney, Len); точнее выражение "pointer(Money)". Есть уверенность, что это будет проинтерпретировано как указатель на область, где лежит значение Money? Если не ошибаюсь, такая запись всего лишь означает преобразовать то, что в скобках к виду указателя, что в данном случае означает преобразовать денежное значение в 32-разрядному адресу. Наверно, здесь стоит сделать что-то наподобие MoveMemory(@Money, ptrMoney, Len); А еще лучше использовать дельфовую функцию Move. Там уже без указателей. И еще. extended proc предполагает, что возращаемое значение имеет тип Integer и ничего другого. Через него возвращается статус исполнения. У тебя указан Currency, что неверно. Хотя к ошибке это вряд ли приведет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2002, 18:08 |
|
||
|
money и currency
|
|||
|---|---|---|---|
|
#18+
Да, небольшие неточности в приведенном коде есть, прошу прощения. Вот код с изменениями: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Но он тоже не работает, хотя возвращает уже 11317238824,96 вместо 2,365... Непонимаю, что неправильно! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2002, 18:30 |
|
||
|
money и currency
|
|||
|---|---|---|---|
|
#18+
Вероятно, теперь имеет значение то обстоятельство, что Currency в Delphi - это число с плавающей точкой, а money - BCD-значение. И их, вероятно, так просто приравнять нельзя, так как в памяти представление у них разное. Поищи функцию преобразования BCD-значений в double или float. Или поэкспериметируй сам, например, смаппировав 8 байт типа money в 2 по 4 байта типа int с последующими вычислениями из этих 2-х целых значений. Как только будет получен результат таких вычислений равный заданному значению money, этот результат можно будет присвоить типу Currency. Функцию преобразования money -> currency можно подглядеть в исходниках TCurrencyField. Там это корректно преобразуется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2002, 10:38 |
|
||
|
money и currency
|
|||
|---|---|---|---|
|
#18+
Я попробовал проверить, там ли и то ли я читаю, включил выходной параметр, в который напрямую передаю входной. Выходной стал равен входному, т.е. читаю оттуда и то что надо. Но, попробовал использовать функцию BCDToCurr и тоже получил ошибку. Т.е. в случае неудачи использования BCDToCurr я пишу "неправильно", и именно это значение я и получил . Т.е. я так понимаю что, Делфи не воспринимает те восемь байт как TBCD. Код следующий: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2002, 11:39 |
|
||
|
|

start [/forum/topic.php?fid=58&fpage=2081&tid=2119812]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
34ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
2ms |
| others: | 13ms |
| total: | 132ms |

| 0 / 0 |
