Nowe posty

Autor Wątek: prosty problem w C  (Przeczytany 3402 razy)

Gosik

  • Gość
prosty problem w C
« dnia: 2013-01-31, 22:49:42 »
Mam funkje, ktora wyswietla elementy tablicy:
 void print_matrix(int m, int n, int lda, double *a) {
  int i, j;

  for (j = 0; j < m; j++) {
    for (i = 0; i < n; i++)
       printf(" %5.1f", a[i+j*lda]);
       printf("\\n");
     }
  }
Mam male doswiadczenie z C++, ale nie z C niestety nie.

Nie rozumiem printf(" %5.1f", a[i+j*lda]);
Dlaczego mamy a[i+j*lda]?

Czy tej linijki nie mozna zapisac: printf(" %5.1f", a[j]]) ?

snajper_8383

  • Gość
prosty problem w C
« Odpowiedź #1 dnia: 2013-02-01, 00:46:19 »
Cytat: Gosik
Czy tej linijki nie mozna zapisac: printf(" %5.1f", a[j]]) ?
Tak możesz tak zapisać.
Można zamiast tego użyć jeszcze wskaźników. Jeśli tablica jest dwuwymiarowa:
*(*(a+j)+i)

ZipoKing

  • Gość
prosty problem w C
« Odpowiedź #2 dnia: 2013-02-01, 08:08:29 »
Aby móc zapisać a[j] tablica musiałaby być zadeklarowana jako double **a, a nie double *a, a tutaj pojawia się mały problem związany z tym jak ta tablica odwzorowana jest w pamięci:
- w przypadku double **a, najpierw trzeba byłoby zaalokować miejsce dla m wskaźników do typu double (double *) a dopiero potem dla każdego z m elementów zaalokować pamięć dla n wartości typu double - szansa na to że wszystkie te elementy zajmą ciągły obszar pamięci jest nikła.
- w przypadku double *a alokuje się za jednym zamachem ciągły obszar pamięci, co może mieć duże znaczenie przy dalszych obliczeniach (jeżeli np. do obliczeń używany jest LAPACK albo inna biblioteka)

snajper_8383

  • Gość
prosty problem w C
« Odpowiedź #3 dnia: 2013-02-01, 11:35:13 »
Tablicę może jeszcze przekazać tak:
Jak masz zadeklarowaną przykładową tablicę:
double tab[3][7];
to możesz zadeklarować funkcje tak:
void print_matrix(int m, int n, double a[][7]);
a potem ją wywołać:
print_matrix(3,7,a);

Gosik

  • Gość
prosty problem w C
« Odpowiedź #4 dnia: 2013-02-01, 14:34:03 »
Bardzo dziekuje Wam za odpowiedz. Jednakze nadal nie moge zaczaic, w jakim celu uzywamy *lda ?

ZipoKing

  • Gość
prosty problem w C
« Odpowiedź #5 dnia: 2013-02-01, 17:45:09 »
Cytat: Gosik
Bardzo dziekuje Wam za odpowiedz. Jednakze nadal nie moge zaczaic, w jakim celu uzywamy *lda ?
Jeżeli lda jest różne od m, oznacza to nie mniej nie więcej jak to że wyświetlany jest tylko kawałek macierzy. Np. możesz mieć macierz zadeklarowaną jako 100x100 a wyświetlać tylko 20x20.