Nie chce działać instrukcja Reset lub rewrite

Odpowiedz Nowy wątek
2019-01-04 16:40
0

Witam.
Byłem w wątku Newbee ale nie wiem dlaczego został zlikwidowany.
Do rzeczy. Napisałem kilka programów. jedne generują dane a inne je wykorzystują i dalej przetwarzają. Ktoś zapyta czy nie można stworzyć jednego programu który będzie zawierał wszystko i bez problemu z komunikacją. Taki program będzie zawierał tysiące linii co jest niełatwe przy wyszukiwaniu błędów. poza tym oznaczenia zmiennych. Można używać długich nazw ale to jeszcze bardziej wydłuży program i koło zamyka się.
Próbowałem stosować instrukcje RESET i REWRITE w różnych konfiguracjach i nic. Gdzie popełniam błąd. Załączam program który generuje dane i je zapisuje a potem w celu sprawdzenia znów wyświetla. (Procedury DyskWrit i DyskRead)
Po uruchomieniu program żąda nazwy pliku do zapisu a po zatwierdzenia kończy działalność bez wyświetlenia błędu.

edytowany 1x, ostatnio: Zbigniew Jachimowicz, 2019-01-04 16:41

Pozostało 580 znaków

2019-01-07 10:44
0
Clarc napisał(a):

A do czego tam jest to + 0.0.? W Lazarusie nie można zapisać do zmiennej double wartości integer?

W tej chwili jest to w komentarzu ale wcześniej miało służyć do zamiany zmiennej N1 - Integer na Double - A[0,0]
Obecnie jest to samo String[15]

Pozostało 580 znaków

2019-01-07 10:49
0

Ale typ integer można bez problemu zapisać do double. W drugą stronę trzeba ucinać/konwertować wartość.
Napisałeś:

A[0,0]:= N1(+0.0);

W programie głównym jest identyczne podstawienie i błędu nie ma
A[0,0]:= N1;

Ja tam nie widzę żeby to było identyczne.

Pozostało 580 znaków

2019-01-07 10:51
0

Nie bardzo rozumiem wcześniej napisałeś - cytat

A do czego tam jest to + 0.0.? W Lazarusie nie można zapisać do zmiennej double wartości integer?

Pozostało 580 znaków

2019-01-07 11:00
0

Jeśli dobrze pamietam to w C++, Pythonie i może jeszcze gdzieś jest coś takiego, że dla zmiennej całkowitoliczbowej, żeby przejść na wartość zmiennoprzecinkową to robi się takie zabiegi jak:
'float' := 'integer' + 0.0; np. żeby uzyskać rzeczywistą wartość przy dzieleniu a nie tylko cześć całkowitą.

W Lazarusie nie można zapisać do zmiennej double wartości integer?
Ale typ integer można bez problemu zapisać do double.

Te dwa zdanie dotyczą tego samego. W Delphi nie ma takiej potrzeby, w Lazarusie nie wiem dlatego zapytałem. Jeśli nie jest to wymagane a powoduje błąd to można to pominąć.

Pozostało 580 znaków

2019-01-07 11:06
0

Te dwa zdanie dotyczą tego samego. W Delphi nie ma takiej potrzeby, w Lazarusie nie wiem dlatego zapytałem. Jeśli nie jest to wymagane a powoduje błąd to można to pominąć.
Jak to pominąć
A[0,0]:= N1;
kiedy tutaj jest
Write(Plik,A[0,0],A[0,1],A[0,2]);

edytowany 1x, ostatnio: Zbigniew Jachimowicz, 2019-01-07 11:14

Pozostało 580 znaków

2019-01-07 11:20
1

Panowie, ale czy to taki problem, żeby zamiast snuć teorie po prostu sprawdzić, jak się Lazarus zachowa? :P


procedure TForm1.Button1Click(Sender: TObject);
var calkowita: integer;
    zmiennoprzecinkowa: extended;
begin
  calkowita := 24234;
  zmiennoprzecinkowa := 0.2434435;
  zmiennoprzecinkowa := zmiennoprzecinkowa + calkowita;
  showmessage (FloatToStr(zmiennoprzecinkowa));
end;             

