Delphi - deklarowanie wielu etykiet

0

Jak zadeklarować np. 1000 etykiet w jakiś skrócony sposób
ja deklaruje je w ten sposób:

Label 1,2,3,4,5,6.............; //co jest troszkę uciążliwe wypisywać wszystko

czy da się jakąś tablice stworzyć?

0

et: array[1..1000] of TLabel

0
procedure TForm1.Button2Click(Sender: TObject);
label array[1..1000] of TLabel
begin
end;

Po słowie array się zatrzymuje 'Identifier or number expected but ARRAY found'

0

chodzi o etykiety do skakania po kodzie? :>

0

jeśli tak to po jaki *** komuś 1000 etykiet w jednej procedurze?? Po co w ogóle etykiety??

0

tak wywnioskowałem z tego kawałka kodu, ale autor sam nie uściślił ocb. Może ma jakieś przyzwyczajenia z asm? :-D

0

dokładnie chodzi o skakanie w kodzie potocznie funkcją goto;

dzięki temu zachowuje jakiś porządek w kodzie

0

Chyba żaden HLL nie jest asmem w którym się takich rzeczy używa... Weź kod przerób aby tego nie używać...

0
mgs_saladin napisał(a)

dzięki temu zachowuje jakiś porządek w kodzie
toś mnie rozbawił teraz

0

A co miałoby się znaleźć pod każdą z etykiet ?

Jeśli to ma być coś podobnego do tego:

case i of
   1: a := 2;
   2: a := 4;
   3: a := 6;
//...
end;

to zamień to na coś takiego

a := 2 * i;

Nie rozpatruj wszystkich przypadków tylko ułóż algorytm.

0
if (polas='abc') then begin goto 001; end;
if (polas='def') then begin goto 002; end;
if (polas='ghi') then begin goto 003; end;

001:
 Panel1.Caption:='abc';
 goto koniec;

002:
 Panel1.Caption:='def';
 goto koniec;

003:
 Panel1.Caption:='ghi';
 goto koniec;

no dla mnie to tak czytelnie wygląda mam wszystkie if’y przy sobie i mogę bez problemu operować na wartościach, w zasadzie mógł bym cały kod podpiąć obok if ale to juz się będzie zlewać bardzo... no dobrze przekonaliście mnie może i macie racje.

A co do pytania jest jakaś możliwość deklaracji wielu etykiet? Może na przyszłość się to przyda.

0

Na przyszlosc to lepiej zapomnij ze istnieje instrukcja goto. Wprowadza ona straszny balagan do kodu. Stosuj procedury, case i staraj sie tak projektowac algorytm zeby skoki byly zbedne.

0

oki dziękuje temat zamknięty

0
mgs_saladin napisał(a)
if (polas='abc') then begin goto 001; end;
if (polas='def') then begin goto 002; end;
if (polas='ghi') then begin goto 003; end;

001:
 Panel1.Caption:='abc';
 goto koniec;

002:
 Panel1.Caption:='def';
 goto koniec;

003:
 Panel1.Caption:='ghi';
 goto koniec;

Hehe :D , a nie lepszy byłby ten mega trudny algorytm:

Panel1.Caption := polas;

Co do goto - przydaje mi się tylko w jednym przypadku mianowicie do wychodzenia z zagnieżdżonych pęteli i switch'ów bez sprawdzania dodatkowych zbędnych warunków. Niestety na studiach żaden nauczyciel tego nie rozumie i jestem zmuszony powstrzymać się totalnie od goto. A nawet Bjarne Stroustrup o tym pisał.

0

@adf88: z wielu zagnieżdżonych pętli wyjdziesz rzucając i łapiąc gdzieś niżej wyjątek, albo robiąc exit z metody.

0

Oj oj oj dobrze widze ? Wyjątek ? Daj spokój.
exit owszem, jeśli tylko można. Czasem po wyjściu z zagnieżdżeń trzeba coś wykonać. Owszem, można pisać osobną funkjcę, czasem jednak nie pasuje, zawsze to doatkowy skok i przekazywanie parametrów.
goto używam baaardzo rzadko (ostatnio to był jakiś parser), ale używam.

0

Ja też się dziwie dlaczego tak się krytykuje Goto?
Napiszcie jak wykonać takie działania bez goto, żeby kod był w miarę czytelny:

Procedure JakasProcedura;
var
wynik : integer;
label start;
label znaleziony;
label wracaj;
label koniec;
Begin

start:
//Pętla obliczeń, gdzie dostajemy integer "wynik".

wracaj:
//Kolejna pętla obliczeń dająca inny "wynik"

