AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Zeiger/Pointer Frage (grosse Arrays) @cracks
Thema durchsuchen
Ansicht
Themen-Optionen

Zeiger/Pointer Frage (grosse Arrays) @cracks

Ein Thema von Kendor · begonnen am 6. Apr 2005 · letzter Beitrag vom 6. Apr 2005
Antwort Antwort
Kendor

Registriert seit: 2. Jan 2003
Ort: Thun
16 Beiträge
 
Delphi 7 Professional
 
#1

Zeiger/Pointer Frage (grosse Arrays) @cracks

  Alt 6. Apr 2005, 18:05
guten abend!

einführung:
-------------------
also ich habe einen xml parser, mit welchem ich mehrere files auslesen will.
die ausgelesenen informationen speichere ich dabei in ein grosses array (wollte es dynamisch machen und immer der grösse anpassen, das gibt aber speicherfehler ab einer grösse von 1002 einträgen) also... array[1..9999] of TDokument;
Delphi-Quellcode:
type TDocument = record
      ID: cardinal;
      Number: string;
      Title: string;
      usw..
      end;
jedes mal wenn nun der parser einen content zwischen zwei xml tag findet wird ein ereignis aufgerufen... ich habe zuvor das aktuelle xml tag in der globalen variable CurrTag gespeichert.

