2013-11-23 2 views
0

Мне нужно работать с полем 2d, которое всегда имеет 2 столбца. У меня есть указатель на поле для этогоУказатель на поле - ошибка присвоения/предупреждение

int (*field)[2]; 
field = (int (*)[2]) malloc(rows * sizeof(*field)); /*further there will be also reallocating*/ 

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

int * function (int rows, int columns, int match, int **differentField) { 
    int i, j; 
    int (*field)[2]; 
    int foundMatch = 0; 


    field = (int (*)[2]) malloc(rows * sizeof(*field)); 

    for (i = 0; i < rows; i++) { 
     for (j = 0; j < colms; j++) { 
      if (match == differentField[i][j]) { 

       field[foundMatch][0] = i; 
       field[foundMatch][1] = j; 

           foundMatch ++; 
      } 

int main (int argc, char ** argv) { 
     int (*field)[2]; 
     int rows = 10; 
     int columns = 10; 
     int match = 1; 
     int **differentField; 

     /*creating different Field*/ 

     field = function(rows, columns, match, differentField); 


} 

-> уступка от несовместимого типа указателя

Любая идея, как правильно работать с этим? Большое вам спасибо ...

+1

Ваш код не заполнен. Функция 'function' разбита посередине. Опубликовать минимально полный код. – AnT

ответ

0

Вы не можете вернуть вектор из функции. Вместо этого, вы можете вернуть указатель:

int ** function (int rows, int columns, int match, int **differentField); 

Это означает, что вы объявляете поле:

int **field; 
+0

Но чем вам нужно выделять каждый размер отдельно. Или можно ли таким образом использовать в распределении (*) [2]? –

+0

Нет, вам нужно выделить каждое измерение. Взгляните сюда: http://www.eskimo.com/~scs/cclass/int/sx9b.html – Paul92

0

Ну, компилятор является правильным; a int * - это не то же самое, что и int (*)[2]. Ваш образец кода является неполным, поскольку он стоит прямо сейчас. Я предполагаю, что вы намерены вернуть field в функцию function. Однако у вас есть другая проблема: вы не можете вернуть массив. Но вы можете вернуть указатель на массив.

Если это поле вы пытаетесь вернуть, то способ объявить возвращаемого значения:

int (**function(int rows, int columns, int match, int **differentField))[2]

Затем, когда вы возвращаетесь поле, возвращает адрес вместо (return &field;).

Затем, в основном, field = *function(rows, columns, match, differentField);

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

В какой-то момент вы должны действительно изучить typedefs, чтобы сделать вашу жизнь намного проще.

typedef int (*field_t)[2];

Тогда вы можете field_t field; и field_t *function(int rows, int columns, int match, int **differentfield);. Разве это не намного лучше?

+0

На самом деле вам нужно сделать 'поле' в' function' static, потому что вы не можете надежно вернуть стек очевидно, переменный адрес. – keefer

+0

Но внутри функции 'field' есть указатель, указывающий на динамически выделенную память. Возвращаемое 'поле' не будет возвращать« адрес переменной стека ». Где вы видите возвращаемый адрес переменной стека? – AnT

+0

'поле' само является переменной стека, и возвращение его адреса будет плохим. – keefer

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