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

Zwracanie tablicy dwuwymiarowej z funkcji

Ostatnio zmodyfikowano 2014-01-28 12:49
Autor Wiadomość
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?
P-103380
alixir
» 2014-01-28 08:33:38
Zapisz swoją pętlę tak (wtedy działa poprawnie):

C/C++
for( i = m; i <= n; i++ ) //przy innych wartosciach np. g=3,h=6,t=2,y=4 tez nie dziala wielowymiarowo
{
    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.


P-103389
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):
C/C++
/*   for(i=0;i<Nf;i++)
    {
        for(j=0;j<Nf;j++)
        {
         printf("\t%d",macf.macierz[i][j]);
        }
    printf("\n\n");
}*/

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 :)
P-103392
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:

C/C++
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 );
}

  • Pierwszy przebieg pętli nr1:
    m = 1 (o = 2) (po zakończeniu przebiegu m=2)
    • Pierwszy przebieg pętli nr 2:
    • o = 2 (m = 1) (po zakończeniu przebiegu o=3)
    • Drugi przebieg pętli nr 2:
    • o = 3 (m = 1) (po zakończeniu przebiegu o=4)
    • Trzeci przebieg pętli nr 2 się nie wykonuje gdyż warunek 4 < 4 jest nieprawdziwy
  • Drugi przebieg pętli nr 1
    m = 2 (o=4) (po zakończeniu przebiegu m=3)
    • Ponowny pierwszy przebieg pętli nr 2 się nie wykonuje gdyż warunek 4 < 4 jest nieprawdziwy
  • Trzeci przebieg pętli nr 1 się nie wykonuje gdyż warunek 3 < 3 jest nieprawdziwy
     
P-103393
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 :)
P-103399
1 « 2 »
Poprzednia strona Strona 2 z 2