GoTo   zodpovězená otázka

VB.NET

Dobrý den,

Vytvářím program, který se za určitých podmínek musí opakovat. Program vybere náhodné číslo, podle něho vybere Label, a když se jeho text rovná TextBox46.Text, zkopíruje jeho text do TextBox28. Kromě toho udělá i jiné věci. Teď ale potřebuju, aby se program zopakoval, když se Label193.Text nerovná TextBox46.Text (aby vybral jiný Label). Zkoušel jsem to pomocí GoTo:

Line1:
        Dim kolekceNahodnychCisel As New System.Collections.Generic.List(Of Integer)
        Dim nahodneCislo As Integer
        Dim generatorNahodnychCisel As New Random
        nahodneCislo = generatorNahodnychCisel.Next(193, 208)
        While kolekceNahodnychCisel.Contains(nahodneCislo)
            nahodneCislo = generatorNahodnychCisel.Next(193, 208)
        End While
        kolekceNahodnychCisel.Add(nahodneCislo)

        If nahodneCislo = 193 Then
            If Label211.Text = TextBox46.Text Then
                TextBox28.Text = Label193.Text
                TextBox29.Text = Label209.Text
                TextBox30.Text = Label210.Text
                TextBox31.Text = Label211.Text
                If TextBox28.Text = Label193.Text Then
                    Label193.Text = "n"
                End If
                If TextBox29.Text = Label209.Text Then
                    Label209.Text = "n"
                End If
                If TextBox30.Text = Label210.Text Then
                    Label210.Text = "n"
                End If
                If TextBox31.Text = Label211.Text Then
                    Label211.Text = "n"
                End If
            Else
                GoTo Line1
            End If
        End If

ale nejde to. Prostě to nefunguje. Neprovede to příkaz GoTo Line1.

Mohl byste mi prosím Vás někdo poradit, jak tenhle problém vyřešit? Předem díky za odpověď.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Příkaz goto v této podobě funguje. Problém bude v kódu, který je, abych řekl pravdu, příšerný. Nedivte se, že tam je chyba. Máte 1000 labelů a 1000 textboxů s nic neříkajícími názvy.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

To je pravda. Přiznám se, že jsem se zamýšlel nad úpravou Vašeho kódu, ale nakonec jsem se v těch labelech ztratil.

Krom toho mi není až tak zřejmá požadovaná funkčnost.

Dále se mi nezdá moc programátorské, že se tím skokem na LINE1 vracíte až před deklarace proměnných - to je dost zbytečné.

Dále z ukázky není patrné, kde tento kód máte v rámci programu umístěn, takže Vám takto bude asi těžké poradit.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zaměřím-li se pouze na problém, který tazatel řeší, pak jde o opakovací cyklus, který nakonec tazatel používá.

Tedy pro tazatele:

Část kódu, který chcete opakovat uzavřete do opakovacího cyklu s podmínkou. Pro vyhodnocení podmínky si můžete nadefinovat proměnnou... např.:

  Dim Opakuj as Boolean = True
  While Opakuj
    ' váš kód
    ' vyhodnocení  potřeby opakování...
    ' splnil-li program potřebné, nastavíte:
    Opakuj = False  ' a opakovací cyklus skončí
  End While

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Promiňte, že píšu tak pozdě. Neměl jsem přístup k internetu. A děkuju za vaše odpovědi.

Z vašich odpovědí jsem pochopil, že nechápete na co ten program bude a jak má fungovat. Tento program má poskládat jeden hlavolam. Je to čtvercové pole rozdělené do šestnácti čtverečků, a šestnáct dílků, které se naskládají do pole. Každý dílek (čtvereček) má na každé své straně jedno číslo. Dílky se musí do pole poskládat tak, aby sousední strany dílků měly stejná čísla. Je to vlastně dvojrozměrné domino.

Čtvercové pole je utvořeno pomocí TextBoxů a dílky pomocí Labelů. Každé políčko je tvořeno čtyřmi TextBoxy a každý dílek čtyřmi Labely.

První dílek už je vložen. Generátor náhodných čísel vybere náhodné číslo od 193 do 208.

Line1:
        Dim kolekceNahodnychCisel As New System.Collections.Generic.List(Of Integer)
        Dim nahodneCislo As Integer
        Dim generatorNahodnychCisel As New Random
        nahodneCislo = generatorNahodnychCisel.Next(193, 208)
        While kolekceNahodnychCisel.Contains(nahodneCislo)
            nahodneCislo = generatorNahodnychCisel.Next(193, 208)
        End While
        kolekceNahodnychCisel.Add(nahodneCislo)


