teilstrings kopieren,wurzel ziehen und arrays <- gelöst

Für Fragen von Einsteigern und Programmieranfängern...
Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Re: teilstrings kopieren und wurzel ziehen

Beitrag von Targion »

Wir brauchen wirklich mehr Informationen über den Code, den du schon hast. Wie groß ist "Zeilenanzahl" bei dir? Hat "Abstaende" die richtige größe?
Stephanie H. hat geschrieben:was ist AV?
Eine Zugriffsverletzung, engl. "Access violation" -> Tritt auf, wenn du auf Speicher zugreifen willst, auf den du nicht zugreifen darfst. In den meisten Fällen wurde ein Objekt nicht erstellt oder ein Array zu klein gemacht. Wenn man mit Pointern arbeitet sind noch vielfältige andere Fehlerquellen möglich...

Stephanie H.
Beiträge: 91
Registriert: Sa 6. Feb 2010, 15:58
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: teilstrings kopieren und wurzel ziehen

Beitrag von Stephanie H. »

also ich hab das mal nachgerechnet und irgendwie macht das programm total die fehler...

Code: Alles auswählen

var
   X              : array of integer;
   Y              : array of integer;
   Xa             : integer;
   Ya             : integer;
   Xb             : integer;
   Yb             : integer;
   D1             : integer;
   D2             : integer;
   Wert1          : integer;
   Wert2          : integer;
   Summe          : integer;
   Ergebnis       : double;
   Abstaende      : array of array[0..9999] of double; 
 
 
 
begin
FOR i := 0 to Zeilenanzahl do begin
FOR a := 0 to Zeilenanzahl do begin
 
                        writeln(' ');
                        Xa := X[i];
                        Ya := Y[i];
                        Xb := X[a];
                        Yb := Y[a];
                        writeln(Xa);
                        writeln(Ya);
                        writeln(Xb);
                        writeln(Yb);
 
 
                        D1 := (Xa - Xb);
                        D2 := (Ya - Yb);
                        writeln(D1);
                        writeln(D2);
 
 
                         Wert1:= D1*D1;   <---hier rechnet das programm immer das falsche
                         Wert2:= D2*D2;   <---und hier
                         writeln(Wert1);
                         writeln(Wert2);
 
                         Summe:=Wert1+Wert2;
                         writeln(Summe);
                         Ergebnis := sqrt(Summe);
                         writeln(Ergebnis);
                         Abstaende[a,i] := Ergebnis;    
end;

Stephanie H.
Beiträge: 91
Registriert: Sa 6. Feb 2010, 15:58
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: teilstrings kopieren und wurzel ziehen

Beitrag von Stephanie H. »

und wenn ich das ohne lazarus öffne also wenn ich die .exe-datei öffne
steht da am ende immer das hier:

An unhandled exception occurred at $00401DD8 :
EInvalidOp : Invalid floating point ooperation
$00401DD8 main, line 191 of project.lpr

Zeile 191 ist das hier: Ergebnis := sqrt(Summe);

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6766
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: teilstrings kopieren und wurzel ziehen

Beitrag von af0815 »

Was ist dann Wert1 und Wert2, die dir ja vorher ausgegeben worden sein müssen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Stephanie H.
Beiträge: 91
Registriert: Sa 6. Feb 2010, 15:58
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: teilstrings kopieren und wurzel ziehen

Beitrag von Stephanie H. »

das ist der quadrat von d1 oder d2...?!

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6766
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: teilstrings kopieren und wurzel ziehen

Beitrag von af0815 »

der numerische Wert wäre das interessante.

Ergänzung: D1, D2, Wert1 und Wert2 als numerischen Wert bitte mal angeben.

Begründung: Was ist wenn durch einen Überlauf des zulässigen Zahlenbereich ein ungültiger Wert entsteht.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: teilstrings kopieren und wurzel ziehen

Beitrag von pluto »

Code: Alles auswählen

Abstaende      : array of array[0..9999] of double;
Na, das sagt doch alles aus. Du erstellst zwar einen Statischen 2D Array, weißt aber nur die Zeilen zu, nicht die Spalten. Richtig wäre(vermutlich):

Code: Alles auswählen

Abstaende      : array[0..66,0..66] of double;
Somit hättest du einen Statischen 2D Array vom Typ Double.
MFG
Michael Springwald

Stephanie H.
Beiträge: 91
Registriert: Sa 6. Feb 2010, 15:58
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: teilstrings kopieren und wurzel ziehen

Beitrag von Stephanie H. »

also ich hab das mit den abstaenden jetzt so:

var Abstaende : array[0..9999] of array[0..9999] of double;
anders geht es irgendwie nicht
aber wie muss ich dann die tabelle initialisieren mit setlenght?

aber ich glaub nicht das das was daran ändert das da falsch gerechnet wird...

also eigentlich sind das immer unterschiedliche werte aber hier hast du mal ein beispiel
d1= -208548
d2= 152310
wert1= 542595344 //das rechnet das Programm falsch aus
wert2= 1723499620 //und das hier auch

also wert1 und wert2 sind jetzt die falsche werte da rechnet das programm irgenwas falsch...

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: teilstrings kopieren und wurzel ziehen

Beitrag von pluto »

var Abstaende : array[0..9999] of array[0..9999] of double;
anders geht es irgendwie nicht
aber wie muss ich dann die tabelle initialisieren mit setlenght?
Nicht so. Sonden so:"array[0..9999,0..9999] of double"
aber wie muss ich dann die tabelle initialisieren mit setlenght?
Wenn du einen Statischen Array hast dann nicht, bei einem Dynamischen ja:
SetLenght(MyArray, Zeile, Spalte)

