Погода: -12°C
  • Нужно в отдельной функции получить массив укаателей типа char и каким-то образом достучаться до него из мэйна, чтобы был доступ к каждому элементу массива в виде
    char *dst[0], char* dst:1: etc....

    Приведенное далее некорректно, но должно быть что-то вроде..

    // ----------------------------------
    char* get_arr(void)
    {
    char* src[] = {"one", "two", "three"};
    return *src;
    }

    void main(void)
    {
    char *dst[];
    dst = get_arr();
    cout

  • Некорректно, потому что массив создается в стеке, и при возврате из функции стек очищается и указатель ссылается в никуда.
    Нужно примерно так:
    char* get_arr(void)
    {
    char** src = new char * [3];
    strcpy(src:1:,"one");
    strcpy(src[2],"two");
    strcpy(src[3],"three");
    //........................................ далее по тексту
    return *src;
    }

    Осторожнее с травой!
    Если хапнешь много дряни
    Увезут тебя с собой
    Злые инопланетяне

  • В принципе можно и так и без с выделения/очистки памяти ручками:

    #include
    #include

    void get_arr(std::vector & arr)
    {
    arr.push_back("one");
    arr.push_back("two");
    arr.push_back("three");
    }

    void main(int, char**)
    {
    std::vector arr;
    get_arr(arr);
    // а дальше зависит от версии C++ Standard Library
    cout

  • У меня этот самый массив указателей - элемент объекта базового класса. Содержимое его (значения элементов) меняются в зависимости от типа класса-потомка (вовсю используется полиморфизм).
    Насколько приемлем для данного случая вариант с STL?

  • #include
    #include

    char *get_fld(void)
    {
    char ** src = new char* [3];
    strcpy(src[0], "one");
    strcpy(src:1:, "two");
    return *src;
    }

    void main(void)
    {
    char *dst = get_fld();
    cout

  • Значит, еще раз вопрос.

    Нужно в вспомогательной функции задания параметров массива заполнить его элементы в стиле:
    {"one", "two", "three"};

    затем передать их в мэйн, чтобы в мэйне их можно было использовать как
    a[0], a:1:, a[2]

    Тип данных: char.
    Как организовать передачу в функцию и чего именно - НЕ ЗНАЮ. Думал над этим вопросом двое суток и понял, что я законченный ламак и доку читать не умею. Сам не разберусь, пришел к вам.

    Позволяет ли синтаксис С++ реализовлать прогу, отвечающую вышеуказанным требованиям?

    Вариант с STL рабочий, автору благодарность, однако хотелось бы такой способ обойти.
    Почему - просто уже из принципа. Уж слишком много времени я потратил впустую на понимание синтаксиса указателей.

  • например:

    #include
    #include
    #include

    void **get_ptrs(int n){
    return (void**) new(std::nothrow) char*[n];
    }

    int get_char_array(int *n, void **r1){
    int ret = 0, j = 0;
    char *in[] = {
    "one", "two", "three"
    };
    char **r = NULL;

    *n = sizeof(in) / sizeof(char*);
    if(!(r = (char**)get_ptrs(*n))) ret = -ENOMEM;
    else{
    for(j = 0; j < *n; j++) r[j] = NULL;
    for(j = 0; j < *n; j++){
    if(!(r[j] = new(std::nothrow) char[strlen(in[j])+1])) break;
    strcpy(r[j], in[j]);
    }
    if(j < *n){
    for(j = 0; j < *n; j++) if(r[j]) delete r[j];
    delete r;
    r = NULL;
    ret = -ENOMEM;
    }
    }
    *r1 = (void*) r;
    return ret;
    }

    int main(void){
    //
    int n = 0;
    char **r = NULL;

    if(!get_char_array(&n, (void**)(&r))){
    for(int j = 0; j < n; j++){
    std::cout

  • > if(!(r = (char**)get_ptrs(*n))) ret = -ENOMEM;

    заменить на
    if(!(r = new char*[n])) ret = -ENOMEM;
    и убрать функцию get_ptrs

  • Вот твой пример с исправленными ошибками:

    // ----------------------------------
    char** get_arr(void)
    {
    static char* src[] = {"one", "two", "three"};
    return src;
    }

    void main(void)
    {
    char **dst;
    dst = get_arr();
    cout

  • О! В чистом виде то, что нужно. Спасибо огромное.

    Код, предложенный ugly, рабочий, однако для меня представляется чем-то вроде привета из астрала. Явно выше моих способностей к осознанию:улыб:

  • В принципе то же самое, о чем я говорил, только у меня массив создается динамически, а здесь статический массив.

    Осторожнее с травой!
    Если хапнешь много дряни
    Увезут тебя с собой
    Злые инопланетяне

  • Ага. Просто динамическая аллокация вряд ли имеет какой-то смысл, когда инициализация производится статическим массивом. Кроме того, не очень красиво, когда функция возвращает наружу указатель аллокированный внутри. ИМХО, более правильно было бы, как в приведенном выше примере на STL, передавать в нее storage как параметр.

  • Согласен.

    Осторожнее с травой!
    Если хапнешь много дряни
    Увезут тебя с собой
    Злые инопланетяне

Записей на странице:

Перейти в форум

Модератор: