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

Wskaźnik na wektor - wypisywanie elementów

Ostatnio zmodyfikowano 2017-01-05 17:36
Autor Wiadomość
begginer
Temat założony przez niniejszego użytkownika
Wskaźnik na wektor - wypisywanie elementów
» 2017-01-05 13:57:29
Witam, pisze program ktory zawiera funkcje zwracajaca wskaznik do wektora o elementach strukturalnych.. Nastepnie w main'ie probuje wypisac jakis element danego wektora, lecz nie bardzo wiem jak to zrobic za pomoca wskaznika. Dodam, ze dana funkcja musi posiadac tylko 1 argument - wielkosc wektora.
C/C++
#include <iostream>
#include <vector>
using namespace std;
struct complex
{
    float rzecz;
    float uroj;
};
vector < complex >* generuj( int n )
{
    vector < complex > y;
    for( int i = 1; i <= n; i++ )
    {
        complex x;
        x.rzecz = i;
        x.uroj = i + 1;
        y.push_back( x );
    }
    vector < complex >* p;
    p = & y;
    return p;
}
int main()
{
    int n = 10;
    vector < complex > * x = generuj( n );
    cout <<( * x )[ 0 ].rzecz; // ?? BŁĄD KOMPLIACJI
    cin.ignore();
}
P-156021
michal11
» 2017-01-05 14:03:41
Nie możesz z funkcji zwrócić adresu zmiennej lokalnej ponieważ ta zmienna po wyjściu z funkcji jest niszczona, czyli masz adres na coś czego już nie ma, zwróć normalnie przez wartość i będzie dobrze. A jeżeli koniecznie musi to być wskaźnik to użyj dynamicznej alokacji (smart pointery).
P-156022
Gibas11
» 2017-01-05 14:03:50
Zwracasz wskaźnik na zmienną lokalną, która przestaje istnieć po zakończeniu funkcji. Przekaż vector jako parametr przez referencję i użyj
std::complex <>
 z biblioteki standardowej.

Tak na szybko:
C/C++
#include <iostream>
#include <complex>
#include <vector>

void generuj( std::vector < std::complex < int >>& vector, int n ) {
    for( int i = 1; i <= n; i++ ) {
        vector.push_back( { i, i + 1 } );
    }
}

int main() {
    std::vector < std::complex < int >> liczby;
    generuj( liczby, 10 );
   
    std::cout << liczby[ 0 ] << std::endl;
   
    return 0;
}
P-156023
michal11
» 2017-01-05 14:06:37
@up

Dodam, ze dana funkcja musi posiadac tylko 1 argument - wielkosc wektora.

także twoje rozwiązanie raczej nie przejdzie.
P-156024
Gibas11
» 2017-01-05 14:12:48
@UP
O, rzeczywiście, no to jak mówiłeś, najlepiej przez wartość albo smart pointerem.
P-156025
begginer
Temat założony przez niniejszego użytkownika
» 2017-01-05 14:18:45
EDIT:
Sprawdzilem taka sama sytuacje ale zamiast wektora jest zwykly int, i wszystko dziala:
C/C++
#include <iostream>
#include <vector>
using namespace std;
//struct complex
//{
// float rzecz;
// float uroj;
//};
int * generuj( int n )
{
    int y = n;
    /*for (int i = 1; i <= n; i++)
    {
    complex x;
    x.rzecz = i;
    x.uroj = i + 1;
    y.push_back(x);
    }*/
    int * p;
    p = & y;
    return p;
}
int main()
{
    int * x = generuj( 10 );
    cout << * x;
    cin.ignore();
}
P-156026
Gibas11
» 2017-01-05 14:42:04
Przypadek.
//edit:
To już nie zadziała:
C/C++
#include <iostream>
#include <vector>
using namespace std;

int * generuj( int n )
{
    int y = n;
    int * p;
    p = & y;
    return p;
}

void func() {
    int a = 2;
    std::cout << a << std::endl;
}

int main()
{
    int * x = generuj( 10 );
    func();
    cout << * x;
    cin.ignore();
}
P-156027
mokrowski
» 2017-01-05 15:31:46
@begginer, koledzy napisali. To że działa to w tym przypadku to raczej "nieszczęście" :-/
Jeśli nie znasz wskaźników inteligentnych i nie znasz zagadnień new/delete to:
C/C++
#include <iostream>
#include <vector>

using namespace std;

struct complex
{
    float rzecz;
    float uroj;
};

vector < complex >* generuj( size_t n )
{
    static vector < complex > y;
    // Zakładam że chcesz mieć n elementów stąd nierówność "ostra"
    // i taka jak widzisz alokacja.
    y.reserve( n );
    for( size_t i = 0; i < n; ++i )
    {
        complex x;
        x.rzecz = i;
        x.uroj = i + 1;
        y.push_back( x );
    }
   
    return & y;
}
int main()
{
    size_t n = 10;
    vector < complex > * x = generuj( n );
    for( size_t i = 0; i < n; ++i ) {
        cout << "Struktura: rzecz = " <<( * x )[ i ].rzecz
        << " uroj = " <<( * x )[ i ].uroj << endl;
    }
}
Tu jak wyżej nie ukrywam rozwiązanie "jakie wymagania, takie rozwiązanie" :-/

Jak znasz zagadnienia new/delete to:
C/C++
#include <iostream>
#include <vector>

using namespace std;

struct complex
{
    float rzecz;
    float uroj;
};

vector < complex >* generuj( size_t n )
{
    vector < complex > * y = new vector < complex >();
    // Zakładam że chcesz mieć n elementów stąd nierówność "ostra"
    // i taka jak widzisz alokacja.
    y->reserve( n );
    for( size_t i = 0; i < n; ++i )
    {
        complex x;
        x.rzecz = i;
        x.uroj = i + 1;
        y->push_back( x );
    }
   
    return y;
}
int main()
{
    size_t n = 10;
    vector < complex > * x = generuj( n );
    for( size_t i = 0; i < n; ++i ) {
        cout << "Struktura: rzecz = " <<( * x )[ i ].rzecz
        << " uroj = " <<( * x )[ i ].uroj << endl;
    }
   
    delete x;
}
P-156028
« 1 » 2
  Strona 1 z 2 Następna strona