Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Immer wieder beliebt: C-DLL in Delphi diesmal "character string array" (https://www.delphipraxis.net/199626-immer-wieder-beliebt-c-dll-delphi-diesmal-character-string-array.html)

Ydobon 6. Feb 2019 20:45

Immer wieder beliebt: C-DLL in Delphi diesmal "character string array"
 
Hallo!

Ich versuche gerade ein paar hundert Funktionen aus einer C-Bibliothek für Delphi nutzbar zu machen und scheitere schon beim Buchstaben "b". Ist nicht das erste mal, dass ich so etwas mache und bisher lief es irgendwann auch irgendwie. In dem Fall ist es aber egal, wie ich die Variable deklariere, konstruiere oder übergebe, es gibt immer eine Zugriffsverletzung.
Code:
  long bschoc (const char  * value,
               long          ndim,  
               long          lenvals,
               const void  * array,
               const long  * order)
Sieht doch eigentlich gar nicht so schlimm aus. Das Feld soll mit [ndim][lenvals] dimensioniert werden. Ich hoffe jemand von euch hat da mehr Ahnung vom Thema.

hoika 6. Feb 2019 21:11

AW: Immer wieder beliebt: C-DLL in Delphi diesmal "character string array"
 
Hallo,

Zitat:

In dem Fall ist es aber egal, wie ich die Variable deklariere, konstruiere oder übergebe, es gibt immer eine Zugriffsverletzung.
Wo ist Dein bisheriger Code?
Hast Du Bsp.-Code in C?

Mir fällt da wieder PChar/PAnsiChar ein.

Ydobon 6. Feb 2019 21:46

AW: Immer wieder beliebt: C-DLL in Delphi diesmal "character string array"
 
Es sind generell die Ansi-Versionen.
Einen einzelnen Code habe ich nicht, probiert habe ich in etwa 'Array of AnsiString/PAnsiString', 'Array of Array of AnsiChar/PAnsiChar/Byte' als dynamische Felder oder nicht. Als normale Variable mit const oder var, als typisierten Zeiger oder einfachen.
Ein richtiges Beispiel habe ich auch nicht.
Code:
Let the input arguments array and order contain the following elements:

        array          order

      "FEYNMAN"          1
      "BOHR"             2
      "EINSTEIN"         0
      "NEWTON"           4
      "GALILEO"          3

   Then

      bschoc_c ( "NEWTON",  5, lenvals, array, order )   ==  3
      bschoc_c ( "EINSTEIN", 5, lenvals, array, order )   ==  2
      bschoc_c ( "GALILEO", 5, lenvals, array, order )   ==  4
      bschoc_c ( "Galileo", 5, lenvals, array, order )   == -1
      bschoc_c ( "BETHE",   5, lenvals, array, order )   == -1

hoika 6. Feb 2019 22:40

AW: Immer wieder beliebt: C-DLL in Delphi diesmal "character string array"
 
Hallo,
long bschoc (const char * value,
long ndim,
long lenvals,
const void * array,
const long * order)

Hm, ich verstehe im Moment auch gar nicht, was die Parameter machen.
Steht aber zumindestens schon mal hier

https://naif.jpl.nasa.gov/pub/naif/t.../bschoc_c.html

Die Beispiele sind total MurKs (für mich).
Es gibt im ganzen Internet nicht einen Delphi-Link für bschoc -> Ich bin raus ;)

Ydobon 6. Feb 2019 22:56

AW: Immer wieder beliebt: C-DLL in Delphi diesmal "character string array"
 
Zitat:

Zitat von hoika (Beitrag 1424909)
Steht aber zumindestens schon mal hier

Ja, da ist es auch her. Nachdem ich bisher nur die Funktionen übersetzt hatte, die ich gerade für meine Programme brauche, wollte ich mir mal das Komplettpaket vornehmen. Im Notfall wird sie halt in Delphi nachgebaut.

Fritzew 7. Feb 2019 10:36

AW: Immer wieder beliebt: C-DLL in Delphi diesmal "character string array"
 
