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

Передать значени через глобальную переменную или указатель

23.05.2009, 11:19. Показов 5845. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется функция, которая должна возвратить строковое значение. Сделал 2 способами. 1 - объявил глобальной переменной строку и передавал в функцию указатель на эту переменную. 2 - передал функции указатель на строку, а вернул указатель на строку, которая была сформирована внутри функции. Хотелось бы узнать как правильнее поступить, если с помощью функции надо модифицировать(вернуть) строку??
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.05.2009, 11:19
Ответы с готовыми решениями:

Как передать глобальную переменную в twig
define("SEASON", 1); как теперь её в файле с расширением twig вывести?

как передать глобальную переменную в класс
Всем привет! подскажите плиз, ответ на такой вопрос? У меня есть массив строк например String str он заполняется при создании...

Через CreateThread в поток передать указатель на форму или ее элемент
Можно ли через CreateThread в поток передать указатель на форму или ее элемент(VS2010)? ...

14
 Аватар для Monte-Cristo
2816 / 1408 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
23.05.2009, 11:24
в хорошем стиле написания, лучше писать без использования глобальных перменных

Добавлено через 1 минуту 24 секунды
но дело в том, что если используются глобальные пременные, я не вижу смысла передавать указатель на глобальную перменную. она видна во всех функциях.
0
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 118
23.05.2009, 11:26  [ТС]
Ну вот по моим скудным ощущениям такой же вывод. Тогда вопрос про время жизни переменной. Если мы в функции создаем строковую переменную, заполняем ее данными и возвращем указатель на нее. Разве это правильно. По идее строковая переменная действительна только внутри функции. Вот это у меня что-то не укладывается...
0
 Аватар для Monte-Cristo
2816 / 1408 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
23.05.2009, 11:34
Тогда вопрос про время жизни переменной. Если мы в функции создаем строковую переменную, заполняем ее данными и возвращем указатель на нее.
нет... так не правильно...

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

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void somefunc(char *str)
{
   strcpy(str,"fdsfsdf");
}
 
int main()
{
   char str[255];
 
   somefunc(str);
   
   cout << str;
 
   return 0;
}
0
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 118
23.05.2009, 12:04  [ТС]
Собственно вот пример моей ситуации:
C
1
2
3
4
5
6
7
8
9
void parser(char *buffer){
//Здесь я заполняю глобальную переменную buf_out основываясь на данных bif_in
}
 
main() {
//....
//получили строку из сети(сокетом) buf_in
parser(buf_in);   //передаю ее функции
//отправляю переменную buf_out через сокет
Соответственно это вариант через глобальную переменную buf_out. Хотелось бы узнать как реализовать просто с возвращением значения функции.
0
 Аватар для Monte-Cristo
2816 / 1408 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
23.05.2009, 12:12
ну например вот так:

C
1
2
3
4
5
6
7
8
9
10
void parser(char *buffer, char *buf_out){
// заполняйте сдесь buf_out
}
 
main() {
//....
//получили строку из сети(сокетом) buf_in
char buf_out[255];
parser(buf_in, buf_out);   //передаю ее функции
//отправляю переменную buf_out через сокет
0
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 118
23.05.2009, 12:18  [ТС]
Ой пардон. я вспомнил. Я так делал, вот только у меня функция в другом файле. Точнее даже не так. У меня функция parser она просто выбирает из списка функций какой передать входные значения(buf_in) и уже в следующей происходит одработка. Вот только последняя функция находится в другом файле. И собственно поэтому у меня не прокатывало так сделать.
0
 Аватар для Monte-Cristo
2816 / 1408 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
23.05.2009, 12:25
ничего не понял
собственно, указатели для того и нужны, чтоб иметь доступ из функций, без потребности глобальных пременных.. передваемый указатель buf_out вы можете передать и в другую функцию.
1
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 118
23.05.2009, 12:45  [ТС]
если у нас функции разбросаны по разным исходным файлам, которые компонуются вместе. Будет ли работать тогда такая схема??
0
 Аватар для Monte-Cristo
2816 / 1408 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
23.05.2009, 12:48
ну да... получается вот что:
у тебя функция работает с адресом, передаваемым в параметре...
и этот адрес, можно передавать из одной функции в другую.

другое дело, что я не вижу всего листинга, и не знаю что и как ты передаешь.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
23.05.2009, 12:51
Цитата Сообщение от toxxin
Сделал 2 способами. 1 - объявил глобальной переменной строку и передавал в функцию указатель на эту переменную.
не, обычно объявляют локально, а потом передают её, так работает функция strcpy, ей передают адрес (она создаёт его копию, но такую же) потом по этому адресу работает, а потом этот же адрес и возвращает

когда у тебя глобальная строка, то и передавать её не надо, функция уже её видит (глобальный стиль делает функции зависимыми, может сковывать программу и эти переменные висят всё время в памяти, переменные же внутри функций создаются только на время вызова и освобождают память как только функция завершилась, нужно поддерживать возможность удаления любой функции из программы, и, если она будет зависеть, то, удалив за ней глобальную переменную, можешь оставить другую зависимую функции без данных или же захочешь исправить что-то в ходе программы с помощью одной функции, которая работает с глобальной переменной, забудешь все функции поправить и некоторые будут продолжать менять глобальную переменную (не найдёшь потом какие именно), когда функций всё больше и больше, это будет сказываться на сложности программы (она должна быть простой независимо от своего размера))
1
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 118
23.05.2009, 13:02  [ТС]
Да я в принципе это понимаю. У меня сложность возникла с возвратом строки из функции(ну фактически возвратом адреса). Я просто думал, что если функция сформировала строку(свою локальную переменную), то при выходе из функции все ее локальные переменные уничтожаются и она уже не может возвратить адрес нужной мне переменно, т.к. самой переменной уже нет

Добавлено через 32 секунды
Честно говоря до сих пор не очень врубаюсь))
0
 Аватар для Monte-Cristo
