Слетает терминал при подключении DLL

 
Наткнулся тут на тему, в которой обсуждались ошибки 226 билда и рекомедовалось поставить 225-й.
У меня как раз 225-й билд. И при подключении DLL-ки выскакивает системная ошибка и терминал выгружается из оперативной памяти. Вот скрин ошибки: http://i39.tinypic.com/68g8s3.jpg
Что было сделано?
DLL-ка создавалась на Delphi. Вот исходник:

library basic;

uses
  SysUtils,
  Windows,
  Classes;

{$R *.res}

// --------- Отброс дробной части ---------
function OtbrosDrobnChasti(ext_DobleVar:Extended):Integer; stdcall;
  // Функция Int возвращает целочисленную часть числа с плавающей точкой, как
  // число с плавающей точкой.
  // Функция Trunc делает то же самое, но возвращает целое число в формате Integer.
  var
  i_Rezult:Integer;

  begin
    i_Rezult:=Trunc(ext_DobleVar);
    OtbrosDrobnChasti:=i_Rezult;
  end;

exports OtbrosDrobnChasti;


begin
end.
Откомпилировалась нормально. Теперь же нужно проверить как она работает. Поэтому кидаем её libraries терминала, открываем редактор кода, создаём иклудник:
//+------------------------------------------------------------------+
//| DLL imports                                                      |
//+------------------------------------------------------------------+

 #import "basic.dll"
  int OtbrosDrobnChasti(double d_DobleVar);// функция отбрасывает дробную часть числа
 #import
Теперь создаём новый скрипт:
#include <Basic_dll.mqh>
#property show_inputs
extern double Cto_Okruglit=25.698;
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start(){
  int Rezult;
  Rezult=OtbrosDrobnChasti(Cto_Okruglit); 
  Alert("Было число = ",Cto_Okruglit,". После отброса дробной части стало = ",Rezult);
  return(0);
}
//+------------------------------------------------------------------+
Компилируем, кидаем на график и выскакивает вышеупомянутое окно об ошибке терминала.
Что не так я делаю?
 
Вы уверены что DecimalSeparator в системе, где работает DLL, есть точка. Я бы проверил.
 
zhuki >>:
Вы уверены что DecimalSeparator в системе, где работает DLL, есть точка. Я бы проверил.


   Переменная DecimalSeparator используется в функциях отображения валюты и вещественного числа.

Значение DecimalSeparator по умолчанию '.', в зависимости от региона Windows.
Взято здесь http://www.delphibasics.ru/DecimalSeparator.php
 
Вы передаёте в DLL якобы число 25.698,но в самом windows точка не является разделителем целых и дробных(DecimalSeparator), а она просто точка. В итоге в DLL вы пытаетесь произвести действия над непонятно чем. В начале функции DLL вставьте DecimalSeparator:='.'; или передавайте 25,698.

P.S. Делфи тут не причём,это система windows в регион. установках.
 
ext_DobleVar:double
 
zhuki >>:
Вы передаёте в DLL якобы число 25.698,но в самом windows точка не является разделителем целых и дробных(DecimalSeparator), а она просто точка. В итоге в DLL вы пытаетесь произвести действия над непонятно чем. В начале функции DLL вставьте DecimalSeparator:='.'; или передавайте 25,698.


Не сталкивался ранее с этим. Глянул свои предыдущие коды Delphi - зачем-то менял точку на запятую при считывании чисел из текстового поля. Нужно возвращаться к мануалам - поперезабыл уже всё сэтим MQL-ом :)
Подскажите пожалуйста, куда конкретно нужно сунуть строку DecimalSeparator:='.'; Я не врубаюсь просто потому, что не понял, как её объявить...
 
  begin
DecimalSeparator:='.';
    i_Rezult:=Trunc(ext_DobleVar);
    OtbrosDrobnChasti:=i_Rezult;
  end;

 
Не помогло - ошибка продолжает выгружать терминал из оперативки.
 
Kos >>:
ext_DobleVar:double


Поменял тип и всё заработало. :)
Вот результирующий код:

library basic;

uses
  SysUtils,
  Windows,
  Classes;

{$R *.res}

// --------- Отброс дробной части ---------
function OtbrosDrobnChasti(ext_DobleVar:Double):Integer; stdcall;
  // Функция Int возвращает целочисленную часть числа с плавающей точкой, как
  // число с плавающей точкой.
  // Функция Trunc делает то же самое, но возвращает целое число в формате Integer.
  var
  i_Rezult:Integer;

  begin
    DecimalSeparator:='.';
    i_Rezult:=Trunc(ext_DobleVar);
    OtbrosDrobnChasti:=i_Rezult;
  end;

exports OtbrosDrobnChasti;


begin
end.

Спасибо большое.
 
Я бы написал так
// --------- Отброс дробной части ---------
function OtbrosDrobnChasti(ext_DobleVar:Extended):Integer; stdcall;
  // Функция Int возвращает целочисленную часть числа с плавающей точкой, как
  // число с плавающей точкой.
  // Функция Trunc делает то же самое, но возвращает целое число в формате Integer.
  begin
DecimalSeparator:='.';
Rezult:=Trunc(ext_DobleVar);

  end;

exports OtbrosDrobnChasti;


begin
end
В том что у вас? ведь функция ничего не возвращает .
 
Нет, возвращает - возвращает целую часть числа без округления - просто отбросив дробную. Я удлиннил код на 2 строки просто чтоб подстраховаться. Вообще, оно должно работать и при более коротком варианте кода:

library basic;

uses
  SysUtils,
  Windows,
  Classes;

{$R *.res}

// --------- Отброс дробной части ---------
function OtbrosDrobnChasti(ext_DobleVar:Double):Integer; stdcall;
  // Функция Int возвращает целочисленную часть числа с плавающей точкой, как
  // число с плавающей точкой.
  // Функция Trunc делает то же самое, но возвращает целое число в формате Integer.

  begin
    DecimalSeparator:='.';
    OtbrosDrobnChasti:=Trunc(ext_DobleVar);
  end;

exports OtbrosDrobnChasti;

begin
end.
P.S. И оно работает - только что проверил.
Причина обращения: