błąd podczas kompilacji w TMTP

błąd podczas kompilacji w TMTP
PP
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 47
0

witam.
Pojawił mi sie błąd podczas kompilowania programu
ms dos 32 bit protected mode.
Co to za błąd..?

Kompiluje w Tmt Pascalu

Kopiuj
uses crt;
var tab:array[1..20] of integer;
    i,licznik:byte;

begin
   randomize;
     repeat
     i:= random(10);
     writeln(tab[i]);
     inc(licznik);
     until licznik=10;
     readln;
end.
Endrju
  • Rejestracja: dni
  • Ostatnio: dni
0

To nie jest żaden błąd. Program "działa": http://ideone.com/5EBYf

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12270
0

To, co Ci wyskakuje to nie jest błąd kompilacji, program powinien działać bez większych problemów; Mniejszym problemem jest losowanie liczb, w którym może wystąpić błąd; Zwróć uwagę na deklaracje macierzy:

Kopiuj
var tab:array[1..20] of integer;

a losowanie indeksu elementu w macierzy:

Kopiuj
i:= random(10);

Zadeklarowana macierz przechowuje elementy indeksowane w przedziale 1 .. 20, a Ty losujesz z przedziału 0 .. 9; Nie dość, że jak generator wylosuje 0 to wyjdziesz poza zakres macierzy, to jeszcze nigdy nie wyświetlisz wartości elementów z przedziału 10 .. 20; Nie wiem, czy takie jest założenie programu, czy nie, więc nie będę Cię poprawiał; W każdym razie aby można było wylosować indeks każdego elementu z macierzy, powinieneś to zrobić w ten sposób:

Kopiuj
var
  Tab: array [0 .. 19] of Integer;

{...}

I := Random(20);

i będzie wszystko działać;

Kolejnym problemem jest brak inicjacji zmiennej licznik - przed pętlą przypisz jej wartość początkową, np. 0 (powinieneś dostać ostrzeżenie o tym);

Czyli Twój program mógłby wyglądać tak:

Kopiuj
uses
  Crt;
var
  Tab: array [0 .. 19] of Integer;
  I, Licznik: Byte;
begin
  Randomize;
  Licznik := 0;

  repeat
    I := Random(20);
    WriteLn(Tab[I]);

    Inc(Licznik);
  until Licznik = 10;

  ReadLn;
end.

dzięki temu żadnego błędu nie uświadczysz; Popracuj nad formatowaniem kodu - styl wielbłądzi się kłania;

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
0

Po poprawieni błędów i bezsensowności powinno być tak:

Kopiuj
const Tab:array [0 .. 19] of Integer = (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20);
var  I:Byte;
begin
  Randomize;
  for I:=0 to 10 do WriteLn(Tab[Random(20)]);
  ReadLn;
end.
PP
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 47
0

Dobra ale nie chodziło mi o to by mi tu poprawiać kod..? Tylko powiedzcie co mam zrobić, żeby ta informacja sie nie pojawiała.. Bo jak naciskam kompilacje to wyskakuje to coś.. :D i program sie nie włącza..

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
0

ProProgramer, czy na moją wersję twój kompilator reaguje tak samo?

PP
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 47
0

Mam jeszcze pytanko.. Dlaczego losują mi się same zera? skoro mam uruchomiony generator liczb losowych..?

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12270
0
ProProgramer napisał(a)

Dlaczego losują mi się same zera?

Twój stary kod wrzucony przez @Endrju na ideone na wyjściu dawał same zera; Nie zagłębiałem się w tamten kod, ale ten podany przez @_13th_Dragon działa w pełni pod Borland Delphi 7; Na FPC także powinien działać, więc zmień kompilator na jakiś sensowny i przetestuj;


Nie rozumiem dlaczego Ci nie działa... Jedyny bląd jaki mi wyszedł to Runtime Error 105 w BD7, ale nie dodałem klauzuli {$APPTYPE CONSOLE}; Poza tym sprawdziłem i działa w pełni; Oczywiście liczby często się powtarzają, ale nie ma przecież zaimplementowanego zabezpieczenia przed tym; Tak więc kod @_13th_Dragon działa jak należy; Z ciekawości przetestowałem archaiczny kompilator TP7 i także działa bez problemów; Oto działający kod:

Kopiuj
program Los;
uses
  Crt;
const
  aNum: array [0 .. 19] of Byte = (1,  2,  3,  4,  5,
                                   6,  7,  8,  9,  10,
                                   11, 12, 13, 14, 15,
                                   16, 17, 18, 19, 20);
var
  I: Byte;
begin
  ClrScr;
  Randomize;

  for I := 0 to 9 do
    WriteLn('Los nr ', I, ': ', aNum[Random(20)]);

  ReadLn;
end.

Przykładowe wyjście:

Kopiuj
Los nr 0: 13
Los nr 1: 4
Los nr 2: 15
Los nr 3: 2
Los nr 4: 5
Los nr 5: 18
Los nr 6: 2
Los nr 7: 14
Los nr 8: 17
Los nr 9: 3

U mnie wszystko gra, założe się, że pod FPC także wszystko będzie śmigać; Nie mam jednak zielonego pojęcia dlaczego u Ciebie są wciąż problemy...

PP
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 47
0
Kopiuj
uses crt;
var i:byte;
    tab:array[1..19] of byte;


procedure losuj();
var licznik:byte;
begin
ClrScr;
     i:=random(20);
     for licznik:=0 to 9 do
     writeln(tab[i]);

end;


begin

losuj();
readln;

end.

Co tu jeszcze jest źle, że mi dalej same zera losuje ?

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12270
0
ProProgramer napisał(a)

Co tu jeszcze jest źle, że mi dalej same zera losuje ?

Wskaż mi w kodzie linijkę, w której wypełniasz tablicę danymi; Poza tym co Ty robisz?

Kopiuj
     i:=random(20);
     for licznik:=0 to 9 do
     writeln(tab[i]);

Do czego to ma być? Raz losujesz liczbę a później 10 razy wypisujesz element z macierzy o wylosowanym indeksie... Choćbyś wypełnił tablicę jakimiś danymi to i tak powyższa pętla wypisze 10 razy tą samą liczbę... Inna sprawa to to, że nie uruchomiłeś generatora liczb pseudolosowych procedurą Randomize;

PP
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 47
0

Napisał by mi ktoś kilka zadań do rozwiązania z tablic..? Takich na moim poziomie (1TI). Z góry dzięki

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
0
  1. Użytkownik podaje ilość wierszy i kolumn, program wypełnia i wyświetla tablicę np dla wierszy - 4, kolumn - 5 :
Kopiuj
 1	 2	 3	 4	 5
14	15	16	17	 6
13	20	19	18	 7
12	11	10	 9	 8
  1. Dodawanie, Odejmowanie, Odwracanie, Mnożenie macierzy.
  2. Implementacja algorytmu węgierskiego - patrz w wikipedii

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.