Delphi-PRAXiS
Seite 1 von 3  1 23   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Pointer :\ (https://www.delphipraxis.net/27627-pointer-%5C.html)

Snoop007 13. Aug 2004 10:18


Pointer :\
 
hi,
eigentlich dürfte das thema kein problem sein aber wieso kann ich den pointer so nicht benutzen ??

ich weiss der code macht so keinen sinn aber ich wollte nicht den kompletten code posten, zumal der Fehler bei fi := fp^; auftritt
Fehlermeldung : Operator auf diesen Operatortyp nicht anwendbar

Code:
var
  fi : File;
  fp : ^File;
begin
  fp := @fi;
  fi := fp^;
  ..
end;

Dannyboy 13. Aug 2004 10:37

Re: Porinter :\
 
Zitat:

ich weiss der code macht so keinen sinn
Dito. :mrgreen:
Meines Wissens kann man keine Pointer auf <File> setzen. Möchtest
Du mit "fi := fp^;" an den Inhalt von der Datei rankommen oder
wie? :gruebel: Mir ist momentan noch nicht ganz klar, was Du machen
möchtest, aber für Dateiverarbeitung sollest Du evtl. Hier im Forum suchenFilestreams
verwenden.

Was genau möchtest Du denn tun? :gruebel: Wenn Du uns das verrätst,
können wir Dir hoffentlich weiterhelfen.

DANNBOY

Nachtrag: Nenn' Deine Überschrift besser "Pointer". Ist aussagekräftiger als "Porinter". :zwinker:

Snoop007 13. Aug 2004 11:06

Re: Pointer :\
 
Prointer .. lol gar net gesehen

ich schreibe eine kompone die daten in eine datei typweise speichert
daher benutze ich in der gasamten komponente die selbe variable vom typ file
daich beim übergeben nicht immer die gesamte variable übergeben möchte wollte ich einen
pointer stattdessen übergeben .. aber wenn das nicht geht :\ schade

Dannyboy 13. Aug 2004 11:19

Re: Pointer :\
 
Zitat:

Prointer .. lol gar net gesehen
Schlimmer noch, es waren sogar "Porinter" :mrgreen:
Wie wäre es denn, wenn Du einen Zeiger auf die Variable
(nicht auf die Datei) an einen FileStream übergibst? :gruebel:
Bei der write-Funktion von TFilestream kannst Du ebenso exakt
die Anzahl der zu schreibenden Bytes (die Quelle wäre dann der
Pointer Deiner Variable) angeben. Ich beschäftige mich z.Zt. auch
mit dem Erstellen einer Datei, in die verschiedene Variablen mit
unterschiedlichen Längen und unterschiedlichen Datentypen
rein kommen. Klappt mit Filestreams ganz easy.

Snoop007 13. Aug 2004 11:20

Re: Pointer :\
 
*g
mh ich hab nu soweit alles mit assign ..reset .. rewrite usw. gemacht
gibts denn einen direkten vorteil gegenüber filestream ?

Dannyboy 13. Aug 2004 11:43

Re: Pointer :\
 
Liste der Anhänge anzeigen (Anzahl: 1)
Dieses ganze AssignFile-reset-rewrite-closeFile-Zeugs stammt
noch aus der Pascal-Zeit. Ich hab's damals auch so gelernt
und hatte kein Bock umzusteigen, aber das mit den Filestreams
ist wirklich (!) ganz einfach und bietet viele Vorteile
der Einfachheit und vor allem in der Geschwindigkeit.
Wenn Du z.B. einen Dateisplitter für beliebige Dateien schreiben möchtest
(siehe Anhang) dann kennst Du die Struktur der Dateien meistens gar nicht.
FileStreams sehen Strukturen einfach als eine Menge von einzelnen
Bytes an. Möchtest Du z.B einen Record speichern, dann machst Du das so:
Delphi-Quellcode:
type TMeinRecord = record
  buchstabe : Char;
  alter : byte;
  groesse : real;
  Daten : array[0..7] of byte;
end;
//...
  var MeinRecord : TMeinRecord;
//...
procedure schreibeMeinRecordInDatei;
  var Filestream: TFileStream;
begin
// FileStream:= TFileStream.create(<Dateiname>, <Zugriff auf Datei>);
   FileStream:= TFileStream.create('C:\test.dat', fmCreate OR fmShareExclusive);
// FileStream.write(<dantenquelle>, <anzahl der bytes>)
  FilStream.write(MeinRecord, SizeOf(TMeinRecord);
// Dateizugriff freigeben
  FileStream.free;
end;
Vorteile von der Pascal-Variante sind mir nicht bekannt. Hab' das aus dem
Kopf geschrieben, ergo ungetestet.
Nachtrag: Musst natürlich noch eventuelle
Exceptions abfangen.

Hansa 13. Aug 2004 11:57

Re: Pointer :\
 
Zitat:

Zitat von Snoop007
ich schreibe eine kompone die daten in eine datei typweise speichert daher benutze ich in der gasamten komponente die selbe variable vom typ file daich beim übergeben nicht immer die gesamte variable übergeben möchte wollte ich einen
pointer stattdessen übergeben .. aber wenn das nicht geht :\ schade

Schreiben mußt du echt noch üben. :lol: Was die Pointer angeht, so habe ich eine dumpfe Ahnung, was du meinst. 8) Das ^ vor einem Typ gibt einen Verweis auf die Stelle einer anderen Variable an. Steht es dahinter, so referenziert man den Inhalt des Pointers.

Nur, was hat das ganze mit Dateien zu tun ? Wahrscheinlich weißt du nicht, wieviel Platz irgendwas zur Laufzeit braucht. Und das soll in eine Datei. Wenn dem so ist, dann willst du das wohl in einer typisierten Datei speichern und das ist auch richtig. Wer weiß beim Programmieren schon, ob eine Rechnung jetzt 1 oder 1000 Positionen hat.

Was du wohl mit "Pointer" meinst, das sind dynamische Datenstrukturen (Listen, Bäume usw.). Da spielt sich aber alles im Hauptspeicher ab.

Soll es längere Zeit gespeichert bleiben, so gehört es in eine Datei / Datenbank. Das alles ist aber auch dynamisch. So, jetzt bin ich mit meinem Latein am Ende, was das ganze soll. :gruebel:

Snoop007 13. Aug 2004 12:04

Re: Pointer :\
 
Zitat:

Zitat von Hansa

Schreiben mußt du echt noch üben. :lol: ..

:stupid: danke ^^

ich wollte einfach statt der variablen File einen pointer übergeben aber so langsam glaub ich, dass das etwas blöd war :gruebel:


@Dannyboy
könnte ich damit auch listen ( arrays ) speichern, sieht bei deinem bsp so aus, wenn dem das so wäre
würde ich sofort darauf umsteigen; gleich mal testen :mrgreen:

Snoop007 13. Aug 2004 12:11

Re: Pointer :\
 
mh, damit kann man leider keine dynamischen listen speichern,
schade .. naja hätte ich mir auch denken können .. egal

dennoch danke euch :)

Dannyboy 13. Aug 2004 12:23

Re: Pointer :\
 
Zitat:

könnte ich damit auch listen ( arrays ) speichern, sieht bei deinem bsp so aus, wenn dem das so wäre
würde ich sofort darauf umsteigen; gleich mal testen
Natürlich geht das:
Delphi-Quellcode:
type TArray = array[0..1000, 3..99999] of integer;
Var meinArray : TArray;
//...
Filestream.write(meinArray, SizeOf(meinArray));
//...
Zitat:

mh, damit kann man leider keine dynamischen listen speichern,
schade .. naja hätte ich mir auch denken können .. egal
Hier geblieben, wir sind noch nicht fertig. :mrgreen:
Du muss nur an den Eintrag der Liste rankommen und dann wie gehabt:
Delphi-Quellcode:
VAR Eintrag : TListEintrag;
//...
FileStream.write(Eintag, SizeOf(Eintrag));
//...
Check this out.
DANNYBOY


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:07 Uhr.
Seite 1 von 3  1 23   

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