Program zliczający elementy macierzy

0

Witam.
Próbuję napisać program dodający ostatni i pierwszy wiersz, a także pierwszą i ostatnią kolumnę dwuwymiarowej tablicy o wymiarach n i m.
Napisałem warunek w pętlach i prosiłbym o jego sprawdzenie, czy jest w miarę logiczny.
Dodatkowo wyskakuje mi błąd typu :

passing argument 1 of 'f' from incompatible pointer

Kod programu:

#include <stdio.h>
#include <stdlib.h>

double f(double **tab, int n, int m) {
    int i, j;
    double suma = 0.0;

    for (j = 0; j < m; j = j + (m - 1))  //dodawanie pierwszej i ostatniej kolumny macierzy
        for (i = 0; i < n; ++i)
            suma += tab[i][j];

    for (i = 0; i < n; i = i + (n - 1))   //dodawanie pierwszego i ostatniego wiersza macierzy
        for(j = 0; j < m; j++)
            suma += tab[i][j];

    return suma;
}

int main() {
    double tab[4][5] = {
                        {1.0, 2.0, 3.0, 4.0, 5.0},
                        {6.0, 0.0, 4.0, 3.0, 1.0},
                        {7.0, 3.0, 4.0, 6.0, 2.0},
                        {8.0, 9.0, 3.0, 4.0, 3.0}
                    };

    double wynik = f(tab, 4, 5);
    printf("%lf", wynik);

    return 0;
}
0

Z racji, że w C/C++ tablica != wskaźnik na pierwszy element (co jest często mylone) masz różne typy danych. Chcesz przyjąć wskaźnik na wskaźnik a przekazujesz tablicę tablic niejawnie rzutowaną na wskaźnik do tablicy.

0
winerfresh napisał(a):

Z racji, że w C/C++ tablica != wskaźnik na pierwszy element (co jest często mylone) masz różne typy danych. Chcesz przyjąć wskaźnik na wskaźnik a przekazujesz tablicę tablic niejawnie rzutowaną na wskaźnik do tablicy.

Jeśli mam być szczery to nic z tego nie rozumiem.
Mógłbyś napisać jak powinno to wyglądać?
I prosiłbym o sprawdzenie tych warunków w pętli. Czy to jest poprawne?

0

Nie wiem jak Ty dodajesz te wiersze i kolumny, ale jak na moje to tam się za dużo dzieje. Jeśli chodzi o to jak składować macierz w pamięci, to potraktuj ją jako jedną tablicę i odwołuj się do niej inteligentnie.

0

Dobrze, ale to się na nic nie zda jeśli źle przekażę parametry.
Prosiłbym o napisanie jak takie wywołanie funkcji powinno wyglądać, próbowałem już z & i *

0

Poprawiłem warunki w pętli, ale nadal nie wiem jak zapisać poprawnie wywołanie funkcji:

 #include <stdio.h>
#include <stdlib.h>

void f(double **tab, int m, int n)
{
    int i,j;
    double suma=0.0;

    for(i=0;i<m;++i){
        for(j=0;j<n;++j){
        if(i==0 || i==m-1 || j==0 || j==n-1){

        suma+=tab[i][j];
            }
        }
    }

    //return suma;
    printf("%lf", suma);
}

int main()
{

    double tab[4][5]={      {1.0, 2.0, 3.0, 4.0, 5.0},
                          {6.0, 0.0, 4.0, 3.0, 1.0},
                          {7.0, 3.0, 4.0, 6.0, 2.0},
                          {8.0, 9.0, 3.0, 4.0, 3.0}
                   };

    f(tab,4,5);

    return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0