Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1204819301
Пробегал...
2008-03-06 19:01
2008.04.20
Переход по CTRL + клик глючит


15-1204740905
tesseract
2008-03-05 21:15
2008.04.20
Мдя студенты проснулись


15-1204686710
Slider007
2008-03-05 06:11
2008.04.20
С днем рождения ! 5 марта 2008 среда


2-1206282811
Илья
2008-03-23 17:33
2008.04.20
Подскажите, как можно перехватить все запускающиеся приложения?


2-1206097183
dumka
2008-03-21 13:59
2008.04.20
Отчеты





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский