Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.04.20;
Скачать: CL | DM;

Вниз

Как заюзать функцию из С-файла в проекте Delphi?   Найти похожие ветки 

 
Бегущий человек ©   (2008-03-23 14:53) [0]

Здравствуйте!
Есть С- файл, в котором есть некая функция. Компилирую в obj. Задача: вызвать функцию из указанного obj внутри проекта Delphi.
Причина такого изврата: в основной задаче встретились такие преобразования типов, которые могли быть реализовано только на С (что и было сделано). Вот такой вопрос


 
Бегущий человек ©   (2008-03-23 14:54) [1]

P.S. поиск по интернету ничего не дал


 
Johnmen ©   (2008-03-23 14:58) [2]


> в основной задаче встретились такие преобразования типов, которые могли быть реализовано только на С

Давайте лучше это обсудим на D.


 
Anatoly Podgoretsky ©   (2008-03-23 16:05) [3]

> Бегущий человек  (23.03.2008 14:53:00)  [0]

Из obj файла ничего выполнить нельзя.


 
Сергей М. ©   (2008-03-23 20:08) [4]


> преобразования типов,
>  которые могли быть реализовано только на С


Да ты шо ?! А мужики-то и не знают !


 
Cpp   (2008-03-23 21:39) [5]

>Компилирую в obj

Надо компилировать в DLL, и вызывать оттуда - Пример для компилятора Dev-Cpp:


//++++++++++++++++++++++++++++++++++++++LIB
#include "lib1.h"
#include <windows.h>
//#include <stdio.h>

DLLIMPORT int liblocalA(int x, int y)
{
      return (x + y);
}

DLLIMPORT int mulA(int x, int y)
{
      return (x * y);
}


BOOL APIENTRY DllMain (HINSTANCE hInst     /* Library instance handle. */ ,
                      DWORD reason        /* Reason this function is being called. */ ,
                      LPVOID reserved     /* Not used. */ )
{
   switch (reason)
   {
     case DLL_PROCESS_ATTACH:
       break;

     case DLL_PROCESS_DETACH:
       break;

     case DLL_THREAD_ATTACH:
       break;

     case DLL_THREAD_DETACH:
       break;
   }

   /* Returns TRUE on success, FALSE on failure */
   
   return TRUE;
}

//++++++++++++++++++++++++++++++++++++++HEADER
#ifndef _DLL_H_
#define _DLL_H_

#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else /* Not BUILDING_DLL */
# define DLLIMPORT __declspec (dllimport)
#endif /* Not BUILDING_DLL */

//extern "C" {

DLLIMPORT int liblocalA(int x, int y);
DLLIMPORT int mulA(int x, int y);
//}

#endif /* _DLL_H_ */

//++++++++++++++++++++++++++++++++++++++Вызов из Delphi:
implementation {$R *.DFM}

function liblocalA(a,b:Integer):Integer;cdecl; external "DLL_LIB_2_C.dll";
function mulA(a,b:Integer):Integer;cdecl; external "DLL_LIB_2_C.dll";

procedure TForm1.FormCreate(Sender: TObject);
begin
 Caption:=IntToStr(liblocalA(5,7)+mulA(10,7));
end;



 
palva ©   (2008-03-23 21:58) [6]

Пример:

Файл fun.c -------------------------------------------
int __fastcall fun(int n) {
 return n + 10;
}
------------------------------------------------------

Компилируется Borland-компилятором:
bcc32 /c fun.c
Получившийся файл fun.obj присоединяется в юните:

Файл objunit.pas -------------------------------------
unit objunit;
interface
function fun(n: Integer): Integer; external;
implementation
{$l fun.obj}
end.
------------------------------------------------------

Юнит используется в главной программе:

------------------------------------------------------
{$APPTYPE CONSOLE}
uses objunit;
begin
 WriteLn(fun(24));
end.
------------------------------------------------------


 
DrPass ©   (2008-03-23 21:59) [7]


> Надо компилировать в DLL, и вызывать оттуда - Пример для
> компилятора Dev-Cpp:

Ыщо один специалист...


> Задача: вызвать функцию из указанного obj внутри проекта
> Delphi

{$L file.obj}

function bebebe: integer; external;

Подразумевается, что твой obj в OWL-формате.


> Причина такого изврата: в основной задаче встретились такие
> преобразования типов, которые могли быть реализовано только
> на С


Правильнее было бы сказать: "в основной задаче встретились такие  преобразования типов, которые я не умею делать в Delphi"


 
Бегущий человек ©   (2008-03-24 02:09) [8]

>Palva
>DrPass ©   (23.03.08 21:59) [7]