if wynik > 2 then goto wracaj;
if wynik = 0 then goto start;
if wynik = 2 then goto znaleziony ;
if wynik = 1 then goto koniec ;


znaleziony:
//wykonaj odpowiednie operacje gdy sukces

koniec:
//wykonaj odpowiednie operacje kończące obliczenia

end;
0

mozesz uzyc do tego: repeat/until, case, if ...

0
entek napisał(a)

Ja też się dziwie dlaczego tak się krytykuje Goto?
Napiszcie jak wykonać takie działania bez goto, żeby kod był w miarę czytelny:
funkcje, procedury, KLASY - mówi Ci to coś :>

0
entek napisał(a)

Ja też się dziwie dlaczego tak się krytykuje Goto?

Widocznie zbyt słabo znasz historię i ewolucję programowania. Zajrzyj tu pod stosowny akapit: GoTo

0

Jakoś mnie to nie przekonuje. Równie dobrze można wywalić z assemblera bezwarunkowe instrukcje skoku typu "JMP" i zostawić same BREQ, BRNE itp.

Nigdy nie skakałem do środka pętli, chyba idiota by takie coś wymyślił!!!
Jeżeli ktoś potrzebuje czytelny kod, to nie ma czasu bawić się w zawiłości Repeat, until, break, continue - za pomocą label i goto można zrobić, to co się chce czasami o wiele szybciej.

Zaś programowaniem bawię się od czasów ZX spectrum, gdzie GOTO w Basicu była jedną z częściej używanych instrukcji. [diabel]

0

Ja goto używam w jedynym przypadku w którym się przydaje, czyli przeskok w zagnieżdżonych pętlach, bo czasem jest potrzeba wyjść z takiej piątej zagnieżdżonej pętli i wskoczyć do powiedzmy drugiej w kolejności zagnieżdżenia :> goto tu jest chyba najlepszym rozwiązaniem

0

Entek, LLL (Low-level language) w to nie mieszaj...JMP w asmie to co innego jest. Tam nie ma pętli, case/switch ani ifów. W wysokopoziomowych językach goto się nie używa. A o BASICu tu nie gadaj bo to jest wyjątek jeden.

0

Entek, to co piszesz świadczy o Twojej niewiedzy lub ignorancji.

0
entek napisał(a)

Nigdy nie skakałem do środka pętli, chyba idiota by takie coś wymyślił!!!

Byś się zdziwił.. wystarczy przez nieuwagę zastosować programowanie metodą Copy'ego-Paste'a (kopiuj, wklej ;) ) i przenieść tak kawałek kodu z etykietą. Zastosowanie dedykowanych konstrukcji pozwoli kompilatorowi stwierdzić, że struktura kodu jest nieprawidłowa, a skok do etykiety będzie zawsze poprawny.

Używanie GoTo współcześnie jest zaliczane do tzw. niebezpiecznych technik programowania; po to język daje Ci narzędzia kontroli poprawności kodu, by nie dopuścić do powstawania błędów. Równie dobrze mógłbyś wyrzucić silne typowanie w językach, typowanie wskaźników czy właśnie konstrukcje logiczne, pozwalające tworzyć poprawny kod.

Odrzucanie tych możliwości jest zaiste ignorancją i niezrozumieniem idei programowania wysokopoziomowego.

0
Szczawik napisał(a)
entek napisał(a)

Nigdy nie skakałem do środka pętli, chyba idiota by takie coś wymyślił!!!

Byś się zdziwił.. wystarczy przez nieuwagę zastosować programowanie metodą Copy'ego-Paste'a (kopiuj, wklej ;) )

Moim zdaniem, wszystkie instrukcje źle użyte spowodują nieprawidłowe działanie aplikacji, mimo że kompilator nie pokaże błędu. To nie tylko jest cecha instrukcji
"goto".

Przykładem niech będzie wyjście z pętli typu break, lub exit, ostatecznie halt.
Mimo użycia w procedurze "try/finally", program skoczy zupełnie gdzie indziej niż powinien.

To nie instrukcja "Goto" jest błędna, ale jej używanie może powodować błędy - chyba się z tym zgodzicie?

Nie jestem ignorantem, naprawdę miałem kiedyś trudny problem i nie chcąc bawić się w zawiłości typu repeat/until gdzie trzeba było korzystać z wielu tablic i kilku algorytmów wyliczania specyficznej wartości; skorzystałem z Goto i rozwiązałem problem bez długiego kombinowania.

