Двумерный массив - предупреждение / ошибка «Слишком много значений инициализатора» - PullRequest
1 голос
/ 07 августа 2020

Я новичок в программировании. Я попытался найти здесь кучу вопросов, похожих на мой, но либо они были слишком сложными для меня, чтобы понять, либо не совсем подходили / помогли мне с моей ситуацией.

Я только что узнал о 2- D массивы, поэтому я делаю по ним задание. (Присваивание касается mov ie рейтингов, которые объяснят имена переменных / массивов / et c в моем коде)

Одна из моих функций должна назначать заранее определенные значения целочисленному массиву . Однако в этой функции, когда я пытаюсь инициализировать массив / назначать ему целые числа, я получаю одну из тех красных волнистых линий, которые говорят: «Слишком много значений инициализатора», когда я наводю на нее курсор.

  1. Почему это появляется, если в массив НЕ помещается слишком много значений? (см. код ниже)

    Я думаю, что видел в других сообщениях / ответах, которые вы не можете назначить массиву - это правда / что происходит не так? Если да, то почему? И как еще я мог бы поместить значения в этот массив, если не просто выполнив что-то вроде array [x] [y] = {...}?

  2. Использовал ли я / передал правильные аргументы / параметры в функции?

Вот часть моего кода (не моя полная программа, а только части, относящиеся к этому вопросу):

#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 } };
}

Когда я пытаюсь его скомпилировать, я получаю следующие ошибки:

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

и

message : The initializer contains too many elements

Я использую Microsoft Visual Studio. Я пробовал использовать свою книгу / искать ее, но мне трудно найти ответы, которые я ищу. Не стесняйтесь исправлять все, что я говорю неправильно. Я здесь, чтобы учиться!

Ответы [ 3 ]

0 голосов
/ 07 августа 2020

Список инициализаторов можно использовать только для инициализации, но не для присвоения. Это означает, что вам нужно будет присвоить значения при первой инициализации массива, т.е.

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 } };

Кроме того, попробуйте использовать другое имя переменной, поскольку array является зарезервированным словом в C ++ (хотя это не проблема, но это плохая практика кодирования).

0 голосов
/ 07 августа 2020

В C ++, когда вы используете arr[i][j], вы фактически получаете доступ к одному элементу этого массива. По сути, arr[i][j] на самом деле *(*(arr+i) + j). И * здесь используется для разыменования указателя.

Давайте рассмотрим более простой пример: предположим, что у вас есть массив int a[3] = {4, 5, 6};, будет 3 «блока» памяти, выделенных для хранения значений, каждый из которых занимает 4 байтов (предположим, что 1 int занимает 4 байта).

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

Для указателей вы можете рассматривать их как некие специальные переменные, которые содержат адреса памяти других переменных. Как следует из названия pointer, они используются для указания на другие переменные.

В C / C ++ имена массивов фактически являются константными указателями. И вы можете использовать arr+i, чтобы указать на любой из 3 блоков.

*(arr+i)

Добавление метки разыменования * поможет вам получить фактическое значение, хранящееся в этом блоке , например, *(arr+1) == 5. Более того, arr[i] на самом деле является другой формой *(arr+i).

Так вот, что произошло, когда вы пишете операторы присваивания массива, такие как arr[i] = 1. С 1d на 2d все становится немного сложнее. Но общая идея та же: когда вы назначаете arr[i][j], вы записываете значения в одно определенное место 2-го массива.

И поэтому вы получаете ошибку error C2440: '=': cannot convert from 'initializer list' to 'int'.

Что касается initializer list, как следует из названия, он используется во время инициализации.

0 голосов
/ 07 августа 2020

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

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 } };

In В вашем случае переменная array уже объявлена, поэтому единственный способ присвоить значения различным индексам - это итерация или прямое присвоение значения каждой позиции.

Назначение, которое вы пытаетесь выполнить, работает только в том случае, если это было примерно так:

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 } };

В объявлении переменной.

Если вы все еще хотите использовать функцию void initialRatings(int array[][NUM_MOVIES]), вот одна альтернатива.


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
}

А если вы хотите увидеть результат после вызова функции initialRatings, выведите значения каждой позиции в консоль.

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...