За совет спасибо, а кто тут сильно умный и всё умеет в Delphi , пусть мне сделает такоe Double(Int64(....
и я с удовольствием перед ним извинюсь за невежество.


 
Бегущий человек ©   (2008-03-24 02:11) [9]

>Сpp
спасибо и Вам


 
Бегущий человек ©   (2008-03-24 02:18) [10]

Я нашёл, что Си лучше приводит типы...во всяком случае приведение к Double (да к чему угодно - хоть к чёрту лысому) 64разрядного целого проходит безболезненно, в то время как  Делфи мучает какие-то функции: объявляй 64 разрядную переменную как Comp, потом вызывай функцию CompToExtended...большой телепатор подсказывает мне, что при этом с точностью происходит хрен знает что. А у меня ошибка кумулятивно накапливается при умножениях... в общем решил, что на Си прокомпилю и подключу уже С-код ( компилированный не паскальным, а именно си-компилятором) и избавлю себя от геморроя.


 
DrPass ©   (2008-03-24 02:18) [11]


> пусть мне сделает такоe Double(Int64

Зависит от того, что надо получить на выходе. Если просто корректно записать int64-переменную в double, то это делается банальным присваиванием, без всяких приведений. Если надо к значению int64 обратиться как к double (боже, зачем?), то достаточно просто объявить его так:
var
 i: int64;
 d: double absolute i;


 
DrPass ©   (2008-03-24 02:21) [12]


> Я нашёл, что Си лучше приводит типы...

Си их вообще не приводит. Он на них забивает :)


 
Германн ©   (2008-03-24 02:25) [13]


> Бегущий человек ©   (24.03.08 02:09) [8]
>
> >Palva
> >DrPass ©   (23.03.08 21:59) [7]
>
> За совет спасибо, а кто тут сильно умный и всё умеет в Delphi
> , пусть мне сделает такоe Double(Int64(....
> и я с удовольствием перед ним извинюсь за невежество.

Чушь! К "преобразованию типов" - не относится.
Лучше сразу извиниться за невежество и забыть сей топик.


 
Бегущий человек ©   (2008-03-24 03:25) [14]

DrPass
Вот и не умничай впредь
Германн
Как это не относится, если выдаваемая ошибка называется "Invalid typecast". Английский язык учим.


 
Старый дядя ЦУП   (2008-03-24 03:40) [15]


> Бегущий человек ©   (24.03.08 03:25) [14]
> DrPassВот и не умничай впредьГерманнКак это не относится,
>  если выдаваемая ошибка называется "Invalid typecast". Английский
> язык учим.


Учи букварь.
Тебе уже DrPass сказал, что Delphi автоматически приведение типов сделает.

var
 i: Int64;
 d: Double;
begin
 i := 10;
 d := i;



> Как это не относится, если выдаваемая ошибка называется
> "Invalid typecast". Английский язык учим.


Учимся читать ответы в форумах.


 
Германн ©   (2008-03-24 03:44) [16]


> Бегущий человек ©   (24.03.08 03:25) [14]

> Германн
> Как это не относится, если выдаваемая ошибка называется
> "Invalid typecast". Английский язык учим.
>

Аглицкий знаю достаточно хорошо. Уверен, что намного лучше чем ты. А выдаваемая ошибка говорит, что ты (извини) - дурак! Примите и прочь!


 
Старый дядя ЦУП   (2008-03-24 03:47) [17]


> Германн ©   (24.03.08 03:44) [16]


Увы, оказывается даже описанный в трёпе интерфейс, оказывается, не универсален для всех случаев жизни.


 
Германн ©   (2008-03-24 03:57) [18]


> Старый дядя ЦУП   (24.03.08 03:47) [17]

Увы и Ах. :(


 
Старый дядя ЦУП   (2008-03-24 04:13) [19]


> Бегущий человек ©   (23.03.08 14:54) [1]
> P.S. поиск по интернету ничего не дал


И в интернете тоже получается научиться искать не сразу - опыт нужен.

Поищи в яндексе по ключевым словам COFF OMF OBJ DELPHI
Изучи первые десяток ссылок.
Плюс справка Delphi по слову OBJ.

Этого достаточно для поиска решения.


 
Бегущий человек ©   (2008-03-24 06:16) [20]

Германн
Ага, английский ты знаешь лучше чем я, но слово typecast как-то не попадалось, а словаря под рукой не было... Оскорблениями авторитета не завоевать.
Старый дядя ЦУП   (24.03.08 04:13) [19]
Не заметил поста DrPass [11]. За что извиняюсь перед ним и слова про умничанье беру обратно. Вот этого не знал. Действительно не знал:

double absolute i;


 
Loginov Dmitry ©   (2008-03-24 08:01) [21]

> пусть мне сделает такоe Double(Int64(....


Такое приведение может делать любой, и даже не сильно умный и не все умеющий в Delphi. А то, что в этом возникли какие-то трудности у тебя - проблема в твоем невежестве и упертости. Такое приведение в Delphi можно выполнить еще множеством способов (но ты ни одного из них не знаешь).
Приведение Int64 к Double - попытка привести логически несовместимые сущности - есть верх извращения. Оно тебе точно нужно?


 
Бегущий человек ©   (2008-03-24 16:21) [22]

>Loginov Dmitry ©   (24.03.08 08:01) [21]
Фактически, требуется следующее
var d:Double;
...
d:=Double(Int64(1 shl 32)*F)/Double(72000000)+0.5 ;

На Си аналогичное приведение прекрасно работает. Почему не работает в Делфи? Что тут логически несовместимого? Все очень логично - кроме компилятора Делфи


 
Бегущий человек ©   (2008-03-24 16:25) [23]

поэтому, чтобы не иметь секс с безумным компилятором Делфи, я решил записать это выражение в Си, скомпилить его и подключить скомпилированный С-код к делфи.


 
Бегущий человек ©   (2008-03-24 16:26) [24]

И вообще переезжаю на Си. Достал меня Паскаль.


 
DrPass ©   (2008-03-24 16:34) [25]


> Фактически, требуется следующее
> var d:Double;
> ...
> d:=Double(Int64(1 shl 32)*F)/Double(72000000)+0.5 ;

Я, конечно, безумно рад, что С приобретет нового достойного последователя.
Но в чем у тебя проблема? Обязательно слово double в формулу хотелось вписать? А просто d:= (1 shl 32)*F/72000000+0.5 сделать никак нельзя было? 8-)


 
Сергей М. ©   (2008-03-24 16:38) [26]


> Бегущий человек ©   (24.03.08 16:21) [22]


> Почему не работает в Делфи?


Потому что не компилируется)

А чтобы компилировалось, нужно писать не ахинею, а осмысленное (с т.з. и программиста и компилятора) выражение.

Те самые твои потуги с бессмысленным приведением типов и есть ахинея)
см. [25]


 
Johnmen ©   (2008-03-24 16:44) [27]

Да ладно вам... Чел уже свалил практически. На С.
Аминь...:)))


 
Сергей М. ©   (2008-03-24 16:51) [28]


> Johnmen ©   (24.03.08 16:44) [27]


Судя по


> в Си, скомпилить его и подключить скомпилированный С-код
> к делфи


пока еще не аминь - нас ждет очередная ламосерия


 
Бегущий человек ©   (2008-03-24 17:30) [29]

Код подключен, всё работает нормально. Спасибо еще раз palva и DrPass.
2Сергей М.
Есть такие люди, которые не любят подстраиваться под компиляторы. Вот для таких людей и существует С. На котором можно реализовать подобную задачу не так, как доктор прописал, а так, как красивее/удобнее/понятнее. Оставляю Вас долбить хвалу Вирту, Дийкстре и прочим замшелым структурникам


 
Оригинал   (2008-03-24 17:55) [30]


> Есть такие люди, которые не любят подстраиваться под компиляторы.
>  Вот для таких людей и существует С. На котором можно реализовать
> подобную задачу не так, как доктор прописал, а так, как
> красивее/удобнее/понятнее.


Видали таких.
После них отладка занимает в 2-3 раза больше времени(как минимум), чем разработка.
После таких приведений и т.п. вещей и возникают трудноуловимые ошибки.


 
DrPass ©   (2008-03-24 18:41) [31]


> На котором можно реализовать подобную задачу не так, как
> доктор прописал, а так, как красивее/удобнее/понятнее.

Сразу видно, что человек никогда еще не разбирал написанные на Сях спагетти...


 
Anatoly Podgoretsky ©   (2008-03-24 20:15) [32]

> Бегущий человек  (24.03.2008 16:25:23)  [23]

Только хотел поговорить, а человека уже потеряли, жалко, пусть теперь дурость творит в Си, только я сомневаюсь, что свалил на Си.


 
Anatoly Podgoretsky ©   (2008-03-24 20:16) [33]

> Бегущий человек  (24.03.2008 17:30:29)  [29]

А очередной троль, ты еще здесь.


 
Бегущий человек ©   (2008-03-25 04:49) [34]

2 A.P.
Кто наезжает на Делфи, тот для Вас сразу троль...
На Делфи буду писать простые программы, что называется "на коленке". Удобная кнопкобросалка,  отчего же её не юзать.
2 DrPass. На IOCCC, конечно, не заявлялся,  но  уродский код видел в книжке Прата, Уитни...а по ней я и учился. На Си легче написать корявый код, но и остроумный тоже. На Делфи всё гладенько, серенько, работает строго по науке. Мерде!



Страницы: 1 вся ветка

Текущий архив: 2008.04.20;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.025 c
15-1204284088
Dmitry S
2008-02-29 14:21
2008.04.20
Анонимный доступ к шарам Win2k3


15-1204730152
dmitry_12_08_74
2008-03-05 18:15
2008.04.20
Требования к курсорам для совместимости с разными версиями Window


15-1204604949
Slider007
2008-03-04 07:29
2008.04.20
С днем рождения ! 4 марта 2008 вторник


2-1206586708
Stepper
2008-03-27 05:58
2008.04.20
Вывод данных в RichEdit с предварительным удалением пробела?


15-1204652410
Dmitry S
2008-03-04 20:40
2008.04.20
AV непонятный