Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Przydział pamięci (wskaźnik na strukturę)

Ostatnio zmodyfikowano 2017-03-08 09:34
Autor Wiadomość
Anim
Temat założony przez niniejszego użytkownika
Przydział pamięci (wskaźnik na strukturę)
» 2017-03-07 14:29:41
Mam problem ze zrozumieniem dynamicznego przydziału pamięci dla struktury. Chcę mieć strukturę taką jak w przykładzie poniżej: Czyli taką, która zawiera w sobie vector <int>. Jednak tutaj rodzi się moje pytanie: jak posłużyć się vectorem, aby można było używać wskaźnika na strukturę bezpiecznie. O ile poniższy kod działa (kompiluje się i nie wywala błędu), to kod nr 2 nie jest poprawny. Jak go poprawić, aby był poprawny?

KOD I:
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <vector>


using namespace std;
struct dane
{
    vector < int > tablica;
};

bool funkcja( int rozmiar, dane * tab )
{
    if( tab == '\0' )
    {
        tab = new dane;
        tab->tablica.push_back( 10 );
        cout << tab->tablica[ 0 ] << endl;
        delete tab;
        return true;
    }
    else return false;
   
}

int main()
{
    int rozmiar = 10;
    dane * tab;
   
    cout << funkcja( rozmiar, tab );
   
    return 0;
}

KOD II (tutaj tylko funkcja()):
C/C++
bool funkcja( int rozmiar, dane * tab )
{
    if( tab == '\0' )
    {
        tab = new dane;
        for( int a = 0; a < 10, a++ ) {
            tab->tablica.push_back( 10 );
        }
        delete tab;
        return true;
    }
    else return false;
   
}

Jak "pokazać" wskaźnikowi, że zajmiemy jakiś obszar pamięci ze względu na dynamiczny vector? Mam nadzieję, że wyrażam się w miarę jasno o co mi chodzi. Z góry dziękuję za podpowiedzi.
P-158656
Monika90
» 2017-03-07 17:11:35

C/C++
if( tab == '\0' )

Przyjęło się zapisywać to w taki sposób:
C/C++
if( !tab )
ponieważ tab to jest wskaźnik. Jaki sens ma porównywanie wskaźnika ze znakiem?



C/C++
dane * tab;
A to jest niezainicjalizowana zmienna, należy zainicjalizować:
C/C++
dane * tab = nullptr;
P-158665
mateczek
» 2017-03-07 19:46:00
C/C++
dane * tab;
cout << funkcja( rozmiar, tab ); // nic nie daje przekazanie tab do funkcji. Przekazujesz przez wartość
P-158666
Anim
Temat założony przez niniejszego użytkownika
» 2017-03-07 21:47:38
Dziękuję :)

A w tym miejscu dodam dodatkowe pytanie: Czy nie lepiej zrobić to przez referencję (chyba nie rozumiem różnicy pomiędzy przekazywaniem przez wskaźnik i przez referencję)? W czym KOD 1 jest lepszy/gorszy/inny od KOD-u 2? :


KOD 1:

C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <vector>


using namespace std;
struct dane
{
    vector < int > tablica;
};

void funkcja( int rozmiar, dane * tab )
{
    for( int i = 0; i < rozmiar; i++ ) {
        tab->tablica.push_back( i + 1 );
        cout << tab->tablica[ i ] << endl;
    }
}

int main()
{
    int rozmiar = 10;
    dane * tab = new dane;
    funkcja( rozmiar, tab );
    delete tab;
   
    return 0;
}

KOD 2:

C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <vector>


using namespace std;
struct dane
{
    vector < int > tablica;
};

void funkcja( int rozmiar, dane & tab )
{
    for( int i = 0; i < rozmiar; i++ ) {
        tab.tablica.push_back( i + 1 );
        cout << tab.tablica[ i ] << endl;
    }
}

int main()
{
    int rozmiar = 10;
    dane tab;
    funkcja( rozmiar, tab );
   
    return 0;
}

Mam nadzieję, że to nadal jest zgodne z punktem: jeden wątek - jeden temat ^^
P-158667
carlosmay
» 2017-03-08 09:34:28
Wskazniki nie mają "tego całego lukru składniowego", jaki mają referencje. Wskazniki zaś dają wieksze możliwości. Mając wskaźnik można zarządzać pamięcią ( ref nie), ale jeśli potrzebujesz odwołania się do obiektu bez kopiowania go, to referencja jest wygodniejsza (przejmuje cechy orginalnego obiektu).
Jeśli chodzi o wydajność to nie ma różnicy.
P-158679
« 1 »
  Strona 1 z 1