Podle něj se vybere Label. Tento Label a ostatní tři, které k němu patří (tzn. celý jeden dílek) se zkopírují (umístí) na určité TextBoxy (určité políčko), pokud se Label211.Text = TextBox46.Text (pokud tam dílek pasuje). Dejme tomu, že bylo vybráno číslo 193.

       If nahodneCislo = 193 Then
            If Label211.Text = TextBox46.Text Then
                TextBox28.Text = Label193.Text
                TextBox29.Text = Label209.Text
                TextBox30.Text = Label210.Text
                TextBox31.Text = Label211.Text

Prázdná políčka jsou označena "n". "Prázdné dílky" (Labely) musí být označeny také. To aby tento dílek neexistoval dvakrát.

                If TextBox28.Text = Label193.Text Then
                    Label193.Text = "n"
                End If
                If TextBox29.Text = Label209.Text Then
                    Label209.Text = "n"
                End If
                If TextBox30.Text = Label210.Text Then
                    Label210.Text = "n"
                End If
                If TextBox31.Text = Label211.Text Then
                    Label211.Text = "n"
                End If

Když tam dílek nepasuje, tak chci, aby se celý proces zopakoval. Vybere se jiné náhodné číslo, jiný Label a třeba tam ten jiný dílek bude pasovat. Když ne, zase se to zopakuje. To ale nefunguje.

            Else
                GoTo Line1
            End If
        End If


Když tam dílek pasovat bude, přejde se na další krok, který ještě nemám napsaný.

