9°C
завтра: 7°C
Погода в Перми
9°C
ночью3°C
утром2°C
завтра7°C
Подробно
 63,79
−0.1742
Курс USD ЦБ РФна 23 апреля
63,7860
−0.1742
 71,72
−0.2022
Курс EUR ЦБ РФна 23 апреля
71,7210
−0.2022
  • Анонимный пользователь
    Нужно в отдельной функции получить массив укаателей типа 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

  • рыжий котэ

    Сообщений: 12083

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

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

  • xray

    Анонимный пользователь

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

    #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 рабочий, автору благодарность, однако хотелось бы такой способ обойти.
    Почему - просто уже из принципа. Уж слишком много времени я потратил впустую на понимание синтаксиса указателей.

  • ugly

    Анонимный пользователь

    например:

    #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

  • ugly

    Анонимный пользователь

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

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

  • guru

    Сообщений: 3019

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

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

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

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

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

  • рыжий котэ

    Сообщений: 12083

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

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

  • guru

    Сообщений: 3019

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

  • рыжий котэ

    Сообщений: 12083

    Согласен.

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

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

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

Модератор: