Autor Thema: Packed CHAR Array vs. String / ST-Pascal  (Gelesen 4428 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

rainers

  • Gast
Packed CHAR Array vs. String / ST-Pascal
« am: Mi 17.04.2013, 10:34:50 »
Hallo,

habe schon wieder eine Anfängerfrage.

Da mir die ganzen Bootmanager zu mächtig sind und vor allem keine Auto-Auswahl vorhanden ist, will ich mir selbst einen basteln.
Das ist auch kein Problem, das Ding soll ja nur zwei Dateien kopieren.
Was mich aber stört ist, daß die Datei-Funktionen von ST-Pascal als Dateinamen eine Variable vom Typ
PACKED CHAR ARRAY
erwarten.
Nun steht zwar im Handbuch, man könne an solche Variablen auch Zeichenkettenkonstanten zuweisen, aber ich stelle mich wohl zu dämlich an.
Es gelingt mir einfach nicht.
Egal was versucht wird (direkte Zuweisung, Zuweisung über Zeiger, ...), der Compiler beschwert sich immer über die Inkompatibilität der Typen.
Hat jemand eine Idee, wie man das bewerkstelligen kann?

Zur Zeit geht das Füllen des Arrays halt über die einzelnen Elemente und das ist bei einem langen Pfadnamen schon sehr lästig.

Danke.
-R.

Arne

  • Gast
Re: Packed CHAR Array vs. String / ST-Pascal
« Antwort #1 am: Mi 17.04.2013, 12:30:23 »
Ich kann mich da noch an eine "Lösung" in Turbo Pascal (x86) erinnern.
Die bestand aus:
asm {
...
}
Und mittels inline-asm dann die Kopierei selbst erledigt.

Offline 1ST1

  • Benutzer
  • Beiträge: 8.661
  • Gesperrter User
Re: Packed CHAR Array vs. String / ST-Pascal
« Antwort #2 am: Mi 17.04.2013, 13:35:19 »
Nein, das geht auch ohne Assembler. Ich habe damals auch mit ST-Pascal+ einige Progrämmchen mit Dateioperationen geschrieben, und das funktionierte problemlos. Aber um das nachvollziehen zu können, muss ich es erst mir mal wieder ansehen, meine Pascal-Programmierkünste sind sehr eingerostet...
Ausgeloggter Mitleser, der hier NIE mehr aktiv wird. Am besten, meine Inhalte komplett löschen. Dabei berufe ich mich auf mein Urheberrecht, die DSGVO und auf die Rechte, die mir unter Impressunm&Datenschutz zugestanden werden. Tschö!

rainers

  • Gast
Re: Packed CHAR Array vs. String / ST-Pascal
« Antwort #3 am: Mi 17.04.2013, 14:49:12 »
Nein, das geht auch ohne Assembler. Ich habe damals auch mit ST-Pascal+ einige Progrämmchen mit Dateioperationen geschrieben, und das funktionierte problemlos. Aber um das nachvollziehen zu können, muss ich es erst mir mal wieder ansehen, meine Pascal-Programmierkünste sind sehr eingerostet...

Das wäre sehr nett von Dir.
Fertig ist das kleine Progrämmchen zwar, aber eben mit der blöden Element-für-Element-Initialisierung.

Offline mfro

  • Benutzer
  • Beiträge: 1.640
Re: Packed CHAR Array vs. String / ST-Pascal
« Antwort #4 am: Mi 17.04.2013, 16:43:56 »
...Was mich aber stört ist, daß die Datei-Funktionen von ST-Pascal als Dateinamen eine Variable vom Typ
PACKED CHAR ARRAY
erwarten.
Nun steht zwar im Handbuch, man könne an solche Variablen auch Zeichenkettenkonstanten zuweisen, aber ich stelle mich wohl zu dämlich an.
Es gelingt mir einfach nicht.
Egal was versucht wird (direkte Zuweisung, Zuweisung über Zeiger, ...), der Compiler beschwert sich immer über die Inkompatibilität der Typen.
Hat jemand eine Idee, wie man das bewerkstelligen kann?

Hallo Rainer,

das geht schon. Das Dumme ist nur, daß Pascal eine streng typisierte Sprache ist. Das heißt, bei der Zuweisung bzw. Konstantendefinition muß auch genau dasselbe zugewiesen werden. Wenn Du eine Variable vom Typ PACKED ARRAY [1..16] OF CHAR hast, mußt Du auch genau 16 Zeichen zuweisen, sonst paßt der Typ nicht:

PROGRAM readwrite;
TYPE
   Str16 = PACKED ARRAY[1..16] OF CHAR;
VAR
   filename : Str16;
   
PROCEDURE write_file(VAR str : Str16);
VAR
   TextFile : Text;
BEGIN
   ReWrite(TextFile, str);
   WriteLn(TextFile, 'Hello World');
END; (* write_file *)

BEGIN
   filename := 'test.txt        ';
   write_file(filename);
END. (* readwrite *)


Hier wurde der String "hinten" mit Leerzeichen auf die erforderliche Länge aufgefüllt - das funktioniert (ohne daß die Datei mit Leerzeichen angelegt wird). Eine andere Möglichkeit ist mir (leider) nicht bekannt. Beim Typ STRING ist die Prüfung etwas laxer, leider akzeptieren den die Standard-Dateifunktionen aber nicht.

Gruß,
Markus
« Letzte Änderung: Mi 17.04.2013, 17:01:57 von mfro »
And remember: Beethoven wrote his first symphony in C

rainers

  • Gast
Re: Packed CHAR Array vs. String / ST-Pascal
« Antwort #5 am: Mi 17.04.2013, 19:41:10 »
Hallo Markus,

tausend Dank dafür.
Aber Du wirst lachen, als ich das sah, also das Auffüllen mit Leerzeichen, da habe ich mich doch daran erinnert, daß ich es genaus so vor Jahren (mehr als 20) programmiert habe. Aber nach so langer Abstinenz habe ich es vergessen.
Zum Glück gibt es Menschen wie Dich, die so etwas noch wissen und es auch gut vermitteln können.

Danke und Gruß.
-R.

Offline mfro

  • Benutzer
  • Beiträge: 1.640
Re: Packed CHAR Array vs. String / ST-Pascal
« Antwort #6 am: Mi 17.04.2013, 19:44:56 »
Hallo Markus,

tausend Dank dafür.
Aber Du wirst lachen, als ich das sah, also das Auffüllen mit Leerzeichen, da habe ich mich doch daran erinnert, daß ich es genaus so vor Jahren (mehr als 20) programmiert habe. Aber nach so langer Abstinenz habe ich es vergessen.
Zum Glück gibt es Menschen wie Dich, die so etwas noch wissen und es auch gut vermitteln können.

Danke und Gruß.
-R.

Dankeschön. Mit hat das Spaß gemacht. Hatte seit gefühlt 100 Jahren kein Pascal mehr in den Fingern, deshalb mußte ich das ausprobieren ;)
And remember: Beethoven wrote his first symphony in C

Offline 1ST1

  • Benutzer
  • Beiträge: 8.661
  • Gesperrter User
Re: Packed CHAR Array vs. String / ST-Pascal
« Antwort #7 am: Do 18.04.2013, 22:47:52 »
Hab mal im Quellcode eines meiner Progrämmchen nachgesehen, wegen dem Problem... In ST-Pascal+ gibts demnach eine vordefinierte Funktion

ptocstr(pascal-string,c-string);

die von Pascal- nach C-String umwandelt.

Eine umgekehrte Funktion sollte es demnach auch geben - hab ich in keinem der Progamme gebraucht, logischerweise müsste die dann so heißen:

ctopstr(c-string,pascal-string);

Dabei gillt:

var c-string : cstring ; {packed CHAR array}
var pascal-string : str255  ; {String mit 255 Zeichen}
Ausgeloggter Mitleser, der hier NIE mehr aktiv wird. Am besten, meine Inhalte komplett löschen. Dabei berufe ich mich auf mein Urheberrecht, die DSGVO und auf die Rechte, die mir unter Impressunm&Datenschutz zugestanden werden. Tschö!