Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.68/19: Рейтинг темы: голосов - 19, средняя оценка - 4.68
0 / 0 / 0
Регистрация: 06.08.2011
Сообщений: 13

возвращение значений функциями

07.08.2011, 17:24. Показов 3508. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Возник у меня следующий вопрос.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
char** FtpConnect::readServ()
{
    int rc;
    int countByte;
    char buff[512];
    char* resultArr[2];
    fd_set fdr;
    FD_ZERO(&fdr);
    FD_SET(this->localSocket,&fdr);
    timeval timeout;
    timeout.tv_sec = 1;
    timeout.tv_usec = 0;
    do 
    {
        countByte = recv(this->localSocket,buff,512,0);
        if (countByte)
        {
            buff[countByte] = '\0';
        }
        rc = select(this->localSocket+1,&fdr,NULL,NULL,&timeout);
    } while(rc);
    resultArr[0] = strtok(buff," ");
    resultArr[1] = strtok(NULL, "\0");
    return resultArr;
}
Получаю варнинг:
C++
1
warning C4172: возвращение адреса локальной или временной переменной
Что в общем то и справедливо.
Не понятно только то, как правильно возвращать значения без new.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.08.2011, 17:24
Ответы с готовыми решениями:

Возможно ли возвращение функцией двух значений? Именно возвращение, не ссылка или указатель
Нужна функция в которую забиваешь два числа и сначала она возвращает минимальное, после максимальное. Я пробовал делать с ссылками и это не...

Возвращение функциями указателей
Читаю про указатели, тут для примера,предоставляется код. Программа ищет какую-то подстроку в строке. Кто нибудь может объяснить,каким...

Возвращение функциями указателей
Доброго времени суток:) Помогите понять код!!!Суть вопроса описана в коментах в коде. Условие задачи:В программе демонстрируеться...

24
Заблокирован
07.08.2011, 17:54
как вариант - занести переменную-результат в списки арг. функции.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void FtpConnect::readServ( char* &resultArr )
{
        int rc;
        int countByte;
        char buff[512];
        
        fd_set fdr;
        FD_ZERO(&fdr);
        FD_SET(this->localSocket,&fdr);
        timeval timeout;
        timeout.tv_sec = 1;
        timeout.tv_usec = 0;
        do 
        {
                countByte = recv(this->localSocket,buff,512,0);
                if (countByte)
                {
                        buff[countByte] = '\0';
                }
                rc = select(this->localSocket+1,&fdr,NULL,NULL,&timeout);
        } while(rc);
        resultArr[0] = strtok(buff," ");
        resultArr[1] = strtok(NULL, "\0");
}
Обратите внимание на выход из функции. Результат её работы всегда будит один и тот же.
Лично я не вижу ни одной причины, зачем он вообще нужен.

Можно было написать вот так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void FtpConnect::readServ()
{
        int rc;
        int countByte;
        char buff[512];
        
        fd_set fdr;
        FD_ZERO(&fdr);
        FD_SET(this->localSocket,&fdr);
        timeval timeout;
        timeout.tv_sec = 1;
        timeout.tv_usec = 0;
        do 
        {
                countByte = recv(this->localSocket,buff,512,0);
                if (countByte)
                {
                        buff[countByte] = '\0';
                }
                rc = select(this->localSocket+1,&fdr,NULL,NULL,&timeout);
        } while(rc);
}
Клиентский код вызывает функцию, а потом делает нечто с литерной константной " "
0
0 / 0 / 0
Регистрация: 06.08.2011
Сообщений: 13
07.08.2011, 17:58  [ТС]
Спасибо за ответ, но все же я не совсем понял.
Функция возвращает массив с кодом и сообщением ответа сервера.
Мне они нужны будут нужны.
0
Заблокирован
07.08.2011, 18:03
Алекс, функция возвращает:


Цитата Сообщение от alex_2017 Посмотреть сообщение
...
resultArr[0] = strtok(buff," ");
resultArr[1] = strtok(NULL, "\0");
return resultArr;
}
Больше она ничего не возвращает. Никаких кодов. Только строчку " "
То бишь 1 символ пробела, и символ завершения строки.

О каких кодах речь?
Какое сообщение сервера?
Вы вообще понимаете, что делает этот код?
Или так просто, скопипастили откуда то не вникая?
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
07.08.2011, 18:04
Цитата Сообщение от alex_2017 Посмотреть сообщение
Функция возвращает массив с кодом и сообщением ответа сервера.
Мне они нужны будут нужны.
вы же не знаете сколько данных вернет сервер, выделяйте память динамически и потом очищайте
0
0 / 0 / 0
Регистрация: 06.08.2011
Сообщений: 13
07.08.2011, 18:16  [ТС]
Bers, код да, скопипастил, но вникал и модифицировал.
Ту часть, которая собственно возвращает массив я далал сам.
Например, после залогинивания на ftp сервере
C++
1
atoi(this->readServ()[0])
возвращает 230.
Хотя примечательно то, что без atoi получаю бардак.

Maxwe11, но ведь очищать ее придется после выполнения функции? Каждый раз после обращения к ней делать это, наверное, не очень красиво.
0
Заблокирован
07.08.2011, 18:22
Цитата Сообщение от alex_2017 Посмотреть сообщение
Bers, код да, скопипастил, но вникал и модифицировал.
Ну раз вникали. И раз:

Цитата Сообщение от alex_2017 Посмотреть сообщение
Функция возвращает массив с кодом и сообщением ответа сервера.
Мне они нужны будут нужны.

Укажите мне номер строки, где в вашем коде "результату" присваиваются какой то "код", и ответ сервера?

Куда вообще записывается желательный результат работы функции?
0
0 / 0 / 0
Регистрация: 06.08.2011
Сообщений: 13
07.08.2011, 18:28  [ТС]
В
C++
1
char buff[512];
ответ сервара, который получаем в с помощью функции
C++
1
recv(this->localSocket,buff,512,0)
С select не разобрался совершенно.
Собственно после цикла в buff у меня ответ сервра но мой последний send.
C++
1
2
resultArr[0] = strtok(buff," ");
resultArr[1] = strtok(NULL, "\0");
Тут я до пробела выдергиваю код ответа, а после, до нулевого символа текст ответа.
recv возвращает количество байт ответа.
C++
1
2
3
4
                if (countByte)
                {
                        buff[countByte] = '\0';
                }
Тут я ставлю "точку" в ответе.

А, ну все это еще и ftp.
0
Заблокирован
07.08.2011, 18:41
а... извиняюсь, я сам попутал с strtok();

В общем, самое простое - закидывать resultArr в качестве ссылки в аргументе функции.
1
Заблокирован
07.08.2011, 18:50
Цитата Сообщение от alex_2017 Посмотреть сообщение
Здравствуйте.
Возник у меня следующий вопрос.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
char** FtpConnect::readServ()
{
    int rc;
    int countByte;
    char buff[512];
    char* resultArr[2];
    fd_set fdr;
    FD_ZERO(&fdr);
    FD_SET(this->localSocket,&fdr);
    timeval timeout;
    timeout.tv_sec = 1;
    timeout.tv_usec = 0;
    do 
    {
        countByte = recv(this->localSocket,buff,512,0);
        if (countByte)
        {
            buff[countByte] = '\0';
        }
        rc = select(this->localSocket+1,&fdr,NULL,NULL,&timeout);
    } while(rc);
    resultArr[0] = strtok(buff," ");
    resultArr[1] = strtok(NULL, "\0");
    return resultArr;
}
Получаю варнинг:
C++
1
warning C4172: возвращение адреса локальной или временной переменной
Что в общем то и справедливо.
Не понятно только то, как правильно возвращать значения без new.
Вы возвращаете адрес первого элемента локального массива. Как только функция завершает свою работу, все локальные переменные удаляются, то есть становятся недостоверными и недоступными. Об этом вам сообщает компилятор. То есть поведение вашей программы становится неопределенным.
0
0 / 0 / 0
Регистрация: 06.08.2011
Сообщений: 13
07.08.2011, 18:52  [ТС]
Сыроежка, да, это я сразу понял.
Bers, вот про
В общем, самое простое - закидывать resultArr в качестве ссылки в аргументе функции.
можно ли где почитать?
0
Заблокирован
07.08.2011, 19:01
Цитата Сообщение от alex_2017 Посмотреть сообщение
Сыроежка, да, это я сразу понял.
Bers, вот про

можно ли где почитать?
C++
1
2
3
4
5
6
7
8
void FtpConnect::readServ( char * ( &result )[2] );
 
