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

Przepełnienie tablicy - problem

Ostatnio zmodyfikowano 2019-08-21 23:49
Autor Wiadomość
Simonsoft
Temat założony przez niniejszego użytkownika
Przepełnienie tablicy - problem
» 2019-08-21 11:55:47
Witam, tak jak w temacie, pobieram tablice do 150 znakow, jednak jesli bedzie ich wiecej, program wariuje i przypisuje elementy ktore nie zmiescily sie w danej tablicy, kolejnym scanf'om, przez co nie jest mozliwe wpisanie kolejnych wartosci i program wywala sie. Probowalem uzyc fflush(stdin) ale cos robie zle, nie wiem jak temu zaradzic, jestem w kropce. Z gory dziekuje za pomoc

C/C++
printf( "Podaj wektor: \n" );
array_size = read_vector( array, 150, 0 );

fflush( stdin );
if( array_size <= 0 )
{
    printf( "Not enough data available" );
    exit( 3 );
}
else
{
    printf( "Podaj przesuniecie: \n" );
    read = scanf( "%d", & positions_to_shift );
   
    if( read <= 0 )
    {
        printf( "Incorrect input" );
        exit( 1 );
    }
    else
    {
        printf( "Podaj kierunek przesuniecia: \n" );
        int read2 = scanf( "%d", & kierunek );
        fflush( stdin );
        if( read2 <= 0 ||( kierunek != 1 && kierunek != 2 ) )
        {
            printf( "Incorrect data input" );
            exit( 2 );
        }
    }
}

C/C++
int read_vector( int * array, int array_size, int stop_value )
{
    if( array == NULL || array_size <= 0 ) return - 1;
   
    int sizeD = 0;
   
    while( sizeD < array_size )
    {
        int read = scanf( "%d", &( *( array + sizeD ) ) );
        if(( read <= 0 ) ) return - 1;
       
        if( read != 1 || *( array + sizeD ) == stop_value ) break;
       
        ++sizeD;
    }
    return sizeD;
}

C/C++
Podaj wektor:
55 19 60 64 55 16 59 14 14 19 62 34 11 45 78 6 96 64 43 40(...wiecej niz 150...) 0
Podaj przesuniecie
    : Podaj kierunek przesuniecia
    : Incorrect data input 8
P-175064
pekfos
» 2019-08-21 15:51:45
Jakie powinno być zachowanie, jeśli dostajesz więcej danych niż jesteś w stanie obsłużyć? Wczytywanie prosto do tablicy nie brzmi zresztą poprawnie, w końcu jak masz tablicę na 150 elementów, to realnie możesz wczytać tylko 149, bo zero też tam pakujesz. Wczytuj liczby do zmiennej tymczasowej i potem decyduj co z nią zrobić - dodać do tablicy, czy zignorować jeśli tablica jest pełna.
P-175065
Simonsoft
Temat założony przez niniejszego użytkownika
» 2019-08-21 17:39:07
Zmienilem program, zapisuje do nowej tablicy a potem przypisuje ja spowrotem do array. Ale nadal jak wiecej niz 150 liczb wpisze to one mi wpadaja kolejno do zmiennej
- Podaj przesuniecie i - Podaj kierunek przesuniecia, przez co program nie dziala, Mozna jakos odrzucic te liczby?

C/C++
int read_vector( int * array, int array_size, int stop_value )
{
    if( array == NULL || array_size <= 0 ) return - 1;
   
    int sizeD = 0;
    int array2[ 150 ];
    int * array2wsk = array2;
   
    while( sizeD < array_size )
    {
        int read = scanf( "%d", &( *( array2wsk + sizeD ) ) );
       
        if( sizeD >= 150 ) break;
       
        if(( read <= 0 ) ) return - 1;
       
        if( read != 1 || *( array2wsk + sizeD ) == stop_value ) break;
       
        *( array + sizeD ) = *( array2wsk + sizeD );
        ++sizeD;
    }
    return sizeD;
}


Podaj wektor: ⏎
333 881 -396 -292 316 301 -957 64 1000 262 -156 130 786 853 644 873 673 369 249 995 -156 -322 -470 436 -957 819 -465 -902 399 -253 -666 757 -900 -735 -295 256 272 354 -201 -905 -491 -795 178 -369 -549 -72 788 142 -810 536 184 -201 437 -501 -771 151 -144 -721 175 318 264 -605 -548 204 -842 -996 952 -630 502 607 792 301 -699 -912 440 389 -169 302 -122 -117 -622 -719 907 -64 459 -738 -376 -647 -829 700 -37 948 -191 419 616 -438 107 975 468 -73 -569 -990 -377 -748 356 -40 489 219 796 -40 302 318 -235 15 638 564 -199 -718 100 297 80 113 -136 -635 329 -901 538 -87 253 -22 -27 379 567 348 836 863 -731 645 -343 232 -184 -947 -993 994 -433 798 -525 447 59 972 -514 -184 234 -461 -957 -20 -296 -649 -247 -732 572 -417 26 -976 -123 -256 206 373 -887 -99 895 326 494 692 -869 -690 -331 -626 211 -888 134 -53 -709 -931 -294 -998 -181 919 955 -899 692 -501 657 198 -134 182 637 -402 955 395 -925 -640 -344 364 -80 -621 313 403 997 -405 -210 833 692 11 631 161 923 -342 -726 579 711 811 -668 -459 -607 -505 -698 892 -925 -570 690 677 -980 -58 -578 -592 -912 -767 909 -626 -332 250 -894 -592 -669 741 830 -219 -420 -95 0⏎
Podaj przesuniecie: ⏎
Podaj kierunek przesuniecia: ⏎
Incorrect data input9⏎
P-175071
Simonsoft
Temat założony przez niniejszego użytkownika
» 2019-08-21 17:52:42
Wlasnie dodalem :

    fflush(stdin);
    fflush(stdout);

po funkcji read_vector i zadzialalo, nie rozumiem u mnie w QT dziala, a w tescie sie ponoc wywala, nie kumam tego czemu.
P-175072
pekfos
» 2019-08-21 18:56:47
Użycie fflush(stdin) jest błędne. fflush() służy wyłącznie do strumieni wyjściowych. Jeśli działa, to polegasz na niestandardowym zachowaniu.

Zmienilem program, zapisuje do nowej tablicy a potem przypisuje ja spowrotem do array.
No i po co to zrobiłeś? W czym miało pomóc robienie tego samego, ale na innej identycznej tablicy?
Wczytuj liczby do zmiennej tymczasowej
Zmiennej. Jednej!
C/C++
int tmp;
scanf( "%d", & tmp );
Potem dodaj tmp do tablicy wynikowej, albo i nie - jeśli nie ma już miejsca. Możesz sobie wczytywać w nieskończoność szukając końca danych i nie przekraczać zakresu tablicy.
P-175077
Simonsoft
Temat założony przez niniejszego użytkownika
» 2019-08-21 19:49:11
Zrobilem tak i nadal nie dziala, tak samo wywala.

C/C++
int read_vector( int * array, int array_size, int stop_value )
{
    if( array == NULL || array_size <= 0 ) return - 1;
   
    int sizeD = 0;
   
    while( sizeD < array_size )
    {
        int temp;
        int read = scanf( "%d", & temp );
       
        if( sizeD >= 150 ) break;
       
        if(( read <= 0 ) ) return - 1;
       
        if( read != 1 || temp == stop_value ) break;
       
        *( array + sizeD ) = temp;
        ++sizeD;
    }
    return sizeD;
}
P-175078
pekfos
» 2019-08-21 19:56:04
No ale w praktyce niczego nie zmieniłeś. I tak zawsze zapisujesz do tej tablicy i przerywasz całość po 150 liczbach. Nie przerywaj pętli w tym wypadku, a po prostu nie dopisuj kolejnych liczb do tablicy.
P-175079
Simonsoft
Temat założony przez niniejszego użytkownika
» 2019-08-21 20:11:16
Dobra, jakos dziala, zwiekszylem tablice i tyle, najwazniejsze ze przeszlo xD.

C/C++
int read_vector( int * array, int array_size, int stop_value )
{
    if( array == NULL || array_size <= 0 ) return - 1;
   
    int sizeD = 0;
   
    while( sizeD < array_size )
    {
        int temp;
        int read = scanf( "%d", & temp );
       
        if(( read <= 0 ) ) return - 1;
       
        if( read != 1 || temp == stop_value ) break;
       
        *( array + sizeD ) = temp;
        if( sizeD <= 149 ) ++sizeD;
       
    }
    return sizeD;
}
P-175080
« 1 » 2
  Strona 1 z 2 Następna strona