вернуть 2d массив из функции в C ++ - PullRequest
4 голосов
/ 10 января 2011

У меня есть функция, объявленная так:

unsigned char** Classifier::classify(){
      //...
    unsigned char **chars = new unsigned char *[H];
for(int i = 0; i < H; i++)
    chars[i] = new unsigned char[W*3];

//...

return &chars;
//note: when this is "return chars;" I get the following:  cannot convert ‘unsigned char*’ to ‘unsigned char**’ in return

Это дает мне предупреждение:

Classifier.cpp: In member function ‘unsigned char** Classifier::classify()’:
Classifier.cpp:124: warning: address of local variable ‘chars’ returned

Это нормально игнорировать? По сути, мой вопрос: как вы возвращаете ссылку на массив, определенный в функции?

Я хочу быть в состоянии сделать

unsigned char** someData = classify();

Ответы [ 6 ]

8 голосов
/ 10 января 2011

Просто верните массив, а не его адрес:

return chars;

&chars - это указатель на указатель на указатель, но chars - это указатель на указатель (что вы хотите).Также обратите внимание, что chars является , а не массивом.Указатели и массивы - это не одно и то же, хотя их часто путают.

4 голосов
/ 10 января 2011

@ Адам Розенфилд получил правильный ответ, как и некоторые другие (удалите этот амперсанд), но в качестве пищи для размышлений хороший способ сделать это - использовать std :: vector (of std :: vectors) передать его в функцию в качестве ссылочного параметра.

#include <vector>

void Classifier::classify(std::vector<std::vector<unsigned char>> & chars)
{
      //construct a vector of W*3 integers with value 0
      //NB ( this gets destroyed when it goes out of scope )
      std::vector<unsigned char> v(W*3,0);

      //push a copy of this vector to the one you passed in - H times.
      for(int i = 0; i < H; i++)
         chars.push_back(v);
}

chars заполняется необходимым содержимым, и когда дело доходит до удаления vector, вам не нужно беспокоиться о том, как вызвать правильный синтаксис delete[], как при этих двух вызовах new в вашем 2D массиве.

Вы можете ссылаться на элементы в этом векторе, как если бы вы использовали 2D-массив, например chars[5][2] или что угодно.

хотя я вижу, что ты хочешь быть в состоянии пойти:

 unsigned char** someData = classify();

Итак, если вы хотите использовать векторы, вам нужно объявить someData следующим образом:

 std::vector<std::vector<unsigned char>> someData;

и, чтобы сделать это более ясным, возможно:

typedef std::vector<std::vector<unsigned char>> vector2D;
vector2D someData;
classify(someData);
...
4 голосов
/ 10 января 2011

Это никогда хорошо, чтобы игнорировать.Вы возвращаете адрес локальной переменной.Этот адрес станет недействительным, когда вы покинете кадр стека classify(), за до у вызывающей стороны есть шанс использовать его.

Вместо этого вам нужно только вернуть значение этой переменной:

return chars;
1 голос
/ 10 января 2011
  1. Если массив определен в функции и если вы хотите использовать его вне функции - вы должны описать его (массив) как статический или объявить массив вне функции и передать его как параметр.

  2. Используйте «возврат символов»;только;

0 голосов
/ 11 января 2011

Другие дали ответ;но в качестве общего замечания я бы порекомендовал вам взглянуть на STL.Вы пометили вопрос C и C ++, поэтому я предполагаю, что вы находитесь в среде C ++, и STL доступен.Затем вы можете использовать typedefs для определения векторов в читаемой форме и даже векторов векторов (т.е. 2d массивов)Затем вы можете вернуть указатель или ссылку (в зависимости от ситуации) на ваш вектор векторов.

0 голосов
/ 10 января 2011

Нет, не стоит игнорировать это предупреждение. Возвращаемым значением является адрес chars в стеке, а не то, на что он указывает Вы хотите вернуть только chars.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...