Wskaźniki i tablice dwuwymiarowe- wczytywanie, alokowanie pamięci

0

Napisałem kod, do zadania poniżej, niedawno zacząłem korzystanie ze wskaźników i chcę wiedzieć , gdzie popełniłem błędy we wczytywaniu/alokowaniu/wypisywaniu za pomocą wskaźników

"Napisz kod umożliwiający dynamiczne tworzenie tablic 2D o rozmiarze
NxM. Zdefiniuj funkcję umożliwiającą wypełnienie tablicy wartościami i
drugą wypisującą zawartość. Wykorzystaj przydzielenie pamięci do
wskaźnika wskaźników"

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

void Arrayx2_1();
void Arrayx2_2();

int n,r,i,j;



int main()
{
    int **tab;
    puts("podaj wielkość tablicy dwuwymiarowej");
    scanf("%d%d",&n,&r);
    puts("\n");

    tab = (int**) malloc(n * sizeof(**tab));
    for (i=0; i<r; i++)
         {tab[i] = (int *)malloc(r * sizeof(*tab));}
    Arrayx2_1(tab);
    Arrayx2_2(tab);

}

void Arrayx2_1(int **array)
{   int x,d;
    for (i = 0; i< n; i++)
     {
         scanf("%d",&x);
         **(array+i)=x;

      for (j = 0; j <r ; j++)
      {
         scanf("%d",&d);
         *(*(array+i)+j)=d;

      }}
}
void Arrayx2_2(int **array_2)
{ puts("wypisz\n");
    for (i = 0; i< n; i++)
      for (j = 0; j <r ; j++)
      {
         printf("%d%d\n", *(*(array_2+i)+j));
      }
}


1
  1. Nie pisz pseudo hackerskiego kodu gwiazdki+nawiasy (arytmetyka wskaźnikowa) o ile da się napisać w notacji tablicowej. A tu się da.
  2. Pętla do n
    for (i=0; i<n; i++)
         {tab[i] = (int *)malloc(r * sizeof(*tab));}

  1. wydaje mi się tak,, ze spacją, to samo przy drukowaniu
 scanf("%d %d",&n,&r);

  1. Nazwy funkcji są d/d, niczego nie oznaczają - więc nie wypowiem się o ich poprawności
0

@AnyKtokolwiek:

  1. Nie piszę pseudo hackerskiego kodu, używam tych zapisów na przemian, żeby sobie przyswoić obie formy zapisu
  2. Dzięki za znalezienie błędu
  3. nieistotne, odruchowo wcisnąłem spację
  4. nie rozumiem o co ci chodzi

Znalazłem błędy w kodzie i go poprawiłem, może komuś się przyda jeśli znajdzie ten wątek

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

void Arrayx2_1();
void Arrayx2_2();

int n,r,i,j;



int main()
{
    int **tab;
    puts("podaj wielkość tablicy dwuwymiarowej");
    scanf("%d%d",&n,&r);
    puts("\n");

    tab = (int**) malloc(n * sizeof(int*));//**tab
    for (i=0; i<n; i++)
         {tab[i] = (int *)malloc(r * sizeof(int));}//*tab
    Arrayx2_1(tab);
    Arrayx2_2(tab);

}

void Arrayx2_1(int **array)
{   int d;
    for (i = 0; i< n; i++)
     {
      for (j = 0; j <r ; j++)
      {
         scanf("%d",&d);
         *(*(array+i)+j)=d;

      }}
}
void Arrayx2_2(int **array_2)
{ puts("\nwypisz\n");
    for (i = 0; i< n; i++)
    {
        printf("\n");

      for (j = 0; j <r ; j++)
      {
         printf("%d", *(*(array_2+i)+j));
      }}
}
0

nie rozumiem o co ci chodzi

Widzisz u kogoś funkcje Arrayx2_1, Arrayx2_2, Arrayx3_1, Arrayx2_4

Co one robią?

0
Patryk Wielgosz napisał(a):

może komuś się przyda jeśli znajdzie ten wątek

Pochlebiasz sobie

0

@AnyKtokolwiek: Nie pochlebiam, wstawiam kod, żeby zakończyć wątek i może komuś się przyda, nie mówię że to jest jakoś idealnie napisane, ale działa, dzięki za "konstruktywną " krytykę

0

@kq: Chodzi o deklaracje tych funkcji na początku ?
Czy chodzi o to, że ich zapis nie wskazuje na to co one robią ?

1

Chodzi o tragiczne nazwy.

0

@kq: ok, po prostu skupiłem się na kodzie, nie myślałem że część kosmetyczna(jeśli chodzi o nazewnictwo) jest na tyle istotna

3

Pisanie czytelnego kodu to znacznie więcej niż część kosmetyczna. To absolutna podstawa.

0
kq napisał(a):

Chodzi o tragiczne nazwy.

Ja bym dodał fatalną arytmetykę wskaźników.

Łączna wartość kodu dla potomnych jest ujemna (jak ogromnej ilości "kodów" które potem są bezmyślnie kopiowane) - zwłaszcza, że każdy z potomnych jak pomyśli, to napisze samodzielnie lepiej.

0

@AnyKtokolwiek: Jeśli takiej formy też się używa, to dobrze ją przećwiczyć, szczególnie jeśli jesteś początkujący

2
Patryk Wielgosz napisał(a):
    tab = (int**) malloc(n * sizeof(int*));//**tab

sizeof(*tab) nieco lepsze (**tab z komentarza nie jest poprawne) dlatego ze po ewentualnej zmianie typu nie musisz tez zmieniac w sizeof.

malloc() moze zwrocic null - to trzeba obsluzyc

po kazdym malloc() roznym od null free() jest obowiazkowe (dla null opcjonalne)

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