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-04 17:34
1

W jakim środowisku to piszesz? Delphi, Lazarus czy jeszcze coś innego?

Tak na szybko wrzuciłem to do Lazarusa. Całość się skompilowała bez jakichkolwiek problemów, ale program robi NIC. Po odpaleniu z poziomu IDE, pojawia się na jakąś sekundę okno z konsolą, które zaraz potem znika. Po odpaleniu ręcznie stworzonego exe'ka dostaję wynik jak na poniższym obrazku (nie ma nawet pytania o ścieżkę pliku):

screenshot-20190104173348.png


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

Pozostało 580 znaków

2019-01-04 18:25
0

Ponieważ obliczenia trwają bardzo krótko więc wrzuciłem linię 196(DyskWrit) i linię 207 (DyskRead) do komentarza i wtedy wyświetlone są dane które powinny być zapisane. na pliku.

Write('Podaj nazwe zbioru na dysku = '); Readln(Nazwa);
Nazwa:='C:\LAZARUS\PAPIEROS\Dane\'+Nazwa; Assign(Plik,Nazwa);
Rewrite(Plik);

edytowany 1x, ostatnio: Zbigniew Jachimowicz, 2019-01-04 18:32

Pozostało 580 znaków

2019-01-04 18:25
1

W procedurze zapisującej:

Procedure DyskWrit (N: Integer; A: Wek);
  Var
    Nazwa: String[36];
    Plik: File of Double;
  Begin
//      Readln;
    Write('Podaj nazwe zbioru na dysku = '); Readln(Nazwa);
    Nazwa:='C:\LAZARUS\PAPIEROS\Dane\'+Nazwa; Assign(Plik,Nazwa);
    Reset(Plik);
    A[0,0]:= N+0.0;
    Write(Plik,A[0,0],A[0,1],A[0,2]);
    For k:=1 To N Do
       For l:=0 To 2 Do
         Write(Plik,A[k,l]);
    Close(Plik)
  End; //Dyskwrit

używasz Reset(Plik), czyli otwierasz plik do odczytu.

w procedurze odczytującej:

Procedure DyskRead;
  Var
    k, l: Integer;
    N: Integer;
    Nazwa: String[30];
    Plik: File of Double;
  Begin
    Write('Podaj nazwe zbioru na dysku = '); Readln(Nazwa);
    Nazwa:='C:\LAZARUS\PAPIEROS\Dane\'+Nazwa; Assign(Plik,Nazwa);
    Rewrite(Plik);
    Read(Plik, A[0,0]);
    N:= Round(A[0,0]);
    For k:=1 To N Do
      For l:=0 To 2 Do
        Read(Plik,A[k,l]);
    Close(Plik); ClrScr;
//    Writeln(#10,'Liczba pomiarów N= ',N,#10,#13);
    For i:=0 To N Do Writeln('z= ',A[i,0],'  p=',A[i,1],'  t=',A[i,1]);

  End;

używasz Rewrite(Plik) czyli otwierasz plik do zapisu.

Reszty nie przeglądałem ale to chyba już załatwia twój problem.

Pozostało 580 znaków

2019-01-04 18:36
0
robertz68 napisał(a):

W procedurze zapisującej:

Procedure DyskWrit (N: Integer; A: Wek);
  Var
    Nazwa: String[36];
    Plik: File of Double;
  Begin
//      Readln;
    Write('Podaj nazwe zbioru na dysku = '); Readln(Nazwa);
    Nazwa:='C:\LAZARUS\PAPIEROS\Dane\'+Nazwa; Assign(Plik,Nazwa);
    Reset(Plik);
    A[0,0]:= N+0.0;
    Write(Plik,A[0,0],A[0,1],A[0,2]);
    For k:=1 To N Do
       For l:=0 To 2 Do
         Write(Plik,A[k,l]);
    Close(Plik)
  End; //Dyskwrit

używasz Reset(Plik), czyli otwierasz plik do odczytu.

w procedurze odczytującej:

Procedure DyskRead;
  Var
    k, l: Integer;
    N: Integer;
    Nazwa: String[30];
    Plik: File of Double;
  Begin
    Write('Podaj nazwe zbioru na dysku = '); Readln(Nazwa);
    Nazwa:='C:\LAZARUS\PAPIEROS\Dane\'+Nazwa; Assign(Plik,Nazwa);
    Rewrite(Plik);
    Read(Plik, A[0,0]);
    N:= Round(A[0,0]);
    For k:=1 To N Do
      For l:=0 To 2 Do
        Read(Plik,A[k,l]);
    Close(Plik); ClrScr;
//    Writeln(#10,'Liczba pomiarów N= ',N,#10,#13);
    For i:=0 To N Do Writeln('z= ',A[i,0],'  p=',A[i,1],'  t=',A[i,1]);

  End;

używasz Rewrite(Plik) czyli otwierasz plik do zapisu.

