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

[c++]Modyfikacja dynamicznej tablicy przez przepisanie adresu/wskaznika...

Ostatnio zmodyfikowano 2014-05-19 15:10
Autor Wiadomość
mackol
Temat założony przez niniejszego użytkownika
[c++]Modyfikacja dynamicznej tablicy przez przepisanie adresu/wskaznika...
» 2014-05-15 23:26:10
Witam,
mam problem z poniższym kodem, mógł by mi ktoś wyjaśnić dlaczego jakakolwiek próba modyfikacja tablicy z poziomu funkcji nie przynosi skutku? W funkcji dynamicznie tworzę tablice o x rozmiarze i chciałbym podmienić istniejącą tablice na nową poprzez przepisanie wskaźnika, w ciele main ten sposób działa, w osobnej funkcji już nie :/
C/C++
#include <cstdlib>
#include <iostream>

using namespace std;

void mod_tab( int * tab ) {
   
    int * nowy = new int[ 1 ];
    nowy[ 0 ] = 66666;
    tab = nowy;
}

int main( int argc, char ** argv ) {
   
    int * tablica = new int;
   
    //To działa!
    int * nowy = new int[ 1 ];
    nowy[ 0 ] = 11111;
    tablica = nowy;
   
    //A to nie działa???
    mod_tab( tablica );
   
    printf( "%d\n", tablica[ 0 ] );
   
    return 0;
}
 
P-110084
OSA_PL
» 2014-05-15 23:36:35
W twojej funkcji masz dostęp tylko do lokalnej kopii wartości zapisanej we wskaźniku, a żeby zmienić wartość we wskaźniku, który przekazujesz potrzebujesz jego adresu w pamięci - przekazuj wskaźnik przez referencje/wskaźnik.
P-110085
mackol
Temat założony przez niniejszego użytkownika
» 2014-05-16 11:01:49
No ok. teraz cos się zmieniło ale nadal nie mogę uzyskać pożądanego efektu:
C/C++
#include <cstdlib>
#include <iostream>

using namespace std;

void mod_tab( int & tab, int i ) {
   
    int * nowy = new int[ i ];
   
    nowy[ 0 ] = 11;
    nowy[ 1 ] = 99;
   
    tab = * nowy;
}

int main( int argc, char ** argv ) {
   
    int * tablica = new int;
   
   
    //A to nie działa???
    mod_tab( * tablica, 2 );
   
    printf( "%d\n", tablica[ 0 ] ); //wynik 11
    printf( "%d\n", tablica[ 1 ] ); //wynik 0 ?
   
   
    return 0;
}

Chciałbym za pomocą funkcji tworzyć dynamicznie nową tablice o określonym rozmiarze i przypisywać jej zawartość do wcześniej zdefiniowanej tablicy w main...? 
P-110099
OSA_PL
» 2014-05-16 11:46:42
C/C++
void mod_tab( int *& tab, int i ) //wskaznik przez referencje
{
   
    int * nowy = new int[ i ];
   
    nowy[ 0 ] = 11;
    nowy[ 1 ] = 99;
   
    tab = nowy;
}
P-110100
Monika90
» 2014-05-16 11:50:10
A nie wpadłeś na to, że jak chcesz coś zwrócić z funkcji, to deklarujesz funkcję z odpowiednim typem zwracanym i używasz return?

Przykład
C/C++
std::vector < int > mod_tab( int size )
{
    std::vector < int > tab( size );
    return tab;
}

W ogóle w C++ nie robi się tablic dynamicznych w taki sposób, używaj kontenerów (najlepiej vectora), albo inteligentnych wskaźników (i to bez jawnego użycia new):
C/C++
auto tab = std::make_unique < int[] >( size );
P-110101
maly
» 2014-05-16 12:08:35
std::make_unique ciekawa opcja ale C++14 !!!
P-110102
mackol
Temat założony przez niniejszego użytkownika
» 2014-05-16 14:19:33
To nie jest rzeczywisty problem tylko "akademicki", muszę użyć zwykłych wskaźników, żadnych vektorów, żadnego STL-a...

C/C++
void mod_tab( int *& tab, int i ) //wskaznik przez referencje
{
   
    int * nowy = new int[ i ];
   
    nowy[ 0 ] = 11;
    nowy[ 1 ] = 99;
   
    delete[] tab; //dlaczego nie działa? jeśli tab[10] elementów nadpiszę dwa pierwsze reszta jest bez zmian?
   
    tab = nowy;
}

mam jeszcze jedno pytanie dlaczego nie działa zwalnianie pamięci z poziomu funkcji - delete[] tab;
P-110109
OSA_PL
» 2014-05-16 16:23:09
A po czym wnioskujesz, że nie działa?
P-110121
« 1 » 2
  Strona 1 z 2 Następna strona