C ++ Как использовать и передавать 3-мерный массив символов? - PullRequest
2 голосов
/ 03 февраля 2010

Я пытаюсь создать массив символов для хранения возвращаемого значения функции. В следующей функции данные сохраняются в ***** valv **. Как создать переменную extern для доступа к данным?

int credis_lrange(REDIS rhnd, const char *key, 
                   int start, int end, char ***valv) 
{
  int rc;

  if ((rc = cr_sendfandreceive(rhnd, CR_MULTIBULK, "LRANGE %s %d %d\r\n", 
                                key, start, end)) == 0) 
  {
    *valv = rhnd->reply.multibulk.bulks;
    rc = rhnd->reply.multibulk.len;
  }

  return rc;
}

Решение:

char **elements;

int size = credis_lrange(this->redis,"object_2",600,603,&elements);

for (int i=0; i<size;i++) {
    cout << "element: " << elements[i] << endl; 
}

Спасибо всем!

Ответы [ 2 ]

5 голосов
/ 03 февраля 2010
char ***element[size];

Это не совсем трехмерный массив, а массив size элементов указателей на указатели на указатели на char.

. Используйте любое из следующих:

char e[ D1 ][ D2 ][ D3 ]; /* D1, D2, D3 are integral constants */
char *e[ D2 ][ D3 ];
char e[][ D2 ][ D3 ];

Кроме того, вы можете передать его, просто указав e в качестве аргумента вашей функции.

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

В этом случае вам нужно будет сделать две вещи:

  • Укажите количество строк, которые вы хотитесохранить в массиве
  • Для каждой строки
    • Выделить память
    • Скопировать данные строки в массив char
* 1028И, наконец, вы передадите адрес этого массива строк в функцию credis_lrange.
0 голосов
/ 03 февраля 2010

Я нашел только один попадание в Google для этого, но похоже, что функция cr_sendfandreceive распределяет свой член rhnd-> reply.multibulk.bulks, так что вам на самом деле не нужно передавать его обратно (так как вы были переданы rhnd в первое место).

Если вы хотите скопировать его, то вы бы объявили элементы как символ ** и передали бы его адрес (или использовали ссылки), а затем внутри метода вы бы клонировали элемент Bulks, а также каждую строку в массиве (в петля).

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