Double **tab_m wyjaśnienie !

0

Mam pytanie ponieważ jestem troche zielony co oznacza przykład : double **tab_m; ( dwie gwiazdki ? ) jest to jakis podwójny wskaźnik ? Czemu to ma służyć i co to jest gdyby mogl ktos mi dokładnie wyjaśnić.

0

jest to wskaznik na wskaznik
Dosc rzadko uzywane ale wyobraz sobie taka sytuacje

Masz funkcje ktora ustawia wskaznik na INVALID (np 0 adress pamieci)
Nie chcesz pisac za kazdym razem

ptr = 0;

napiszesz sobie funkcje

void makeInvalidPtr(double **ptr)
{
  *ptr = 0;
}

i teraz wskaznik ktory przekazales wskazuje na zero.
Czasami wskaznik nie chcesz przekazywac przez kopie, ale przez referencje/wskaznik. (nie wiem po co, ale niektorzy tak robia)

0

Genialnie! A jestes w stanie opisać mi to na tym konkretnym przykładzie ? Bo wlasnie to proboje rozgryźć. Bede dozgonnie wdzięczny!

#include <iostream>
#include <stdio.h>
#include <cstdlib>
#include <string.h>

using namespace std;

class Macierz
{
private:
    int m_size;
    double ** tab_m;
public:

    Macierz( int = 2 ); // konstruktor
    ~Macierz(); // destruktor

    void wypelnij_macierz();
    void wypisz_macierz();

    Macierz dodaj_macierz( Macierz & m2 );
    Macierz odejmij_macierz( Macierz & m2 );
    Macierz pomnoz_macierz ( Macierz & m2 );

    Macierz & operator =( const Macierz & ); //przeladowany operator =

};



Macierz & Macierz::operator =( const Macierz & M ) //tu jego implementacja
{
    this->m_size = M.m_size;

    for( int i = 0; i < m_size; ++i )
    for( int j = 0; j < m_size; ++j )
         this->tab_m[ i ][ j ] = M.tab_m[ i ][ j ];

}



Macierz::Macierz( int size )
{
    m_size = size;
    tab_m = new double *[ m_size ];

    for( int i = 0; i < m_size; i++ )
         tab_m[ i ] = new double[ size ];

}

Macierz::~Macierz() //destruktor
{
    for( int i = 0; i < m_size; i++ )
         delete tab_m[ i ]; //usuwanie elementow wiersza

    delete[] tab_m; //usuwanie wiersza w kolumnie
}

void Macierz::wypelnij_macierz()
{
    for( int i = 0; i < m_size; i++ )
    {
        for( int j = 0; j < m_size; j++ )
        {
            cout << "Wprowadz wartosc do macierzy [ " << i << " ][ " << j << " ] : ";
            cin >> tab_m[ i ][ j ];

        }
    }
}

void Macierz::wypisz_macierz()
{
    for( int i = 0; i < m_size; i++ )
    {
        for( int j = 0; j < m_size; j++ )
        {
            cout << tab_m[ i ][ j ] << " ";
        }
        cout << endl;
    }
}

Macierz Macierz::dodaj_macierz( Macierz & m2 )
{
    cout << "Dodaje macierze  \n";
    cout << "Wynik dodawania: \n";

    Macierz suma;
    suma= * this;

    for( int i = 0; i < m_size; i++ )
    {
        for( int j = 0; j < m_size; j++ )
        {
            suma.tab_m[ i ][ j ] = tab_m[ i ][ j ] + m2.tab_m[ i ][ j ];
        }
    }
    return suma;

}

Macierz Macierz::odejmij_macierz( Macierz & m2 )
{
    cout << "Odejmuje macierze  \n";
    cout << "Wynik dodawania: \n";

    Macierz suma;
     suma= * this;

    for( int i = 0; i < m_size; i++ )
    {
        for( int j = 0; j < m_size; j++ )
        {
            suma.tab_m[ i ][ j ] = tab_m[ i ][ j ] - m2.tab_m[ i ][ j ];
        }
    }
    return suma;

}
Macierz Macierz::pomnoz_macierz( Macierz & m2 )
{
    cout << "Mnoze macierze  \n";
    cout << "Wynik dodawania: \n";

    Macierz suma;
     suma= * this;

    for( int i = 0; i < m_size; i++ )
    {
        for( int j = 0; j < m_size; j++ )
            for (int k=0; k<m_size; k++)
        {
            suma.tab_m[ i ][ j ] = suma.tab_m[i][j] + tab_m[i][k] * m2.tab_m[k][j];;
        }
    }
    return suma;

}

int main()
{
    //Deklaracja obiektów klasy Macierz
    Macierz m1, m2, suma;

    // Pobranie danych do macierzy
    m1.wypelnij_macierz();
    cout << endl;
    m2.wypelnij_macierz();
    cout << endl;

    // Wyswietlenie podanych macierzy w celu sprawdzenia
    cout << "Podane dane: \n\n";
    m1.wypisz_macierz();
    cout << endl;
    m2.wypisz_macierz();
    cout << endl;

    // Dodawanie macierzy
    suma = m1.dodaj_macierz( m2 );
    cout << endl;
    suma.wypisz_macierz();
    cout << endl;

    suma = m1.odejmij_macierz( m2 );
    cout << endl;
    suma.wypisz_macierz();
    cout << endl;

    suma = m1.pomnoz_macierz( m2 );
    cout << endl;
    suma.wypisz_macierz();
    cout << endl;

    system( "PAUSE" );
    return 0;
} 
0
double ** tab_m; 

ten wskaznik jest uzywany jako dwuwymiarowa dynamiczna tablica. Lepiej byloby uzyc tutaj std::vector
do poczytania
http://www.p-programowanie.pl/cpp/tablice-dynamiczne/

0

Dziękuje rozumiem już powoli. Przyjmę jeszcze tą lekturę na dzisiaj i poczytam o tym. A co do tego programu. Czy "suma= * this" jest niezbędne?

0

nie jest niezbedne. zwracanie this nie ma sensu w wiekszosci wypadkow. W tym tez mozna sie pozbyc tego

0
Biały Pomidor napisał(a):

Mam pytanie ponieważ jestem troche zielony co oznacza przykład : double **tab_m; ( dwie gwiazdki ? ) jest to jakis podwójny wskaźnik ? Czemu to ma służyć i co to jest gdyby mogl ktos mi dokładnie wyjaśnić.

To jest tablica wskaźników... i tyle.

możesz to sobie powielać dowolnie:

double ***v;

i to jest tablica wskaźników do tablic do wskaźników... itd.

3
pir napisał(a):
Biały Pomidor napisał(a):

Mam pytanie ponieważ jestem troche zielony co oznacza przykład : double **tab_m; ( dwie gwiazdki ? ) jest to jakis podwójny wskaźnik ? Czemu to ma służyć i co to jest gdyby mogl ktos mi dokładnie wyjaśnić.

To jest tablica wskaźników... i tyle.

To nie jest tablica wskaźników. To jest wskaźnik do wskaźnika.

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