nun frage ich nach tag ab (btw. gibts keine möglichkeit auch nach strings eine case abfrage zu machen? wie c++?) (content beinhaltet den eintrag zwischen den tags)
Delphi-Quellcode:
      if CurrTag='IDthen
        begin
          CurrID:=strtoint(Content); {/ ID ist immer erster eintrag daher geht das so }
            {  If CurrID>Length(NewDocDb) then SetLength(NewDocDb,CurrID+1); // geht nicht - speicher nehm ich an..? }
          NewDocDb[CurrID].ID:=strtoint(Content);
        end;
     if CurrTag='Numberthen
        NewDocDb[CurrID].Number:=Content;
     if CurrTag='Titlethen
        NewDocDb[CurrID].Title:=Content;

      usw...
wie ihr seht ist das dann alles schön in meiner struktgur gespeichert... -> funktioniert alles bestens...

nun parse ich aber ein weiteres file, mit dem gleichen parser, den gleichen tags..
dieses will ich aber nicht in NewDocDB speichern, sondern in OldDocDB

frage:
-------------------------
wie kann ich das vereinfacht machen durch einen pointer?
also damit es etwa so aussieht:

Delphi-Quellcode:
if aktuelles file = altes file then
speicher_mich_hier = zeiger auf das array wo das alte gespeichert wird
if aktuelles file = neues file then
speicher mich hier = zeiger auf das array wo das neue gespeichert wird

      if CurrTag='IDthen
        begin
          CurrID:=strtoint(Content);
          speicher_mich_hier[CurrID].ID:=strtoint(Content);
        end;
     if CurrTag='Numberthen
        speicher_mich_hier[CurrID].Number:=Content;
     if CurrTag='Titlethen
        speicher_mich_hier[CurrID].Title:=Content;

      usw...

vielleicht noch zu sagen: die arrays sind global... müssen...
klar geht das ganze auch indem man einfach die ganze abfrage kopiert und so für eine simple abfrage riesenviel code braucht...
aber ich denk es muss doch möglich sein? also eine referenz auf ein anderes array zu machen

vielen dank für eure schnellen antworten!
beste grüsse,
ein etwas verzweifelter kendor
Ut sementem feceris, ita metes.

Nosce te ipsum!(Inschrift in Delphi, nach Cicero)
  Mit Zitat antworten Zitat
Benutzerbild von Binärbaum
Binärbaum

Registriert seit: 19. Jan 2005
Ort: Elstra
764 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Zeiger/Pointer Frage (grosse Arrays) @cracks

  Alt 6. Apr 2005, 18:15
Zitat von Kendor:
nun frage ich nach tag ab (btw. gibts keine möglichkeit auch nach strings eine case abfrage zu machen? wie c++?) (content beinhaltet den eintrag zwischen den tags)
Hi,
von Haus aus kann man case nicht mit Strings verwenden, höchstens mit Char.
Allerdings ist es mit einem Trick doch möglich, case auf Strings anzuwenden. Dazu braucht man eine zusätzliche Funktion:
Delphi-Quellcode:
function StrIdx(aStr: string; strArr: array of string): Integer;
var i: Integer;
begin
  Result:= -1;
  for i:= 0 to High(strArr) do
    if (aStr=strArr[i]) then
    begin
      Result:= i;
      Break;
    end;
end;
Danach kann man folgendes verwenden:
Delphi-Quellcode:
const AlleMeineStrings: array [0..100] of string = ( 'ID', 'Number', ... );
...

begin
  ...
  case StrIdx(CurrTag, AlleMeineStrings) of
    0: ShowMessage('ID-Tag');
    1: ShowMessage('Number-Tag');
    2: ShowMessage('NochEin-Tag');
    ...
    -1: ShowMessage('Kein Tag');
  end;
end;
MfG
Binärbaum
There are exactly 10 kinds of people: those who understand binary, and those who don't.
---
"Software reift beim Kunden. Bei Hardware ist es anders: Hardware fault beim Kunden." - Rainer G. Spallek
  Mit Zitat antworten Zitat
Kendor

Registriert seit: 2. Jan 2003
Ort: Thun
16 Beiträge
 
Delphi 7 Professional
 
#3

Re: Zeiger/Pointer Frage (grosse Arrays) @cracks

  Alt 6. Apr 2005, 20:44
hi binärbaum...
vielen dank. ist doch schonmal was werd ich gleich mal einführen.

und zur eigentlichen frage: niemand eine idee?
Ut sementem feceris, ita metes.

Nosce te ipsum!(Inschrift in Delphi, nach Cicero)
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Zeiger/Pointer Frage (grosse Arrays) @cracks

  Alt 6. Apr 2005, 20:47
eignetlich hast du ja schon die lösung selbst gepostet:
Delphi-Quellcode:
if aktuelles file = altes file then
speicher_mich_hier = zeiger auf das array wo das alte gespeichert wird
if aktuelles file = neues file then
speicher mich hier = zeiger auf das array wo das neue gespeichert wird
derzeit verwendest du ja
array[1..9999] of TDokument Mach daraus einfach einen neuen Typ und legen einen Pointer auf diesen Typ an. Und dann diesen Pointer typ verwenden.
Delphi-Quellcode:
  TDokumentArr = array[1..9999] of TDokument;
  PDokumentArr = ^TDokumentArr;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Kendor

Registriert seit: 2. Jan 2003
Ort: Thun
16 Beiträge
 
Delphi 7 Professional
 
#5

Re: Zeiger/Pointer Frage (grosse Arrays) @cracks

  Alt 6. Apr 2005, 22:12
Zitat von SirThornberry:
Mach daraus einfach einen neuen Typ und legen einen Pointer auf diesen Typ an. Und dann diesen Pointer typ verwenden.
Delphi-Quellcode:
  TDokumentArr = array[1..9999] of TDokument;
  PDokumentArr = ^TDokumentArr;
mmh, ich hab scheinbar grad einen rechten knopf wie geh ich denn da weiter vor?

ich hab mir das weiter überlegt, ungefähr so:
Delphi-Quellcode:

type TDocument = record
      ID: cardinal;
      Number: string;
      Title: string;
      usw..
      end;

var // global
  OldDocDB: array[1..9999] of TDocument;
  NewDocDB: array[1..9999] of TDocument;
  EditDocDB: Pointer;
  first_time_flag: bool;


procedure ich_werde_bei_content_aufgerufen(Sender, Content, ...);
begin

if aktuelles_file = altes_file and first_time_flag=0 then
begin
  EditDocDB = @OldDocDB;
  first_time_flag=1;
end;
if aktuelles_file = neues_file and first_time_flag=0 then
  EditDocDB = @NewDocDB;
  first_time_flag=1;
end;

if CurrTag='Numberthen TDocument(EditDocDB[CurrID]^).Number:=Content;
if CurrTag='Titlethen TDocument(EditDocDB[CurrID]^).Title:=Content;
usw...

end;
(first_time_flag benutze ich, dass nur beim ersten durchlauf der Pointer gesetzt wird, sonst wird doch jedes mal wieder an die erste stelle verwiesen?)

kann das so funktionieren?
damit ich in OldDocDB die einträge des alten files und in NewDocDB die des neuen habe?


vielen dank...
Ut sementem feceris, ita metes.

Nosce te ipsum!(Inschrift in Delphi, nach Cicero)
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Zeiger/Pointer Frage (grosse Arrays) @cracks

  Alt 6. Apr 2005, 22:29
ich hab das gefühl das wir ananeinder vorbei reden/schreiben.
Ich hab das ganze so verstanden. Du hast 2 Arrays vom gleichen Typ. Und dann hast du eine Procedure die mit einem Array etwas anstellt. Dann willst du anhand einer Bedingung entweder das eine oder das andere Array auf die procedure anwenden?! richtig so?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Kendor

Registriert seit: 2. Jan 2003
Ort: Thun
16 Beiträge
 
Delphi 7 Professional
 
#7

Re: Zeiger/Pointer Frage (grosse Arrays) @cracks

  Alt 6. Apr 2005, 22:33
genau
deine idee scheint gut zu sein nur hab ich atm keine ahnung wie ich denn das machen soll?
Ut sementem feceris, ita metes.

Nosce te ipsum!(Inschrift in Delphi, nach Cicero)
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Zeiger/Pointer Frage (grosse Arrays) @cracks

  Alt 6. Apr 2005, 22:38
Ok dann nochmal (ausschnitt)
Delphi-Quellcode:
type
  TDocumentArray = array[1..9999] of TDocument;
  PDocumentArray = ^TDocument;
[...]
var // global
  OldDocDB: TDocumentArray;
  NewDocDB: TDocumentArray;
  EditDocDB: PDocumentArray;
  first_time_flag: bool;
[...]
if Bedingung then
  EditDocDB = @OldDocDB
else
  EditDocDB = @NewDocDB;

//Do something width EditDocDB
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Kendor

Registriert seit: 2. Jan 2003
Ort: Thun
16 Beiträge
 
Delphi 7 Professional
 
#9

Re: Zeiger/Pointer Frage (grosse Arrays) @cracks

  Alt 6. Apr 2005, 22:41
mmh *nickt* - könnt dich umarmen... - danke!... und jetzt kann ich beruhigt schlafen gehen
Ut sementem feceris, ita metes.

Nosce te ipsum!(Inschrift in Delphi, nach Cicero)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:45 Uhr.
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