![]() |
Speicherverbrauch bei langer if...then-Liste
Ich habe keine Ahnung, wie rechnerintern Speicherplatz für if...then verwendet wird.
Bei ca. 60 if...then-Zeilen habe ich keine Probleme. Bei längeren "Listen" kommt die Zuordnung außer Tritt. Wahrscheinlich müsste der Speicherbedarf vorstrukturiert werden, oder? Siehe Beispiel.
Delphi-Quellcode:
// Zufallswort wird ausgesucht
wortwahl[w]:= random (maxLine)+1; wort[w]:= Memo1.Lines.Strings[wortwahl[w]]; // 4x das gleiche... wort_1.text:= wort[1]; wort_2.text:= wort[2]; wort_3.text:= wort[3]; wort_4.text:= wort[4]; // davon wird ein Wort vertont tonwahl:=random (4) + 1; suchwort:= wort[tonwahl]; mediaPlayer1.FileName := TPath.Combine(TPath.GetDocumentsPath, (suchwort+'.mp3')); mediaPlayer1.Play; { so klappt das gut. Bei Wörtern mit Umlauten muss ich aber wegen .mp3 die Tondatei umbenennen. Dazu fällt mir leider nur die if..then-Variante ein. Die funktioniert auch gut und stabil bis zu ca. 60 Zeilen. } if suchwort = 'am' then ton2:='am'; if suchwort = 'im' then ton2:='im'; if suchwort = 'Bär' then ton2:='Baer'; mediaPlayer1.FileName := TPath.Combine(TPath.GetDocumentsPath, (ton2+'.mp3')); mediaPlayer1.Play; // Bei längeren if...then-Listen kommt ton2 bei einer Neuwahl von suchwort "aus dem Tritt" und der letzte ton2 // wird 1- oder 2-mal wiederholt. |
AW: Speicherverbrauch bei langer if...then-Liste
Moin...:P
Als erstes schreibst du uns bitte mal deine Delphi Version. :zwinker: Da können wir genauer helfen. Das Problem hat imho nichts mit der if then Orgie zu tun. Durch die vielen Zeilen, und der damit verbundenen Unübersichtlichkeit, können sich andere Fehler einschleichen. Tipp / eine Möglichkeit: Die Daten z.B. Bär = Baer extern in einer INI oder Textdatei vorhalten. Diese in das Programm einlesen und in einer Liste oder Dictionary verwalten. Das erspart bei Ergänzungen das Ändern des Programmes... :zwinker: |
AW: Speicherverbrauch bei langer if...then-Liste
Zitat:
Du möchtest eine eindeutige Zuordnung schaffen zwischen Suchbegriff und Dateiname. Klassisch könnte man hier ein Dictionary verwenden. Etwas - billiger - aber auch nicht schlecht: TStringList. Auch diese bietet eine Zuordnung zwischen Name und Wert an und der kannst Du sogar sagen, was bei Duplikaten passieren soll. Davon abgesehen, dass das IF absolut zuverlässig funktioniert, ist es die falsche Herangehensweise bei diesem Problem - weil der Code ein unwartbares Monstrum wird. Das siehst Du ja jetzt schon. |
AW: Speicherverbrauch bei langer if...then-Liste
Zitat:
Ich kann nicht generell "Bär" zu "Baer" machen, da als Text im Label "Bär" angezeigt werden soll. |
AW: Speicherverbrauch bei langer if...then-Liste
Zitat:
Jetzt werde ich mich mal auf TStringList konzentrieren (für 2000 Suchbegriffe). |
AW: Speicherverbrauch bei langer if...then-Liste
Zitat:
Stand jetzt hast Du ein fehlerhaftes Projekt - den Nachweis hast Du erst dann erbracht, wenn Deine Situation reproduzierbar wird. Und genau das ist ja nach Deiner Aussage nicht gegeben. |
AW: Speicherverbrauch bei langer if...then-Liste
:P
Zitat:
Zitat:
Zitat:
Hänge das fehlerhafte Projekt mal komplett an. |
AW: Speicherverbrauch bei langer if...then-Liste
Zitat:
Aber, wie schon festgestellt, wäre diese Abfrage für 2000 Wörter nicht praktikabel. Nur theoretisch wäre eine Erklärung des Phänomens interessant. |
AW: Speicherverbrauch bei langer if...then-Liste
Wenn ein Programm nicht tut, was es soll, liegt das in den allermeisten Fällen an Denkfehlern des Programmierers, gefolgt von Fehlern in den verwendeten Klassen/Komponenten und nur in ganz ganz seltenen Fällen (ich schätze, weit unter 1%) an Fehlern im Compiler.
|
AW: Speicherverbrauch bei langer if...then-Liste
Zitat:
Wenn ich hier mal aus dem ![]() Zitat:
|
AW: Speicherverbrauch bei langer if...then-Liste
Hallo,
also beim Code sagt mir doch der Compiler "value not assigned", weil ton2 nicht initialisiert ist. Lieber TE , du hast einen Bug produziert, sieh es einfach ein. Also bitte mehr Code. Wie steht es eigentlich mit einem Unit-Test? Heiko |
AW: Speicherverbrauch bei langer if...then-Liste
Das liegt wohl an der Zeile:
Delphi-Quellcode:
Hier könnte es passieren, dass keine der IF-Statements greift und somit die Ausgabe ".mp3" wäre, da in ton2 nichts drin steht.
mediaPlayer1.FileName := TPath.Combine(TPath.GetDocumentsPath, (ton2+'.mp3'));
Edit: Um die Warnung zu entfernen, solltest du beim Aufruf der Procedure(?) den Wert von ton2 auf '' initialisieren. |
AW: Speicherverbrauch bei langer if...then-Liste
Drehen wir doch den "Delphi-"Spieß doch einfach mal um:
Zeig uns doch mal deinen kompletten Code bei dem es zu Problemen kommt und auch das Suchwort bei dem es vermeintlich zu Differenzen in der Verarbeitung von IF..THEN kommt. |
AW: Speicherverbrauch bei langer if...then-Liste
@hoika:
Zitat:
|
AW: Speicherverbrauch bei langer if...then-Liste
Zitat:
Delphi-Quellcode:
Jetzt müssten ja "Aussetzer" zu hören sein, wenn das Suchwort nicht vorhanden ist
ton2 := '';
if suchwort = 'am' then ton2:='am'; if suchwort = 'im' then ton2:='im'; if suchwort = 'Bär' then ton2:='Baer'; //...jede Menge if...then´s If ton2 <> '' then begin mediaPlayer1.FileName := TPath.Combine(TPath.GetDocumentsPath, (ton2+'.mp3')); mediaPlayer1.Play; end; |
AW: Speicherverbrauch bei langer if...then-Liste
[QUOTE=Uwe Raabe;1311566]
Zitat:
Ich konnte mir ja auch nicht erklären, warum simple und überschaubare IF..THEN-Anweisungen zu einem nicht konstanten "Zufallsergebnis" führen sollte. Also war es doch wohl ein außerhalb von Delphi liegendes temporäres Speicherproblem des Rechners. |
AW: Speicherverbrauch bei langer if...then-Liste
Kennst Du CodesiteLogging? XE5 hat das dabei (denke ich).
CodesiteLogging in den Uses einbinden und dann
Delphi-Quellcode:
So kannst Du zumindest mal die Ergebnisse verfolgen.
if suchwort = 'am' then ton2:='am';
if suchwort = 'im' then ton2:='im'; if suchwort = 'Bär' then ton2:='Baer'; Codesite.Send(Suchwort + '->' + ton2); mediaPlayer1.FileName := TPath.Combine(TPath.GetDocumentsPath, (ton2+'.mp3')); mediaPlayer1.Play; Oder hast Du einfach einen Bereichsüberlauf. Sind Deine Arrays mit 1 initialisiert? Die Übersetzung würde ich aber wirklich über ein Dictionary, Stringlist oder Ini lösen. Letzteres hätte den Vorteil, dass Du sie auch mal ohne Neukompilierung ändern und erweitern kannst. |
AW: Speicherverbrauch bei langer if...then-Liste
Dass eine Kette von if-then Zuweisungen nicht funktionieren, wenn es "zu viele" werden, das wäre in der 20jährigen Geschichte von Delphi ein Unikum, das man wohl ausschliessen kann.
Da läuft mit Sicherheit etwas anderes schief, und bei endlosen Codeschlangen ist das auch nicht zu verwundern. Ohne das ganze Projekt zu sehen, werden wir wohl nicht viel helfen können. Unabhängig davon, dass es sicher funktioniert, deuten aber soclche Unmengen von Abfragen auf krasse Designfehler hin. Hinweise auf TDictionary und TStringList sind schon gefallen, du solltest das Programm unbedingt in so einer Richtung umbauen. |
AW: Speicherverbrauch bei langer if...then-Liste
Zitat:
Nachdem das Problem gelöst ist, wie die Ursache vermutlich nie finden werden mache ich hier mal zu. Auf Basis dieser dünnen Informationslage erübrigen sich weitere Beiträge. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:46 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