Форум: "Начинающим";
Текущий архив: 2008.04.20;
Скачать: [xml.tar.bz2];
ВнизКак заюзать функцию из С-файла в проекте 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;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.042 c