That game of life is hard to play
I'm gonna lose it anyway
The losing card I'll someday lay
So this is all I have to say
edytowany 2x, ostatnio: cerrato, 2019-01-07 11:21

Pozostało 580 znaków

2019-01-07 11:22
0

Wpis
" A[0,0]:= N1(+0.0);
W instrukcji A[0,0]:= N1(+0.0); pojawia się wspomniany wcześniej błąd
W komentarzu jest próba zamiany zmiennej N1 - Integer na Double aby dopasować A[0,0]:= N1+0.0; bez zmian - błąd

W programie głównym jest identyczne podstawienie i błędu nie ma
A[0,0]:= N1; A[0,1]:= 0.0; A[0,2]:= 0.0; "

wyraźnie sugeruje że błąd jest w A[0,0]:= N1(+0.0); chyba że ja jakoś inaczej czytam. Nigdzie nie pisałeś że chodzi o

Write(Plik,A[0,0],A[0,1],A[0,2]);

@cerrato, nie mam Lazaura żeby sprawdzić a nie chce mi się instalować.

edytowany 1x, ostatnio: Clarc, 2019-01-07 11:23

Pozostało 580 znaków

2019-01-07 11:33
1

nie mam Lazaura żeby sprawdzić a nie chce mi się instalować.

Tak się fajnie składa, że akurat mam jednego przy sobie, więc szybko sprawdziłem :D

Podany powyżej kod się kompiluje bez problemów, a wartość zwrócona przez ShowMessage jest zgodna z tym, czego chcemy (mówiąc wprost - ładnie się dodał integer do float'a i mamy wartość zmiennoprzecinkową o takiej wartości, jaka wynika z sumowania). Nie trzeba żadnych czarów czy czarnej magii odprawiać ;)


That game of life is hard to play
I'm gonna lose it anyway
The losing card I'll someday lay
So this is all I have to say
edytowany 2x, ostatnio: cerrato, 2019-01-07 11:34

Pozostało 580 znaków

2019-01-07 11:36
0

Tak czy inaczej jest błąd
Załączam ostatnią wersję procedur DyskWrit i DyskRead

{ Procedura zapisuje w pliku "Nazwa.*" wyniki obliczeń z programu
SCRATONUR:}
Procedure DyskWrit (N1: Integer; A: Wek);
Var
Nazwa: String[15];
Plik: File of Double;
Begin
Readln;
Write('Podaj nazwe zbioru na dysku np. = C:\Silnik.10 '); Readln(Nazwa);
Nazwa:=Concat('C:\',Nazwa);
Assign(Plik,Nazwa);
Rewrite(Plik);
A[0,0]:= N1;
Write(Plik,A[0,0],A[0,1],A[0,2]);
For k:=1 To N1 Do
For l:=0 To 2 Do
Write(Plik,A[k,l]);
Close(Plik)
End; //Dyskwrit

{Procedura odczytuje z pliku "Nazwa.*" wyniki obliczeń z programu
SCRATONUR: N= liczba pomiarów, x= z, Y[1] = p, Y[2] = t}
Procedure DyskRead;
Var
k, l: Integer;
N1: Integer;
Nazwa: String[15];
Plik: File of Double;
Begin
Write('Podaj nazwe zbioru na dysku np. = C:\Silnik.10 '); Readln(Nazwa);
Nazwa:=Concat('C:\',Nazwa);
Assign(Plik,Nazwa);
Reset(Plik);
Read(Plik, A[0,0]);
N1:= Round(A[0,0]);
For k:=1 To N1 Do
For l:=0 To 2 Do
Read(Plik,A[k,l]);
Close(Plik);
ClrScr;
Writeln(#10,'Liczba pomiarów N= ',N1,#10,#13);
For k:=0 To N1 Do Writeln('z= ',A[k,0],' p=',A[k,1],' t=',A[k,1]);
End;

edytowany 2x, ostatnio: Zbigniew Jachimowicz, 2019-01-07 11:40

Pozostało 580 znaków

2019-01-07 12:31
1

utwórz folder na dysku C i spróbuj w nim utworzyć swój plik. Windows 10 nie lubi gdy tworzy się pliki w ścieżce C:\

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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