Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Unerklärbarer Error bei Matrix befüllung (https://www.delphipraxis.net/154781-unerklaerbarer-error-bei-matrix-befuellung.html)

Muellermilchtrinker 24. Sep 2010 18:00

Delphi-Version: 2009

Unerklärbarer Error bei Matrix befüllung
 
Hallo DP,

ich soll für einen Kumpel fragen, da er hier nicht angemeldet ist. Er programmiert gerade, einen kleinen LED Cube Simulator.
Also er hat die Ports des Microcontrollers und möchte die Ebene so ansteurn:
Delphi-Quellcode:
Ports2Matrix('&B00110011','&B00110011','&B00110011','&B00110011',2);
Und das ist seine Funktion:
Delphi-Quellcode:
procedure TForm1.Ports2Matrix(Porta:String;Portb:String;Portc:String;Portd:String;Ebene:Integer);
  var Pa,Pb,Pc,Pd:String;
begin
  Pa := Copy(Porta,3,8);
  Pb := Copy(Portb,3,8);
  Pc := Copy(Portc,3,8);
  Pd := Copy(Portd,3,8);
  cube[1,1,Ebene+1] := StrToInt(Pa[8]);    //Porta (Säule 1-8)
  cube[2,1,Ebene+1] := StrToInt(Pa[7]);
  cube[3,1,Ebene+1] := StrToInt(Pa[6]);
  cube[4,1,Ebene+1] := StrToInt(Pa[5]);
  cube[5,1,Ebene+1] := StrToInt(Pa[4]);
  cube[1,2,Ebene+1] := StrToInt(Pa[3]);
  cube[2,2,Ebene+1] := StrToInt(Pa[2]);
  cube[3,2,Ebene+1] := StrToInt(Pa[1]);
  cube[4,2,Ebene+1] := StrToInt(Pc[1]);    //Portc (Säule 9-16)
  cube[5,2,Ebene+1] := StrToInt(Pc[2]);
  cube[1,3,Ebene+1] := StrToInt(Pc[3]);
  cube[2,3,Ebene+1] := StrToInt(Pc[4]);
  cube[3,3,Ebene+1] := StrToInt(Pc[5]);
  cube[4,3,Ebene+1] := StrToInt(Pc[6]);
  cube[5,3,Ebene+1] := StrToInt(Pc[7]);
  cube[1,4,Ebene+1] := StrToInt(Pc[8]);           // Hier kommt der Error siehe unten
  cube[2,4,Ebene+1] := StrToInt(Pd[1]);    //Portd (Säule 17)
  cube[3,4,Ebene+1] := StrToInt(Pb[8]);    //Portb (Säule 18-25)
  cube[4,4,Ebene+1] := StrToInt(Pb[7]);
  cube[5,4,Ebene+1] := StrToInt(Pb[6]);
  cube[1,5,Ebene+1] := StrToInt(Pb[5]);
  cube[2,5,Ebene+1] := StrToInt(Pb[4]);
  cube[3,5,Ebene+1] := StrToInt(Pb[3]);
  cube[4,5,Ebene+1] := StrToInt(Pb[2]);
  cube[5,5,Ebene+1] := StrToInt(Pb[1]);
end;
Nach durchsteppen, hat er rausbekommen, dass der Error in der oben markierte Zeile auftritt.
Folgender Error tritt auf:
Code:
Erste Gelegenheit für Exception bei $761DFBAE. Exception-Klasse EConvertError mit Meldung '''
array ist ein array of integer.
Soll mich von ihm schon mal bedanken.

mkinzler 24. Sep 2010 18:08

AW: Unerklärbarer Error bei Matrix befüllung
 
Ist der Array dynamisch? Grenzen?

Muellermilchtrinker 24. Sep 2010 18:09

AW: Unerklärbarer Error bei Matrix befüllung
 
Festes array, 1..5,1..5,1..5

Union 24. Sep 2010 18:16

AW: Unerklärbarer Error bei Matrix befüllung
 
Pc[8] enthält wohl keinen gültigen Integerstring. Soll er mal als watch anschauen.

Christian Seehase 24. Sep 2010 22:28

AW: Unerklärbarer Error bei Matrix befüllung
 
Moin,

mit den von Dir angegebenen Codeabschnitten (eingebaut per Copy&Paste) kann ich das Problem weder mit D7 noch mit XE nachvollziehen.

Muellermilchtrinker 25. Sep 2010 12:05

AW: Unerklärbarer Error bei Matrix befüllung
 
Kann es vielleicht sein, dass wenn er in einem anderen Timer gerade die Matrix ausliest, dass es dann zum Error kommt???

Aber:
Er hat mir gerade gesagt, dass es immer vorkommt, wenn er vom String den Index 8 auslesen will.

Uwe Raabe 25. Sep 2010 13:09

AW: Unerklärbarer Error bei Matrix befüllung
 
Ich würde erstmal eine Überprüfung einbauen, daß die vier P-strings auch wirklich 8 Zeichen lang sind.

Satty67 25. Sep 2010 13:12

AW: Unerklärbarer Error bei Matrix befüllung
 
Man könnte eine zusätzliche Sicherheit einbauen und prüfen ob Porta/b/c/d wirklich mit 10 Zeichen an die Funktion übergeben wurde, also
Delphi-Quellcode:
if Length(Porta) >= 10 then
  Pa := Copy(Porta,3,8)
else
  Pa := '00000000'; // oder Fehlermeldung ausgeben
€: Gibts nicht, da war einer schneller (das passiert, wenn die Threads lange im Brwoser-Tab schlummern, sollte nicht immer so viele auf einmal öffnen) ;)

Uwe Raabe 25. Sep 2010 14:54

AW: Unerklärbarer Error bei Matrix befüllung
 
Man sollte in so einem Fall unbedingt auch das RangeChecking einschalten, das bringt meist schon so einiges zutage.

Unabhängig von dem Fehler ließe sich das alles aber noch etwas beschleunigen. Da in Delphi
Delphi-Quellcode:
Ord(false) = 0
und
Delphi-Quellcode:
Ord(true) = 1
ist:

Delphi-Quellcode:
cube[1, 1, Ebene + 1] := Ord(Pa[8] <> '0'); //Porta (Säule 1-8)


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:46 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