int main()
{
   char * result[2] = {};
   
   FtpConnect::readServ( result );
}
1
0 / 0 / 0
Регистрация: 06.08.2011
Сообщений: 13
07.08.2011, 19:20  [ТС]
Вот я только вот чего не пойму.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void FtpConnect::readServ( char * (&result)[2] )
{
    int rc;
    int countByte;
    char buff[512];
    
    fd_set fdr;
    FD_ZERO(&fdr);
    FD_SET(this->localSocket,&fdr);
    timeval timeout;
    timeout.tv_sec = 1;
    timeout.tv_usec = 0;
    do 
    {
        countByte = recv(this->localSocket,buff,512,0);
        if (countByte)
        {
            buff[countByte] = '\0';
        }
        rc = select(this->localSocket+1,&fdr,NULL,NULL,&timeout);
    } while(rc);
    result[0] = strtok(buff," ");
    result[1] = strtok(NULL, "\0");
}
C++
1
2
3
char * result[2];
this->readServ( result );
cout << atoi(result[0]);
В ответ вижу код код, все отлично.

Но стоит только убрать atoi, то вижу неописуемого вида строку (мусор какой-то).

Если buff в FtpConnect::readServ объявить динамически, то все отлично.

Но я не хочу потом ее чистить (да и не знаю как).
Как быть?
0
Заблокирован
07.08.2011, 19:33
У вас еще имеется проблема в программе. Вы в массив, который передаете по ссылке, заносите адреса локальной переменной buff.

То есть у вас в целом код безграмотный! Вам следует переписать функцию. Нельзя такой безграмотный код писать! Я вам с самого начала сказал, что все локальные переменные функции становятся недействительными по завершению ее работы, а вы опять наступаете на те же самые грабли!
0
0 / 0 / 0
Регистрация: 06.08.2011
Сообщений: 13
07.08.2011, 19:38  [ТС]
Да, действительно, теперь понял.
А то, что код безграмотный не беда, я только учусь, и код этот пишу лишь в образовательных целях.
0
Заблокирован
07.08.2011, 19:44
Цитата Сообщение от alex_2017 Посмотреть сообщение
Да, действительно, теперь понял.
А то, что код безграмотный не беда, я только учусь, и код этот пишу лишь в образовательных целях.
Не обижайтесь. Такую ошибку порой можно встретить и в профессиональном коде. То есть нередко возвращают из функции ссылку на локальную переменную.
0
Заблокирован
07.08.2011, 19:48
Цитата Сообщение от Сыроежка Посмотреть сообщение
Такую ошибку порой можно встретить и в профессиональном коде. То есть нередко возвращают из функции ссылку на локальную переменную


Профи сообщения компиляторов уже не читают?
0
0 / 0 / 0
Регистрация: 06.08.2011
Сообщений: 13
07.08.2011, 19:48  [ТС]
А я обижаться и не думал.
Я сюда пришел как раз за тем, чтобы вы мне и показали, что я делаю не так.
0
Заблокирован
07.08.2011, 19:58
Цитата Сообщение от Bers Посмотреть сообщение


Профи сообщения компиляторов уже не читают?
Как раз именно профи чаще всего не читают предупреждения компилятора. То есть не надо переоценивать слово "профи". Я под ним в данном случае просто имел в виду тех, кто работает программистами. Я видел исходные коды проекта IBM, и у меня волосы просто дыбом встали. Настолько он непрофессиональный, и сколько в нем ошибок!
0
Заблокирован
07.08.2011, 20:02
Цитата Сообщение от Сыроежка Посмотреть сообщение
Как раз именно профи чаще всего не читают предупреждения компилятора
Не знаю... у нас вообще запрещается игнорировать предупреждения компилятора, и запрещается "затыкать" ему рот всякими трюками...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.08.2011, 20:02
Помогаю со студенческими работами здесь

Задачка с функциями: возвращение данных двумя способами
В одномерном массиве, вводимом с клавиатуры и состоящем из N вещественных элементов, вычислить сумму элементов массива с нечетными номерами...

Возвращение значений из функции
Добрый день! Есть индексный файл в котором происходит начало сессии, подключаются библиотека с функциями и шаблоны сайта и...

Возвращение пр до нормальных значений
Гугл часто обнуляет значение пр при черезмерной продажи ссылок. Вот и у меня это случилось где-то годик назад. Теперь надумал вернуть пр до...

Возвращение неправильных значений
Добрый день Написал программу для умножения двух матриц. Но к сожалению метод возвращает мне нули. А на самом деле не должна. ...

Возвращение значений масивов
Требуется: 1) Создать метод MyReverse(int array), который принимает в качестве аргумента массив целочисленных элементов и возвращает...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru