Pos(....); bei einer Array

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Pos(....); bei einer Array

Beitrag von Mathias »

Ich bin Zufällig auf dieses Problem gestossen, als mein Fehlerhafter Code fehlerfrei Compiliert wurde.
Dann habe ich auf ein Minimum auf folgenden Code abgespeckt:

Code: Alles auswählen

var
  sa: TStringArray = ('aaa', 'bbb', 'ccc');
  ba: array of byte = (1, 2, 3, 4, 5, 6);

procedure TForm1.Button1Click(Sender: TObject);
begin
  Caption := pos(ba, 4).ToString;
  Caption := pos(sa, 'aaa').ToString;
end;
Nur wen ich es dann laufen lasse, knallt es mit folgendem Fehler:
[Debuggerausnahmen-Nachricht]
Projekt project1 hat Exception-Klasse »EVariantError« ausgelöst mit der Meldung:
Invalid variant type cast


Irgendwie hat das eine Zusammenhang mit Variant. Deshalb habe ich mal in den Sourcen nachgeguckt und folgendes gefunden:

Code: Alles auswählen

Function Pos (const v : Variant; Const s : ShortString) : SizeInt;{$ifdef SYSTEMINLINE}inline;{$endif}
  begin
    Result:=Pos(ShortString(v),s);
  end;       
Irgendwie sehe ich da keinen Sinn dahinter, das Pos nur mit String und Char funktioniert.
Weiss einer von euch den Grund, wies FPC alles mögliche für Variablen zulässt ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Pos(....); bei einer Array

Beitrag von Winni »

Hi!

Minmales Grundlagenwissen Pascal:

Pos war immer nur für Strings und Char möglich.

Was Du möchtest ist

Code: Alles auswählen

Caption := sa[0]; // oder 1 oder 2
Natürlich darfst Du im Index von sa auch rumrechnen:

Code: Alles auswählen

var x: integer;
...
Caption := sa[2*x +1 -x -x];
Winni

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Pos(....); bei einer Array

Beitrag von Mathias »

Pos war immer nur für Strings und Char möglich.
Dann erklär mir, warum ich eine ganzes Array an Pos() übergeben kann ?
Oder wieso mit Variant in Pos() hantiert wird ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Pos(....); bei einer Array

Beitrag von Socke »

Mathias hat geschrieben:
Di 12. Apr 2022, 19:14
Dann erklär mir, warum ich eine ganzes Array an Pos() übergeben kann ?
Oder wieso mit Variant in Pos() hantiert wird ?
Weil Variant für COM alles aufnehmen kann. Auch Strings, Arrays, Integer, Pointer und was es sonst noch so alles gibt.
Da dann alles in der Variable enthalten sein kann, darf man nur Pos() darauf anwenden, wenn man dessen Inhalt geprüft hat.

Code: Alles auswählen

uses Variants;
var
  v: Variant;
begin
  if VarIsStr(v) then
    Pos(v, 'a') // ...
Ist bei array of const auch nicht anders, nur dass du da den gewünschten Typ explizit angeben musst und bei Falschauswahl Datenmüll erhälst.

Edit: Ich habe gerade nachgeschaut, seit wann es Pos() für Variant gibt. Das ist vielleicht nicht seit immer, dass es aber schon 2006 war, hat mich doch überrascht.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antworten