Задачка по С++
1815
12
Нужно в отдельной функции получить массив укаателей типа 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;
}
craxx
В принципе можно и так и без с выделения/очистки памяти ручками:

#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
craxx
У меня этот самый массив указателей - элемент объекта базового класса. Содержимое его (значения элементов) меняются в зависимости от типа класса-потомка (вовсю используется полиморфизм).
Насколько приемлем для данного случая вариант с STL?
craxx
#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
ugly
> 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
onanymous
О! В чистом виде то, что нужно. Спасибо огромное.

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