pętla w drugą stronę?

0

Ktoś z programistów Borlanda chyba mi rzuca kłody. Mam taką małą procedurkę w programie
procedure NextStep {brawo} {brawo} {browar} ;
var
i : integer;
begin
for i:=1 to (Ndim-1) do
begin
CC[i] := 2.0CC[i] - CCN[i];
CCN[i] := 0.5
(CC[i] + CCN[i])
end;
end;

gdzie:
Ndim = 5;
CC[i], CCN[i] to tablice: array[1..Ndim] of extended;

I gdy odpalam programik to:
Pętla for i:=1 to (Ndim-1) do rozpoczyna się od 4 kończy na 1(czyli biegnie odwrotnie),
Następnie na 1507 wywołaniu procedury pokazuje się error EinvalidOp ‘Invalid floating point operation’
Ma ktoś może jakiś pomysł? Dzięki za wszelka pomoc

--
Delphi6
marko

0

marko napisał:
Ktoś z programistów Borlanda chyba mi rzuca kłody. Mam taką małą procedurkę w programie
&gtPętla for i:=1 to (Ndim-1) do rozpoczyna się od 4 kończy na 1(czyli biegnie odwrotnie),

To Ty oszukaj ich i zamiast:
&gt for i:=1 to (Ndim-1) do
wstaw:
&gt for i:=1 downto (Ndim-1) do

:)

A na programistów Borlanda to bym tak nie psioczył. Firmy zajmujące się tworzeniem środowisk programistycznych podchodzą do niezawodności swoich produktów jak żadne inne (od tego zależy los mnóstwa programów)--Jest jeszcze jeden błąd ... :)

0

Nie mam nic do Borlanda to był żart a wina na pewno leży po mojej stronie tyle ze nie wiem czym może bć spowodowana.
Z downTo już szybciej próbowałem pętla po prostu sie nie wykonuje podobnie z zamianą argumentów '1' na '(Ndim-1)'

--
Delphi6
marko

0

marko napisał:
&gtPętla for i:=1 to (Ndim-1) do rozpoczyna się od 4 kończy na 1(czyli biegnie odwrotnie),

Mi tez sie to zdarzalo, wstawilem Break pointa na pierwszej instrukcji kodu, i podczas debugu okazalo sie ze o dziwo n nie bylo rowne 0 tylko 3 [for n:=0 to Kloc.Wysokosc-1 do....], a Kloc.Wysokosc mial wartosc 4.--sys:&gt logout....

0

Delphi optymalizuje petle tak, zeby zliczala sie w dol do zera.

sprobuj wylaczyc optymalizacje kodu dla Twojej petli
{$OPTIMIZATION Off} *dziala na cala procedure
procedure NextStep;
begin
*tu petla
end;
{$OPTIMIZATION on}

Co prawda optymalizacja petli przez zliczanie w dol powinna zachodzic tylko jesli programista nie odwoluje sie do zmiennej kontrolujacej petle, ale moze Delphi uznal ze u Ciebie to nic nie zmieni. Co do 1507(dlaczego tyle?) wywolania procedury, nie mam pojecia. Sprobuj przesledzic debuggerem co sie dzieje. EInvalidOp is raised when the CPU encounters an undefined instruction, invalid operation, or floating-point stack overflow. moze to wlasnie przepelnienie stosu ????

--
Pawel {Delphi6 }

Po pierwsze: naciśnij F1

0

marko napisał:
&gtprocedure NextStep {brawo} {brawo} {browar} ;
&gtvar
&gti : integer;
&gtbegin
&gt for i:=1 to (Ndim-1) do
&gt begin
&gt CC[i] := 2.0CC[i] - CCN[i];
&gt CCN[i] := 0.5
(CC[i] + CCN[i])
&gt end;
&gtend;
&gt
&gtgdzie:
&gtNdim = 5;
&gtCC[i], CCN[i] to tablice: array[1..Ndim] of extended;
&gt
&gtI gdy odpalam programik to:
&gtPętla for i:=1 to (Ndim-1) do rozpoczyna się od 4 kończy na 1(czyli biegnie odwrotnie),
&gtNastępnie na 1507 wywołaniu procedury pokazuje się error EinvalidOp ‘Invalid floating point operation’

Pętla biegnie odwrotnie tylko gdy zadeklarujesz tablice w typie extended.
Wówczas obliczenia które przeprowadzasz są poza zakresem, compilator wariuje, odlicza odwrotnie i wyrzuca błąd. Jeżeli wszystko zadeklarujesz jako single to odlicza w dobrej kolejności. Błędu też nie ma.

Aaa jeszcze jedno. U mnie błąd wyrzucało przy pierwszym uruchomieniu, ponieważ nie ustawiałem żadnych danych w tablicy. Ty ustaw dane na początku i dopasuj typ danych. Zobacz jakie są wartości pierwotne w tablicy i do jakich wyników dochodzisz przy obliczaniu. Musisz sprawdzać czy nie wychodzą poza zakres.--Jest jeszcze jeden błąd ... :)

0

OK. Dzięki:-)
Mam jeszcze jedno pytanko. Chciałem zadeklarować tablice jako dynamiczne. Tyle, że nie wiem jak ustawić rozmiar tablic dwuwymiarowych np procedurą SetLength ?

--
Delphi6
marko

0

marko napisał:
OK. Dzięki:-)
&gtMam jeszcze jedno pytanko. Chciałem zadeklarować tablice jako dynamiczne. Tyle, że nie wiem jak ustawić rozmiar tablic dwuwymiarowych np procedurą SetLength ?

Trzeba je najpierw zadeklarowac jako 2-wymiarowe i potem juz latwo:

var
x : array of array of byte; *2 wymiary
y : array of array of array of integer; *3 wymiary
begin
SetLength(x, 10, 10);
SetLength(y, 5, 20, 350);
end;
--Pawel {Delphi6 }

Po pierwsze: naciśnij F1

0

pq napisał:
&gtvar
&gt x : array of array of byte; *2 wymiary
&gt y : array of array of array of integer; *3 wymiary
&gtbegin
&gt SetLength(x, 10, 10);
&gt SetLength(y, 5, 20, 350);
&gtend;

To SetLength może działać tak jak Slice?
Bo mi potrzebne jest przycinanie tak jak Slice, tylko że w dwóch wymiarach.
A jeszcze jedno. Te tablice muszą być przekazywane jako const :(. Slice jednowymiarowe tak przekazywało.--Jest jeszcze jeden błąd ... :)

--------------Blok reklamowy :) -----
kanał: #4programmers.net
w sieci POLNet
serwer np.: warszawa.ircnet.pl

1 użytkowników online, w tym zalogowanych: 0, gości: 1