Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi mem aus TurboPascal (https://www.delphipraxis.net/58413-mem-aus-turbopascal.html)

JamesTKirk 6. Dez 2005 18:30


mem aus TurboPascal
 
Hi Leutz!

Ich bin vor kurzem im Internet auf eine Facharbeit zum Thema computergenerierte Hologramme gestoßen, bei welcher auch der dazugehörige Pascalcode dabei ist.
Da ich auch mal in TurboPascal programmiert hab, dachte ich mir, ich portiere das Ganze auf Delphi.
Doch dann bin ich leider an dem Array "mem" hängen geblieben, von dem ich nicht weiß, wie ich das am klügsten in Delphi schreibe. :(

MfG, Sven

Zacherl 6. Dez 2005 18:32

Re: mem aus TurboPascal
 
Fragst du wie man das Array deklarieren soll?
Wie ist das Array denn im Pascal Code deklariert?

Ist das ein dynamisches Array?
Delphi-Quellcode:
var
  mem: array of string;
oder ein statisches?

Delphi-Quellcode:
var
  mem: array[0..100] of string;
Florian

JamesTKirk 6. Dez 2005 18:38

Re: mem aus TurboPascal
 
Das Array ist eines, das von Pascal zur Verfügung gestellt wird. Ich schau mal schnell, ob ich irgendwo noch Pascal rumkurven hab... (wegen der Hilfe) :?

Im übrigen gibt's dynamische Arrays erst ab Delphi 4... ;)

Zacherl 6. Dez 2005 18:41

Re: mem aus TurboPascal
 
Delphi-Quellcode:
Im übrigen gibt's dynamische Arrays erst ab Delphi 4...
Vergesse ich manchmal, da ich nie richtig mit einer Delphi Version unter 7.0 gearbeitet habe.

Welche Werte stehen denn in dem Array?

JamesTKirk 6. Dez 2005 18:47

Re: mem aus TurboPascal
 
Hab mal schnell die Pascal Hilfe ausgebuddelt:

Zitat:

Zitat von Pascal Hilfe
Turbo Pascal stellt drei vordefinierte Arrays zur Verfügung, die direkte Zugriffe auf einzelne Speicheraddressen ermöglichen: Mem, MemW und MemL.

Jedes Element von Mem ist ein Byte.
Jedes Element von MemW ist ein Word.
Jedes Element von MemL ist ein LongInt.

Alle drei verwenden eine spezielle Notation für ihre Indizes: Zwei Ausdrücke des Typs Word, die durch einen Doppelpunkt voneinander getrennt sind. Diese Ausdrücke geben die Segment- und Offset-Addresse der jeweiligen Speicherzelle an.

Mehr steht nicht in der Hilfe und mehr weiß ich auch nicht.... :cry:

Zacherl 6. Dez 2005 18:49

Re: mem aus TurboPascal
 
Schein eine Zugriff auf den Speicher des Programms darzustellen. Da kenne ich mich leider nicht aus. Ich denke aber mit einem MemoryStream dürfte man das ähnlich handhaben können.

Florian

JamesTKirk 6. Dez 2005 18:57

Re: mem aus TurboPascal
 
Werd ich dann mal austesten... Danke soweit mal... :-D

Hansa 6. Dez 2005 21:10

Re: mem aus TurboPascal
 
Mem dient zum direkten setzen und lesen des Speichers. Z.B. :
Delphi-Quellcode:
mem [$1000:$1009] := 5; oder MyVar := mem [$1000:$1009]
Ist also wohl kaum zu empfehlen.

Flocke 6. Dez 2005 22:20

Re: mem aus TurboPascal
 
Zitat:

Zitat von Hansa
Mem dient zum direkten setzen und lesen des Speichers. Z.B. :
Delphi-Quellcode:
mem [$1000:$1009] := 5; oder MyVar := mem [$1000:$1009]

Stimmt genau.

Mem wurde dazu benutzt, an bestimmten Speicheradressen Werte zu lesen und schreiben, häufig in den Videospeicher oder den Tastaturpuffer o.ä. Zeige mal die betreffenden Stellen im Quelltext, dann können wir dir ggf. sagen, was damit bezweckt wird und wie man es unter Windows abbilden kann.

JamesTKirk 8. Dez 2005 19:44

Re: mem aus TurboPascal
 
Aber gerne zeige ich die Stelle...

Delphi-Quellcode:
(* 
   Legende:
    //...: Meine Kommentare
    {...}: Kommentare des Autors
*)

// globale Vars / Consts / Types
const
    entf=40; {z-Koordinate des Objekts Std: 40}
    Staffelung=0; {z-Koordinatendifferenz von einem Buchstaben zum nächsten Std: 0}
    Wort='Laser';
    wortx=0.08; worty=-0.17; {Koord. des Wortbeginns Std: 0.08, -0.17}
    breite=0.16; hoehe=0.17; {Größe eines 8*8 Bit Punkterasters Std: 0.16, 0.17}
    Abstand=0.17; {Buchstabenabstand Std: 0.17}

type
    punkttyp=array[1..3] of real;

vars
  p: array[0..200] of punkttyp; {Array zum Speichern d. Punktkoordinaten}
  punkte: integer; {Anzahl der Punkte für das Wort}

// Das Objekt der Begierde ist diese Funktion....
function objekt: integer; {Wandelt die Zeichenkette in Punkteraster um}
 const
  segcg: word=$F000; ofscg: word=$FA6E; {Segment und Offsetadresse wo
              man das Rasterpunktmuster herauslesen kann}
 var
  i, j, bnr, r, sp: integer; {bnr: Buchstabennr; r: Reihe; sp: Spalte}
  asc, zbyte, zpot: byte; {asc: ascii-Code d. Zeiches; zbyte: Zeile d. binären Punkterasters;
                     zpot: zur Kontrolle ob Bit gesetzt oder nicht}
  hstr: string; {Aktuelles Zeichen}
begin
 punkte:=0;
 for bnr:=0 to length(wort)-1 do begin {Für jeden Buchstaben die Schleife durchlaufen}
  hstr:=copy(wort,bnr+1,1); {hstr: Aktueller Buchstabe}
  asc:=ord(hstr[1]); {asc: Ascii-Wert d. Buchstaben}
  for r:=0 to 7 do begin {jeder Buchstabe hat 8 Zeilen, wobei jede
   Zeile der Reihe nach ausgelesen wird}
   
   //Hier ist das Mem Zeugs
   
   if asc<128 then begin {diese Zeile auslesen}
    ofscg:=$FA6E;
    segcg:=$F000;
    zbyte:=mem[segcg:ofscg+8*asc+r];
   end else begin
    ofscg:=mem[0:4*$1F]+256*mem[0:4*$1F+1]+8*(asc-128)+r;
    segcg:=mem[0:4*$1F+2]+256*mem[0:4*$1F+3];
    zbyte:=mem[segcg:ofscg];
   end;
   zpot:=128; {=10000000b}
   for sp:=0 to 7 do begin {Jedes Bit durchlaufen}
    if (zbyte and zpot)=zpot then begin {Falls Bit gesetzt dann Punkt speichern}
     inc(punkte); {Punktanzahl um eins erhöhen}
     p[punkte,1]:=wortx+abstand*bnr+sp*breite/8; {=Objektbeginn+ Zeichenabstand*
     Zeichen + Punktnummer*Zeichenbreite/8
     (8 Punkte pro Zeichenzeile)}
     p[punkte,2]:=worty+r*hoehe/8; {Objektbeginn + Pixelreihe* Höhe/8}
     p[punkte,3]:=entf+staffelung*bnr; {Abstand in z-Richtung + Staffelung}
    end;
    zpot:=zpot div 2; {Einser in Binärzahl rückt um 1 Stelle nach rechts}
   end;
  end;
 end;
 objekt:=punkte;
end;
Ich hoff ich hab alle Consts, Vars und Types erwischt... und ich hoffe, dass ihr schlauer draus werdet, als ich.... :? die Daten die hier jetzt berechnet wurden sind zur Berechnung des Interferenz Bildes notwendig... doch das ist ne andere Geschichte... äh... Prozedur (musste sein) :wink:

Flocke 8. Dez 2005 20:09

Re: mem aus TurboPascal
 
An Adresse F000:FA6E liegt seit Urzeiten in den PCs der 8x8 Standard-Rasterfont. Also z.B. für A die Bits:
Code:
.XXXXX..
XX...XX.
XX...XX.
XXXXXXX.
XX...XX.
XX...XX.
XX...XX.
........
Wenn ich das richtig verstehe, dann wandelt die Routine einfach den String "wort" in Einzelpunkte (Pixel), deren Koordinaten in dem Array "p" gespeichert werden.

Wenn du das unter Windows nachbildest, dann kannst du es ggf. durch eine einfache Textausgabe in den Canvas ersetzen.

JamesTKirk 8. Dez 2005 20:29

Re: mem aus TurboPascal
 
Wieder was gelernt... Danke für die Hilfe :thumb:
Des wird bei nächstbester Gelegenheit ausgetestet, aber heut nemme *gähn*

Ciao,
Sven

tomsel 8. Dez 2005 20:33

Re: mem aus TurboPascal
 
Gegenfrage:
wird hier das Interferenzmuster aus den Pixeln von Schriftzeichen gewonnen? Das sichtbar gemachte Hologramm zeigt dann räumliche Buchstaben? Wie macht man es sichtbar, wie bekommt man das Muster vom PC auf Holo-Filmmaterial?

Die Version mit dem Canvas ist zwar schon mal nicht schlecht, aber man müsste dan jedes einzelne Zeichen genau lokalisieren. Am Besten gibt man jedes Zeichen eines Strings einzeln aus, dessen Position ist dann bekannt und man muss nur noch die Größe ermitteln.

Kommt man irgendwie ohne solchen Umweg an die Font-Daten ran?

Flocke 8. Dez 2005 21:27

Re: mem aus TurboPascal
 
Liste der Anhänge anzeigen (Anzahl: 1)
@tomsel: Entweder nimmst du überhaupt keinen Font sondern direkt eine Bitmap (siehe Anlage), oder du zeichnest den String in einen Schwarz/Weiß-Canvas und holst dir dann mit MSDN-Library durchsuchenGetTextExtentExPoint die Breite aller Zeichen im String.

turboPASCAL 8. Dez 2005 22:17

Re: mem aus TurboPascal
 
Liste der Anhänge anzeigen (Anzahl: 1)
ich denke mal es geht um das hier: http://pluslucis.univie.ac.at/FBA/FB...n/computer.pdf

Delphi-Quellcode:
segcg: word=$F000; ofscg: word=$FA6E;
und
Delphi-Quellcode:
ofscg:=mem[0:4*$1F]+256*mem[0:4*$1F+1]+8*(asc-128)+r;
    segcg:=mem[0:4*$1F+2]+256*mem[0:4*$1F+3];
    zbyte:=mem[segcg:ofscg];
Ist das umwandeln eines 8x8-Zeichens, wie Flocke schon sagte.

Delphi-Quellcode:
for sp := 0 to 7 do
      begin {Jedes Bit durchlaufen}
        if (zbyte and zpot) = zpot then
        begin {Falls Bit gesetzt dann Punkt speichern}
          inc(punkte); {Punktanzahl um eins erhöhen}
          p[punkte, 1] := wortx + abstand * bnr + sp * breite / 8;
            {=Objektbeginn+ Zeichenabstand*
          Zeichen + Punktnummer*Zeichenbreite/8
          (8 Punkte pro Zeichenzeile)}
          p[punkte, 2] := worty + r * hoehe / 8;
            {Objektbeginn + Pixelreihe* Höhe/8}
          p[punkte, 3] := entf + staffelung * bnr;
            {Abstand in z-Richtung + Staffelung
          end;
          zpot:=zpot div 2; {Einser in Binärzahl rückt um 1 Stelle nach rechts}
        end;
Das ist wohl der wichtigste Teil der Procedur. Ich würde es auch so machen wie Flocke das vorgeschlagen hat. Zur Not kann man sich ja auch mit einem 8x8-Font wie zB. Terminal behelfen den man sich mit OutText auf den Canvas zeichnet und dan die Pixel einliest.

JamesTKirk 9. Dez 2005 15:01

Re: mem aus TurboPascal
 
Genau die Facharbeit meinte ich :shock:

@tomsel:
Falls du noch nicht nachgeschaut hast: Aus den Pixeln und einer Entfernung wird das Interferenzmuster berechnet... dieses muss dann abfotografiert und der Film (vorzugsweise schwarz/weiß) dann zu einem Dia entwickelt werden. Dieses kann man dann mit einem Laser (Laserpointer genügt angeblich auch) bestrahlen und man erhält ein (primitives) Hologramm... zumindest laut Autor und einigen anderen Internetquellen. :?

tomsel 9. Dez 2005 19:13

Re: mem aus TurboPascal
 
ob das klappt? ein normales dia durfte kaum ausreichende auflösung bieten. dazu braucht man spezielles, holographie-material. außerdem brauchst du einen optischen tisch, der absolut stabil und erschütterungsfrei laser, eine streulinse und das hologramm aufnimmt. na ja, vielleicht geht es dir auch nur um die programmierung.

gruß
tomsel

JamesTKirk 10. Dez 2005 14:11

Re: mem aus TurboPascal
 
Naja, sowohl dieser Autor, als auch andere hatten auf diese Weise schon Erfolg. Die so entstehenden Holgramme sind zwar nicht so gut, wie Hologramme auf Spezialfilmen/-platten, aber sie funktionieren laut diesen Leuten...

Mir ging es eigentlich weniger ums programmieren, sondern um den Geschwindigkeitstest :-D

Hansa 10. Dez 2005 15:30

Re: mem aus TurboPascal
 
Geschwindigkeitstest ? Wozu das ? :shock: Habe auch größte Bedenken ein Hologramm mit einem Dia zu machen. Das geht nämlich nicht. Weil das hier angesprochene "Hologramm" überhaupt keins ist ! :lol:

Bei der angesprochenen Geschichte handelt es sich lediglich um eine räumliche Darstellung, siehe 3D Brille. Um ein Hologramm kann man aber auch herumgehen und es von der Seite betrachten (ohne Brille). mit einem auf Dia abfotografierten S/W Bild ist das nun mal nicht hinzukriegen. Wie so etwas aber aussehen könnte, das ist bisher nur auf dem Holodeck der Enterprise zu sehen. :mrgreen:

tomsel 10. Dez 2005 17:50

Re: mem aus TurboPascal
 
Zitat:

Um ein Hologramm kann man aber auch herumgehen und es von der Seite betrachten (ohne Brille). mit einem auf Dia abfotografierten S/W Bild ist das nun mal nicht hinzukriegen. Wie so etwas aber aussehen könnte, das ist bisher nur auf dem Holodeck der Enterprise zu sehen.
da wir nun eh schon das Thema gewechselt haben, noch ein kleiner Exkurs:
Das geht schon. Ein solches Hologramm ist nichts Anderes als das auf Film aufgezeichnete Interferenzmuster des vom Objekt reflektierten Lichtes. Es gibt jedoch auch computergenerierte Hologramme, die nach dem gleichen Prinzip funktionieren, aber eben kein reales Objekt zur Grundlage haben. Sichtbar macht man es z. Bsp. durch Be- oder Durchleuchtung mit einem aufgeweiteten Laserstrahl, wobei durch Beugung des Lasers im Interferenzmuster die Original-Wellenfront des Objektes wieder hergestellt wird. Die Qualität hängt dabei von vielen Faktoren ab. Herumgehen kann man übrigens um kein Hologramm, auch nicht um die hochwertigsten Laser-Transmissionshologramme. Das erreicht man nur durch die Kombination hunderter Einzelhologramme, aber auch nur einigermaßen gut.

Gruß
tomsel

JamesTKirk 10. Dez 2005 22:26

Re: mem aus TurboPascal
 
Wenigstens einer, der versteht, wie das abläuft.. :mrgreen:

@Hansa: Geschwindigkeitstest meinte ich in Bezug auf die Berechnung des Interferenzbildes... der Autor hatte ja schließlich einen 166MHz PC mit 64 MB RAM... und ich hier einen AMD Athlon 64bit 3700 mit 1024 MB RAM... dezenter Unterschied :wink:

Jaja... so Hologramme wie in Star Trek wären schon was *seufz*... aber ANGEBLICH (!!!) werden in Bezug auf holografisch anzeigbare Schaltflächen Erfolge verbucht. Aber selbst wenn das (noch) nicht der Fall ist, sollen ja in einigen Jahren die ersten Holodiscs mit 200GB Fassungsvermögen auf den Markt kommen :D


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:09 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz