Page 1 of 1

functii

Posted: 29 Jul 2014, 22:21
by vili_c++
Am realizat urmatorul cod ce ar trebui sa afiseze un vector.
Va rog sa ma ajutati sa inteleg de ce nu afiseaza elementele vectorului.
Va multumesc !

Code: Select all

#include <iostream>
using namespace std;
int *pfunction(int n);

int main()
{
    int n, *q;
    cout << "\n Numarul de elemente: ";
    cin >> n;
    q = pfunction(n);
    cout << "\n Elementele vectorului sunt: ";
    for (int i=0; i<n; i++)
        cout << " " << *(q+i);
    cout << endl;
    return 0;
}

int *pfunction(int n)
{
    int *p, tab[10];
    p = &tab[0];
    for(int i=0; i<n; i++)
    {
        cout << "\n tab[" << i << "] = ";
        cin >> *(p+i);
    }
    return p;
}

Re: functii

Posted: 30 Jul 2014, 09:09
by Ovidiu Cucu
Tabloul tab[10] e definit local in pfunction. La iesirea din scopul functiei, tab[10] este distrus iar ca mai departe programul o sa-ti afiseze "carcalaci".
Solutia este sa-l definesti in main si sa-l transmiti functiei ca parametru.

Cam asa:

Code: Select all

int main()
{
    // ...

    int tab[10];
    q = pfunction(n, tab);

    // ...
}

int *pfunction(int n, int tab[])
{
    int *p;
    p = &tab[0]; // sau mai simplu, p = tab; (numele tabloului e un pointer la primul element)
    
    // ...

    return p;
}
...sau si mai simplu, folosesti direct tab,

Code: Select all

int *pfunction(int n, int tab[])
{
    for(int i=0; i < n; i++)
    {
        cout << "\n tab[" << i << "] = ";
        cin >> *(tab + i);
    }
    return tab;
}
...sau, echivalent

Code: Select all

int *pfunction(int n, int tab[])
{
    for(int i=0; i < n; i++)
    {
        cout << "\n tab[" << i << "] = ";
        cin >> tab[i];
    }
    return tab;
}
tab este echivalent cu *(tab + i)

Re: functii

Posted: 30 Jul 2014, 11:11
by vili_c++
Multumesc de raspuns domnule Cucu !
Intre timp am si o alta varianta a codului de mai sus cu tab[10] declarat ca variabila statica.
Prezinta un dezavantaj declararea tabloului tab[10] ca variabila statica ?

Code: Select all

#include <iostream>
using namespace std;
int *pfunction(int);

int main()
{
    int n, *q;
    cout << "\n Numarul de elemente: ";
    cin >> n;
    q = pfunction(n);
    cout << "\n Elementele vectorului sunt: ";
    for (int i=0; i<n; i++)
        cout << " " << *(q+i);
    cout << endl;
    return 0;
}

int *pfunction(int n)
{
    int *p;
    static int tab[10];
    p = &tab[0];
    for(int i=0; i<n; i++)
    {
        cout << "\n tab[" << i << "] = ";
        cin >> *(p+i);
    }
    return p;
}


Re: functii

Posted: 30 Jul 2014, 20:05
by MarianMMX
In cazut tau, nu.