Atexor Temat założony przez niniejszego użytkownika |
» 2014-01-27 22:50:52 Wybacz za niedomówienie. Na przyszłość (jak nie zapomnę) będę się określał.
Rozwiązanie, które podałeś z rozmiarem tablicy jest ciekawe. Niby proste, ale sam na to nie wpadłem. Nie rozumiem czemu ma niezdefiniowane zachowanie w kompilatorach ze standardem C99, skoro na stronie Moniki jest napisane, że "C99 allows variable-length arrays", czyli że zezwala na tablice zmiennej długości. W wolnych chwilach spróbuję z tym pokombinować (w C czy działa/C++).
Chciałbym się jeszcze spytać o jedną rzecz. Teraz program już wszystko mi dobrze oblicza poza wyświetlaniem konkretnego fragmentu, dokładniej wierszy. Np. ma pokazać fragment tablicy od wiersza 2 do 5 i kolumny od 3 do 7. Kolumny pokazuje dobrze, zaś wiersz tylko "2".
Kod: http://wklej.to/YONum
Próbowałem dać inne, nowe zmienne (napisałem w komentarzach) ale problem występuje nadal, w czym jest problem? |
|
alixir |
» 2014-01-28 08:33:38 Zapisz swoją pętlę tak (wtedy działa poprawnie): for( i = m; i <= n; i++ ) { for( j = o; j <= p; j++ ) { printf( "\t%d", macf[ i ][ j ] ); } printf( "\n\n" ); } Ogólnie teraz jak się przyjrzałem to widzę trochę błędów. Po co ci typ MAC skoro masz zdefiniowaną strukturę. Funkcja wysmale() jako argument powinna przyjmować strukturę ‘zmienna’ a nie ‘MAC’ . Wtedy wewnątrz funkcji dostęp do macierzy uzyskujesz przez macf.macierz[ i ][ j ] W funkcji main powinieneś przekazać do funkcji wysmale() ‘zwroc’ a nie jak to robisz ‘zwroc.macierz’. Natomiast co do błędu w wyświetlaniu macierzy to dzieje się tak dlatego, że : - w pierwszym przejściu pętla ‘m’ ma jakąś wartość początkową, podczas gdy w pętli ‘o’ zmienna ‘o’ zostaje sukcesywnie zwiększana - gdy dochodzimy do drugiego przejścia pętli ‘m’, pętla ‘o’ już się nie wykonuje gdyż zmienna ‘o’ osiągnęła swoją wartość maksymalną w poprzednim cyklu pętli Dlatego powinieneś zastosować się do mojej wskazówki. |
|
Atexor Temat założony przez niniejszego użytkownika |
» 2014-01-28 10:05:35 Hmmm, ciekawe. Sposób wyświetlania tablicy pomniejszonej zrobiłem w ten sam sposób, co wyświetlanie zwykłej (tylko pozmieniałem zmienne): Czyli dla i=0 robi wewnątrz pętle, gdy j osiągnie maksimum, wtedy robi dla i=1 i znowu j do danego max'a i tak w kółko. Ogólnie rzecz biorąc wczytuje poziomo kolejne kolumny i przechodzi do następnego wiersza. W przypadku m,n,o,p jest to na moje oko analogiczne i nadal w ogóle nie pojmuję jak to może NIE działać... jednak ważne że działa. Odnośnie typu MAC - zdaję sobie sprawę, że nie jest to zbyt zoptymalizowane jednak jako takowych błędów (że coś może się sypać) chyba nie ma. W funkcji wysmale() nie korzystałem już po prostu ze struktury, gdyż uważałem że jej rola powinna ograniczyć się do zwrócenia tablicy z funkcji wys(). Jednakże już wszystko poprawiłem i działa. Dziękuję za poprawę błędów :) |
|
alixir |
» 2014-01-28 10:56:35 Zauważ, że w podanym przez ciebie przykładzie druga pętla na początku zawiera zapis „j=0”, natomiast twoja pętla wyświetlająca pomniejszoną macierz ma tylko zapis „o”. To jest kluczowe w tym przypadku, gdyż pętla ta wykonuje się ‘m-(n+1)’ razy. W pierwszym przypadku za każdym razem gdy program napotka na pętlę to ustawia wartość początkową ‘j’ na 0, po czym w pętli ją inkrementuje j++ aż do momentu gdy osiągnie ona oczekiwaną wartość. W drugim przypadku ‘o’ jest przez cały czas tą samą zmienną. Więc jeśli w pierwszym przebiegu zostanie zwiększona, to w kolejnym przebiegu gdy program na potka na tą pętlę warunek od razu jest niespełniony i pętla się nie wykona. Mały przykład: int m = 1; int o = 2; for( m; m < 3; m++ ) { for( o; o < 4; o++ ) { printf( "m=%d o=%d,\t", m, o ); } printf( "\nm=%d o=%d\t", m, o ); } |
|
Atexor Temat założony przez niniejszego użytkownika |
» 2014-01-28 12:49:03 Dziękuję Ci bardzo za dokładne wytłumaczenie. Teraz załapałem. Dla poćwiczenia, próbowałem to jeszcze zrobić z użyciem wskaźników (aby pobierały wartości zmiennych), ale coś nie działało, bo pokazywało jak wcześniej, ale w sumie to nieważne. Widocznie się nie da.
Jeszcze raz dziękuję i pozdrawiam :) |
|
1 « 2 » |