Zadanie z tablicą wielowymiarową

0

Mam zadanie:
W głównym kodzie zadeklaruj dwuwymiarową tablicę [ 5 ][ 8 ]
(deklaracja w tej kolejności).
Zapisz funkcję ustawiającą, która ustawi poszczególne wartości komórek tablicy wg schematu (wartości maleją od 40 do 1).
Parametrami funkcji mają być dwa wskaźniki. Pierwszy wskazujący na pierwszy element tablicy, drugi wskazujący na ostatni element tablicy.
Wewnątrz tej funkcji może znajdować się tylko jedna pętla!
Zapisz funkcję drukującą, która wyświetli na ekranie tablicę. Parametrem funkcji ma być oryginalna tablica dwuwymiarowa, z modyfikatorem const.
Tutaj już klasycznie, dwie pętle do wydruku.

W głównym kodzie:
• zadeklaruj tablicę dwuwymiarową, • wywołaj funkcję ustawiającą
• wywołaj funkcję drukującą

mój kod:


#include <stdio.h>

void set2(int *a, int *b)
{
    int start = 40;
    for(int *p = a; p < b; p++, start--)
    {
        *p = start;
    }
}

void print3(const int tab[][])
{
    for(int i = 0; i<5; i++)
    {
        for(int j = 0; j<8; j++)
        {
            printf("%3i", tab[i][j]);
        }
        putchar('\n');
    }
}

int main()
{
    int tab[5][8] = {0};
    set2(tab, &tab[4][7]);
    print3(tab);

    return 0;
}

oraz wyświetlane błędy:

main.c:13:23: error: array type has incomplete element type ‘int[]’
   13 | void print3(const int tab[][])
      |                       ^~~
main.c:13:23: note: declaration of ‘tab’ as multidimensional array must have bounds for all dimensions except the first
main.c: In function ‘main’:
main.c:28:10: warning: passing argument 1 of ‘set2’ from incompatible pointer type [-Wincompatible-pointer-types]
   28 |     set2(tab, &tab[4][7]);
      |          ^~~
      |          |
      |          int (*)[8]
main.c:4:16: note: expected ‘int *’ but argument is of type ‘int (*)[8]’
    4 | void set2(int *a, int *b)
      |           ~~~~~^
main.c:29:12: error: type of formal parameter 1 is incomplete
   29 |     print3(tab);

nie potrafię tego naprawić, jakieś sugestie co powinno zostać zmienione?

2

@Pysa6:

nie potrafię tego naprawić, jakieś sugestie co powinno zostać zmienione?

Trzeba się posłuchać kompilatora. I tak odpowiednio:

main.c23: note: declaration of ‘tab’ as multidimensional array must have bounds for all dimensions except the first

Jak masz tablicę tablic, kompilator nie wie, jak ją adresować, dopóki nie zna wszystkich poza co najwyżej jednym — pierwszym — wymiarem. Tablice wielowymiarowe są „spłaszczane” w pamięci — jak masz, na przykład, tab[3][2], to kolejno będą w niej zapisane¹ tab[0][0], tab[0][1], tab[1][0], tab[1][1], tab[2][0]tab[2][1]. Zatem jak kompilator potrzebuje wiedzieć, jak zaadresować coś, o ile skoczyć od adresu startowego, to musi znać wszystkie wymiary poza pierwszym, by móc odpowiednio wymnożyć adres docelowy

main.c10: warning: passing argument 1 of ‘set2’ from incompatible pointer type [-Wincompatible-pointer-types]

Funkcja void set2(int *a, int *b) oczekuje, jak widać, dwóch int *wskaźników na inty — a Ty ją wywołujesz jako set2(tab, &tab[4][7]). To niby też jest wskaźnik, i to nawet o tej samej wartości jak chciałeś, ale innym typie — nie na int, ale na ośmioelementową tablicę intów, int (*)[8].


¹ Na potrzeby adresowania, fizyczna reprezentacja może być różna i dowolnie dziwaczna.

1

A próbowałeś np. tak ?

#include <stdio.h>

void print3(const int tab[5][8])
{
    for(int i = 0; i<5; i++)
    {
        for(int j = 0; j<8; j++)
        {
            printf("%3i", tab[i][j]);
        }
        putchar('\n');
    }
}

 void set2(int *a, int *b){
   
 	int start = 39;
    
    for(int z=0; z < 40; z++,start--)
    {
      *a=start;a++;
	}
}



int main()

    int tab[5][8] = {0};
    
	set2(tab[0],tab[0]);
    
	print3(tab);
    return 0;
}
0
#include <stdio.h>

void set(int *tb,int size)
{
    while(size) *(tb++)=size--; 
}
void print(const int *tb)
{
    for(int y=0;y<5;++y,putchar('\n')) for(int x=0;x<8;++x) printf("%3i",*(tab++));
}

int main()
{
    int tab[5][8]={0};
    set(tab,40);
    print(tab);
    return 0;
}

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