Jaki indeks ma pierwszy element tablicy?

0

mam taką tablicę:

const
 ObecnoscVal: array [1..4] of string = ('',' obecny','częściowo','nieobecny');

i dadaję elementy co ComboBoxa

cmbObecnosc.Items.Clear;
  for i:= 2 to high(ObecnoscVal) do begin
    cmbObecnosc.Items.add(ObecnoscVal[i]);
  end;

Zauważcie że pomijam pierwszy pusty element

problem w tym, że teraz w Combo mam :

częściowo
nieobecny
nieobecny

a gdy pętlę zacznę od 1 to wtedy w combo mam prawidłowe 3 wpisy.

Zawsze myślałem że pierwszy element jest taki jak w deklaracji tablicy (czyli u mnie 1) dlatego zacząłem pętlę od 2 żeby pominąć pusty element.
Nie jest tak?

0

w pętli numerujesz tak jak zadeklarowałeś tablicę, czyli jak chcesz pominąć pierwsza pozycję zaczynasz pętle od 2.
Oczywiście do combobox wpadają elementy 2, 3 i 4.
Nawet sprawdziłem i wszystko działa.

pokaż albo cały unit albo sam sprawdź czy nie masz jakiejś procedury która może coś mieszać w comboboxie

0

jak sprawdzam Low(ObecnoscVal) i High(ObecnoscVal) to mam 1 i 4. Czyli dobrze.
ale coś mi nie pasuje ponieważ ObecnoscVal[2] = 'częściowo' a powinien być 'obecny'

i jeszcze jak sprawdzam ObecnoscVal[0] to mam błąd, bo nie ma takiego elementu, ale jak sprawdzam ObecnoscVal[1] to mam 'obecny'
Tak jakby zupełnie nie brał pod uwagę tego pustego elementu. Czyżby kompilator usuwał pusty element?

0

nic nie usuwa, ustaw breakpointa na początku pętli i sprawdź krok po kroku co dzieje się ze zmiennymi. Tutaj nie ma cudów.

3

Spróbuj tę pętlę:

for i:= 2 to high(ObecnoscVal) do
  cmbObecnosc.Items.add(ObecnoscVal[i]);

zamienić na taką:

for i := Succ(Low(ObecnoscVal)) to High(ObecnoscVal) do
  WriteLn(ObecnoscVal[i]);

I zobacz co dostaniesz na wyjściu — powinny się pojawić trzy niepuste ciągi.

BTW: dlaczego indeksujesz macierz od 1, a nie od 0?

1

Ludzie zaczynają liczyć od jednego, ale w programowaniu jest prosty wzór matematyczny, który określa położenie każdego elementu w tablicy, adres tablicy + index * wielkość elementu, w takim wypadku, żeby otrzymać sam adres czyli pierwszy element, to index musi zaczynać od 0.

Znając wzór będzie ci łatwo zapamiętać dlaczego tak się to numeruje od zera.

1
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    cmbObecnosc: TComboBox;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  const
  ObecnoscVal: array [1..3] of string = ('obecny','częściowo','nieobecny');

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
i : integer;
begin
  cmbObecnosc.Clear;
  cmbObecnosc.Sorted := False;

  for i := 1 to high(ObecnoscVal) do
  cmbObecnosc.Items.add(ObecnoscVal[i]);
end;

end.

lub

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    cmbObecnosc: TComboBox;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  const
  ObecnoscVal: array [-1..1] of string = ('obecny','częściowo','nieobecny');

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
i : integer;
begin
  cmbObecnosc.Clear;
  cmbObecnosc.Sorted := False;

  for i := -1 to high(ObecnoscVal) do
  cmbObecnosc.Items.add(ObecnoscVal[i]);
end;

end.


lub

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    cmbObecnosc: TComboBox;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  const
  ObecnoscVal: array [0..2] of string = ('obecny','częściowo','nieobecny');

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
i : integer;
begin
  cmbObecnosc.Clear;
  cmbObecnosc.Sorted := False; // warunek konieczny do odzwierciedlenia to co jest w tablicy znajdzie się w  kontrolce ComboBox. Bez zniekształceń w sortowaniu !!! Realność tablicy w stosunku do kontrolki odczytu!!!

  for i := 0 to high(ObecnoscVal) do
  cmbObecnosc.Items.add(ObecnoscVal[i]);
end;

end.

W ostatnim przypadku tablica jak i ComboBox.items ustawiony jest od 0. To ułatwia wzajemne pisanie kodu w tablicy i indeksie 0 w stosunku do kontrolek takich jak ListBox, ComboBox Co oznacza owe łatwiejsze pisanie kodu? Po prostu, że nie myślisz na przeliczaniu od minus i przejścia poprzez "0' Jeśli natomiast w tablicy masz zaczęty index od 1 to w kontrolce Combobox musisz mieć, i = 1 Pozdrawiam serdecznie.

1

@Szalony Programista: wszystko byłoby fajnie gdyby nie stringi. Tam niestety numerujemy elementy od jedynki.

2
robertz68 napisał(a):

@Szalony Programista: wszystko byłoby fajnie gdyby nie stringi. Tam niestety numerujemy elementy od jedynki.

Nie wiem jak w Delphi (bo nie używam), ale we Free Pascalu to nie jest do końca prawda. Bo o ile normalne ciągi znaków faktycznie są indeksowane od 1 (co jest efektem wstecznej kompatybilności z typem ShortString), tak helpery stringów mają metody, które wykorzystują indeksowanie od 0.

Niezłe cyrki potrafią powstać w kodzie, gdy się jeszcze tego nie wie. :D

1

Największy problem miałem z utworzeniem tablicy do obliczania numerów kombinacji LOTTO (Duży Lotek). Stworzyłem ją od jedynki działa pięknie.

const
  Tablica : array[1..990] of String = (
    '178364','341549','490544','626295','749705','861635','962905','1054295','1136546','1210361',
    '1276406','1335311','1387671','1434047','1474967','1510927','1542392','1569797','1593548','1614023',
    '1631573','1646523','1659173','1669799','1678654','1685969','1691954','1696799','1700675','1703735',
    '1706115','1707935','1709300','1710301','1711016','1711511','1711841','1712051','1712177','1712247',
    '1712282','1712297','1712302','1712303','1875488','2024483','2160234','2283644','2395574','2496844',
    '2588234','2670485','2744300','2810345','2869250','2921610','2967986','3008906','3044866','3076331',
    '3103736','3127487','3147962','3165512','3180462','3193112','3203738','3212593','3219908','3225893',
    '3230738','3234614','3237674','3240054','3241874','3243239','3244240','3244955','3245450','3245780',
    '3245990','3246116','3246186','3246221','3246236','3246241','3246242','3395237','3530988','3654398',
    '3766328','3867598','3958988','4041239','4115054','4181099','4240004','4292364','4338740','4379660',
    '4415620','4447085','4474490','4498241','4518716','4536266','4551216','4563866','4574492','4583347',
    '4590662','4596647','4601492','4605368','4608428','4610808','4612628','4613993','4614994','4615709',
    '4616204','4616534','4616744','4616870','4616940','4616975','4616990','4616995','4616996','4752747',
    '4876157','4988087','5089357','5180747','5262998','5336813','5402858','5461763','5514123','5560499',
    '5601419','5637379','5668844','5696249','5720000','5740475','5758025','5772975','5785625','5796251',
    '5805106','5812421','5818406','5823251','5827127','5830187','5832567','5834387','5835752','5836753',
    '5837468','5837963','5838293','5838503','5838629','5838699','5838734','5838749','5838754','5838755',
    '5962165','6074095','6175365','6266755','6349006','6422821','6488866','6547771','6600131','6646507',
    '6687427','6723387','6754852','6782257','6806008','6826483','6844033','6858983','6871633','6882259',
    '6891114','6898429','6904414','6909259','6913135','6916195','6918575','6920395','6921760','6922761',
    '6923476','6923971','6924301','6924511','6924637','6924707','6924742','6924757','6924762','6924763',
    '7036693','7137963','7229353','7311604','7385419','7451464','7510369','7562729','7609105','7650025',
    '7685985','7717450','7744855','7768606','7789081','7806631','7821581','7834231','7844857','7853712',
    '7861027','7867012','7871857','7875733','7878793','7881173','7882993','7884358','7885359','7886074',
    '7886569','7886899','7887109','7887235','7887305','7887340','7887355','7887360','7887361','7988631',
    '8080021','8162272','8236087','8302132','8361037','8413397','8459773','8500693','8536653','8568118',
    '8595523','8619274','8639749','8657299','8672249','8684899','8695525','8704380','8711695','8717680',
    '8722525','8726401','8729461','8731841','8733661','8735026','8736027','8736742','8737237','8737567',
    '8737777','8737903','8737973','8738008','8738023','8738028','8738029','8829419','8911670','8985485',
    '9051530','9110435','9162795','9209171','9250091','9286051','9317516','9344921','9368672','9389147',
    '9406697','9421647','9434297','9444923','9453778','9461093','9467078','9471923','9475799','9478859',
    '9481239','9483059','9484424','9485425','9486140','9486635','9486965','9487175','9487301','9487371',
    '9487406','9487421','9487426','9487427','9569678','9643493','9709538','9768443','9820803','9867179',
    '9908099','9944059','9975524','10002929','10026680','10047155','10064705','10079655','10092305','10102931',
    '10111786','10119101','10125086','10129931','10133807','10136867','10139247','10141067','10142432','10143433',
    '10144148','10144643','10144973','10145183','10145309','10145379','10145414','10145429','10145434','10145435',
    '10219250','10285295','10344200','10396560','10442936','10483856','10519816','10551281','10578686','10602437',
    '10622912','10640462','10655412','10668062','10678688','10687543','10694858','10700843','10705688','10709564',
    '10712624','10715004','10716824','10718189','10719190','10719905','10720400','10720730','10720940','10721066',
    '10721136','10721171','10721186','10721191','10721192','10787237','10846142','10898502','10944878','10985798',
    '11021758','11053223','11080628','11104379','11124854','11142404','11157354','11170004','11180630','11189485',
    '11196800','11202785','11207630','11211506','11214566','11216946','11218766','11220131','11221132','11221847',
    '11222342','11222672','11222882','11223008','11223078','11223113','11223128','11223133','11223134','11282039',
    '11334399','11380775','11421695','11457655','11489120','11516525','11540276','11560751','11578301','11593251',
    '11605901','11616527','11625382','11632697','11638682','11643527','11647403','11650463','11652843','11654663',
    '11656028','11657029','11657744','11658239','11658569','11658779','11658905','11658975','11659010','11659025',
    '11659030','11659031','11711391','11757767','11798687','11834647','11866112','11893517','11917268','11937743',
    '11955293','11970243','11982893','11993519','12002374','12009689','12015674','12020519','12024395','12027455',
    '12029835','12031655','12033020','12034021','12034736','12035231','12035561','12035771','12035897','12035967',
    '12036002','12036017','12036022','12036023','12082399','12123319','12159279','12190744','12218149','12241900',
    '12262375','12279925','12294875','12307525','12318151','12327006','12334321','12340306','12345151','12349027',
    '12352087','12354467','12356287','12357652','12358653','12359368','12359863','12360193','12360403','12360529',
    '12360599','12360634','12360649','12360654','12360655','12401575','12437535','12469000','12496405','12520156',
    '12540631','12558181','12573131','12585781','12596407','12605262','12612577','12618562','12623407','12627283',
    '12630343','12632723','12634543','12635908','12636909','12637624','12638119','12638449','12638659','12638785',
    '12638855','12638890','12638905','12638910','12638911','12674871','12706336','12733741','12757492','12777967',
    '12795517','12810467','12823117','12833743','12842598','12849913','12855898','12860743','12864619','12867679',
    '12870059','12871879','12873244','12874245','12874960','12875455','12875785','12875995','12876121','12876191',
    '12876226','12876241','12876246','12876247','12907712','12935117','12958868','12979343','12996893','13011843',
    '13024493','13035119','13043974','13051289','13057274','13062119','13065995','13069055','13071435','13073255',
    '13074620','13075621','13076336','13076831','13077161','13077371','13077497','13077567','13077602','13077617',
    '13077622','13077623','13105028','13128779','13149254','13166804','13181754','13194404','13205030','13213885',
    '13221200','13227185','13232030','13235906','13238966','13241346','13243166','13244531','13245532','13246247',
    '13246742','13247072','13247282','13247408','13247478','13247513','13247528','13247533','13247534','13271285',
    '13291760','13309310','13324260','13336910','13347536','13356391','13363706','13369691','13374536','13378412',
    '13381472','13383852','13385672','13387037','13388038','13388753','13389248','13389578','13389788','13389914',
    '13389984','13390019','13390034','13390039','13390040','13410515','13428065','13443015','13455665','13466291',
    '13475146','13482461','13488446','13493291','13497167','13500227','13502607','13504427','13505792','13506793',
    '13507508','13508003','13508333','13508543','13508669','13508739','13508774','13508789','13508794','13508795',
    '13526345','13541295','13553945','13564571','13573426','13580741','13586726','13591571','13595447','13598507',
    '13600887','13602707','13604072','13605073','13605788','13606283','13606613','13606823','13606949','13607019',
    '13607054','13607069','13607074','13607075','13622025','13634675','13645301','13654156','13661471','13667456',
    '13672301','13676177','13679237','13681617','13683437','13684802','13685803','13686518','13687013','13687343',
    '13687553','13687679','13687749','13687784','13687799','13687804','13687805','13700455','13711081','13719936',
    '13727251','13733236','13738081','13741957','13745017','13747397','13749217','13750582','13751583','13752298',
    '13752793','13753123','13753333','13753459','13753529','13753564','13753579','13753584','13753585','13764211',
    '13773066','13780381','13786366','13791211','13795087','13798147','13800527','13802347','13803712','13804713',
    '13805428','13805923','13806253','13806463','13806589','13806659','13806694','13806709','13806714','13806715',
    '13815570','13822885','13828870','13833715','13837591','13840651','13843031','13844851','13846216','13847217',
    '13847932','13848427','13848757','13848967','13849093','13849163','13849198','13849213','13849218','13849219',
    '13856534','13862519','13867364','13871240','13874300','13876680','13878500','13879865','13880866','13881581',
    '13882076','13882406','13882616','13882742','13882812','13882847','13882862','13882867','13882868','13888853',
    '13893698','13897574','13900634','13903014','13904834','13906199','13907200','13907915','13908410','13908740',
    '13908950','13909076','13909146','13909181','13909196','13909201','13909202','13914047','13917923','13920983',
    '13923363','13925183','13926548','13927549','13928264','13928759','13929089','13929299','13929425','13929495',
    '13929530','13929545','13929550','13929551','13933427','13936487','13938867','13940687','13942052','13943053',
    '13943768','13944263','13944593','13944803','13944929','13944999','13945034','13945049','13945054','13945055',
    '13948115','13950495','13952315','13953680','13954681','13955396','13955891','13956221','13956431','13956557',
    '13956627','13956662','13956677','13956682','13956683','13959063','13960883','13962248','13963249','13963964',
    '13964459','13964789','13964999','13965125','13965195','13965230','13965245','13965250','13965251','13967071',
    '13968436','13969437','13970152','13970647','13970977','13971187','13971313','13971383','13971418','13971433',
    '13971438','13971439','13972804','13973805','13974520','13975015','13975345','13975555','13975681','13975751',
    '13975786','13975801','13975806','13975807','13976808','13977523','13978018','13978348','13978558','13978684',
    '13978754','13978789','13978804','13978809','13978810','13979525','13980020','13980350','13980560','13980686',
    '13980756','13980791','13980806','13980811','13980812','13981307','13981637','13981847','13981973','13982043',
    '13982078','13982093','13982098','13982099','13982429','13982639','13982765','13982835','13982870','13982885',
    '13982890','13982891','13983101','13983227','13983297','13983332','13983347','13983352','13983353','13983479',
    '13983549','13983584','13983599','13983604','13983605','13983675','13983710','13983725','13983730','13983731',
    '13983766','13983781','13983786','13983787','13983802','13983807','13983808','13983813','13983814','13983815');

1

No i co ta tablica przedstawia? Oprócz problemu, jakim jest trzymanie liczb jako ciągów znaków. :|

1

W podsumowaniu
0 w tablicy a rozpoczęcie w ComboBox od 1

Naturalne indeksowanie:
0 0
1 1
2 2

Urojone indeksowanie:
0 1 obecny
1 2 częściowo
2 3 nieobecny
.. 4 nieobecny gdy ComboBox napotka taką właściwość powtórzy item dwa razy. Z reguły ostatni, czyli drugi index tablicy. Jest automatycznie dopisywany, gdyż jest indeksowanie po kolei jest wypełniany (zainteresowany)ComboBox, kiedy tablica kończy się jest dopisywany fałszywy item z przesunięciem a zarazem urojonym przekazem ostatniego elementu tablicy w stosunku do ComboBox (ignorancja) .

0

@robertz68 póki co autorowi chodziło o Index tablicy :-)

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    cmbObecnosc: TComboBox;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

  const
  ObecnoscVal: array [-999..-997] of string = ('obecny','częściowo','nieobecny');

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
i : integer;
begin
  cmbObecnosc.Clear;
  cmbObecnosc.Sorted := False;

  for i := -999 to high(ObecnoscVal) do
  cmbObecnosc.Items.add(ObecnoscVal[i]);

end;

end.
0
// Prosty test
procedure TForm1.BitBtn1Click(Sender: TObject);
var
test : string;
sl : TStringList;
begin
  sl := TStringList.Create;

  test := '4programmers'; // 12 gdy (test,0,1) lub (test,1,1) 

  sl.Add('copy(test,0,1)  = ' + copy(test,0,1)); // :-)
  sl.Add('copy(test,1,1)  = ' + copy(test,1,1)); // :-)
  sl.Add('copy(test,2,1)  = ' + copy(test,2,1));
  sl.Add('copy(test,3,1)  = ' + copy(test,3,1));
  sl.Add('copy(test,4,1)  = ' + copy(test,4,1));
  sl.Add('copy(test,5,1)  = ' + copy(test,5,1));
  sl.Add('copy(test,6,1)  = ' + copy(test,6,1));
  sl.Add('copy(test,7,1)  = ' + copy(test,7,1));
  sl.Add('copy(test,8,1)  = ' + copy(test,8,1));
  sl.Add('copy(test,9,1)  = ' + copy(test,9,1));
  sl.Add('copy(test,10,1) = ' + copy(test,10,1));
  sl.Add('copy(test,11,1) = ' + copy(test,11,1));
  sl.Add('copy(test,12,1) = ' + copy(test,12,1));

  ShowMessage(sl.Text+#13#10+' Znaków = '+inttostr(sl.count)); // 13

  sl.Free;
end;
0
var
Tab : array[0..2] of String;
sl : TStringList;
begin
  sl := TStringList.Create;

  sl.Add('taki');
  sl.Add('ja');
  sl.Add('sobie');

  Tab[0] := sl[0];
  Tab[1] := sl[1];
  Tab[2] := sl[2];

  ShowMessage(Tab[0]+' '+#13+Tab[1]+' '+#13+Tab[2]);

  sl.Free;
0

@Mariusz Bruniewski: ale nabijasz się ze mnie czy co? :)
w poprzednim przykładzie do stringlisty wpisałeś zwykły string i kopiowałeś z niego znaki (numerowane są od jedynki jak pisałem),
teraz do stringlisty wpisałeś 3 linie z wyrazami i odwołujesz się właśnie do nich. To dodatkowo dowód na to że linie w stringliście (jak i innych listach wizualnych jak i niewizualnych) numerowane są od zera.
Czyli dokładnie potwierdziłeś co napisałem :)

0

@robertz68 Aby nie zaśmiecać wątku. Nie ma reguły, jeśli chodzi o zwykły string przyjmuje albo 0 albo 1 jak go od początku liczyć. Jest jednak utrudnienie, gdy od 0 liczymy musimy pominąć 1 a następnie przeskoczyć do 2. Tak samo jak zastanawiano się, czy liczby pierwsze liczy się od 1. Jeśli chodzi o tablice o to co pytał autor postu przyjmuje trzy wartości -, 0 +

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