bei dem Versuch, eigene Funtionen und Prozeduren, wieder zu verwenden, bin ich auch über Bibliotheken gestolpert.
Dabei habe ich folgende Bibliothek erstellt:
Code: Alles auswählen
library myfunc1; // Versuch1
{$mode objfpc}{$H+}
uses
Classes,
strings
{ you can add units after this };
{$R *.res}
function isAlpha(c :pchar) :integer; CDecl;
{************************************************************************
Name: isalpha
Beschreibung: prüft, ob Zeichen ein Alpha-Zeichen
Parameter: c :pchar
Rückgabewert: 1, wenn ja, 0, wenn nicht
************************************************************************}
var
e :integer;
struges :pchar;
begin
struges :='äöüÄÖÜabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZß';
e := 0;
IF (strpos(struges,c) <> nil) THEN e := 1;
isAlpha := e;
end;
exports
isAlpha;
end.
und im folgenden Programm verwendet:
Code: Alles auswählen
program project1; //Versuch1
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes,
strings
{ you can add units after this };
function isAlpha(c :pchar) :integer; CDecl; external 'myfunc1';
var
e :integer;
c :pchar;
struges :pchar;
begin
struges :='äöüÄÖÜabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZß';
c := 'z';
e := 0;
IF (strpos(struges,c) <> nil) THEN e := 1;
writeln(e);
e := isAlpha(c);
writeln(e);
end.
Die erste Ausgabe war 1,
die zweite Ausgabe, also der externe Funktionsaufruf, brachte eine 157637... Die Pünktchen sind weitere Ziffern. Ich vermute eine Speicheradresse?
Dann habe ich etwas von externen Variablen gelesen und es auch probiert.
Code: Alles auswählen
library myfunc1; //Versuch2
{$mode objfpc}{$H+}
uses
Classes,
strings
{ you can add units after this };
{$R *.res}
var
e :integer; cvar;
function isAlpha(c :pchar) :integer; CDecl;
{************************************************************************
Name: isalpha
Beschreibung: prüft, ob Zeichen ein Alpha-Zeichen
Parameter: c :pchar
Rückgabewert: 1, wenn ja, 0, wenn nicht
************************************************************************}
var
struges :pchar;
begin
struges :='äöüÄÖÜabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZß';
e := 0;
IF (strpos(struges,c) <> nil) THEN e := 1;
end;
exports
isAlpha;
end.
Code: Alles auswählen
program project1; //Versuch2
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes,
strings
{ you can add units after this };
function isAlpha(c :pchar) :integer; CDecl; external 'myfunc1';
var
e :integer;
c :pchar;
struges :pchar;
begin
struges :='äöüÄÖÜabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZß';
c := 'z';
e := 0;
IF (strpos(struges,c) <> nil) THEN e := 1;
writeln(e);
isAlpha(c);
writeln(e);
end.
Ich bin davon ausgegangen, das die externe Funktion im ersten Versuch auch ein Integerwert zurück gibt und nicht eine Speicheradresse??
Die Bibliothek habe ich mit Projekt->Projekteinstellungen->Pfade->Bibliotheken eingebunden.
Habe ich beim ersten Versuch etwas übersehen, nicht verstanden?
Vielleicht habt Ihr ja eine Idee oder Hinweise.
Bis dann ...
MfG
Günter
P.S. meine "Weisheiten" habe ich aus dem Buch Freepascal2 von Michael Van Canneyt, C&L-Verlag