1
votes

2-D Array - Avertissement / erreur "Trop de valeurs d'initialisation"

Je suis nouveau dans la programmation. J'ai essayé de regarder un tas de questions similaires aux miennes ici, mais soit elles étaient trop avancées pour que je les comprenne, soit elles ne s'appliquaient pas tout à fait à ma situation.

Je viens d'apprendre les tableaux 2D, donc je fais une mission à leur sujet. (Le devoir concerne les classements de films, ce qui expliquera les noms des variables / tableaux / etc dans mon code)

Une de mes fonctions est censée attribuer des valeurs prédéterminées à un tableau d'entiers. Cependant, dans cette fonction, lorsque j'essaie d'initialiser le tableau / de lui attribuer des entiers, j'obtiens une de ces lignes ondulées rouges qui dit "Trop de valeurs d'initialisation" lorsque je survole.

  1. Pourquoi cela apparaît-il alors qu'il N'Y A PAS trop de valeurs mises dans le tableau? (voir code ci-dessous)

    Je pense avoir vu dans d'autres articles / réponses que vous ne pouvez pas attribuer à un tableau - est-ce vrai / est-ce que c'est ce qui ne va pas? Si oui, pourquoi? Et comment pourrais-je mettre des valeurs dans ce tableau, si ce n'est simplement en faisant quelque chose comme array [x] [y] = {...}?

  2. Ai-je utilisé / passé les bons arguments / paramètres dans la fonction?

Voici une partie de mon code (pas mon programme complet, juste les parties pertinentes à cette question):

message : The initializer contains too many elements

Les erreurs exactes que j'obtiens lorsque je essayez de le compiler sont:

error C2440: '=': cannot convert from 'initializer list' to 'int'

et

#include <iostream>
#include <cstdlib>

using namespace std;

//Global constants
const int NUM_REVIEWERS = 4;   //Number of rows in reviews array
const int NUM_MOVIES = 6;      //Number of columns in reviews array     

//function prototype
void initialRatings(int[][NUM_MOVIES]); 

int main()
{
    // Variable declarations
    int someArray[NUM_REVIEWERS][NUM_MOVIES];  // Ratings for reviewers
    int choice;

    initialRatings(someArray); //function call with actual argument passing in the array and the number of rows

    return 0;
}


/***************************************************************************
    function definition for initialRatings

    this function sets all data elements in the 2-D array to the sample data

****************************************************************************/

void initialRatings(int array[][NUM_MOVIES])
{
    array[NUM_REVIEWERS][NUM_MOVIES] = { {3, 1, 5, 2, 1, 5 }, 
                                         {4, 2, 1, 4, 2, 4 },//the beginning of this row is where I get the error 
                                         {3, 1, 2, 4, 4, 1 }, 
                                         {5, 1, 4, 2, 4, 2 } };
}

J'utilise Microsoft Visual Studio. J'ai essayé d'utiliser mon livre / de le chercher, mais j'ai du mal à trouver la ou les réponses que je recherche. N'hésitez pas à corriger tout ce que je dis de manière incorrecte. Je suis ici pour apprendre!


4 commentaires

Dans la fonction initialRatings () , array [NUM_REVIEWERS] [NUM_MOVIES] désigne un élément et non le tableau. C'est pourquoi l'erreur ne peut pas convertir de 'liste d'initialisation' en 'int' car lhs est int. De plus, array [NUM_REVIEWERS] [NUM_MOVIES] ne désigne aucun élément de votre tableau et conduit à un comportement indéfini


Merci à tous ceux qui ont répondu !! Cela semble évident maintenant que vous l'expliquez, haha. M'a beaucoup aidé! Je vais créer un autre tableau et ensuite "transférer" les valeurs une par une en utilisant des boucles for. :) Infiniment reconnaissant!!


@GraceM marque la question comme étant une réponse, comme vous êtes nouveau dans stackoverflow, accédez aux réponses ci-dessous et marquez-la comme la bonne réponse. Bonne chance avec C ++.


@Andersen ohh haha ​​ouais c'est vraiment bon à savoir! Merci! :)


3 Réponses :


0
votes

le problème avec votre code est que vous ne pouvez faire l'affectation ci-dessous que dans la déclaration de variable, c'est-à-dire que vous ne pouvez faire que plusieurs affectations du tableau, lorsque vous déclarez le tableau.

int main()
{
    // Variable declarations
    int someArray[NUM_REVIEWERS][NUM_MOVIES];  // Ratings for reviewers
    initialRatings(someArray); //function call with actual argument passing in the array and the number of rows
    for (int row = 0; row < NUM_REVIEWERS; row++)
    {
        for (int column = 0; column < NUM_MOVIES; column++)
        {
            cout << someArray[row][column] << " "; // print the array value and a space to separate 
                                                    // the values in each column
        }
        cout << endl; // add line break for each row
    } 
    return 0;
}

