Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Problem z tablicą

Ostatnio zmodyfikowano 2019-02-07 00:17
Autor Wiadomość
Pawełek
Temat założony przez niniejszego użytkownika
Problem z tablicą
» 2019-02-04 13:06:27
Przygotowuję się do matury, i mam do rozwiązania zadanie:
"Wiązka zadań Ciekawe liczby W pliku liczby.txt w oddzielnych wierszach znajduje się 1000 różnych liczb, każda o długości od 2 do 9 cyfr. Napisz program(-y), który da odpowiedzi do poniższych zadań. Odpowiedzi zapisz do pliku wyniki_liczby.txt, a każdą odpowiedź poprzedź numerem zadania. 
59.1.  Czynnikiem pierwszym danej liczby naturalnej złożonej jest dowolna liczba pierwsza, która dzieli tę liczbę całkowicie. Podaj, ile jest w pliku liczby.txt liczb, w których rozkładzie,na czynniki pierwsze występują dokładnie trzy różne czynniki (mogą się one powtarzać, z których każdy jest nieparzysty."

Mój program (problem opisałem w komentarzu)
C/C++
#include <iostream>
#include <fstream>
#include <math.h>

using namespace std;

void sito( int a, bool * tab )
{
   
    for( int i = 2; i * i <= a; i++ )
    if( tab[ i ] == 0 )
    for( int b = i * i; b <= a; b += 2 )
    {
        tab[ b ] = 1;
    }
   
}
bool trzyczyn( int liczba, bool * tab )
{
    int druga[ 4 ] { }, i = 1, c = 0;
    do
    {
       
        i++;
       
       
        if( tab[ i ] == 0 )
        if( liczba % i == 0 )
        {
            liczba /= i;
            if( i % 2 == 0 )
                 return false;
           
            for( int y = 0; y <= 3; y++ )
            if( druga[ y ] == 0 )
            {
                druga[ y ] = i;
                c++;
                break;
               
            }
            i = 2;
        }
    } while( liczba != 1 );
   
    if( c == 3 )
         return true;
    else
         return false;
   
}

int main()
{
   
    fstream plik, plik2;
    bool * tab; //tutaj jest deklaracja wskaźnika do tablicy z która mam problem.
    int liczba;
    plik.open( "liczby.txt", ios::in );
    plik2.open( "wyniki_liczby.txt", ios::out );
    for( int i = 1; 1 <= 1000; i++ )
    {
        plik >> liczba;
        tab = new bool[ liczba + 1 ] { }; /* tutaj mam problem z tą tablicą, podczas debuggowania, w tym miejscu debugger się zatrzymuje i ta 'strzalka znika' jak odpalam debugger drugi raz wyskakuje mi okienko call stack. Jak zmienię wielkość tablicy z 'liczba +1' np. na 6 wszystko działa poprawnie. Dodam też tylko ze pierwsza liczba w pliku 'liczby' to '13150087'. Liczba jest typu int, wiec ten typ miesci ta liczbe jak i wszystkie inne z tego pliku. Wyprzedzając pytania, tablica nie może być mniejsza bo muszą zostać tutaj obliczone wszystkie liczby pierwsze w przedziale 0-'liczba' za pomocą sita eratostenosa. Dodam też że jeśli usunę klamry zerujące tablicę '{}' także wszystko działa poprawnie. Nie rozumiem, nawet w książce Jerzego grebosza opus magnum jest opisany owy sposób jako najszybszy sposób zerowania tablicy.*/
        sito( liczba, tab );
        if( trzyczyn( liczba, tab ) )
        {
            plik2 << liczba;
        }
        delete[] tab;
       
    } return 0;
}
Nie opisywalem dzialania calego programu, bo z rozwiazaniem zadania nie mam problemu tylko z tą tablicą. Problem występuje nawet jak zmienna zamienie na liczbę której to ta zmienna odpowiada w pierwszym obiegu pętli czyli 13150087.
P-173842
pekfos
» 2019-02-04 15:01:48
podczas debuggowania, w tym miejscu debugger się zatrzymuje i ta 'strzalka znika' jak odpalam debugger drugi raz wyskakuje mi okienko call stack.
Co to znaczy?
P-173843
Pawełek
Temat założony przez niniejszego użytkownika
» 2019-02-04 15:14:55
Właśnie nie wiem. Po prostu debugger się zatrzymuje przy tej linijce. Wygląda to na to jakby miał problem z jednoczesna deklaracja i wyzerowaniem tak dużej tablicy.
Jeśli chodzi o kompilacje to wszystko działa bez zarzutu, tyle tylko ze program oddaje mi pusty plik wyniki.txt, chciałem wiec uzyc debuggera i sprawdzić co jest nie tak, i debugger nie może przejść wyżej opisanej linii
P-173844
pekfos
» 2019-02-04 16:15:16
Czyli ten kod nie działa?
C/C++
#include <iostream>

int main()
{
    bool * tab;
    int liczba = 13150087;
    tab = new bool[ liczba + 1 ] { };
    std::cout << "OK: " <<( void * ) tab << '\n';
    delete[] tab;
    return 0;
}
P-173845
Pawełek
Temat założony przez niniejszego użytkownika
» 2019-02-04 23:40:13
Nie działa
P-173849
Pawełek
Temat założony przez niniejszego użytkownika
» 2019-02-05 00:04:39
Tzn. program się kompiluje, tyle tylko że się nie debuguje. Debugger zatrzymuje się przy zerowaniu tablicy.
P-173850
pekfos
» 2019-02-05 00:07:17
Podaj dokładną wersję kompilatora.
P-173851
Pawełek
Temat założony przez niniejszego użytkownika
» 2019-02-05 00:41:52
GCC 5 Series MinGW 32-bit Edition wersja kompilatora

GDB 7.9 Series MinGW 32-bit Edition wersja debuggera.


System mam 64 bitowy, powiem szczerze, że nawet nie wiedziałem że mam 32 bitową wersję kompilatora. Czy to może mieć jakiś wpływ? (Oczywiście zmienię ten kompilator, ale myślisz że to rozwiąże problem?)
P-173852
« 1 » 2 3 4 5
  Strona 1 z 5 Następna strona