Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.05.2012, 14:51   #1
Kaela
Пользователь
 
Регистрация: 29.04.2012
Сообщений: 36
По умолчанию возврат строки из функции

Код:
#include <iostream.h>
char* Fun ();
using namespace std;

void main()
{
char *stst;
stst=Fun();
cout<<stst<<endl;
system("pause");
return;
}


char* Fun()
{
char stroka[]="privet";
system("pause");
return stroka;
}


вот собственно передает какие-то непонятные символы
не могу понять почему, вроде верно всё
Kaela вне форума Ответить с цитированием
Старый 26.05.2012, 15:10   #2
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

возвращаешь наружу мертвый элемент.

Попробуй так:
Код:
const char* Fun()
{
system("pause");
return "privet";
}
_Bers вне форума Ответить с цитированием
Старый 26.05.2012, 15:19   #3
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Вот так работает:

Код:
#include <iostream>
using namespace std;

char* Fun();

const int BSIZE = 20;

int main()
{
    char* stst = new char[BSIZE];

    stst = Fun();
    cout << stst << endl;
 
    delete [] stst;
    return 0;
}

char* Fun()
{
    char stroka[] = "privet";

    return stroka;
}
Но выдаётся предупреждение:
Цитата:
warning C4172: возвращение адреса локальной или временной переменной

Последний раз редактировалось 8Observer8; 26.05.2012 в 15:22.
8Observer8 вне форума Ответить с цитированием
Старый 26.05.2012, 15:41   #4
Kaela
Пользователь
 
Регистрация: 29.04.2012
Сообщений: 36
По умолчанию

Цитата:
Сообщение от 8Observer8 Посмотреть сообщение
Вот так работает:

Код:
#include <iostream>
using namespace std;

char* Fun();

const int BSIZE = 20;

int main()
{
    char* stst = new char[BSIZE];

    stst = Fun();
    cout << stst << endl;
 
    delete [] stst;
    return 0;
}

char* Fun()
{
    char stroka[] = "privet";

    return stroka;
}
эм, изменил у себя, всё равно выдаёт символы + ошибку
использую Microsoft Visual Studio Developer 2011

Цитата:
Сообщение от _Bers Посмотреть сообщение
возвращаешь наружу мертвый элемент.

Попробуй так:
Код:
const char* Fun()
{
system("pause");
return "privet";
}
нужно возвращать в принципе любую строку, так не вариант

Последний раз редактировалось Stilet; 27.05.2012 в 10:32.
Kaela вне форума Ответить с цитированием
Старый 26.05.2012, 15:47   #5
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Kaela Посмотреть сообщение
нужно возвращать в принципе любую строку, так не вариант
Не вариант - возвращать наружу указатель/ссылку на дохлый объект.

Если нужно возвращать в принципе любую строку, стало быть нужен код, который эти строки создает.

Покажи, как ты будешь создавать в принципе разные строки

[QUOTE=8Observer8;1050825]Вот так работает:

Не работает так. То, что память ещё остаётся непопорченной - не значит, что она живая. Твой указатель смотрит на убитый объект.

Последний раз редактировалось Stilet; 27.05.2012 в 10:33.
_Bers вне форума Ответить с цитированием
Старый 26.05.2012, 15:50   #6
Kaela
Пользователь
 
Регистрация: 29.04.2012
Сообщений: 36
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
Не вариант - возвращать наружу указатель/ссылку на дохлый объект.

Если нужно возвращать в принципе любую строку, стало быть нужен код, который эти строки создает.

Покажи, как ты будешь создавать в принципе разные строки
я пишу обратную польскую запись
суть в том, что я в одной функции преобразовываю строку
и хочу её передать аргументом в другую функцию
там я её заполняю посимвольно
можно реализовать через cin.getline()
но почему дохлый объект?
указатели ведь указывают на адрес даже, когда из функции выходим
Kaela вне форума Ответить с цитированием
Старый 26.05.2012, 16:04   #7
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

[QUOTE=8Observer8;1050825]Вот так работает:

Не работает так. То, что память ещё остаётся непопорченной - не значит, что она живая. Твой указатель смотрит на убитый объект.

Если совсем точно - литерная константа, определяемая внутри функции по стандарту имеет класс памяти static

Поэтому, вот такой код валидный:

Код:
const char* Fun()
{
      return "privet";
}
Стандарт гарантирует, что адрес, который вернётся из такой функции, будет указывать на const char* const = "privet"

Цена за это: не возможность освободить память занимаемую строкой "privet" до конца жизни приложения.


Тот факт, что вы присваеваете результат (const char* const) простому char* - раздолбайство языка си.
Так делать некорректно, но язык позволяет (типа все знают, что это фейл, но всем пофигу, да).
_Bers вне форума Ответить с цитированием
Старый 26.05.2012, 16:13   #8
Kaela
Пользователь
 
Регистрация: 29.04.2012
Сообщений: 36
По умолчанию

[QUOTE=_Bers;1050855]
Цитата:
Сообщение от 8Observer8 Посмотреть сообщение
Вот так работает:

Не работает так. То, что память ещё остаётся непопорченной - не значит, что она живая. Твой указатель смотрит на убитый объект.

Если совсем точно - литерная константа, определяемая внутри функции по стандарту имеет класс памяти static

Поэтому, вот такой код валидный:

Код:
const char* Fun()
{
      return "privet";
}


Стандарт гарантирует, что адрес, который вернётся из такой функции, будет указывать на const char* const = "privet"

Цена за это: не возможность освободить память занимаемую строкой "privet" до конца жизни приложения.


Тот факт, что вы присваеваете результат (const char* const) простому char* - раздолбайство языка си.
Так делать некорректно, но язык позволяет (типа все знают, что это фейл, но всем пофигу, да).
тогда как мне реализовать возврат строки из функции?
если я не знаю, какая она будет, а хочу возвращать рандомную?
Kaela вне форума Ответить с цитированием
Старый 26.05.2012, 16:15   #9
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Начни о описания процедуры создания строки.
Создай строку.

/зы твой подход некорректный изначально
_Bers вне форума Ответить с цитированием
Старый 26.05.2012, 17:03   #10
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Цитата:
Сообщение от Kaela Посмотреть сообщение
тогда как мне реализовать возврат строки из функции?
если я не знаю, какая она будет, а хочу возвращать рандомную?
Например, вот так:
Код:
#include <iostream>
using namespace std;

void Fun(char* buf);

const int BSIZE = 20;

int main()
{
    char* stst = new char[BSIZE];

    Fun(stst);
    cout << stst << endl;
 
    delete [] stst;
    return 0;
}

void Fun(char* buf)
{
    char stroka[] = "privet";
    
    strcpy(buf, stroka);

    return;
}
8Observer8 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Возврат массива из функции max_prorok Помощь студентам 2 06.10.2011 12:39
Возврат 2 и более аргументов из функции. Drilla Microsoft Office Excel 2 18.09.2011 14:11
c++ возврат указателя из функции Neolit1819 Помощь студентам 6 28.03.2011 15:37
Мини бэйсик:объявление функции, вызов функции , возврат. AL_LORD Помощь студентам 2 14.10.2010 17:48
Возврат результата функции по ссылке gladov Общие вопросы C/C++ 2 24.06.2008 22:48