Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как объявить функцию? возвр. массив строк или что-то подобное 
:(
    Опции темы
mefager
Дата 10.12.2010, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 24.2.2007

Репутация: нет
Всего: нет



Дело в том, что у меня есть часть кода(код рабочий), но в нём нет главного. Помогите, кто чем может.
Вот то, что есть у меня.
Код
int main()
{    
    int   num = 5;
    // здесь нужно объявить указатель res
        // что бы потом с его помощью получить результат функции foo,
        // которую тоже нужно предварительно создать. 
        // как это сделать?
    
    res = foo(num);
    
    cout << "result:\n";
    for(int i = 0; i < num; i++)
        cout << res[i] << endl;
    
    delete [] res;    
    return 0;
}
 

Если всё сделать правильно, то программа должна вывести:
Цитата
result:
string #1
string #2
string #3
string #4
string #5
 
PM MAIL   Вверх
triclosan
Дата 10.12.2010, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 515
Регистрация: 18.8.2006

Репутация: 2
Всего: 12



res - массив указателей на функцию должен быть по вашему?
PM MAIL   Вверх
Estranged
Дата 10.12.2010, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 30.8.2010

Репутация: нет
Всего: 3



Массивы функции возвращать не могут. Только если указатель возвратить.
char ** res ;
...

delete [] res;

char ** foo (int num)
{
if (num > 0)
{
char ** ch = new char *[num];
ch [0] = "string #1";
ch [1] = "string #2";
ch [2] = "string #3";
ch [3] = "string #4";
ch [4] = "string #5";

return ch;
}else return NULL;
}
PM MAIL   Вверх
sQu1rr
Дата 10.12.2010, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: 3
Всего: 13



Estranged
Ваш код будет работать так как нужно, только если num = 5...
PM MAIL Skype GTalk   Вверх
mefager
Дата 10.12.2010, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 24.2.2007

Репутация: нет
Всего: нет



Цитата(triclosan @  10.12.2010,  17:15 Найти цитируемый пост)
res - массив указателей на функцию должен быть по вашему? 

triclosan, если честно, то я не знаю кем он должен быть.  smile Знаю только, что это указатель.  

Вот удалось добыть уточняющие данные(препод под пытками признался  smile ):
Код
#define N 80
// заголовок функции foo
{
        // тело функции (намекнули, что не более 5-6 строк)
        
    return ;
}

int main()
{    
    int   num = 5;      // должен вводиться пользователем, но пока хотя бы так

    // здесь нужно объявить указатель res
        // что бы потом с его помощью получить результат функции foo,
        // которую тоже нужно предварительно создать. 
        // как это сделать?
    
    res = foo(num);
    
    cout << "result:\n";
    for(int i = 0; i < num; i++)
        cout << res[i] << endl;
    
    delete [] res;    
    return 0;
}
  
PM MAIL   Вверх
Dov
Дата 10.12.2010, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 11
Всего: 88



Цитата(mefager @  10.12.2010,  17:54 Найти цитируемый пост)
triclosan, если честно, то я не знаю кем он должен быть.   Знаю только, что это указатель.  

ну это уже не мало...  smile 
Код
#define N 80

а вот это существенное дополнение...   smile 



 



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Alexeis
Дата 10.12.2010, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 4
Всего: 459



mefager, удобнее всего, в функцию получить ссылку на пустой вектор строк, а функция заполнить и заодно может вернуть итератор vector<>.begin() ;


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
triclosan
Дата 10.12.2010, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 515
Регистрация: 18.8.2006

Репутация: 2
Всего: 12



Цитата(Alexeis @  10.12.2010,  20:57 Найти цитируемый пост)
удобнее всего, в функцию получить ссылку на пустой вектор строк, а функция заполнить и заодно может вернуть итератор vector<>.begin() ; 

имхо, передача итереторов между функциями не есть хорошо и безопасно, если уже используем вектор строк - вернуть его по ссылке!
PM MAIL   Вверх
mefager
Дата 10.12.2010, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 24.2.2007

Репутация: нет
Всего: нет



Alexeistriclosan всё дело в том, что мне ничего такого выдумывать не нужно. Задание заключается в том, что бы написать недостающий код в работающей проге. То что она работает я видел самолично. Просто препод удалил из кода ключевые моменты, для того что бы  мы смогли сами что нибуть придумать. Но пока что не очень-то получается.  smile

Добавлено через 2 минуты и 1 секунду
и я знаю что там никаких векторов и тем паче итераторов никаких нет. 
PM MAIL   Вверх
Alexeis
Дата 11.12.2010, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 4
Всего: 459



Цитата(triclosan @  10.12.2010,  22:51 Найти цитируемый пост)
имхо, передача итереторов между функциями не есть хорошо и безопасно, если уже используем вектор строк - вернуть его по ссылке! 

  Я имел ввиду и то и другое сделать. Итератор вернуть, чтобы (возможно) сократить выражение. 

Цитата(mefager @  11.12.2010,  00:40 Найти цитируемый пост)
и я знаю что там никаких векторов и тем паче итераторов никаких нет.  

 1) Передать по ссылке в функцию переменную в которую будет занесено количество строк.
 2) Выделять память всегда на n+1 строк и вместо последней строки записывать число-терминатор, например NULL. В этом случае перебираем строки пока не дойдет до нуля. Хуже если нельзя обойтись без последовательного перебора и иметь число строк в качестве переменной.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
