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

Wskażnik do tablicy zwracany przez funkcje

Ostatnio zmodyfikowano 2013-01-13 18:37
Autor Wiadomość
Karol_14
Temat założony przez niniejszego użytkownika
Wskażnik do tablicy zwracany przez funkcje
» 2013-01-13 16:20:17
Zacząłem pisać prosty program do marge sort. To narazie połowa pracy ale napotkałem problem którego nie potrafie wyjaśnić. pokaże na przykladach.

C/C++
#include <iostream>
using namespace std;
///////////////////////////////////
int * scal( int lewa[], int prawa[], int dlugoscL, int dlugoscP )
{
    int posortowane[ dlugoscL + dlugoscP ];
    int i = 0, j = 0, k = 0;
    while( k < dlugoscP + dlugoscL )
    {
        if( prawa[ i ] < lewa[ j ] )
        {
            posortowane[ k ] = prawa[ i ];
            i++;
            k++;
        }
        else
        {
            posortowane[ k ] = lewa[ j ];
            j++;
            k++;
        }
       
    }
    while( j < dlugoscL )
    {
        posortowane[ k ] = lewa[ j ];
        j++;
        k++;
    }
    while( i < dlugoscP )
    {
        posortowane[ k ] = prawa[ i ];
        i++;
        k++;
    }
    return posortowane;
}
///////////////////////////////////
int main()
{
    int tab1[ 5 ] = { 1, 3, 6, 78, 234 };
    int tab2[ 5 ] = { - 54, 8, 43, 231, 867 };
    int * wynik = scal( tab1, tab2, 5, 5 );
    for( int i = 0; i < 10; i++ ) cout << wynik[ i ] << endl;
   
}

w środku funkcji tablice ładnie się sortują, zwraca wskaźnik do tej tablicy, ale jak już mam ją odczytać to poprawnie pokazuje tylko pierwszy element(i to też tylko jednokrotnie mogę go odczytać, później jakby zmienia się wartość). Gdy wyśle tablice jako argument funkcji wszystko działa poprawnie:
C/C++
#include <iostream>
using namespace std;
///////////////////////////////////
int * scal( int lewa[], int prawa[], int dlugoscP, int dlugoscL, int posortowane[] )
{
    int i = 0, j = 0, k = 0;
    while( k < dlugoscP + dlugoscL )
    {
        if( prawa[ i ] < lewa[ j ] )
        {
            posortowane[ k ] = prawa[ i ];
            i++;
            k++;
        }
        else
        {
            posortowane[ k ] = lewa[ j ];
            j++;
            k++;
        }
       
    }
    while( i < dlugoscL )
    {
        posortowane[ k ] = lewa[ i ];
        k++;
        i++;
    }
    while( j < dlugoscP )
    {
        posortowane[ k ] = prawa[ j ];
        j++;
        k++;
    }
    return posortowane;
}
///////////////////////////////////
int main()
{
    int tab1[ 5 ] = { 1, 3, 6, 78, 234 };
    int tab2[ 5 ] = { 0, 8, 43, 231, 867 };
    int wynik[ 10 ];
    scal( tab1, tab2, 5, 5, wynik );
    for( int i = 0; i < 10; i++ ) cout << wynik[ i ] << endl;
   
}

Mógłby mi ktoś powiedzieć czemu tak się dzieje? To bardzo irytujący problem
P-73812
DejaVu
» 2013-01-13 18:37:30
Zwracasz adres do zmiennej lokalnej, która przestaje istnieć z chwilą wyjścia z funkcji. To jest standardowe i prawidłowe zachowanie C++.
P-73823
« 1 »
  Strona 1 z 1