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 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 ); } } }
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; }
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 ⏎ |
|
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. |
|
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? 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⏎
|
|
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. |
|
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! 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. |
|
Simonsoft Temat założony przez niniejszego użytkownika |
» 2019-08-21 19:49:11 Zrobilem tak i nadal nie dziala, tak samo wywala. 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; }
|
|
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. |
|
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. 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; }
|
|
« 1 » 2 |