2816 / 1408 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
23.05.2009, 14:16
Цитата Сообщение от toxxin Посмотреть сообщение
Я просто думал, что если функция сформировала строку(свою локальную переменную), то при выходе из функции все ее локальные переменные уничтожаются и она уже не может возвратить адрес нужной мне переменно, т.к. самой переменной уже не
так оно и есть.. но если создать в main() какую нибудь строку, и передовать ее адрес по функциям, то в этих функиях ее можно изменять.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
23.05.2009, 16:14
toxxin, было бы лучше, если бы ты пояснил конкретно, какое действие ты реализуешь, а то по тому, что ты написал, сложно что-то понять. Если я правильно тебя понял, то нужно делать так

C
1
2
3
4
5
6
7
char*
parser (char *buff_in)
{
  static char buff_out[1024]; // <--- здесь нужно быть уверенным, что размера буффера достаточно
  strcpy (buff_out, buff_in);
  return buff_out;
}
Переменные, описанные как static внутри процедуры, являются глобальными в плане времени жизни. Но доступ к этой переменной по имени может быть только внутри данной процедуры. Т.е. в двух разных процедурах ты можешь объявить две static переменные с одним и тем же именем - получится два разных глобала, но каждый доступен только в своей процедуре

Однако при описанном подходе надо иметь ввиду, что второй вызов процедуры пишет в тот же буффер, а потому если тебе значение нужно перетащить через второй вызов - оно испортиться.

C
1
2
3
4
5
char *p1, *p2;
p1 = parser ("trampampam");
printf ("%s\n", p1);
p2 = parser ("tralivali");
printf ("%s\n", p1); // <--- в этом месте для p1 уже напечатается другая строка
1
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
24.05.2009, 10:52
Цитата Сообщение от toxxin
Я просто думал, что если функция сформировала строку(свою локальную переменную), то при выходе из функции все ее локальные переменные уничтожаются и она уже не может возвратить адрес нужной мне переменно, т.к. самой переменной уже нет
да, только когда ты передаёшь адрес в функцию, создаётся его копия и помещается в указатель (указатель как раз локальный), когда функция закончилась, она удаляет указатель, вместе с этой копией адреса (в данном случае адрес является как бы простыми данными вроде числа и типа эти данные передались в функцию и присвоились переменной, а то, что это адрес там какой-то переменной и так далее, этого функция не знает), то есть указатель внутри функции - это обычная переменная, хранящая данные
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.05.2009, 10:52
Помогаю со студенческими работами здесь

Передать в процедуру "ссылку" на глобальную переменную
Всем привет. Есть процедура , которая изменяет значение некоторой глобальной переменной. Какую именно переменную нужно изменять, заранее...

Как создать (проинициализировать) глобальную переменную или глобальный класс управляемого типа?
Hi! Нужна помощь: Как создать(проинициализировать) глобальную переменную или глобальный класс управляемого типа (CLR)??? В Visual c++...

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

Как при создании дочернего окна передать ему указатель на static-переменную в оконной процедуре родительского?
Есть оконная процедура родительского окна, в ней есть static-переменная, например, static std::string s;. Оконная процедура дочернего кона...

Изменить переменную класса через указатель
В данном примере я получаю указатель на переменную объекта. Я хочу изменить указатель, т.е. не само значение переменной на которую...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru