Autor Beitrag
Lux
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 104

Win XP Home
D2005 Pers.
BeitragVerfasst: Mi 09.03.05 10:33 
Hallo Leute.
Ist echt schwer einen passenden Titel zu finden :)

Also ich hab ein Programm, welches die Daten aus einer Liste auslesen soll.
Die Liste sieht so aus:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
L(PNAME,16)      ENAME        L(ANAME,33)              ADAP DATUM      UHRZEIT  GWERT     

BEHRENS. IRIS    Begriffe     dt. Varianten            -999 16.11.2004 16:47:50    4.6667 
BEHRENS. IRIS    Begriffe     dt. Varianten            -999 22.11.2004 08:52:46   13.1667 
BEHRENS. IRIS    Begriffe     dt. Varianten            -999 23.11.2004 08:42:49   14.8333 
BEHRENS. IRIS    Begriffe     dt. Varianten            -999 09.12.2004 08:32:12    8.2500 
BEHRENS. IRIS    Begriffe     dt. Varianten            -999 13.12.2004 08:23:55    9.8333 
BEHRENS. IRIS    Begriffe     dt. Varianten            -999 14.12.2004 08:25:34    9.8333 
BEHRENS. IRIS    Bildarchiv   b. Mauer  free recall    -999 25.11.2004 09:09:33   92.8571 
BEHRENS. IRIS    Bildarchiv   b. Mauer  free recall    -999 26.11.2004 09:04:27   92.8571 
BEHRENS. IRIS    Bildarchiv   b. Mauer  free recall    -999 29.11.2004 09:08:43  100.0000 
BEHRENS. IRIS    Bildarchiv   b. Mauer  free recall    -999 30.11.2004 09:15:35  100.0000


Nun hab ich diese Liste in eine ListView reingeladen, was ja soweit auch noch super klappte.
Hier auch nochmal ein Dankeschön an das Forum, welches mir hierbei sehr geholfen hat.

Nun möchte ich allerdings hinter dem GWERT noch eine weitere Spalte machen mit dem Ergebnistext, da erscheint dann entweder "Fehler in Prozent" oder "Richtige in Prozent" oder "Pluspunkte pro Aufgabe" usw.
Dazu ist zu sagen, das die Liste aus einem anderen Programm kommt, wo insgesamt über 400 Aufgaben enthalten sind.
Nun habe ich das Problem so gelöst, dass ich ein Array erzeugt habe, was über 400 Bereiche hat (array [1..482, 1..4] of string)
erstellt habe und dort für jede Aufgabe den Ergebnistext und weitere Informationen gespeichert habe.
Wenn ich nun die Liste anzeigen möchte, dann durchsucht er bei jeder Zeile der Datei auch einmal das komplette Array.
Und wenn nun diese Datei über 200 Einträge hat, dann würde er 200 mal ein Array aufrufen, welches über 400 Einträge hat, die er durchsuchen muss.

Mein Problem: Seit ich das nun habe, stürzt das Programm mir unregelmäßig ab. Manchmal funktionierte es und manchmal nicht. Jetzt klappt es gar nicht mehr.

Meine Frage: Habt ihr eine Idee, wie man dieses durchsuchen optimieren kann?
Einige Infos noch dazu:
- Diese über 400 Aufgaben unterteilen sich noch einmal in verschiedene Bereiche (Mathe, Deutsch usw.)
- Nicht jede Aufgabe hat einen anderen Ergebnistext (Viele haben den Text Pluspunkte pro Aufgabe, andere wieder einen anderen)
- Zur Zeit läuft meine Suchabfrage so ab:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
for Counting = 0 to High(AAufgaben) do
 begin
  if x = AAufgaben[Counting, 2then
  ergebnis := AAufgaben[counting, 3];
 end;

In X ist der name der Aufgabe enthalten
AAufgaben ist das Array
AAufgaben[Counting, 2] im 2 ist auch die Aufgabe enthalten
AAufgaben[Counting, 3] hier ist der Ergebnistext enthalten.

Ich hoffe ihr könnt mir ein paar Denkanstöße geben, wie ich das optimieren kann!

Vielen dank schonmal im Vorraus

_________________
There are 10 different people.
Those who understand binary code and those who don't understand.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mi 09.03.05 10:45 
Der Titel hat aber mit deiner Frage nicht viel zu tun, oder?

Wenn dein Array unsortiert ist, empfehle ich dir, ein zweites sortiertes Array zu verwenden. Dieses sollte außer dem Sortier-Feld noch ein Index-Feld haben. Dieses Index-Feld beinhaltet den Index des eigentlichen Arrays.
Jetzt kannst du das sortierte Array mit deiner Liste abgleichen. Über die Referenz (Index-Feld) weißt du, welches Array-Element im richtigen Array zu benutzen ist.

Das sortierte Array sollte die gleiche Sortierung wie deine Liste haben, wenn diese denn eine hat. So musst du nicht immer das ganze Array durchlaufen. Übrigens kannst du eine Schleife mit Break abbrechen. Denn wenn du das Element gefunden hast, musst du den Rest des Arrays ja nicht mehr prüfen. Noch schöner wäre es natürlich, wenn du ein While-Schleife benutzt. Dann kannst du das Abbruch-Kriterium (gefunden) dort mit aufnehmen. Dann benötigst du auch ken Break.
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Mi 09.03.05 11:01 
Ich würde anstelle des zweiten Array evtl. ein Record empfehlen. Dadurch ist es offensichtlicher auf welches Feld du zugreifst.

Ich denke mal dass die Namen recht gleich sind. Also laut deinem kleinen Text. Evtl könntest du dir auch einen kleinen Baum aufbauen in dem deine Einträge sortiert ablegst.

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
- BEHRENS. IRIS
  - Begriffe
    - dt. Varianten
      - Record welches die folgenden Werten beinhält '-999 16.11.2004 16:47:50    4.6667'
      - Record welches die folgenden Werten beinhält '-999 16.11.2004 16:47:50    4.6667'
      - Record welches die folgenden Werten beinhält '-999 16.11.2004 16:47:50    4.6667'
      - Record welches die folgenden Werten beinhält '-999 16.11.2004 16:47:50    4.6667'
  - Bildarchiv
    - b. Mauer  free recall
      - Record welches die folgenden Werten beinhält '-999 16.11.2004 16:47:50    4.6667'
      - Record welches die folgenden Werten beinhält '-999 16.11.2004 16:47:50    4.6667'
      - Record welches die folgenden Werten beinhält '-999 16.11.2004 16:47:50    4.6667'
      - Record welches die folgenden Werten beinhält '-999 16.11.2004 16:47:50    4.6667'

Dann könntest du recht schnell die Werte eingrenzen. Allerdings weiß ich nicht ob sich deine Daten da so einsortieren lassen und ob das einen Vorteil bringt.

Falls deine Namen 100%tig identisch sind könntest du auch ein Hash verwenden.

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mi 09.03.05 11:09 
Lossy-eX, das mit Record stimmt natürlich. Ich meinte eigentlich auch ein Array of Record.
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Mi 09.03.05 11:57 
for Counting = 0 to High(AAufgaben) do

das sieht mir so aus als wenn da ne -1 fehlt, vill stürzt es deshalb öfter mal ab

_________________
wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
wdbee
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 628
Erhaltene Danke: 1



BeitragVerfasst: Mi 09.03.05 12:11 
@uall@ogc: Knapp daneben. Wenn dort der Fehler liegt, dann sollte es dort wohl heißen
ausblenden Delphi-Quelltext
1:
for Counting = Low(AAufgaben) to High(AAufgaben) do					


Er schreibt oben, seine Arrays seien von 1 an definiert.