mefager
Дата 11.12.2010, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 24.2.2007

Репутация: нет
Всего: нет



Цитата(Alexeis @  11.12.2010,  00:16 Найти цитируемый пост)
1) Передать по ссылке в функцию переменную в которую будет занесено количество строк.

Так передается же, вот:
Код
res = foo(num);

num это и есть количество строк. А по ссылке зачем передавать? 
Цитата(Alexeis @  11.12.2010,  00:16 Найти цитируемый пост)
 2) Выделять память всегда на n+1 строк и вместо последней строки записывать число-терминатор, например NULL. В этом случае перебираем строки пока не дойдет до нуля. Хуже если нельзя обойтись без последовательного перебора и иметь число строк в качестве переменной. 

а это вобще ничего непонял. Это для меня темный лес.  smile 
PM MAIL   Вверх
Dov
Дата 13.12.2010, 02:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 11
Всего: 88



Цитата(mefager @  10.12.2010,  17:54 Найти цитируемый пост)
 // тело функции (намекнули, что не более 5-6 строк)

Что-то многовато, вроде.  У меня всего две получилось.  smile 



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Alexeis
Дата 13.12.2010, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 4
Всего: 459



mefager, да чет я протупил, не понял для чего память выделять в функции, тогда как нужный размер известен еще до вызова. smile  Это безусловно плохая практика. Но теме не менее раз просят, то
Код

const int MaxLen     = 64;
const int LinesCount = 5;

typedef char FixStr[MaxLen];

FixStr* foo(int n)
{
    FixStr *tmp = new FixStr[n];
    for (int i = 0; i < n; i++)
        sprintf(tmp[i], "string #%d", i + 1);
    return tmp;
}


Это сообщение отредактировал(а) Alexeis - 13.12.2010, 12:01


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
mefager
Дата 13.12.2010, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 24.2.2007

Репутация: нет
Всего: нет



DovAlexeis огромное спасибо что помогли. 
У Alexeis`а практически то же решение что прислал мне Dov, только с  typedef`ом  smile 
Вот его решение.
Код
#define N 80
char (*foo(int sz))[N]
{
    char (*p)[N] = new char[sz][N];
    
    for(int i = 0; i < sz; i++) sprintf(p[i], "string #%d", i + 1);
    
    return p;
}

int main()
{    
    int   num = 5;
    char (*res)[N];
    
    res = foo(num);
    
    cout << "result:\n";
    for(int i = 0; i < num; i++)
        cout << res[i] << endl;
    
    delete [] res;    
    return 0;
}


PM MAIL   Вверх
Dov
Дата 14.12.2010, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 11
Всего: 88



Цитата(mefager @  13.12.2010,  10:46 Найти цитируемый пост)
У Alexeis`а практически то же решение что прислал мне Dov, только с  typedef`ом

Так я тоже могу typedef прикрутить. Я ж не знал, что так нужно...
 Вот, пожалуйста:
Код
#define N 80
typedef char (*ukazatel_na_massiv_iz_N_elementov_tipa_char)[N];
typedef ukazatel_na_massiv_iz_N_elementov_tipa_char pArr;
pArr foo(int sz)
{
    pArr p = new char[sz][N];
    
    for(int i = 0; i < sz; i++) sprintf(p[i], "string #%d", i + 1);
    
    return p;
}


Даже два, на всякий случай.  smile 



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0977 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.