0
votes

Je rencontre des ennuis en C ++ obtenir une entrée d'un utilisateur dans une fonction, ajoutant à un tableau et imprimer ce tableau

J'apprends C ++ et j'essaie de demander à l'utilisateur de saisir 4 numéros dans une fonction, puis d'imprimer simplement la matrice.

int getFourNums();
int main(int argc, char** argv){

    int getNums;

    getNums = getFourNums();

    cout << "The array is: " getNums << endl;
}

int getFourNums(){

    int i;

    int myArray[4];
    cout << "Enter 4 nums: ";
    for(i = 0; i < 4; i++){
        cin >> myArray[i];
    }
    return myArray[i];


9 commentaires

Votre bogue est ici retour myarray [i]; Votre code tente de renvoyer l'entier unique qui est à myarray [4] qui est hors limites.


Vous n'imprimez pas de tableau, n'est-ce pas?


Connexes: Stackoverflow.com/questions/3473438/ReTurn-Array -in-A-FunCti sur


De plus, si vous vouliez renvoyer un tableau int getnums; ne fonctionnerait pas car il s'agit d'un seul entier non pas un tableau.


Le moyen c ++ est d'utiliser std :: array ou std :: vecteur bien que si cela est une exercice académique qu'ils voudront peut-être que vous fassiez ce que vous feriez dans C


@Stephanlecherner Je viens d'essayer de retourner la matrice à utiliser dans une autre fonction, mais j'essayais de l'utiliser dans ma fonction principale pour voir si elle remplissait correctement


@ user2348258 "< J'essaie simplement de renvoyer le tableau " pour l'instant, la signature de int gefournums () signifie que la fonction renvoie un seul int < / code>. Pas un tableau.


Le tableau est en cours de remplissage correctement, mais vous retournez MyARRAY [4] depuis que je == 4 à ce moment-là. Notez que la matrice n'a pas d'élément à cette position, il est donc de retourner une mémoire invalide et il est renvoyé juste un int.


Les tableaux ne peuvent pas être attribués, c'est donc renvoyer un tableau ne fonctionne jamais. Mieux que vous puissiez obtenir, c'est un pointeur sur le tableau, mais puisque la variable locale est conforme à l'intérieur getfournour , un pointeur à celui-ci est inutile. La mémoire n'est pas valide au moment où la fonction d'appel peut faire n'importe quoi avec elle. Les tableaux sucent.


4 Réponses :


1
votes

Un problème de votre code est qu'une boucle comme xxx pré>

se retrouvera avec i == 4 code>. Par conséquent, retour myarray [i] code> dépassera les limites de la matrice et / ou accédera à une valeur non initialisée puis et donner un comportement non défini. P>

Le problème principal, cependant, est que, dans C ++, vous suivrez une approche très différente et utilisez des types de collecte comme std :: vecteur code> au lieu de tableaux simples. Voir le code suivant illustrant cela. J'espère que cela aide. P>

#include <vector>
#include <iostream>

std::vector<int> getFourNums(){

    int val;
    std::vector<int> result;
    cout << "Enter 4 nums: ";
    for(int i = 0; i < 4; i++){
        cin >> val;
        result.push_back(val);
    }
    return result;
}

int main(int argc, char** argv){
    std::vector<int> fourNums = getFourNums();
    for (auto i : fourNums) {
        cout << i << endl;
    }
}


0 commentaires

2
votes

Votre problème fondamental est que int getfournums () ne peut renvoyer qu'à un entier , pas un tableau d'entre eux. Le problème suivant est que les fonctions ne peuvent pas renverser des tableaux bruts pour des raisons historiques. Vos choix sont de renvoyer un std :: Array , un struct contenant le tableau, transmettez la matrice par référence dans la fonction ou renvoyez un std :: vecteur . Ma préférence pour cette application est un std :: vecteur - il est flexible, et bien que pas aussi efficace que std :: Array , vous devez probablement défaut à std :: vecteur sauf si vous avez une bonne raison sinon. Votre code getnums ressemblerait alors à: xxx

pour imprimer le vecteur, voir cette question . Ma préférence personnelle serait une gamme basée sur la boucle sur le vecteur; Vos goûts peuvent varier.


0 commentaires

0
votes

int getfournums () code> ne vous permettra que de revenir un int code>, pas l'ensemble de la matrice et retour myARRAY [i]; code> est hors de limites depuis i == 4 code>. Vous ne pouvez utiliser que la plage [0,3] en tant que indices pour votre tableau. Voici une version retravaté avec des commentaires dans le code.

#include <iostream>
#include <vector>

// don't do "using namespace std;" since it includes
// a lot of stuff you don't need.

// Here's a function that will return a vector of int's
// It'll behave much like a C style array
// but can have variable length and you can use
// a lot of standard functions on it.

std::vector<int> getNums(size_t count) {

    // The "array" we'll return with "count" number of
    // default constructed int:s (they will all be 0):

    std::vector<int> myArray(count);

    std::cout << "Enter " << count << " nums: ";

    // A range based for loop that will go through
    // all int:s in "myArray". "num" will be
    // a reference to each int in the vector which
    // means that if you change the value of "num",
    // you'll actually change the value in the vector.

    for(int& num : myArray) {
        // read values into the int currently
        // referenced by num

        std::cin >> num;
    }

    // return the vector by value
    return myArray;
}

// Put main() last so you don't have to forward declare the functions
// it uses

int main() {

    // call getNums with the value 4 to read 4 int:s
    std::vector<int> Nums = getNums(4);

    std::cout << "The array is:";

    // print each int in the vector. There's no need to use
    // a reference to the int:s here since we won't be changing
    // the value in the vector and copying an int is cheap.

    for(int num : Nums) {
        std::cout << " " << num;
    }

    // std::endl is rarely good when you only want to output a newline.
    // It'll flush the buffer with is costly.
    // Make a habit of using "\n" in most cases.

    std::cout << "\n";
}


0 commentaires

0
votes

Je vois que vous voulez que vous souhaitiez retourner une matrice complète, mais il suffit de regarder votre type de retour:

#include <iostream>
using namespace std;
const int SIZE = 4;

void getFourNums(int myArray[]);
void printFourNumbers(int array[]);

int main(int argc, char** argv){
    int myArray[SIZE];
    getFourNums(myArray);
    printFourNumbers(myArray);

}

void getFourNums(int myArray[]){
    int i;
    cout << "Enter 4 nums: ";
    for(i = 0; i < SIZE; i++){
        cin >> myArray[i];
    }
}

void printFourNumbers(int array[])
{
    for(int i = 0 ; i < SIZE ; ++i)
    {
        cout << array[i] << endl;
    }
}


0 commentaires