aber ich glaub nicht das das was daran ändert das da falsch gerechnet wird...
Das ist richtig, aber wenn du keine Spalten-Länge angibst, gibt es eine nette kleine AV.

Code: Alles auswählen

d1= -208548
d2= 152310
wert1= 542595344 //das rechnet das Programm falsch aus
wert2= 1723499620 //und das hier auch
Daraus kann ich / man nicht ableiten. Wie erstellst du oder woher hast du "542595344" ?
also wert1 und wert2 sind jetzt die falsche werte da rechnet das programm irgenwas falsch...
Das Programm tut das was du ihn sagst, nicht das was du möchtest *G*
MFG
Michael Springwald

Stephanie H.
Beiträge: 91
Registriert: Sa 6. Feb 2010, 15:58
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: teilstrings kopieren und wurzel ziehen

Beitrag von Stephanie H. »

d1 und d2 hat das programm ausgerechnet...

FOR i := 0 to Zeilenanzahl do begin
FOR a := 0 to Zeilenanzahl do begin

writeln(' ');
Xa := X;
Ya := Y;
Xb := X[a];
Yb := Y[a];
writeln(Xa);
writeln(Ya);
writeln(Xb);
writeln(Yb);


D1 := (Xa - Xb);
D2 := (Ya - Yb);
writeln(D1);
writeln(D2);


Wert1:= D1*D1; <---hier rechnet das programm immer das falsche
Wert2:= D2*D2; <---und hier
writeln(Wert1);
writeln(Wert2);

Summe:=Wert1+Wert2;
writeln(Summe);
Ergebnis := sqrt(Summe);
writeln(Ergebnis);
Abstaende[a,i] := Ergebnis;

also das hier ist mein quelltext
und wenn ich das nachrechne(Xa,Xb und Ya,Yb weiß ich) ist da irgendwas bei Wert1 und Wert2 falsch...

Ja ich sag dem dämlichen Programm ja was ich möchte nur das hört nicht auf mich :(
da hab ich doch klip und klar geschrieben das wert1 = d1*d1 ist
und er rechnet da irgend so ein scheiß aus..

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6766
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: teilstrings kopieren und wurzel ziehen

Beitrag von af0815 »

Stephanie H. hat geschrieben: aber ich glaub nicht das das was daran ändert das da falsch gerechnet wird...

also eigentlich sind das immer unterschiedliche werte aber hier hast du mal ein beispiel
d1= -208548
d2= 152310
wert1= 542595344 //das rechnet das Programm falsch aus
wert2= 1723499620 //und das hier auch

also wert1 und wert2 sind jetzt die falsche werte da rechnet das programm irgenwas falsch...
Das Programm rechnet nicht falsch, sondern ganz einfach die gewählten Zahlenräume falsch gewählt sind und es deshalb zu Überläufen kommt. Integer ist entweder SmallInt oder LongInt (je nach Modus -> RTFM :idea: ) damit ist die maximale Zahl bei LongInt 2.147.483.647 - somit das Quadrat von -208.548 ist 43.492.268.304. Das kann sich NIE ausgehen. Integer ist der falsche Typ dafür.

Unter Projekteinstellungen > Quelltext > Überprüfungen
-> Bereich
-> Überlauf
-> Stack
anwählen, das Projekt neu erstellen und mal laufen lassen, es sollten jetzt viel mehr Fehler sichtbar sein. Auch der obige erwähnte Fehler. Man sollte gerade bei Prohgrammerstellung die Prüfungen einschalten und erst dann ausschalten, wenn man weis was man tut.

[sarkasmus on] Übrigends macht ein Programm nicht irgendwas, sondern leider das, was der Programmierer geschrieben hat - nicht das was er gemeint hat (oder geglaubt hat zu tun). [sarkasmus off]
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Stephanie H.
Beiträge: 91
Registriert: Sa 6. Feb 2010, 15:58
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: teilstrings kopieren und wurzel ziehen

Beitrag von Stephanie H. »

welchen typ soll ich denn nehmen?
und was ist RTFM?

ich find das nicht:
Unter Projekteinstellungen > Quelltext > Überprüfungen
-> Bereich
-> Überlauf
-> Stack
anwählen, das Projekt neu erstellen und mal laufen lassen, es sollten jetzt viel mehr Fehler sichtbar sein. Auch der obige erwähnte Fehler. Man sollte gerade bei Prohgrammerstellung die Prüfungen einschalten und erst dann ausschalten, wenn man weis was man tut.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: teilstrings kopieren und wurzel ziehen

Beitrag von pluto »

Schau mal unter "Projekt\Compiliereinstlelungen\QuellText".
Projekt findest du im MainMenu: Das ist das Menü, wo Datei, Bearbeiten und soweiter steht. QuellText steht im Dialog, welches dann kommt in der Linken TreeView....
MFG
Michael Springwald

Stephanie H.
Beiträge: 91
Registriert: Sa 6. Feb 2010, 15:58
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: teilstrings kopieren und wurzel ziehen

Beitrag von Stephanie H. »

da kommen voll viele fehlermeldungen -.- guck mal in meinen anderen thread...

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6766
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: teilstrings kopieren und wurzel ziehen

Beitrag von af0815 »

Bezüglich RTFM - befrage das Orakel zu Google :mrgreen:

Zu den Fehlermeldungen - jetzt prüft der Compiler wirklich, vorher hast du ihm die rosarote Brille aufgezwungen. Ich reda da noch gar nicht von den Fehlern die kommen (Runtime Errors), falls das mal mit den Checks kompilierbar wird.

Jetzt ganz einfach die Fehlerliste von OBEN NACH UNTEN abarbeiten. Pluto hat dir schon etliche Hinweise gegeben, man muß sie nur begreifen und dann umsetzen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten