10 / 10 / 6
Регистрация: 24.05.2013
Сообщений: 350
1

Вернуть из функции 2 значения

14.05.2015, 08:41. Показов 6649. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как вернуть из функции 2 значения? Нужно вернуть строку и ее длину, но чтобы функция SendData() не вызывалась 2 раза.
Сейчас узнаю длину вот так:
C++
1
2
3
4
int main(){
InternetObj1.Send(SendData(), strlen(SendData()));
return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.05.2015, 08:41
Ответы с готовыми решениями:

Вернуть из функции два значения
функция должна находить максимальное и минимальное значение используя классы template <class T> T...

Как вернуть из функции два значения
Доброго времени суток! Подскажите, пожалуйста, как вернуть два значения: row и column из функции....

Как вернуть сразу 2 значения из функции?
Есть функция, которая генерирует 2 параметра. Как сделать так, чтобы функция их вернула? Оба сразу?

Из функции вернуть более одного значения
У меня есть функция: code(int y, int z){ int g=y+z; int f=y*z; return g,f; } main(){ int...

14
36 / 36 / 15
Регистрация: 08.12.2014
Сообщений: 171
14.05.2015, 08:49 2
Никак. НЕвознможно подобное сделать в с++, однако, можно передать в функцию параметр по указателю и тогда функция будет работать не с копией парметра, а с самим парасетром, то есть:
C++
1
2
3
4
void func (int* n)
{
     n++;
}
вызов:
C++
1
2
3
int n = 7;
func (&n);
cout<<n;
На экране будет 8
0
10 / 10 / 6
Регистрация: 24.05.2013
Сообщений: 350
14.05.2015, 09:04  [ТС] 3
я так пробовал делать, но передумал, пришлось добавлять слишком много преобразований и временные переменные и это не работало, а еще при отладке ошибка постоянно появлялась.
Приходится создавать временную переменную n.
А еще не получается в нее записать длину строки.
C++
1
2
3
4
5
6
7
8
9
10
11
char *func(int* n)
{
    char *buf = "test";
    n=strlen(buf);
    return buf;
}
int main(){
    int n;
    printf("%s\n%i\n", func (&n), n);
    return 0;
}
Код
error C2440: =: невозможно преобразовать "size_t" в "int *"
Если делать strlen(func()) то все хорошо, никаких преобразований типов делать не нужно, но функцию нужно вызвать 1 раз, а моим способом она вызывается 2 раза.
0
18813 / 9818 / 2400
Регистрация: 30.01.2014
Сообщений: 17,244
14.05.2015, 09:05 4
drunkwolfs, можно вернуть структуру вида:
C++
1
2
3
4
5
struct mystr
{
    <подставить правильный тип> data; // строка
    size_t length; // длина строки
};
0
7780 / 6550 / 2981
Регистрация: 14.04.2014
Сообщений: 28,608
14.05.2015, 09:05 5
А если так?
C++
1
2
3
4
5
int main(){
char *s = SendData();
InternetObj1.Send(s, strlen(s));
return 0;
}
0
10 / 10 / 6
Регистрация: 24.05.2013
Сообщений: 350
14.05.2015, 09:13  [ТС] 6
Цитата Сообщение от nmcf Посмотреть сообщение
А если так?
А потом переменные нужно уничтожать после создания вроде?
если я всегда буду делать временные переменные то это мне потом строк 100 кода по их уничтожению писать
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,510
14.05.2015, 09:15 7
Цитата Сообщение от drunkwolfs Посмотреть сообщение
n=strlen(buf);
Цитата Сообщение от drunkwolfs Посмотреть сообщение
error C2440: =: невозможно преобразовать "size_t" в "int *"
размер пишем в указатель
нужно разыменовать
C++
1
*n=strlen(buf);
0
9 / 9 / 7
Регистрация: 04.05.2015
Сообщений: 34
14.05.2015, 09:16 8
drunkwolfs, в STL есть готовые решения: make_pair/pair
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <utility>
#include <iostream>
 
std::pair<int, char*>
func()
{
    return std::make_pair<int, char*>(4, "lsjdflsdkjf");
}
 
int
main()
{
    std::pair<int, char*> val = func();
    std::cout << val.first << ' ' << val.second << std::endl;
}
1
25 / 25 / 11
Регистрация: 07.12.2012
Сообщений: 169
14.05.2015, 09:20 9
C++
1
2
3
4
std::pair<int, char*> func()
{
    return {4, "lsjdflsdkjf"};
}
0
Эксперт .NET
6451 / 4053 / 1598
Регистрация: 09.05.2015
Сообщений: 9,480
14.05.2015, 09:25 10
C++
1
2
3
4
5
6
7
8
9
void func(int &a, int &b)
{
    a = 1;
    b = 2;
}
 
int a, b;
func(a, b);
printf("%d %d", a, b);
Цитата Сообщение от drunkwolfs Посмотреть сообщение
А потом переменные нужно уничтожать после создания вроде?
если я всегда буду делать временные переменные то это мне потом строк 100 кода по их уничтожению писать
Только если вы динамически выделяете память (new и т.п.), в этом случае "уничтожать" все равно нужно, независимо от того как вы передаете или возращаете значения.
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
14.05.2015, 09:34 11
drunkwolfs,
Чего уничтожать? Переменные? Они у тебя в стеке. Конкретно указатель располагается в стеке. Сама строка - вот она возможно в динамической памяти. Но поскольку она создаётся функцией Send(), то тебе в любом случае придётся её удалять. Без переменной ты её пустишь "в свободное плавание" и рискуешь навсегда потерять этот кусок памяти.
1
9 / 9 / 7
Регистрация: 04.05.2015
Сообщений: 34
14.05.2015, 09:38 12
xEmpire,
C++
1
2
3
4
5
6
7
8
auto
func()
{
    return std::make_pair<int, char*>(4, "lsjdflsdkjf");
}
...
...
    auto val = func();
0
Модератор
Эксперт С++
13491 / 10747 / 6405
Регистрация: 18.12.2011
Сообщений: 28,680
14.05.2015, 09:46 13
Лучший ответ Сообщение было отмечено drunkwolfs как решение

Решение

Я что-то никак в толк не возьму.
Зачем передавать длину строки, если ее всегда можно определить внутри функции?
C++
1
2
3
4
5
6
7
8
9
void f(char* Data)
{
    InternetObj1.Send( Data, strlen(Data) );
}
int main()
{
   f(SendData());
   return 0;
}
1
10 / 10 / 6
Регистрация: 24.05.2013
Сообщений: 350
14.05.2015, 10:21  [ТС] 14
Спасибо за ответы, оказывается есть много способов и это хорошо.
Решил пока что использовать pair, в будущем может перепишу так, как написал zss

Добавлено через 18 минут
zss, InternetObj1 создаю внутри main. Лучше вынести создание объекта за main, в начало кода?
C++
1
2
3
4
int main(){
Internet InternetObj1;
...
}
0
Модератор
Эксперт С++
13491 / 10747 / 6405
Регистрация: 18.12.2011
Сообщений: 28,680
14.05.2015, 11:04 15
1.
C++
1
2
3
4
5
6
7
8
9
10
void f(char* Data)
{
   Internet InternetObj1;
   InternetObj1.Send( Data, strlen(Data) );
}
int main()
{
   f(SendData());
   return 0;
}
2.
C++
1
2
3
4
5
6
7
8
9
10
Internet InternetObj1;
void f(char* Data)
{
   InternetObj1.Send( Data, strlen(Data) );
}
int main()
{
   f(SendData());
   return 0;
}
0
14.05.2015, 11:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.05.2015, 11:04
Помогаю со студенческими работами здесь

Как вернуть из функции два значения?
Подскажите,как вернуть из ф-ции 2 значения .Вроде ,как то можно с помощью pair ,но как здесь это...

Как вернуть больше одного значения из функции?
здрасти, как быть если функция должна возвратить не 1 значение а 2?

Как вернуть сразу 2 значения массива в функции?
Собственно дан у меня например массив &quot;aa&quot;, где l-левая граница, а r-правая. При выполнении кода...

Необходимо вернуть значение функции из Булевского значения и посчитать факториал
Стоит задача- Написато программу которая спрашивает пользователя - Рост, вес, и возраст а затем...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru