Использование функций для создания и инициализации массива из main в Visual Studio 2017 - PullRequest
0 голосов
/ 21 октября 2019

Элементы массива не инициализируются, потому что когда я запускаю код, я вижу только значения из памяти, а не значения, которые я установил в векторе. Можете ли вы объяснить мне, почему это происходит, и что я должен делать в будущем, чтобы избежать этой ошибки? Пожалуйста, игнорируйте комментарии из моего кода

#include <iostream>
using namespace std;

//ne va crapa deoarece nu am initializat valorile vectorului, de asta cream o functie de initializare vector

void initialisingVector(int* vector, int n, int InitialValue)
{
    for (int i = 0; i < n; i++)
    {
        vector[i] = InitialValue;
    }

}
//mereu vom pune initializarea inainte de afisare

void displayingtheVector(int vector[], int n)
{
    cout << endl << "The vector is:";
    for (int i = 0; i < n; i++)
    {
        cout << vector[i] << ",";
    }
}

int* creatingAndInitialisingtheVector(int* n)//nu avem nevoie de nr de elemente deoarece le ia din main;si nici de vector;
{//nu avem nevoie de nimic la parametrii, totusi punem n deoarece ne da eroare-n main, ai comentat acolo

//vom folosi in* n ca parametru deoarece n e o valoare ce se va modifica , prin urmare e transmisa prin pointer

//vom avea eroare cu expected ; ,nu are legatura cu ; problema este de la int[] ,expected an identifier
//nu o sa putem nici o data pune int[] la tipul unei functii, mereu vom pune int*, int[]---sa incercam sa uitam forma asta;
//INTOTDEAUNA int*

    int vectorNou[30];
    int numberElements;
    int InitialValue;

    std::cout << std::endl << "Number of elements:";
    std::cin >> numberElements;
    *n = numberElements;

    std::cout << std::endl << "Initial value is:";
    std::cin >> InitialValue;


    initialisingVector(vectorNou, numberElements, 0);
    //afisareVector(vectorNou, numarElemente); nu are sens sa o facem in fct de creare

    return vectorNou;
}


int main()
{
    int listaPreturi[30];
    int numarProduse;

    /*std::cout << std::endl<<"Numarul de produse este:";
    std::cin >> numarProduse;

    initializareVector(listaPreturi, numarProduse, 0);
    afisareVector(listaPreturi,numarProduse);
    */

    //listaPreturi=crearesiInitializareVector();//ne va trebui o variabila care sa prinda vectorul creat de functie,de asta punem listaPreturi
    //vom obtine o alta eroare dupa ce egalam variabila cu functia; expression must be a modifiable lvalue==>listaPreturi e o variabila constanta, si trebuie sa fie modifiable
    //dc avem o fct care inhtoarce un vector nu vom putea prinde vectorul nou intr-un alt vector deja creat static.
    //il va prinde u8n vetor dinamic in schimb
    int nrElements = 0;
    int* vectorNew = creatingAndInitialisingtheVector(&nrElements);//functioneaza

    //afisareVector(vectorNou, sizeof(vectorNou)); e periculos folosind sizeof(vectorNou) deoarece vectorNou are 4 , utilizatoru poate vrea mai multe elemente

    displayingtheVector(vectorNew, nrElements);
}

Я ожидаю, что будет отображаться вектор со значениями, установленными пользователем, а не адресами памяти.

Ответы [ 2 ]

3 голосов
/ 21 октября 2019

Программа имеет неопределенное поведение, потому что функция creatingAndInitialisingtheVector возвращает указатель на локальный массив

int vectorNou[30];

, который не будет работать после выхода из функции.

Кажется, вы должны объявитьфункционировать с еще одним параметром следующим образом

size_t creatingAndInitialisingtheVector( int *a, size_t n );

и вызывать функцию в основном как

size_t nrElements = 
    creatingAndInitialisingtheVecto( listaPreturi, sizeof( listaPreturi ) / sizeof( *listaPreturi ) );

Определение функции может выглядеть как

size_t creatingAndInitialisingtheVector( int *a, size_t n)//nu avem nevoie de nr de elemente deoarece le ia din main;si nici de vector;
    {//nu avem nevoie de nimic la parametrii, totusi punem n deoarece ne da eroare-n main, ai comentat acolo

    //vom folosi in* n ca parametru deoarece n e o valoare ce se va modifica , prin urmare e transmisa prin pointer

    //vom avea eroare cu expected ; ,nu are legatura cu ; problema este de la int[] ,expected an identifier
    //nu o sa putem nici o data pune int[] la tipul unei functii, mereu vom pune int*, int[]---sa incercam sa uitam forma asta;
    //INTOTDEAUNA int*

        size_t numberElements;
        int InitialValue;

        std::cout << std::endl << "Number of elements:";
        std::cin >> numberElements;

        if ( n < numberElements ) numberElements = n;

        std::cout << std::endl << "Initial value is:";
        std::cin >> InitialValue;

        initialisingVector( a, numberElements, InitialValue);
        //afisareVector(vectorNou, numarElemente); nu are sens sa o facem in fct de creare

        return numberElements;
    }
0 голосов
/ 21 октября 2019

Внутри вашей функции creatingAndInitialisingtheVector вы возвращаете указатель на память, которая выйдет из области видимости после возврата из функции. Память выделяется для области действия функции и освобождается после возврата. Я бы порекомендовал прочитать о области видимости и о том, как выделяется память для таких вещей, как массивы в C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...