Myslím, že to, co mi poradil pan Renner, bude fungovat, ale nevím, jak to mám použít. Nevím, do jaké části programu to mám napsat.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Bohužel, možná jsem na to již příliš stár, leč Váš výklad mi toho moc neobjasnil. Ale budiž - hlavní je, že se ve svém programu orientujete sám (ta označení jednotlivých labelů a textboxů vznikla jak, mají nějakou zákonitost, nějak jste je vygeneroval nebo napsal otrocky ručně....) Takže se pokusím (bez vazby na skutečnou funkčnost) alespoň rozebrat Váš úryvek kódu (nečekejte ale, že Vám napíšu, kam co máte umístit, když z Vaší ukázky není zřejmé, kde to máte umístěno sám:

Takže ve Vašem příkladu deklarujete kolekci náhodných čísel:

Dim kolekceNahodnychCisel As New System.Collections.Generic.List(Of Integer)
Dim nahodneCislo As Integer
Dim generatorNahodnychCisel As New Random
nahodneCislo = generatorNahodnychCisel.Next(193, 208)

While kolekceNahodnychCisel.Contains(nahodneCislo)
    nahodneCislo = generatorNahodnychCisel.Next(193, 208)
End While

kolekceNahodnychCisel.Add(nahodneCislo)

Celkem je to jasné, až na jednu drobnost:

Vy se postupně snažíte naplnit tuto kolekci "různými" náhodnými čísly v rozsahu 193 - 207.

Ale kdy tu kolekci plníte?

Dle Vašeho příkladu postupujete takto:


' 1) nadeklarujete novou (čistou) kolekci int čísel:
Dim kolekceNahodnychCisel As New System.Collections.Generic.List(Of Integer)

Dim nahodneCislo As Integer
Dim generatorNahodnychCisel As New Random

' 2) zvolíte první náhodné int číslo v rozsahu 193 - 208:
nahodneCislo = generatorNahodnychCisel.Next(193, 208)

' pokud kolekce již toto číslo obsahuje, zkoušíte čísla jiná
' v našem případě kolekce nic neobsahuje,
' takže cyklus se přeskočí:
While kolekceNahodnychCisel.Contains(nahodneCislo)
    nahodneCislo = generatorNahodnychCisel.Next(193, 208)
End While

' nyní přidáte své číslo do kolekce
kolekceNahodnychCisel.Add(nahodneCislo)


If nahodneCislo = 193 Then
    ' pokud jsme se strefili do čísla 193, pak se provedou 
    ' Vaše různá přepsání
    ' ...
    
    If Label211.Text = TextBox46.Text Then
        ' pokud se navíc rovná label211 textboxu46
        ' provedu další přepisy
        ' ...
    Else
        ' pokud se label211 nerovná textboxu46
        ' chcete skočit úplně na začátek
        ' ještě před deklarace, takže jako první krok po tomto
        ' odskoku "vynulujete" kolekciNahodnychCisel...
        GoTo Line1
    End If
End If

' sem se dostanu POUZE v případě, že:
' BUĎ
' nahodneCislo = 193
' Label211.Text = TextBox46.Text 
' v tomto případě ale kolekceNahodnychCisel obsahuje číslo jediné a tím je 193 (k čemu to tam potom je?)

' NEBO
' nahodneCislo je různé od 193
' i v tomto případě kolekceNahodnychCisel obsahuje číslo jediné rovné hodnotě nahodneCislo

Bohužel z výše uvedeného mi skutečně uniká smysl, co tím básník chtěl říci.

Ač si nejsem jist, zdali Váš kód odpovídá Vašim představám, pokud bych chtěl na stejnou funkčnost napasovat to, co Vám poradil pan Renner, mohlo by to vypadat nějak takto:

Dim opakuj As Boolean = True
        While opakuj

            Dim kolekceNahodnychCisel As New System.Collections.Generic.List(Of Integer)
            Dim nahodneCislo As Integer
            Dim generatorNahodnychCisel As New Random
            nahodneCislo = generatorNahodnychCisel.Next(193, 208)
            While kolekceNahodnychCisel.Contains(nahodneCislo)
                nahodneCislo = generatorNahodnychCisel.Next(193, 208)
            End While
            kolekceNahodnychCisel.Add(nahodneCislo)

            If nahodneCislo = 193 Then
                If Label211.Text = TextBox46.Text Then
                    TextBox28.Text = Label193.Text
                    TextBox29.Text = Label209.Text
                    TextBox30.Text = Label210.Text
                    TextBox31.Text = Label211.Text
                    If TextBox28.Text = Label193.Text Then
                        Label193.Text = "n"
                    End If
                    If TextBox29.Text = Label209.Text Then
                        Label209.Text = "n"
                    End If
                    If TextBox30.Text = Label210.Text Then
                        Label210.Text = "n"
                    End If
                    If TextBox31.Text = Label211.Text Then
                        Label211.Text = "n"
                    End If
                    opakuj = False
                End If
            Else
                opakuj = False
            End If
        End While

nebo by se to dalo ještě trochu modifikovat:

While True

            Dim kolekceNahodnychCisel As New System.Collections.Generic.List(Of Integer)
            Dim nahodneCislo As Integer
            Dim generatorNahodnychCisel As New Random
            nahodneCislo = generatorNahodnychCisel.Next(193, 208)
            While kolekceNahodnychCisel.Contains(nahodneCislo)
                nahodneCislo = generatorNahodnychCisel.Next(193, 208)
            End While
            kolekceNahodnychCisel.Add(nahodneCislo)

            If nahodneCislo = 193 Then
                If Label211.Text = TextBox46.Text Then
                    TextBox28.Text = Label193.Text
                    TextBox29.Text = Label209.Text
                    TextBox30.Text = Label210.Text
                    TextBox31.Text = Label211.Text
                    If TextBox28.Text = Label193.Text Then
                        Label193.Text = "n"
                    End If
                    If TextBox29.Text = Label209.Text Then
                        Label209.Text = "n"
                    End If
                    If TextBox30.Text = Label210.Text Then
                        Label210.Text = "n"
                    End If
                    If TextBox31.Text = Label211.Text Then
                        Label211.Text = "n"
                    End If
                    Exit While
                End If
            Else
                Exit While
            End If
        End While

Samozřejmě neznám souvislosti, takže nemohu posoudit nezbytnost těch vnořených IFů, adt. atd., o nepochopení funkčnosti takovéhoto kódu z mé strany jsem již psal výše. Berte tyto ukázky proto jako mechanické nahrazení konstrukce GOTO konstrukcí za pomocí cyklu.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Díky, tohle by snad mohlo fungovat. Takhle jsem si to představoval. Bohužel nemám možnost si to teď vyzkoušet, ale v sobotu to vyzkouším a napíšu vám, jestli to funguje.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Soudíte správně "Z vašich odpovědí jsem pochopil, že nechápete na co ten program bude a jak má fungovat". Zkuste se, prosím, ptát na konkrétní věc a tu řešte. Měl jste problém a ten nazval GoTo. Řešení je snadné, místo GoTo dáte While. Nechtějte však, aby druhý chápal o co vám jde a co jste nenapsal. Opakovací cyklus je vám totiž k ničemu, když chcete dosáhnout, že nahodneCislo = 193, na to stačí jeden řádek:

Dim nahodneCislo as Integer = 193

Nemám v úmyslu tady hrát chytřejšího, ale vinou takových příspěvků se zde užitečné věci ztratí! Proto na marnost toho vašeho upozorňuji.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Pro usnadnění nápovědy si myslím, že se snaží řešit něco na tento způsob. Taky jsem si pohrával s myšlenkou něco ve VB vytvořil, ale zatím jen čerpám zkušenosti :)

frhttp://cz.eternityii.com/try-eternity2-o...

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback