Comment puis-je renvoyer ce tableau à la fonction principale pour une utilisation ultérieure dans mon programme?

int* enterMarks(int marks) {

int arr[marks];
cout << "Please enter " << marks << "marks (0<=Mark<=100):" << endl;

for (int i = 0; i < marks; i++) {
    cout << i+1 << ">";
    cin >> arr[i];
}
cout << "Thank you..." << endl;

return *arr;
-1
CuzWhyNot Vlogs 1 juin 2020 à 01:18

3 réponses

Meilleure réponse

Pour les débutants, des tableaux de longueur variable comme celui-ci

int* enterMarks(int marks) {

int arr[marks];
//...

N'est pas une fonctionnalité C ++ standard. En C ++, la taille d'un tableau doit être une constante à la compilation.

Deuxièmement, un pointeur vers un tableau local avec une durée de stockage automatique renvoyée par la fonction aura une valeur non valide car le tableau local ne sera pas actif après avoir quitté la fonction.

Vous devez disposer d'un tableau alloué dynamiquement.

Soit vous pouvez utiliser le pointeur intelligent std::unique_ptr qui pointera vers un tableau alloué dynamiquement comme indiqué dans le programme de démonstration ci-dessous.

#include <iostream>
#include <memory>

std::unique_ptr<unsigned int[]> enterMarks( size_t marks ) 
{
    const unsigned HIGH_MARK = 100;

    auto arr = std::make_unique<unsigned int[]>( marks );

    std::cout << "Please enter " << marks 
              << " marks (0<=Mark<=" << HIGH_MARK << "):" << std::endl;

    for ( size_t i = 0; i < marks; i++ ) 
    {
        std::cout << i+1 << "> ";
        std::cin >> arr[i];
    }

    std::cout << "Thank you..." << std::endl;

    return arr;
}

int main() 
{
    size_t n = 10;

    auto arr = enterMarks( n );

    for ( size_t i = 0; i < n; i++ )
    {
        std::cout << arr[i] << ' ';
    }
    std::cout << '\n';

    return 0;
}

La sortie du programme pourrait ressembler à

Please enter 10 marks (0<=Mark<=100):
1> 10
2> 20
3> 30
4> 40
5> 50
6> 60
7> 70
8> 80
9> 90
10> 100
Thank you...
10 20 30 40 50 60 70 80 90 100 

Ou vous pouvez utiliser le modèle de classe standard std :: vector comme indiqué ci-dessous.

#include <iostream>
#include <vector>

std::vector<unsigned int> enterMarks( size_t marks ) 
{
    const unsigned HIGH_MARK = 100;

    std::vector<unsigned int> arr( marks );

    std::cout << "Please enter " << marks 
              << " marks (0<=Mark<=" << HIGH_MARK << "):" << std::endl;

    for ( size_t i = 0; i < marks; i++ ) 
    {
        std::cout << i+1 << "> ";
        std::cin >> arr[i];
    }

    std::cout << "Thank you..." << std::endl;

    return arr;
}

int main() 
{
    size_t n = 10;

    auto arr = enterMarks( n );

    for ( size_t i = 0; i < n; i++ )
    {
        std::cout << arr[i] << ' ';
    }
    std::cout << '\n';

    return 0;
}

La sortie du programme peut ressembler à celle illustrée ci-dessus.

Faites attention qu'il n'y a pas de grand sens à créer le tableau du type entier signé int. Il est préférable d'utiliser le type entier non signé unsigned int.

2
Vlad from Moscow 31 mai 2020 à 22:56

Actuellement, vous essayez de retourner une adresse locale qui sortira de la portée lorsque la fonction retourne en invoquant un comportement non défini, vous devez allouer de la mémoire pour votre tableau:

int *enterMarks(int marks) {   
    int *arr = new int[marks];
    //...
    return arr; //<-- no derefencing on return
}

delete [] arr; lorsque vous n'en avez plus besoin.

Vous avez des conteneurs C ++ qui peuvent vous éviter ce genre de problème, dans ce cas, puisque c'est un tableau de longueur variable, je recommanderais std::vector:

std::vector<int> enterMarks(int marks) {
    std::vector<int> arr;
    //...
    cin >> mark;
    arr.push_back(mark);
    //...
    return arr;
}
0
anastaciu 31 mai 2020 à 22:52
int arr[marks];

Il s'agit d'une variable locale et vous ne pouvez donc pas la renvoyer, sinon le comportement n'est pas défini, a provoqué un plantage, etc.

Vous avez deux options

1) Allouez le tableau dans le tas et renvoyez-le

int *arr = (int *)malloc(sizeof(int)*marks);
...
return arr;

Vous devez alors free le arr dans la fonction appelante.

2) Mieux, utilisez le vecteur C ++ et renvoyez-le

std::vector<int> arr;
...
cin >> mark;
arr.push_back(mark);
...
return arr;

De cette façon, vous n'avez pas à vous rappeler de libérer la mémoire du tas.

2
artm 31 mai 2020 à 22:25