AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Abbildung einer C-Funktion nach Delphi
Thema durchsuchen
Ansicht
Themen-Optionen

Abbildung einer C-Funktion nach Delphi

Ein Thema von R2009 · begonnen am 18. Dez 2009 · letzter Beitrag vom 27. Dez 2009
Antwort Antwort
R2009

Registriert seit: 9. Mär 2009
Ort: Heidelberg
440 Beiträge
 
Delphi 2007 Professional
 
#1

Abbildung einer C-Funktion nach Delphi

  Alt 18. Dez 2009, 11:24
Hi,

folgendes Problem. Ich würde gerne diese Funktion nach Delphi abbilden:

static int callback(void *NotUsed, int argc, char **argv, char **azColName)

Mein Ansatz:
   Function callback(n:pointer;argc:integer,argv:pointer;azcolname:pointer); Ich habe keine Ahnung was die ** bedeuten und habs auch im Internet nicht gefunden.
Vermutlich ist das ein Pointer auf einen Pointer oder so etwas.
Kann mir jemand helfen die gesamte Funktion abzubilden?

Grüsse
Rainer
Rainer Unger
Mein Profil:
Studium Allgemeine Elektrotechnik TH Darmstadt
Entwicklung von Tools für die Rundsteuer und Zählertechnik.
uP's Atmel Prozessoren (ATmega16,32,88...) in C und Assembler.
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#2

Re: Abbildung einer C-Funktion nach Delphi

  Alt 18. Dez 2009, 11:42
** ist, wie du schon richtig vermutet hast, ein Doppelzeiger.

static int callback(void *NotUsed, int argc, char **argv, char **azColName)

Function CallBack( NotUsed: Pointer; argc: Integer; var argv: PAnsiChar; var azColName: PAnsiChar ): Integer Das wäre so in etwa mein Vorschlag für eine 1:1 Übersetzung. Ob das im Kontext allerdings Sinn ergibt, dass ist die zweite Frage...

Denn ich vermute einfach mal, dass in argv und azColName Zeichenketten stehen, oder?
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
R2009

Registriert seit: 9. Mär 2009
Ort: Heidelberg
440 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Abbildung einer C-Funktion nach Delphi

  Alt 18. Dez 2009, 11:47
Hi Daniel,
ja sieht so aus.
Ich habe versucht die Callback Funktion des SQLite Beispiels so zu übersetzen, dass ich sie in Delphi nutzen kann.

Der Code:

Delphi-Quellcode:
#include <stdio.h>
#include <stdlib.h>
#include "sqlite3.h"

static int callback(void *NotUsed, int argc, char **argv, char **azColName){
  int i;
  for(i=0; i<argc; i++){
    printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
  }

  printf("\n");
  return 0;
}

int main(int argc, char **argv){
  sqlite3 *db;
  char *zErrMsg = 0;
  int rc;

  if( argc!=3 ){
    fprintf(stderr, "Usage: %s DATABASE SQL-STATEMENT\n", argv[0]);
    exit(1);
  }

  rc = sqlite3_open(argv[1], &db);
  if( rc ){
    fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
    sqlite3_close(db);
    exit(1);
  }

  rc = sqlite3_exec(db, argv[2], callback, 0, &zErrMsg);
  if( rc!=SQLITE_OK ){
    fprintf(stderr, "SQL error: %s\n", zErrMsg);
    sqlite3_free(zErrMsg);
  }

  sqlite3_close(db);
  return 0;
}
Ziel soll sein, dass der eigentliche Aufruf in eine DLL geschrieben wird, die Callback Funktion jedoch in Delphi bleibt.
Das Ergebnis wäre eine ganz einfache Schnittstelle zu SQlite, die nur auf SQL Befehlen basiert.

Vielen Dank und Grüsse
Rainer
Rainer Unger
Mein Profil:
Studium Allgemeine Elektrotechnik TH Darmstadt
Entwicklung von Tools für die Rundsteuer und Zählertechnik.
uP's Atmel Prozessoren (ATmega16,32,88...) in C und Assembler.
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#4

Re: Abbildung einer C-Funktion nach Delphi

  Alt 18. Dez 2009, 13:14
**argv wird wohl besser übersetzt mit const array of pchar oder const array of pansichar, mit ziemlicher Sicherheit bezeichnet **argv ein Array. Standardmäßig wird argc/argv doch benutzt, um die Anzahl der Kdo-Zeilenparameter und das Array der eigentlichen Parameter zu bezeichnen.

Gruß Gammatester
  Mit Zitat antworten Zitat
R2009

Registriert seit: 9. Mär 2009
Ort: Heidelberg
440 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Abbildung einer C-Funktion nach Delphi

  Alt 27. Dez 2009, 09:39
