2010-02-02 4 views
2

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

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; 
} 

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

+1

Многие дубликаты. Начните с http://stackoverflow.com/questions/917783/how-do-i-work-with-dynamic-multi-dimensional-arrays-in-c http://stackoverflow.com/questions/1874604/passing-an -array-of-arrays-in-c http://stackoverflow.com/questions/2003745/pointer-address-in-ac-multidimensional-array и есть другие ... – dmckee

+0

Не то, чтобы он напрямую отвечал на ваш вопрос, но массивы «не являются предпочтительными» в C++, и вы должны использовать контейнерный класс STL, возможно, вектор. – Mawg

+0

Credis lib - это C lib. Можно ли использовать C++-векторы в C? – dan

ответ

5
char ***element[size]; 

не совсем 3D массив, а массив size элементов указатели к указателям к указателям на char.

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

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

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

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

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

  • указать количество строк, которые вы хотите хранить в массиве
  • Для каждой строки
    • Выделяем память
    • Копирование данных строки в char массив

И, наконец, вы передадите адрес этого массива строк на функцию credis_lrange.

+0

Привет, Dirk, спасибо за ваш быстрый ответ. Так что я должен сделать 3 для циклов и выделить память для каждого элемента на уровне массива? – dan

+0

Если вы используете первое предложение Dirks, вам не нужно делать выделение памяти. Все это распределено в одном непрерывном куске. Хотя, когда вы используете «e», он будет действовать как указатель (указатель на указатель на символ), что не означает необходимости выделять/освобождать память из кучи. – Steve314

+0

В первом примере Dirk вам не нужно выделять память. Во втором примере вам нужно пройти один раз и выделить память. – Jagannath

0

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

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

+0

Привет, Нил, спасибо за ваш ответ. Не могли бы вы дать какой-нибудь пример кода? – dan

+0

Это основная идея, но, очевидно, без проверки ошибок: char ** clone (int argc, char ** argv) { char ** результат = (char **) malloc (argc * размерof (char *)); while (argc--) результат [argc] = strdup (argv [argc]); результат возврата; } – Neil