Diskuze: VB - Aplikace se sekne

C# .NET .NET (C# a Visual Basic) VB - Aplikace se sekne American English version English version

Avatar
MadaraCZech
Člen
Avatar
MadaraCZech:

Při spuštění jednoho konkrétního Formu se aplikace sekne, kód :

Public Class test

    Private Sub test_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim pocet As Integer

        Using zjisteni As New StreamReader("slovicka-cizi.txt")
            While Not zjisteni.EndOfStream
                pocet = pocet + 1
            End While
        End Using

        Dim nahoda As Integer = Int(Rnd() * pocet) + 1
        Dim cislo1 As Integer
        Dim cizislovo As String

        Using nahoda1 As New StreamReader("slovicka-cizi.txt")
            While Not nahoda1.EndOfStream()

                If cislo1 = nahoda Then

                    cizislovo = nahoda1.ReadLine
                    slovo_label.Text = cizislovo


                End If

                cislo1 = cislo1 + 1
            End While
        End Using

    End Sub
End Class
Odpovědět 1.2.2014 18:39
...
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na MadaraCZech
Jan Vargovský:

Si to odkrokuj kde se to zasekne ne?

 
Nahoru Odpovědět 1.2.2014 18:42
Avatar
MadaraCZech
Člen
Avatar
Odpovídá na Jan Vargovský
MadaraCZech:

Už při spuštění tohoto kódu se to sekne, hned po zapnutí.

Nahoru Odpovědět 1.2.2014 18:43
...
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na MadaraCZech
Jan Vargovský:

Hoď si na začátek metody break point a krokuj. Je nějaká metoda/instrukce u které se to zasekne. Pak zjistíš ten problém kde :)

 
Nahoru Odpovědět 1.2.2014 18:46
Avatar
petrph
Člen
Avatar
petrph:

Jenom tak z voleje asi vidím chybu. V té smyčce

  • While Not zjisteni.EndOf­Stream

    pocet = pocet + 1

    End While

    End Using*

ti asi chybí zjisteni.ReadLine, bez toho stojíš pořád na začátku souboru a jen se ti načítají čísla do pocet..

 
Nahoru Odpovědět  +1 1.2.2014 18:46
Avatar
Odpovídá na MadaraCZech
Michal Žůrek (misaz):

Zacyklí se ti to u prvního while. Ten kód je divný, proč to načítáš 2x?

Nahoru Odpovědět 1.2.2014 18:59
Nesnáším {}, proto se jim vyhýbám.
Avatar
MadaraCZech
Člen
Avatar
Odpovídá na petrph
MadaraCZech:

Tak to jsem opravil, ale pořád se mi to sekne

Nahoru Odpovědět 1.2.2014 18:59
...
Avatar
MadaraCZech
Člen
Avatar
Odpovídá na Michal Žůrek (misaz)
MadaraCZech:

Nejdřív zjistím, kolik tam mám slovíček a pak vygeneruji náhodné číslo. Když mám náhodné číslo, tak pak najdu řádek toho čísla a vypíšu ho.

Nahoru Odpovědět 1.2.2014 19:02
...
Avatar
Odpovídá na MadaraCZech
Michal Žůrek (misaz):

Ano, a kde se to sekne?

brekpoint si tam dáš kliknutím na šedý pruh před zdrojovým kódem.

Nahoru Odpovědět 1.2.2014 19:05
Nesnáším {}, proto se jim vyhýbám.
Avatar
MadaraCZech
Člen
Avatar
MadaraCZech:

Tak jinak, posílám celý projekt :D

Nahoru Odpovědět 1.2.2014 19:19
...
Avatar
Odpovídá na MadaraCZech
Michal Žůrek (misaz):

to se dělá tak, že si je načteš do slovníku, pak už manipuluješ jen se slovníkem. Slovníky jsou popsané myslím v tutorialu o OOP.

Nahoru Odpovědět  +1 1.2.2014 19:21
Nesnáším {}, proto se jim vyhýbám.
Avatar
MadaraCZech
Člen
Avatar
MadaraCZech:

Soubor :

Nahoru Odpovědět  -1 1.2.2014 19:25
...
Avatar
MadaraCZech
Člen
Avatar
Nahoru Odpovědět  -1 1.2.2014 19:30
...
Avatar
petrph
Člen
Avatar
Odpovídá na MadaraCZech
petrph:

Ale možná se ten program posunul k tomu dalšímu While Not nahoda1.EndOf­Stream()
Tam si tipnu že by se ten program neměl úplně seknout, ale v nějaký poměrně dlouhý době proběhnout (možná roky, tisíciletí?). A to proč.
Protože ty v tom kódu nehledáš řádek toho čísla jak tvrdíš,ale něco dost děsivýho.
Máš hodnotu v cislo1 (na počátku je 0). Pak vygeneruješ náhodný číslo do nahoda. Pak tam provádíš ten test cislo1 = nahoda. Pouze (a to pouze) pokud se ty čísla rovnají tak přečteš řádek v ReadLine a tím se posuneš v souboru o 1 řádek dál. Pak připočteš 1 do cislo1 a v cyklu zase testuješ, jestli se rovná tomu náhodnýmu,než se posuneš dál v souboru. Jestli je pocet trochu vyšší číslo, tak šance že se dostaneš na konec souboru a tím ti to skončí v nějakým rozumným čase je asi jako vyhrát v Sazce..
Takže, jestli bych ti poradil po tom

  • Using nahoda1 As New StreamReader("slo­vicka-cizi.txt")*

si dát prostě cyklus
*FOR i=1 TO nahoda
cizislovo = nahoda1.ReadLine
NEXT I *
jedu to jenom z hlavy, pokud máš správně ošetřený to náhodný číslo aby nepřekorčilo počet slovíček, tak ani nepotřebuješ test na EndOfStream

 
Nahoru Odpovědět  +1 1.2.2014 19:36
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 14 zpráv z 14.