To, że wszyscy przestali używać Goto jakoś mnie nie przekonuje, że ta instrukcja jest niedobra. Również twierdzenia, że jest zła bo może być nieprawidłowo użyta, do mnie nie trafia.

To samo można powiedzieć o danych typu variant - są o wiele bardziej niebezpieczne, gdy się nieumiejętnie je użyje, ale jakoś nikt ich nie krytykuje, ciekawe dlaczego?

ps.

Nie tylko ja krytykuję tezę Dijkstra, z 1968roku, również inne osoby jak David R. Tribble
http://david.tribble.com/text/goto.html

0

Mylisz się. Goto jest złe. Goto jest niskopoziomowe. Jak ktoś mówi, że "woli goto od kombinowania z pętlami" to raczej programować nie potrafi. Takie konstrukcje od razu powinny nasuwać się na myśl, bez żadnego kombinowania. To jest wyższy poziom abstrakcji. Nawet jeśli wychodzimy z wielu zagnieżdżeń w większości przypadków da się to zrobić bez goto i bez dodatkowych narzutów. Przykład:

procedure ...
begin
  for i := 1 to n do
  begin
    case ...
       ...: goto koniec;
       ...
    end;
    instrukcje1;
  end;
  label koniec;
  instrukcje2;
end;

Powyżej goto można zamienić na

instrukcje2;
exit;

albo

i := n-1;
continue;

Gorzej już w takim przypadku:

procedure ...
begin
  while true
  begin
    case ...
       ...: goto koniec;
       ...
    end;
    case ...
       ...: goto koniec;
       ...
    end;
    instrukcje1;
  end;
  label koniec;
  instrukcje2;
end;

Bez dodatkowych narzutów się nie obejdzie. Konieczny jest dodatkowy warunek sprawdzający koniec lub dodatkowa funkcja wykonująca 'instrukcje2'. Jeśli jednak nie chodzi o super szybkość to warto poświęcić ten dodatkowy narzut, aby kod był czytelny.

0

Wszystko zalezy od sposobu myslenia. Ja nigdy nie uzylem/uzywalem GoTo. po prostu zawsze nasuwa mi sie inne rozwiazanie (petla, zmienna logiczna, itd.). Wszystko jest dla ludzi, GoTo tez.

0
WIktorDelphi napisał(a)

Wszystko zalezy od sposobu myslenia.
Nie. Sposób myślenia jest taki sam. Różny jest poziom abstrakcji.

0

No to zadanko, jak to zrobić bez Goto:

int parse()
{
    Token   tok;

reading:
    tok = gettoken();
    if (tok == END)
        return ACCEPT;
shifting:
    if (shift(tok))
        goto reading;
reducing:
    if (reduce(tok))
        goto shifting;
    return ERROR;
}

Nie uważam, że powinno się używać Goto na co dzień; dla mnie jest ta instrukcja ostatnią deską ratunku, jak przerabiam kod i nie mam czasu na zawiłe przerabianie pętli while, repat itp

Po prostu dobrze jest ją znać, a nie od razu spisywać na straty bo jakiś gościu w 1968r tak sobie wymyślił. Jak już wspominałem nie wszyscy zgadzają się panem Edsger-em W. Dijkstra i długo tak będzie.

Naprawdę polecam tekst: http://david.tribble.com/text/goto.html

{---------------------------------------------------------------------------------------------------}

adf88 napisał(a)
WIktorDelphi napisał(a)

Wszystko zalezy od sposobu myslenia.
Nie. Sposób myślenia jest taki sam. Różny jest poziom abstrakcji.

Moim pierwszym językiem był assembler i dla mnie normalne jest wychodzenie z pętli skokami bezwarunkowym.
Pewnie nadal przy używaniu języka wyższego poziomu jakim jest pascal, używam myślenia jak przy nisko poziomowym assemblerze - nic na to nie poradzę. Jeśli ktoś nabedzie pewne nawyki, juz nigdy od nich nie odejdzie.

//jakas tam petla 
loc_1:					
		ld	r16, Z+
		call	procedura1		
		cpi	r30, 0xA	 
		brne	loc_1           ; skok warunkowy
		rjmp	loc_0           ; <--- tu skok bezwarunkowy na początek programu

loc_2:
                ldi	r20, 0x28
		ldi	r16, 4
		call	procedura2
		rjmp	loc_18         ; <--- a tu skok bezwarunkowy w inne miejsce

Po prostu w assemblerze nie da programowac bez skoków bezwarunkowych, bynajmniej ja bym nie potrafił.
No ale skoro twierdzicie, że jestem ignorantem i się nie znam - trudno, nie będę polemizował i temat uważam za wyczerpany.

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