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

Odpowiedz Nowy wątek
2018-12-03 22:49
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.

edytowany 1x, ostatnio: furious programming, 2018-12-04 00:15

Pozostało 580 znaków

2018-12-03 23:13
0

JAKI BŁĄD???


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.

Pozostało 580 znaków

2018-12-03 23:24
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?


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, 2018-12-03 23:25

Pozostało 580 znaków

2018-12-03 23:47
0

Dodałem w załączniku

Pozostało 580 znaków

2018-12-03 23:54
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.


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, 2018-12-04 00:05

Pozostało 580 znaków

2018-12-04 00:07
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.
edytowany 1x, ostatnio: furious programming, 2018-12-04 00:17

Pozostało 580 znaków

2018-12-04 00:22
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.


Pozostało 580 znaków

2018-12-04 00:35
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ą ?

Pozostało 580 znaków

2018-12-04 00:41
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.


edytowany 2x, ostatnio: furious programming, 2018-12-04 00:48

Pozostało 580 znaków

2018-12-04 08:40
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 :)


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, 2018-12-04 08:41

Pozostało 580 znaków

2018-12-04 13:23
1

Takich rzeczy jak w tym programie się nie robi – czyli deklarowania mnóstwa zmiennych pomocniczych, w dodatku globalnych i o nic nie mówiących, jednoliterowych identyfikatorach. Po to są tablice, listy, kolejki i inne indeksowane kontenery, aby mieć jedną zmienną grupującą dla dowolnej liczby elementów.

Takich rzeczy jak to niżej też się nie robi:

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);

Tutaj powinno się zastosować metodę FindChildControl i na podstawie nazwy wyłapywać kontrolki w pętli, rzutować na określony typ końcowy (czyli TEdit) i na koniec konwertować tekst na liczbę (za pomocą ogólnych funkcji lub tych z helperów – dla zwiększenia czytelności).


edytowany 3x, ostatnio: furious programming, 2018-12-05 03:11
no m.in. to miałem na myśli pisząc kilka postów wyżej " widzę parę innych błędów/problemów w Twoim kodzie, ale o tym będzie trochę późnej ;)" - cerrato 2018-12-04 13:37
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); eeeeeeeeeee macarena - babubabu 2018-12-04 16:52

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