3

そのため、相互に依存する .c ファイルと .h ファイルのセットがあり、C/C++ から Pascal への動作を正確に理解しようとしています (それ以外の場合、私の delphi/pascal の作業はかなり基本的なものでした)。cファイルは、数学アルゴリズムのステップ1〜N(順番に)であり(それぞれが個別の関数です)、1つのヘッダーは各関数で使用される変数を指定します(recordデルファイで.hファイルを再作成するために使用しています)、およびもう 1 つのヘッダーには、カスタム変数の型の詳細が示されます。目標は、C コードを Pascal/Delphi 構文に書き直さずに関数にアクセスし、Delphi コードから既存の c にリンクすることです。切り取るには長すぎるファイル (12 .c と 4 .h) が多すぎて、私の C はひどく錆びていますが、試してみます。

たとえば、ファイルfuncs.hがあります。

#ifndef _FUNCS_H
#ifndef _FUNCS_H

#ifdef __cplusplus
extern "C" {
#endif

#include "New_Type.h"  // custom variable used in funcs.h
#include "Optional.h"  // optional set of more functions

typedef struct {
    int a1[4];
    double b1[10];

    // Computed if optional functions are requested
    double c1[10];
    int d1[4];
} func1;

typedef struct {
    new_type c2, d2;
} func2;
}
#endif
#endif

ファイルfunc1.cfunc2.cは、上記の変数の数学的操作 (主に線形代数) を行います。私の当面の質問は次のとおりです。

  1. 複数の C ヘッダーがあるように、複数の Delphi ファイルが必要ですか?
  2. Delphi ファイルの「スケルトン」はどのように見えますか (推定、関数呼び出し)?
  3. {$LINKLIB C}、cdecl、および CALLBACK とは何ですか? 私が見た他の質問/回答での共通点

検索/質問を変更する必要があるかもしれませんが、正直なところ、これを適切に尋ねる方法がわかりません. 具体的な回答は必要ありません。正直なところ、誰かがいくつかのリンクを教えてくれればいいのですが (本を読んでください。将来この言語を使用する予定です)、本当に感謝しています。

すべての助けを前もって感謝します。

4

1 に答える 1

3

#2 から: Delphi では、ヘッダーと実装の両方が同じファイルに格納されます。これは、ヘッダー部分 (.h) と実装部分 (.c) が Delphi のユニット/ファイルの構造に適合する場所を示すクラスの基本的なスケルトンです。

unit Unit1;

interface
  uses // List of header dependencies goes here...
  // Stuff from the .h file will go here
implementation
  uses // List of implementation dependencies goes here...
  // Stuff from the .c file will go here
end.

#1 に戻ります。C ヘッダー ファイルを Delphi ファイルに 1:1 でマッピングすることは厳密には必要ではありませんが、C でファイルごとに適切なレベルの粒度があれば、Delphi でも同様に機能する可能性があります。変更する正当な理由がない限り、1 つの C ヘッダー ファイルで 1 つの Delphi ファイルにマッピングされたままにしておきます。

About.com には、Delphi 開発に関するかなり詳細なセクションがあります。たとえば、ユニットの操作に関するページは、Delphi ファイルの構造について学習するための良い出発点になる可能性があります。また、DelphiBasicsを参照サイトとしてよく使用していることに気付きます (ただし、構造よりもメソッドを対象としています)。また、Embarcadero の Web サイトにある公式ドキュメントを軽視しないでください。彼らの言語ガイドセクションは、実質的に Delphi の学習に関する教科書であり、言語の基礎を理解するのに十分詳細です。

そして、#3まで:これは、スタックオーバーフローに関するいくつかの個別の完全な質問である可能性があります。しかし、一般的には、C コードを Delphi から直接呼び出すためのコードを見ているように思えます。CDeclメソッドに渡される順序パラメータを指定する呼び出し規約 (たまたま c... に一致するもの) の 1 つです。詳細については、Embarcadero のドキュメントを参照してください。$LINKLIBはライブラリ (この場合は C コードを呼び出す場合に行う C ライブラリ) へのリンクに使用され、callback は c の関数ポインタとほぼ同等です。

3 番目のサブ質問の全体的な音から、C コードを Pascal/Delphi 構文に書き直し、Delphi からリンクすることなく、Delphi プロジェクトで C コードを使用する方法について読んでいると思います。書き直したり変換したくない既存の C ライブラリにコードを追加します。C ライブラリを書き換えずにリンクすることが最終的な目標である場合は、FreePascal での C の使用に関するこの記事が役立つかもしれません。C コードにリンクするという目的では、FreePascal と Delphi の違いは比較的無視できるものになります)。基本的に、C ヘッダーを Pascal 構文に書き直すか変換する必要があります。これにより、Delphi は C ライブラリに含まれる関数を認識し、それらを呼び出すことができます。Dr. Bob の詳しいページがありますヘッダー ファイルの変換に関する詳細情報を探している場合は、Delphi での C dll の使用について。型名がどのように一致するかについての他の有用な情報の中で、c ヘッダー ファイルを Delphi ヘッダーに変換するために存在する自動化ツールのページに例があります。コード ライブラリ全体を Delphi に完全に移植することなく、Delphi アプリケーションから既存の C コードを呼び出したり利用したりすることが目標である場合は、自動ツールを使用してヘッダーを Delphi 構文に変換する方が簡単な場合があります。

例として、Dr. Bob の HeadConverter ツールを介して変換された質問のヘッダーは、次のような出力を提供します (実際の出力はより長く、C コードを dll としてロードするためのコードといくつかのコメントも含まれています)。

unit FILE1;

interface
uses
  Windows;

{$INCLUDE "New_Type.h"}
{$INCLUDE "Optional.h"}

type
  func1 = record
    a1: Array[0..4-1] of Integer;
    b1: Array[0..10-1] of Double;
    c1: Array[0..10-1] of Double;
    d1: Array[0..4-1] of Integer;
  end {func1};

type
  func2 = record
    c2, d2: NEW_TYPE;
  end {func2};

{...}

implementation
   {...}
end.
于 2013-05-29T05:29:29.107 に答える