Zitat:

Zitat von Ydobon (Beitrag 1424901)
Hallo!
Code:
  long bschoc (const char  * value,
               long          ndim,  
               long          lenvals,
               const void  * array,
               const long  * order)
Sieht doch eigentlich gar nicht so schlimm aus. Das Feld soll mit [ndim][lenvals] dimensioniert werden. Ich hoffe jemand von euch hat da mehr Ahnung vom Thema.

So wie ich das sehe erwartet die function den value als fortlaufendes char Array(Byte) im Fortranstyle.
also Fixe längen
in Etwa als Delphi Array: Valuetype = Array[5, 30] of Ansichar; // [ndim][lenvals]

peterbelow 7. Feb 2019 11:57

AW: Immer wieder beliebt: C-DLL in Delphi diesmal "character string array"
 
Zitat:

long bschoc (const char * value,
long ndim,
long lenvals,
const void * array,
const long * order)
Ohne Dokumentation der Parameter kann man damit wenig anfangen. Dem Beispiel nach nach ist "array" in diesem Fall wohl ein Array von char *, d.h. der Parameter hätte eigenlich als const char** array deklariert sein müssen, wenn meine (lückenhafte) Kenntnis der C-Syntax korrekt ist. Eine mögliche Übersetzug wäre dann

function bschoc( Value: PAnsichar; ndim: Integer; lenvals: Integer; array: PPAnsiChar; order: PInteger): Integer; cdecl;

Für den Array könntest Du je nach Bedarf eine Variable vom Typ array [0..N] of PAnsiChar oder auch TArray<PAnsiChar> (wenn die Zahl der Element variable ist) verwenden und dann die Addresse des ersten Elementes des Arrays übergeben.

Was irgendwie nicht ins Bild passt ist der "ndim" Parameter, der erweckt in mir den Verdacht, dass man der Funktion eigentlich einen mehrdimensionalen array übergeben kann. Dann sollte lenvals aber als long * lenvals definiert sein, damit man damit die Zahls der Elemente pro Dimension übergeben kann. Das Beispiel übergibt die Zahl der Elemente in "ndim" und zeigt nicht, was lenvals da sein soll.

Fritzew 7. Feb 2019 13:49

AW: Immer wieder beliebt: C-DLL in Delphi diesmal "character string array"
 
Zitat:

Was irgendwie nicht ins Bild passt ist der "ndim" Parameter, der erweckt in mir den Verdacht, dass man der Funktion eigentlich einen mehrdimensionalen array übergeben kann. Dann sollte lenvals aber als long * lenvals definiert sein, damit man damit die Zahls der Elemente pro Dimension übergeben kann. Das Beispiel übergibt die Zahl der Elemente in "ndim" und zeigt nicht, was lenvals da sein soll.
Nee schau in die Documentation weiter oben verlinkt.....
[ndim][lenvals] ist schon richtig, das Teil ist ein mix aus c un Fortran, Fortran arbeitet nur mit fixen längen und kennt kein Char*

Deshalb als ein Buffer mit festen Eintragslängen, lenvals ist die Stringlänge pro Reihe

nur so hingeschrieben zum Zugriff aus Delphi

Delphi-Quellcode:
type
const
 colwidth = 40-1;
 rows = 50-1;

 TRow = array[0..colwidth] of ansichar;

PBschocArray= ^TBschocArray;
TBschocArray = Array[0..rows] of Trow;


myArray : TBschocArray;
myOrders : Array[0..rows] of integer;

// Füllen dann

res := bschoc ('EINSTEIN'
               rows,
               colwidth,
              @myArray,
             @myOrders);

Ydobon 7. Feb 2019 13:51

AW: Immer wieder beliebt: C-DLL in Delphi diesmal "character string array"
 
Musste ja so sein. Es lag gar nicht an den Strings. Der letzte Parameter muss auch ein Array (Vector) sein. Peinlich, peinlich.

Aber danke für eure Hilfe.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:48 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz