Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Array: mein integer ist leer :\ (https://www.delphipraxis.net/13306-array-mein-integer-ist-leer-%5C.html)

Pseudemys Nelsoni 15. Dez 2003 20:12


Array: mein integer ist leer :\
 
hoi,

Delphi-Quellcode:
      SetLength(QuizAntwort, length(QuizAntwort)+1);
      QuizAntwort[high(QuizAntwort)].nick := nick;
      QuizAntwort[high(QuizAntwort)].rAntworten := 1;
      ShowMessage(IntToStr(QuizAntwort[high(QuizAntwort)].rAntworten));
wieso wird mir hierbei eine leere message, also ohne text angezeigt? ich hab doch "rAntworten" den wert 1 zugewiesen. "QuizAntwort" ist das array

Niels 15. Dez 2003 20:26

Re: Array: mein integer ist leer :\
 
Moin!

Ich habs bei mir mal ins Delphi eingefügt weil's IMO fehlerfrei ist. Bei mir zeigts ne Message an wo ne 1 drin steht.

MfG Niels

Pseudemys Nelsoni 15. Dez 2003 21:04

Re: Array: mein integer ist leer :\
 
hoi, sorry ich hab das falsche kopiert, also hier:


Delphi-Quellcode:
procedure irgendwas;
var
  i: integer;
  b: boolean;
  text: string;
begin
  text := bla;
  for i := 0 to high(QuizAntwort) do
  begin
    if lowercase(text) = lowercase(QuizAntwort[i].text) then // wenn text schon im array ist
    begin
      inc(QuizAntwort[i].Antworten);
      Showmessage(IntToStr(QuizAntwort[i].Antworten));  // müsste 2 zeigen, zeigt aber nichts an
      b := true;
    end;
    if b = false then
    begin
      SetLength(QuizAntwort, length(QuizAntwort)+1);
      QuizAntwort[high(QuizAntwort)].text := text;
      QuizAntwort[high(QuizAntwort)].Antworten := 1;
      ShowMessage(IntToStr(QuizAntwort[high(QuizAntwort)]));  // zeigt 1
    end;
  end;
end;


beim ersten mal wenn "text"(bla) noch nicht in dem array ist wird der teil NACH dem "b = false" ausgeführt, sonst wird nur alles VOR dem "b = false" ausgeführt... also beim ersten mal wird mir "1" angezeigt, dann existierts also und beim 2ten aufruf der procedure wird alles vor "b = false" ausgeführt. ich habe da "inc(QuizAntwort[i].Antworten);" also müsste aus der "1" doch eine "2" werden, das wird es aber nicht, ich seh nichtmal die "1", das sowmessage zeigt mir nichts an

woher kommt das?

Sanchez 15. Dez 2003 21:19

Re: Array: mein integer ist leer :\
 
Hi,

Mal abgesehen davon, dass ich dein Beispiel nicht verstehe wäre wohl interessant wie groß dein Array vor der Prozedur ist. Ein Element muss wohl mindestens drinnen sein, sonst würdest du nie eine Messagebox bekommen.

Wenn mehr als Element drinne ist ist auch klar, warum du im 2ten Durchgang nicht unbedingt die 2 bekommst.

Weil:

Im ersten Durchgang erzeugst du ein neues Element, welches ja nicht das nächste sein muss. Den Antworten-Wert des nächsten Elementes, das du in dieser Prozedur noch nicht angerührt hast erhöhst du um eins. Natürlich hab ich keine Ahnung was dort jetzt drinsteht, weil ich den Code dazu nicht habe.

BTW: Ist es schlau, die ArrayLänge in einer For-Schleife als Counter zu verwendet, wenn man sie verändert?
Die Abbruchbedingung für eine Forschleife wird doch nur einmal ausgewertet, oder hab ich das falsch verstanden?

Pseudemys Nelsoni 15. Dez 2003 21:22

Re: Array: mein integer ist leer :\
 
also das array "QuizAntwort" ist global definiert und ist komplett leer beim ersten betreten der prozedur(wird von einer anderen prozedur auch nicht verwendet)

Niels 15. Dez 2003 21:36

Re: Array: mein integer ist leer :\
 
Wenn das Array leer ist, gibt high(array) -1 zurück und die for-Schleife startet net mal. Du musst dann length(array) nehmen.


MfG Niels

Pseudemys Nelsoni 15. Dez 2003 21:40

Re: Array: mein integer ist leer :\
 
ich verstehe hier den unterschied zu high/length nichtmehr (steht in meinem buch nicht)

Niels 15. Dez 2003 21:47

Re: Array: mein integer ist leer :\
 
High gibt dir den Index des letzten Elementes zurück und Length gibt dir die Anzahl der Elemente des Arrays zurück.

Ich hab mir dein Prog jetzt nochmal angeguckt...Angenommen am Anfang hat das Array ne Länge von 1.
Dein Prog macht es um 1 länger und trägt an der Stelle mit dem Index 1 die Daten ein.
Beim erneuten Aufruf der Prozedur geht es wieder beim ersten Element los, wo er sieht, dass es leer ist und schließlich das Array um eins vergrößert (length ist nun 3) und beim Element mit dem Index 2 das Zeug einträgt.
Beim zweiten Durchlauf der For-Schleife findet er nun eine Übereinstimmung (Stelle mit Index 1). Daraufhin wird die Anzahl der Antworten an dieser Stelle inkrementiert und als MSG ausgegeben.

Mich würde aber mal interessieren was das werden soll. :roll:


MfG Niels

[edit] Was ich vorhin mit Length / High gesagt hab würde den (eventuellen) Sinn deines Progs verändern...also vergiss es einfach :) [/edit]

Pseudemys Nelsoni 15. Dez 2003 21:55

Re: Array: mein integer ist leer :\
 
huhu niels,

Zitat:

High gibt dir den Index des letzten Elementes zurück und Length gibt dir die Anzahl der Elemente des Arrays zurück.
wenn high das letzte element ausgibt würde das bei 20 elementen 20 sein und da es 20 elemente hat wird length doch auch 20 wiedergeben oder nicht?

das ganze ist für ein quiz, die procedure s.o soll bei einer richtigen antwort auf eine frage einen punkt addieren.

dabei muss ich prüfen ob der nick schon in dem array is, oder nicht. der typ des arrays sieht so aus:

Delphi-Quellcode:
Type
  TQuizAntwort = Record
    nick: string;
    antworten: integer;
  end;
irgendwie klappts nicht, im chat wird mir ab frage 2 dann das angezeigt:

Zitat:

[21:55:11] <silent> ja
[21:55:13] <ism> ¤¤¤ silent hat die Frage "nein ? " richtig, mit "ja" beantwortet
[21:55:14] <ism> ¤¤¤ silent hat jetzt 1 richtige Antwort(en)
[21:55:14] <ism> ¤¤¤ ja ?
[21:55:16] <silent> nein
[21:55:16] <ism> ¤¤¤ silent hat die Frage "ja ?" richtig, mit "nein" beantwortet
[21:55:17] <ism> ¤¤¤ silent hat jetzt richtige Antwort(en)

den ersten punkt sehe ich noch, bei dem 2teil steht da keine zahl mehr

Niels 15. Dez 2003 21:59

Re: Array: mein integer ist leer :\
 
Moin!

Die Indizes beginnen bei 0 ...das heißt bei nem Array mit length = 20 ist die ist high = 19.

Die Suche nach Usern würde ich anders machen. Geht viel einfacher...hab jetzt aber keine Lust mehr.
gn8

MfG Niels


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:53 Uhr.
Seite 1 von 2  1 2      

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