Как передать двумерный массив в функцию (C ++)? - PullRequest
0 голосов
/ 18 октября 2019

У меня есть два цикла for, которые обрабатывают данные из файла и сохраняют их в массиве, соответствующим образом индексируя каждый элемент. Я хочу передать этот массив в функцию и выполнить некоторые вычисления над ним, но он дает мне ошибку: «ошибка: нет соответствующей функции для вызова 'year_range'".

Я пытался передать его как элемент[] [] но затем компилятор хочет, чтобы я указал индекс. Я хочу передать весь массив в функцию, чтобы выполнить некоторые вычисления над ней.

void year_range(string item[]);

int main()
{
    string item[75][5];
    for (int row = 0; row < 74; row++)
    {
        for (int col = 0; col < 4; col++)
        {
            getline(fin,item[row][col], ',');
        }
        getline(fin, item[row][4], '\n');  
    }
    year_range(item);
}

void year_range(string item[])
{
  // processing item array
}

Я ожидаю, что весь массив "item" успешно пройдет через функцию year_range, без ошибок.

Ответы [ 2 ]

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

Требуется длина второго измерения. Попробуйте:

void year_range(string item[][5]);

Обратите внимание, что это работает только для массивов, которые имеют второе измерение 5. Для лучшего, более общего способа сделать это, посмотрите этот полудублированный вопрос .

Также обратите внимание: вам придется изменить это как в вашей реализации, так и в объявлении, даже если я не показываю изменения в вашей реализации.

1 голос
/ 18 октября 2019
void year_range(string item[]);

Здесь аргумент имеет тип «указатель на строку».

string item[75][5];
year_range(item);

Когда вы используете массив в качестве значения, онбудет неявно конвертировать в указатель на первый элемент. Это называется гниением. item - это массив (75) массивов из 5 строк. Поскольку элементы являются массивами из 5 строк, указатель на элемент является указателем на массив из 5 строк.

Таким образом, вы передаете указатель на массив из 5 строк в функцию, которая принимает указатель настрока. Массив из 5 строк отличается от типа строки, поэтому это не может работать. Вы можете изменить year_range так, чтобы он принимал указатель на 5 строк, который соответствует (разрушенному) объекту, который вы пытаетесь передать:

void year_range(string item[][5]);  // like this
void year_range(string (*item)[5]); // or this
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...