![]() |
Array zählt nicht hoch ?!
Hallo,
Ich habe ein A_Array[i,0] und ein ValueArray[i*4,0] in das die TabWerte aus A_Array + erste neue Werte (min,max,sum.avr) gespeicher werden sollen. (abc := 0) Folgender Code dazu:
Delphi-Quellcode:
Minimum, Maximum ist klar und Mittelwert an sich auch. Das Problem ist nur, dass er in
procedure TMomFiles.WerteBerechnen;
var temp, Avr, Mini, Maxi : real; begin if Zeile = 0 then //Erste Zeile als Default übernehmen begin ValueArray[abc, 0] := TabWert; ValueArray[abc+1,0] := TabWert; ValueArray[abc+2,0] := TabWert; ValueArray[abc+3,0] := (temp)/(Zeile+1); if abc < (Spaltenanzahl-1)*4 then abc := abc+4; end; if Zeile <> 0 then begin //Minimum if (TabWert < ValueArray[abc,0]) then ValueArray[abc,0] := TabWert; //Maximum if (TabWert > ValueArray[abc+1,0]) then ValueArray[abc+1,0] := TabWert; //Mittelwert ValueArray[abc+2,0] := (ValueArray[abc+2,0]+TabWert); ValueArray[abc+3,0] := ValueArray[abc+2,0]/(Zeile+1); if abc < (Spaltenanzahl-1)*4 then abc := abc+4; end; end;
Delphi-Quellcode:
die Summe der entsprechenden Tabwerte speichern soll für die Mittelwertberechnung.
ValueArray[abc+2,0]
z.B. 1. Durchlauf: TabWert = 2 -> ValueArray[abc+2,0] = 2 2. Durchlauf: TabWert = 5 -> ValueArray[abc+2,0] = 7 usw. Aber er schreibt immer nur den neuen Wert hinein, ohne die Summe zu bilden. Was läuft da schief? EDIT : Ich glaube, es liegt an
Delphi-Quellcode:
Ich habe dieses in der Schleife, wo die Spalten durchlaufen werden und dabei wird dann wohl auch immer das Array neu erstellt?!
Setlength(ValueArray,Spaltenanzahl*4,1); //4 Felder pro Spalte (Min,Max,Value,Avr)
Aber wo soll ich damit hin? Schließlich weiß ich doch erst an der Stelle, was 'Spaltenanzahl' ist . |
Re: Array zählt nicht hoch ?!
Du schreibst das ja auch an verschiedene Stellen des Arrays...
Delphi-Quellcode:
Du schreibst also den ersten Wert in ValueArray[2, 0], danach dann schreibst du in ValueArray[6, 0] die Summe von ValueArray[6, 0] und Tabwert, greifst also auf den vorherigen Wert gar nicht zu. Was sollte also auch anderes passieren...
Zeile 0:
abc = 0 --> abc + 2 = 2 ValueArray[abc+2,0] := TabWert; --> ValueArray[2, 0] := TabWert; abc := abc + 4 --> abc = 4 Zeile 1: abc = 4 --> abc + 2 = 6 ValueArray[abc+2,0] := TabWert; --> ValueArray[6, 0] := ValueArray[6, 0] + TabWert; [edit=mkinzler]Code-Tag durch Delphi-Tag ersetzt Mfg, mkinzler[/edit] |
Re: Array zählt nicht hoch ?!
Nee, bei jeder neuen Zeile wird abc=0 gesetzt.
Delphi-Quellcode:
z := Zeilenanzahl-1;
abc := 0; begin; for s := 0 to Spaltenanzahl-2 do begin StringArray[s,z] := ZwSpeicher.Strings[s+2]; Spalte := s; Zeile := z; TabWert := (StrToFloat(StringArray[s,z])); SetLength(ValueArray,Spaltenanzahl*4,1); // 4 Felder pro Spalte (Min, MAx, Sum, Avr) WerteBerechnen; Temp := (StringArray[s,z]) + ';'; TestDatei.Write(PChar(Temp)^,Length(Temp)); end; StringArray[Spaltenanzahl-1,z] := ZwSpeicher.Strings[ZwSpeicher.Count-1]; Spalte := Spaltenanzahl-1; Zeile := z; TabWert := (StrToFloat(StringArray[Spaltenanzahl-1,z])); WerteBerechnen; Temp := (StringArray[Spaltenanzahl-1,z]) + #13#10; TestDatei.Write(PChar(Temp)^,Length(Temp)); end; |
Re: Array zählt nicht hoch ?!
Und was hat es dann für einen Sinn abc in WerteBerechnen zu erhöhen, wenn das ohnehin immer wieder zurückgesetzt wird?
Und was hat dann abc als globale Variable dort zu suchen? Dann gibt es dafür schließlich Parameter... Dann kannst du tausendmal einfacher abc direkt an WerteBerechnen übergeben... Kann es sein, dass einmal eine Zeile leer ist bzw. es einen Zugriffsfehler gibt? Weil du vielleicht drauf zugreifst, wenn gerade die neue Zeile geschrieben wird... Und ansonsten: wie gesagt, debuggen, das kann dir niemand abnehmen ohne das Projekt zu haben... Und nur an einem Teil des Quelltextes sieht man eben nicht viel, wenn der so unübersichtlich mit globalen Variablen usw, geschrieben ist. |
Re: Array zählt nicht hoch ?!
Zitat:
Zitat:
|
Re: Array zählt nicht hoch ?!
Warum glaubst du sagen dir alle, du sollst Ein- und Ausgaben als Parameter/Rückgabewerte deklarieren und mit lokalen arbeiten?
Weil dein Code sonst unverständlich und nicht wartbar ist. Niemand liest so was gern und Fehlersuche kannst du vergessen. Du möchtest die Summe für einen bestimmten Bereich? Dann schreib eine Funktion die genau das macht und nichts anderes:
Delphi-Quellcode:
Für die spezielle Auswertung kannst du dann die Unterfunktionen benutzen.
function TMomFiles.BerechneSumme(const ARect: TRect): Double;
var x, y: Integer; begin Result := 0; for y := ARect.Top to ARect.Bottom do for x := ARect.Left to ARect.Right do Result := Result + ValueArray[x, y]; end; function TMomFiles.BerechneMinimum(const ARect: TRect): Double; var x, y: Integer; begin Result := ValueArray[ARect.Left, ARect.Top]; for y := ARect.Top to ARect.Bottom do for x := ARect.Left to ARect.Right do if ValueArray[x, y] < Result then Result := ValueArray[x, y]; end;
Delphi-Quellcode:
procedure TMomFiles.Auswertung(const ARect: TRect);
var lRect: TRect; x: Integer; begin lRect.Top := ARect.Top lRect.Bottom := ARect.Bottom; for x := ARect.Left to ARect.Right do begin lRect.Left := x; lRect.Right := x; ValueArray[x, ARect.Bottom + 1] := BerechneSumm(lRect); ValueArray[x, ARect.Bottom + 2] := BerechneMinimum(lRect); {...} end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:48 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 by Thomas Breitkreuz