Verständnisfrage bei Bibliotheken

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
niederrheiner
Beiträge: 87
Registriert: Sa 19. Jan 2008, 17:21
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Rheinberg

Verständnisfrage bei Bibliotheken

Beitrag von niederrheiner »

Hallo an Alle,
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.


Bei diesem Programm waren die beiden Ausgaben aber unterschiedlich;
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.


Hier das entsprechende Testprogramm:

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.


Bei diesem Versuch waren beide Ausgaben identisch;

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

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Verständnisfrage bei Bibliotheken

Beitrag von theo »

Bei mir geht das. Da hast du vllt. sonst was versemmelt?
Oder einen FPC der Probleme mit Shared Libraries hat?

niederrheiner
Beiträge: 87
Registriert: Sa 19. Jan 2008, 17:21
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Rheinberg

Re: Verständnisfrage bei Bibliotheken

Beitrag von niederrheiner »

Hallo theo,
mein FPC ist 2.6.0-1 und Lazarus ist 0.9.31-0

bis dann ...
MfG
Günter

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Verständnisfrage bei Bibliotheken

Beitrag von theo »

Ich glaube du machst da einfach ein Durcheinander.
Bei der letzten Variante greifst du zweimal auf das lokale e in der Fkt. isAlpha von project1 zu.
Wieso soll das plötzlich ändern?

Mal eine andere Frage: Wozu brauchst du das überhaupt?

Bora4d
Beiträge: 290
Registriert: Mo 24. Dez 2007, 13:14
OS, Lazarus, FPC: WinXP-Pro-Sp3, Xubuntu 12.04, (Laz 1.1-SVN Mai2012, FPC 2.6.1 / 2.6.0-Linux)
CPU-Target: AMD64X2

Re: Verständnisfrage bei Bibliotheken

Beitrag von Bora4d »

Bei mir funktioniert das auch, fpc 2.6.61, laz 1.1 mit winxp.

Du brauchst eigentlich dort kein variable e ich würde die funktion so machen:

Code: Alles auswählen

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 Result:=1 //e := 1;
  else Result:=0;
  //isAlpha := e;
end;


Und die Variable Struges kann man so machen:

Code: Alles auswählen

struges :='A..Z'+'a..z'+'äöüÄÖÜß'; //+ 'eventuell andere lateinische Zeichen für andere sprachen wie 'ýáâ'

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Verständnisfrage bei Bibliotheken

Beitrag von theo »

Bevor ihr zu lange an der Funktion rumdoktert, die gibt es seit 9 Monaten Unicodetauglich in der unit character.
TCharacter.IsLetter();

niederrheiner
Beiträge: 87
Registriert: Sa 19. Jan 2008, 17:21
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Rheinberg

Re: Verständnisfrage bei Bibliotheken

Beitrag von niederrheiner »

Hallo an Alle,
danke für Eure Tipps und Hinweise.
Ich habe nun mal alle Eure Hinweise und Tipps zusammen gefasst:

Code: Alles auswählen

library myfunc1;
{$mode objfpc}{$H+}
uses
  Classes,
  strings;
{$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
  struges    :pchar;
begin
  struges :='A..Z'+'a..z'+'äöüÄÖÜß';
  IF (strpos(struges,c) <> nil) THEN Result:=1
    else Result:=0;
end;
exports
   isAlpha;
end.

Code: Alles auswählen

program testconsole;
{$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;
begin
  c := 'u';
  e := isAlpha(c);
  writeln(e);
end.


Die Ausgabe von testconsole sieht so aus:

Code: Alles auswählen

guenter@hermes:~/Projekte/Pascal/test$ ./testconsole
134877440
Inconsistency detected by ld.so: dl-fini.c: 207: _dl_fini: Assertion `ns != 0 || i == nloaded' failed!
guenter@hermes:~/Projekte/Pascal/test$

Mit der Incosistens-Meldung kann ich ersteinmal leben, oder besteht da ein Zusammenhang?
Was nun?
@theo: Das es diese Function gibt, wusste ich nicht. Danke für den Hinweis. Es geht mir aber hier nur um die Handhabung externer Funktionen.

Bis dann ...
MfG
Günter

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Verständnisfrage bei Bibliotheken

Beitrag von theo »

Hatten wir das nicht schon mal?

viewtopic.php?f=10&t=3990

Antworten