2015-10-10 4 views
0

Я решаю проблему, в которой я пытаюсь передать адрес 2-мерного массива структуры и пытаюсь манипулировать им, но когда я использую оператор [] для доступа к массиву элементы, я получаю ошибку времени компиляции:error: no match for 'operator []'

no match for 'operator[]'

в моих кодовых блоках IDE.

#include <iostream> 

using namespace std; 

typedef struct mat 
{ 
    int data; 
    int flag; 
} cell; 

int mat(cell *); 

int main() 
{ 
    int m,n; 
    cin>>m>>n; 
    cell game[n][m]; 
    cout<<"The length of matrix is "<<mat(&game[0][0]); 
} 

int mat(cell *arr) 
{ 
    return (sizeof(arr[0])/sizeof(arr[0][0])); 
} 
+1

Обратите внимание, что 'sizeof (arr [0])' не будет работать, как вы думаете, будет – wimh

+0

Обратите внимание, что массивы переменной длины являются нестандартными функциями. –

+0

Прежде всего, вы не можете сделать это с помощью массивов стиля C объявленные как вы их объявляете, потому что они не могут быть динамически разбросаны. Чтобы делать то, что вы хотите с массивами C, вам нужно будет использовать 'malloc' для выделения кучной памяти. Поскольку вы используете C++, вам может быть проще использовать 'std :: vector' –

ответ

0

определение отдается в основном говорит, что ваш класс не определяет оператор [], то есть вы не можете использовать синтаксис, который вы пытаетесь использовать.

1

две вещи:

  1. Ваша функция принимает указатель на cell, но так как вы рассматривая его как 2D массив, вероятно, вы должны изменить свою подпись либо приму в cell ** arr или cell arr[m][] где m - это (фиксированный) размер массива и должен быть указан. Обратите внимание, что эти структуры данных имеют принципиально разные представления в памяти - они просто имеют одинаковый синтаксис [][] для доступа к элементам.

  2. Вы не можете использовать функцию sizeof, чтобы определить длину массива, если вы передадите его как указатель на элемент. Вам нужно будет пройти размеры вместе с массивом, например:

int mat(cell **arr, int m, int n);

+0

Это, конечно, не будет работать, потому что 'cell [x] [y]' несовместимо с 'cell **'. –

+0

* «Вы не можете использовать функцию sizeof для определения длины массива, если вы передаете его как указатель» * вы не можете запрашивать VLA с 'sizeof' вообще –

+0

@PiotrSkotnicki Хорошая точка, хотя я не был подразумевая, что вы могли бы. Просто пытаюсь объяснить, почему sizeof не будет работать для указателей. – tep

2
cell game[n][m]; 

Это не законно C++. Вы используете расширение для компилятора. На этом этапе я советую вам не использовать какие-либо расширения для компилятора. Используйте только стандартный C++. В стандартном C++ нет массивов переменной длины. Не используйте массивы в своих программах на C++. Чтобы получить правильную функциональность массива переменной длины. Вы должны использовать std::vector вместо этого, как это:

std::vector<std::vector<cell>> game; 

Далее

&game[0][0] 

не является адресом 2D массива. Это адрес первого элемента массива. Он не содержит информации о количестве элементов. Он потерян навсегда. Вы не можете передать его некоторой функции и ожидать, что размер массива будет восстановлен. Чтобы получить правильную функциональность массива со встроенной функцией размера, используйте std::vector.

И последнее, но не в последнюю очередь,

(sizeof(arr[0])/sizeof(arr[0][0])); 

arr является cell*. arr[0] - cell. arr[0][0] недействителен, так как cell не является массивом, а не указателем, а также не имеет настраиваемого оператора []. В любом случае вы не можете использовать sizeof для восстановления количества элементов в массиве из указателя на его первый элемент. Чтобы получить правильную функциональность массива со встроенной функцией размера, используйте std::vector.

Смежные вопросы