Reszty nie przeglądałem ale to chyba już załatwia twój problem.

Nic to nie daje a program dalej robi NIC jak napisał cerato

Pozostało 580 znaków

2019-01-06 01:36
1

Trzy sprawy:

1) tak, jak pisałem (oraz dałem screena), aplikacja na Win10 64-bit robi NIC. Nie wnikając dlaczego tak się dzieje, sprawdziłem przed chwilą na poczciwym Windowsie XP. Program się uruchamia i pyta o nazwę pliku.

2) po wpisaniu nazwy pliku wyskakuje błąd. Tutaj popieram to, co napisał wcześniej @robertz68 - jeśli masz procedurę o nazwie DyskWrit, która ma pisać do pliku, to nie możesz go otwierać przez reset, bo Reset - Open file for reading https://www.freepascal.org/docs-html/rtl/system/reset.html. Zmieniłem reset na rewrite ale ponownie wyskoczył (czego się zresztą spodziewałem) błąd.

3) zmieniłem podaną przez Ciebie ścieżkę/lokalizację pliku z "C:\LAZARUS\PAPIEROS\Dane\" na "C:\" i program zadziałał. Stworzył w katalogu głównym dysku C: jakieś pliki o podanej przeze mnie nazwie, miały one rozmiar większy od zera, więc zostały wypełnione jakimiś danymi.

Podsumowując - po poprawieniu błędów z pkt.2 aplikacja działa poprawnie. Możesz ewentualnie spróbować zapisać u siebie pliki wynikowe do katalogu głównego i sprawdzić, czy da to jakiś efekt.

Daj proszę znać, czy udało Ci się aplikację odpalić, czy nadal są problemy.


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 1x, ostatnio: cerrato, 2019-01-06 01:40

Pozostało 580 znaków

2019-01-06 09:50
0
    Nazwa:='C:\LAZARUS\PAPIEROS\Dane\'+Nazwa; Assign(Plik,Nazwa);
    Rewrite(Plik);
    Read(Plik, A[0,0]);

The rewrite procedure opens a file given by FileHandle for writing.
You must use AssignFile to assign a file to the FileHandle before using Reset.
If the file does not exist, it is created.
If the file already exists, the contents are lost, and new data is added to the start.

http://www.delphibasics.co.uk/RTL.asp?Name=rewrite

(AssignFile to to samo co Assign)

edytowany 1x, ostatnio: Azarien, 2019-01-06 10:24

Pozostało 580 znaków

2019-01-06 13:16
0

Witam
Zastosowałem się do wskazówek ale pojawił się niezrozumiały błąd w procedurze DyskWrit (linia 35). Zastosowałem 2 sposoby podstawienia, jest dalej błąd. Otwiera się okno Asemblera i wykonuje się kilka instrukcji i zakończenie programu (przy krokowym wykonaniu programu)

Mam Win10

edytowany 1x, ostatnio: Zbigniew Jachimowicz, 2019-01-06 17:06

Pozostało 580 znaków

2019-01-06 20:32
1

To może mieć jakiś związek z systemem. U mnie na XP działa OK, natomiast na Win10 64-bit (jak pisałem kilka postów wcześniej) robi totalne NIC, aczkolwiek może to wynikać równie dobrze z czegoś innego - np. antywirusa. Podeślę sobie tego samego EXE, który działał na XP i jutro przetestuję jego zachowanie w firmie.

A odnośnie błędu, o którym piszesz w ostatnim poście - fajnie, jakbyś napisał coś więcej, a nie jedynie "znowu jest błąd". Im więcej szczegółów, tym łatwiej coś wykombinować.


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

Pozostało 580 znaków

2019-01-07 09:49
0

A odnośnie błędu, o którym piszesz w ostatnim poście - fajnie, jakbyś napisał coś więcej, a nie jedynie "znowu jest błąd". Im więcej szczegółów, tym łatwiej coś wykombinować.

Więcej szczegółów:
Win10 64bit

Fragment procedury DyskWrit:
Write('Podaj nazwe zbioru na dysku np. = C:\Silnik.10 '); Readln(Nazwa);
Nazwa:='C:\'+Nazwa;
Assign(Plik,Nazwa);
Rewrite(Plik);
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;

edytowany 1x, ostatnio: Zbigniew Jachimowicz, 2019-01-07 09:55

Pozostało 580 znaków

2019-01-07 10:38
1

A do czego tam jest to + 0.0.? W Lazarusie nie można zapisać do zmiennej double wartości integer?
Odnośnie wcześniejszego problemu który chyba rozwiązał @cerrato to masz ustawiony na sztywno długości ścieżki do pliku a do tego jeszcze 2 różne długości. Raz Nazwa: String[36]; przy zapisie i Nazwa: String[30]; przy odczycie. Jeśli już chcesz ograniczać długość to dla konsoli maksymalna długość ścieżki to 260. I powinna ta wartość być taka sama dla zapisu i odczytu.

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