Dans votre cas, la variable array est déjà déclarée, donc le seul moyen d'attribuer des valeurs aux différents index est en itérant ou en attribuant directement une valeur à chaque position.

L'affectation que vous 'essayez de ne fonctionne que si c'était quelque chose comme ceci:

void initialRatings(int array[NUM_REVIEWERS][NUM_MOVIES])
{
    array[0][0] = 3;
    array[0][1] = 1;
    array[0][2] = 5;
    array[0][3] = 2;
    array[0][4] = 1;
    array[0][5] = 5;

    array[1][0] = 4;
    array[1][1] = 2;
    array[1][2] = 1;
    array[1][3] = 4;
    array[1][4] = 2;
    array[1][5] = 4;

//... Do the same for the other rows
}

Dans la déclaration de variable.

Si vous voulez toujours utiliser le void initialRatings (int array [] [NUM_MOVIES]) voici une alternative.

int array[NUM_REVIEWERS][NUM_MOVIES] = 
      { {3, 1, 5, 2, 1, 5 }, 
      {4, 2, 1, 4, 2, 4 },//the beginning of this row is where I get the error 
      {3, 1, 2, 4, 4, 1 }, 
      {5, 1, 4, 2, 4, 2 } };

Et si vous voulez voir le résultat après avoir appelé le La fonction initialRatings imprime les valeurs de chaque position sur la console.

array[NUM_REVIEWERS][NUM_MOVIES] = 
      { {3, 1, 5, 2, 1, 5 }, 
      {4, 2, 1, 4, 2, 4 },//the beginning of this row is where I get the error 
      {3, 1, 2, 4, 4, 1 }, 
      {5, 1, 4, 2, 4, 2 } };


0 commentaires

1
votes

Vous ne pouvez utiliser la liste d'initialisation que pour l'initialisation, et non pour l'attribution. Cela signifie que vous devrez attribuer des valeurs lorsque vous initialisez le tableau pour la première fois, c'est-à-dire

int array[NUM_REVIEWERS][NUM_MOVIES] = 
      { {3, 1, 5, 2, 1, 5 }, 
      {4, 2, 1, 4, 2, 4 },
      {3, 1, 2, 4, 4, 1 }, 
      {5, 1, 4, 2, 4, 2 } };

De plus, essayez d'utiliser un autre nom de variable, puisque array code> est un mot réservé en C ++ (bien que ce ne soit pas un problème mais ce n'est pas une bonne pratique de codage).


1 commentaires

Quoi qu'il en soit, le code est bien formaté et documenté!



0
votes

En C ++, lorsque vous utilisez arr [i] [j] , vous accédez en fait à un seul élément de ce tableau. Fondamentalement, arr [i] [j] est en fait * (* (arr + i) + j) . Et * ici est utilisé pour déréférencer un pointeur.

Prenons un exemple plus simple: supposons que vous ayez un tableau int a [3] = {4, 5, 6}; code>, il y aura 3 "blocs" de mémoire alloués pour contenir les valeurs, chacun prenant 4 octets (supposons que 1 int prend 4 octets).

|   4    |   5       |   6        |
0x1      0x1 + 4     0x1 +8       0x1+12
arr      arr+1       arr+2        arr+3

Pour les pointeurs, vous pouvez les considérer comme des variables spéciales qui contiennent les adresses mémoire d'autres variables. Comme le suggère le nom pointer , ils sont utilisés pour pointer vers d'autres variables.

En C / C ++, les noms de tableaux sont en fait des pointeurs const. Et vous pouvez utiliser arr + i pour pointer vers l’un des 3 blocs.

* (arr + i)

L'ajout d'une marque de déréférence * vous aide à récupérer la valeur réelle stockée dans ce bloc, par exemple * (arr + 1) == 5 . De plus, arr [i] est en fait une autre forme de *(arr+i).

C'est donc ce qui s'est passé lorsque vous écrivez une affectation de tableau des instructions telles que arr [i] = 1 . Les choses se compliquent un peu de 1d à 2d. Mais l'idée générale est la même: lorsque vous assignez à arr [i] [j] , vous écrivez des valeurs à un certain emplacement du tableau 2D.

Et c'est pourquoi vous obtenez l'erreur error C2440: '=': impossible de convertir de 'liste d'initialisation' en 'int' .

Comme pour liste d'initialisation , comme le nom suggère, il est utilisé au moment de l'initialisation.


0 commentaires