Hi,
hab das:
Code:
static int callback(void *NotUsed, int argc, char **argv, char **azColName)
mit:
Function zielfunktion1( NotUsed: Pointer; argc: Integer; const argv:array of pchar; const azcolname:array of pchar ): Integer;cdecl; übersetzt.
Funktioniert für die ersten 2 Parameter. Im dritten steht nur Mist drin.
Bin fast am verzweifeln. Gibts hier irgendjemand der mir auf die Sprünge helfen kann?
Ziefunktion1 ist im übrigen die Callbackfunktion von Sqlite3_exec.
Noch ein Hinweis: ich kann die Struktur der aufrufenden Funktion nicht ändern.

Grüsse
rainer
Rainer Unger
Mein Profil:
Studium Allgemeine Elektrotechnik TH Darmstadt
Entwicklung von Tools für die Rundsteuer und Zählertechnik.
uP's Atmel Prozessoren (ATmega16,32,88...) in C und Assembler.
  Mit Zitat antworten Zitat
R2009

Registriert seit: 9. Mär 2009
Ort: Heidelberg
440 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Abbildung einer C-Funktion nach Delphi

  Alt 27. Dez 2009, 12:01
Hi,

gibts hier keinen C Profi der mir auf die Sprünge helfen kann?

Grüsse
Rainer
Rainer Unger
Mein Profil:
Studium Allgemeine Elektrotechnik TH Darmstadt
Entwicklung von Tools für die Rundsteuer und Zählertechnik.
uP's Atmel Prozessoren (ATmega16,32,88...) in C und Assembler.
  Mit Zitat antworten Zitat
Niko

Registriert seit: 23. Jun 2003
416 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Abbildung einer C-Funktion nach Delphi

  Alt 27. Dez 2009, 13:07
Hi,

Code:
static int callback(void *NotUsed, int argc, char **argv, char **azColName)
char** ist ein Zeiger auf einen Zeiger auf char oder, was in C das gleiche ist, ein Array von Zeichenarrays (= nullterminierten Strings).

In Delphi muss das dann so aussehen:
Delphi-Quellcode:
type
  PPCharArray = ^PCharArray;
  PCharArray = Array[0..0] of PChar;

Function zielfunktion1( NotUsed: Pointer; argc: Integer; argv: PPCharArray; azcolname: PPCharArray): Integer; cdecl;
Korrekt wäre auch:
Delphi-Quellcode:
type
  PPChar = ^PChar;

Function zielfunktion1( NotUsed: Pointer; argc: Integer; argv: PPChar; azcolname: PPChar): Integer; cdecl;
Aber dann kannst du nur über Zeigerarithmetik auf das Array zugreifen und nicht über Indizes.
"Electricity is actually made up of extremely tiny particles called electrons, that you cannot see with the naked eye unless you have been drinking." (Dave Barry)
  Mit Zitat antworten Zitat
R2009

Registriert seit: 9. Mär 2009
Ort: Heidelberg
440 Beiträge
 
Delphi 2007 Professional
 
#8

Re: Abbildung einer C-Funktion nach Delphi

  Alt 27. Dez 2009, 13:28
Hi Nico,

vielen vielen dank, hat funktioniert. Ich bin fast verzweifelt an diesem problem.
Noch eine kleine Frage:
Delphi-Quellcode:
type
  PPCharArray = ^PCharArray;
  PCharArray = Array[0..10] of PChar;
Bei der Dimension des Arrays muss ich doch von vorne herein eine obere Grenze angeben oder?
Mit Array[0..0] kann ich nur auf a[0] zugreifen.

Grüsse
Rainer
Rainer Unger
Mein Profil:
Studium Allgemeine Elektrotechnik TH Darmstadt
Entwicklung von Tools für die Rundsteuer und Zählertechnik.
uP's Atmel Prozessoren (ATmega16,32,88...) in C und Assembler.
  Mit Zitat antworten Zitat
Niko

Registriert seit: 23. Jun 2003
416 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Abbildung einer C-Funktion nach Delphi

  Alt 27. Dez 2009, 14:24
Eine obere Grenze anzugeben ist eine Möglichkeit. Da du die wirkliche Größe zur Übersetzungszeit aber sowieso nicht kennst, kannst du auch die Bereichsprüfung des Compilers für den entsprechenden Abschnitt ausschalten (mit {$R-}, ist zumindest bei Delphi 2006 auch die Vorgabe). Letzteres halte ich für die sauberere Variante.
"Electricity is actually made up of extremely tiny particles called electrons, that you cannot see with the naked eye unless you have been drinking." (Dave Barry)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:03 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