Nekonečná procedura   otázka

VB.NET

Dobrý den,

ve Visual Basicu se teprve učím (a všeobecně programování), a nemůžu si poradit s jedním problémem.

Zde je kód:

Public Sub zapis(ByVal od As Integer, ByVal N As Integer, ByVal p() As Boolean, ByVal poradi As Integer)
        Dim pocet As Integer = 1
        Dim soubor As New IO.StreamWriter("prvočísla" + Str(poradi) + ".txt")
        For i = od To N - 2
            If pocet < 600000 Then
                If p(i) = True Then
                    soubor.WriteLine(i)
                    pocet += 1
                End If
            Else
                soubor.Close()
                zapis(i, N, p, poradi + 1)
            End If
        Next
        soubor.Close()

    End Sub

Mám program který vypočítává prvočísla od 2 do zadané hodnoty.

Výsledky ukládá do seznamu typu boolean (index=dané číslo, 0/1-je/není prvočíslo).

Následně prvočísla zapisuji do textového souboru. Pokud bych to uložil pouze do jednoho, tak pro výpočet prvočísel do 1 000 000 000 je velikost souboru cca 500MB a s tím se pak nedá pracovat.

Takže ukládám do jednoho souboru vždy 600 000 prvočísel, pak soubor zavřu, vytvořím další atd.

Využívám zde rekurze

proměná "od" udává od jaké hodnoty má cyklus seznam procházet

"N" je číslo do kterého se prvočísla počítaly

"p" je samotný seznam

"poradi" určuje název souboru do kterého se ukládá

Má hlava mi tvrdí, že pokud cyklus For doběhne do konce( což se stane až u posledního souboru) přeskočí na další příkaz (zavření souboru) a procedura se ukončí.

Problém mi nastane vždy právě u posledního souboru, do kterého zapisuje neustále znovu a znovu, do nekonečna...

Pokud je prvočísel málo a stačí jeden soubor, tak chyba nenastane, ale pro 2 a více už ano.

Snad jsem to vysvětlil dostatečně pochopitelně. Prosím o radu.

Tomáš H.

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

Else

pocet = 0

soubor.Close()

zapis(i, N, p, poradi + 1)

End If

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

Problém bude pravdepodobne v nesprávnom použití rekurzie(keď metóda, funkcia, procedúra... volá sama seba). Skúste si to odkrokovať vo Visual Studiu, sledujte pritom hodnoty premenných.

BTW nešlo by to riešiť bez rekurzie? Bez rekurzie je menšia šanca, že spravíte nekonečný kód.

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

podle me je problem v tom "ByVal od As Integer", "ByRef od As Integer" by melo fungovat, anebo "exit for" po zapis(i, N, p, poradi + 1)

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