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ć.
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)
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;
}
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/
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?
nie jest niezbedne. zwracanie this nie ma sensu w wiekszosci wypadkow. W tym tez mozna sie pozbyc tego
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.
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.