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ć?
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ć?
et: array[1..1000] of TLabel
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'
chodzi o etykiety do skakania po kodzie? :>
jeśli tak to po jaki *** komuś 1000 etykiet w jednej procedurze?? Po co w ogóle etykiety??
tak wywnioskowałem z tego kawałka kodu, ale autor sam nie uściślił ocb. Może ma jakieś przyzwyczajenia z asm? :-D
dokładnie chodzi o skakanie w kodzie potocznie funkcją goto;
dzięki temu zachowuje jakiś porządek w kodzie
Chyba żaden HLL nie jest asmem w którym się takich rzeczy używa... Weź kod przerób aby tego nie używać...
mgs_saladin napisał(a)
dzięki temu zachowuje jakiś porządek w kodzie
toś mnie rozbawił teraz
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.
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.
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.
oki dziękuje temat zamknięty
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ł.
@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.
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.
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;
mozesz uzyc do tego: repeat/until, case, if ...
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ś :>
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
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]
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
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.
Entek, to co piszesz świadczy o Twojej niewiedzy lub ignorancji.
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.
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
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.
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.
WIktorDelphi napisał(a)
Wszystko zalezy od sposobu myslenia.
Nie. Sposób myślenia jest taki sam. Różny jest poziom abstrakcji.
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.