Czy można używać zmiennych w tablicy jako numer indeksu?

0

Witam,
próbuję użyć tablicy w pętli (for), ale cały czas pokazuje mi błąd na zmiennej I i nie wiem czy po prostu ja robię coś źle czy nie można tak w delphi?

var  I : Integer;

  for I := 1 to 10 do
     tablica[I]:=I;

Bardzo proszę o pomoc.

0

JAKI BŁĄD???

0

Jak najbardziej można tak wykorzystać pętlę for, żeby zmienna sterująca była jednocześnie indeksem tablicy.
Natomiast odnośnie Twojego problemu - podaj odpowiedź na trzy poniższe pytania, bo na razie ciężko coś więcej powiedzieć:

1) pokaz, w jaki sposób została zadeklarowana tablica
2) napisz, jaki błąd się pojawia. Myślę, że mając go będziemy mogli coś więcej powiedzieć. Może on wynikać z wielu rzeczy - może tablica nie jest typu integer, a może ma inny rozmiar i w pętli odwołujesz się do elementów poza jej zakresem
oraz
3) czy ten błąd pojawia się podczas kompilacji, czy dopiero po uruchomieniu?

0

Dodałem w załączniku

2

po pierwsze - tablicę masz zadeklarowaną jako array[0..9] of string. Oznacza to, że składa się z 10 elementów, ale są one typu string czyli tekstowego. Poza tym numeracja zaczyna się od zera, a kończy na 9.
Ty natomiast starasz się po pierwsze pisać do indeksów od 1 do 10, co oznacza, że ostatni indeks do którego się odwołujesz zwyczajnie nie istnieje, a po drugie - chcesz do tablicy tekstowej zapisać wartości liczbowe.

Najpierw - uporządkuj te indeksy i zrób tak, żeby deklaracja tablicy pokrywała się z pętlą - obecnie w jednym miejscu masz 0-9, a w drugim 1-10.
A po drugie - albo zmień typ tablicy na integer, albo skorzystaj z funkcji, która przerobi liczbę na łańcuch (np. inttostr) i dopiero po takiej konwersji zapisz ją do tablicy.

Tak w ogóle to widzę, że pętla for w pierwszym poście oraz na załączonych zrzutach ekranu to są inne pętle, w związku z czym ciężko mi teraz dać konkretną poradę, bo pierwszy post oraz ostatni zawierają różne treści i nie wiem, do której mam się odnosić i poprawiać. Napisz może co chcesz osiągnąć i co ten program ma robić, to będzie łatwiej Ci pomóc. Zwłaszcza, że widzę parę innych błędów/problemów w Twoim kodzie, ale o tym będzie trochę późnej ;)

I ostatnia prośba - jakbyś mógł kod zamieszczać w treści posta a nie jako obrazki - będzie czytelniej.

0

Program ma podliczać punktacje formuły 1. Czyli za 1 miejsce 20 punktów i tak dalej. Zrobiłem 10 editów, które odpowiadają drużyną (jest ich 10), użyłem fora dlatego, że z założenia maja być tylko 5 okrążeń i na końcu if który ma sprawdzać czy zmienna przypisana do edita jest równa jeden, dwa itd. do 10ciu. I stoję na etapie takim:
P.S Skrypt sie zmienił bo w między czasie go modyfikowałem

unit unit6;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit10: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Edit7: TEdit;
    Edit8: TEdit;
    Edit9: TEdit;
    procedure Button1Click(Sender: TObject);
  private

  public

  end;

var
  Form1: TForm1;
var
  Tablica : array[0..9] of string;
var a, b, c, d, e, f, g, h, i, j :String;

implementation

{$R *.lfm}

procedure TForm1.Button1Click(Sender: TObject);
           var n,o,s,r,p,w,u,x,y,z:real;
           var m : integer;
begin

     Tablica[0] := a;
     Tablica[1] := b;
     Tablica[2] := c;
     Tablica[3] := d;
     Tablica[4] := e;
     Tablica[5] := f;
     Tablica[6] := g;
     Tablica[7] := h;
     Tablica[8] := i;
     Tablica[9] := j;
     n:=StrToint(Edit1.text);
     o:=StrToint(Edit2.text);
     s:=StrToint(Edit3.text);
     r:=StrToint(Edit4.text);
     p:=StrToint(Edit5.text);
     w:=StrToint(Edit6.text);
     u:=StrToint(Edit7.text);
     x:=StrToint(Edit8.text);
     y:=StrToint(Edit9.text);
     z:=StrToint(Edit10.text);
     for m:= 1 to 5 do
       if n == 1 Tablica[0]:=20+a;
       if n == 2 Tablica[0]:=18+a;

end;

end.
2
Tablica[0] := a;
Tablica[1] := b;
Tablica[2] := c;
Tablica[3] := d;
Tablica[4] := e;
Tablica[5] := f;
Tablica[6] := g;
Tablica[7] := h;
Tablica[8] := i;
Tablica[9] := j;

Przypisujesz do tablicy wartości tych zmiennych, a nawet nie nadałeś im początkowej wartości. Jako że zmienne od a do j są globalne, to ich wartości są inicjalizowane pustymi ciągami znaków. Więc do każdej komórki tablicy i tak podajesz puste wartości.

n:=StrToint(Edit1.text);
o:=StrToint(Edit2.text);
s:=StrToint(Edit3.text);
r:=StrToint(Edit4.text);
p:=StrToint(Edit5.text);
w:=StrToint(Edit6.text);
u:=StrToint(Edit7.text);
x:=StrToint(Edit8.text);
y:=StrToint(Edit9.text);
z:=StrToint(Edit10.text);

Zmienne od n do z są typu Real, czyli zmiennoprzecinkowego, a Ty próbujesz do nich wpisać liczby całkowite. Zamiast StrToInt użyj StrToFloat.

damianmajor987 napisał(a):

P.S Skrypt sie zmienił bo w między czasie go modyfikowałem

To nie jest skrypt – te pisze się w językach skryptowych, do których Delphi się nie zalicza.

0

Dziękuję bardzo za wszelkiej maści wskazówki mój błąd odnośnie skryptu wziął się stąd, że przygodę z programowaniem zacząłem z językami skryptowymi i dlatego ciężko mi jest się przestawić zwłaszcza na deklarowanie typu zmiennej. Jesteście mi w stanie powiedzieć jeszcze jak zrobić w if'ie, że jeżeli coś = coś to zrób tamto, bo dwa równa się nie działają ?

1

Bo w przeciwieństwie do innych języków, dialekty Pascala wykorzystują operator = jak pan bug przykazał do porównania operandów, a nie do przypisania.

if cos = cos then
  zrob_cos;

Zacznij może od jakiegoś kursu, bo masz poważne braki z zakresu absolutnych podstaw. W razie czego tutaj jest dokumentacja, w której znajdziesz wszystko czego potrzebujesz.

0

No i pytanie - czy teraz już wiesz, jak osiągnąć to, co chciałeś, czy jeszcze nadal masz problem?
Wczoraj poszedłem spać, ale widzę, że temat ładnie pociągnął dalej @furious programming. Jakby co to śmiało pisz :)

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