Mieszanie między tablicami dynamicznymi i statycznymi

0

Witam, mam pytanie laika. Pewien czas już szukam odpowiedzi na necie ale nie widzę odpowiedzi...
Do rzeczy, mam funkcję która przyjmuje jako argument tablicę dynamiczą dwuwymiarową, powiedzmy że funkcja mająca na celu mnożenie macierzy. W programie używam także tablic statycznych i w pewnym momencie pojawia się problem mnożenia macierzy statycznej i dynamicznej. Czy jest jakiś sposób aby przekazać tablicę statyczną do funkcji z argumentem tablicy dynamicznej? Chciałbym uniknąć przeciażenia funkcji.

double P[3][2]={{1,2},{2,3},{4,3}};
Matrix_Multi(P, B, C, 3, 2, 4); 

Nagłówek funkcji:

void Matrix_Multi(double **A, double **B, double **C, int m, int n, int o) 
0

a nie łatwiej wpakować w jakiś kontener np vector vectorów?

0

W C/C++ nie ma czegoś takiego jak tablica dwuwymiarowa tak naprawdę. Statyczne tablice "wielowymiarowe" są tak naprawdę jednowymiarowe. Z kolei double ** to nie jest w zasadzie żadna tablica - to wskaźnik do wskaźnika na double (to Ty traktujesz to jak tablicę bo wiesz, że możesz). Pomiędzy tym typem a double [][] konwersja jest niemożliwa. Możliwa jest "konwersja" na double * ale używanie tego nie będzie poprawne wg standardu C++ - zobacz telenowelę w tym wątku.

Obsługiwanie macierzy za pomocą tzw. tablic wielowymiarowych jest niemądre. Dużo prościej napisać miniaturową klasę, która będzie używała wewnętrznie zwykłej dynamicznej tablicy jednowymiarowej albo nawet std::valarray.

0

Z ciekawosci wpisalem w wyszukiwarke na forum slowo "macierz", rozumiem ze posrod tych 154 stron wynikow (praktycznie polowa to gotowce) nic nie znalazles?

#include <iostream>
using namespace std;

struct macierz {
  macierz(size_t w, size_t h): w(w), h(h) { tab = new double[w*h]; }
  
  double& operator()(size_t r, size_t c) {
    return tab[r*w+c];
  }
 
  double* tab;
  size_t w, h;
};
 
int main() {
    macierz* m = new macierz(10, 201);
    (*m)(5, 10) = 3.0;
    cout << (*m)(5, 10);
    return 0;
}

http://ideone.com/eIuYCv

0

__tmp dzięki za gotowca, ale pytanie było nie o tworzenie struktury "macierz" tylko o przekazywanie wartości między tablicą statyczną a dynamiczną bez konieczności przepisywania każdej wartości z osobna.

0
Endrju napisał(a)

W C/C++ nie ma czegoś takiego jak tablica dwuwymiarowa tak naprawdę. Statyczne tablice "wielowymiarowe" są tak naprawdę jednowymiarowe.
Wyjaśnij, w jakiż to sposób tablica dwuwymiarowa w C jest "tak naprawdę jednowymiarowa", i jakie warunki musiałaby spełniać, by była "tak naprawdę wielowymiarowa".

0

Może ten przykład w czymś Ci pomoże. Nie wiem , czy dobrze zinterpretowałem pytanie

 
#include <iostream>
#include <conio.h>

using namespace std;

double P[3][2]={{1,2},{2,3},{4,3}};
double wynik;

double funkcja(double *A, double *B, double *C)
{
     cout<< "A[0] = " << A[0] << endl;
     cout<< "A[1] = " << A[1] << endl << endl;
     double wynik_mnozenia_kolumny_A = A[0] * A[1];

     cout<< "B[0] = " << B[0] << endl;
     cout<< "B[1] = " << B[1] << endl << endl;
     double wynik_mnozenia_kolumny_B = B[0] * B[1];

     cout<< "C[0] = " << C[0] << endl;
     cout<< "C[1] = " << C[1] << endl << endl;
     double wynik_mnozenia_kolumny_C = C[0] * C[1];

     return wynik_mnozenia_kolumny_A + wynik_mnozenia_kolumny_B + wynik_mnozenia_kolumny_C;
}

int main()
{
    wynik = funkcja(&P[0][0], &P[1][0], &P[2][0] );
    cout<<"wynik = "<<wynik;
    getch();
}

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