Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
7 / 7 / 1
Регистрация: 19.04.2011
Сообщений: 68
1

Область видимости переменной

29.04.2011, 19:00. Показов 1912. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Пожалуйста проясните новичку почему следующий код выводит сообщение messagebeer вместо message ? . Я только осваиваю язык поэтому хочу разобраться.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <windows.h>
#include <stdio.h>
using namespace std;
void myfunction(LPTSTR f);
int main()
 
{
  
   char f[]="message";
   myfunction(f);
   cout<<f;
   cin.get();
   return 0;
    
}
 
void myfunction(LPTSTR f)
{
    strcat(f,"beer");      
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.04.2011, 19:00
Ответы с готовыми решениями:

Область видимости переменной
Объявляю переменную в блоке(цикл, if) функции main. Как объявить таким образом, чтобы область...

Область видимости переменной
#include &lt;iostream&gt; int main() { int i = 5; for(int i = 0; i &lt; 5; i++) { //здесь } ...

Область видимости переменной в классе
допустим у меня есть класс A class A { public : ..... std::vector&lt;g *&gt; list; ...... }; и...

Область видимости переменной пользовательского класса
Всем привет! Столкнулся с такой проблемой: Создал клас и в нем класс исключений class A { ...

17
Higher
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
29.04.2011, 19:02 2
C++
1
"message\n"
или
C++
1
"\nbeer"
В общем у вас нету разделителей между строками, если вас это беспокоит.
Ваша функция добавляет к f(message) "beer", получается "messagebeer".
0
7 / 7 / 1
Регистрация: 19.04.2011
Сообщений: 68
29.04.2011, 19:04  [ТС] 3
diagon,
Я не понимаю что Вы этим хотели сказать
Меня беспокоит почему выводится messagebeer вместо message, ведь в функции myfunc() переменная f должна быть локальной, т.е. изменения переменной в нутри этой фунции не должны влиять на переменную f обьявленую в теле main. Или я просто чего то непонимаю ?
0
Higher
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
29.04.2011, 19:10 4
Если бы вы объявили ее внутри функции, то она была бы локальной... А у вас она лишь один из аргументов... Точнее единственный аргумент.
0
21 / 21 / 4
Регистрация: 06.11.2010
Сообщений: 57
29.04.2011, 19:13 5
Тебе отдельно два слова нужно что ли вывести?
0
Higher
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
29.04.2011, 19:14 6
Теперь это действительно локальная переменная, и она не влияет на main=)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <windows.h>
#include <stdio.h>
using namespace std;
void myfunction();
int main()
 
{
 
   char f[]="message";
   myfunction();
   cout<<f;
   cin.get();
   return 0;
 
}
 
void myfunction()
{
    LPTSTR f;
    strcat(f,"beer");
}
0
7 / 7 / 1
Регистрация: 19.04.2011
Сообщений: 68
29.04.2011, 19:16  [ТС] 7
В Вашем примере работа программы не выполняется (
0
Higher
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
29.04.2011, 19:18 8
А что она должна делать-то? Если склеивать строки,то в первом сообщении вы выложили рабочий вроде код.
Если демонстрировать область видимости переменной-то все работает.
0
7 / 7 / 1
Регистрация: 19.04.2011
Сообщений: 68
29.04.2011, 19:19  [ТС] 9
В этом случае выводит 5, т.е. правильно.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <windows.h>
#include <stdio.h>
using namespace std;
void myfunction(int f);
int main()
 
{
  
   int f=5;
   myfunction(f);
   cout<<f;
   cin.get();
   return 0;
    
}
 
void myfunction(int f)
{
    f=4;      
}
Почему в первом случае выводит messagebeer а не message ?
0
10 / 10 / 3
Регистрация: 11.12.2010
Сообщений: 12
29.04.2011, 19:20 10
Потому что ты указатель в функцию передаешь...
1
7 / 7 / 1
Регистрация: 19.04.2011
Сообщений: 68
29.04.2011, 19:22  [ТС] 11
litoq, Можно немного подробней
Все я понял, спасибо litoq
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
29.04.2011, 19:41 12
LedZeppelin, В функцию передаётся не массив, а только лишь адрес первого элемента. Поэтому все изменения, произведённые над переданным в функцию массивом внутри этой функции, отражаются на реальном массиве.
1
7 / 7 / 1
Регистрация: 19.04.2011
Сообщений: 68
29.04.2011, 21:31  [ТС] 13
silent_1991
Я учту это, спасибо.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12459 / 7483 / 1754
Регистрация: 25.07.2009
Сообщений: 13,762
29.04.2011, 23:03 14
А меня одного смущает, что объявление
Цитата Сообщение от diagon Посмотреть сообщение
char f[]="message";
подразумевает массив из 7 + 1 символов, а к нему ещё
Цитата Сообщение от LedZeppelin Посмотреть сообщение
strcat(f,"beer");
приделывается? То есть выход за границу массива...
0
7 / 7 / 1
Регистрация: 19.04.2011
Сообщений: 68
30.04.2011, 19:56  [ТС] 15
easybudda
А что разве функция strcat() не добавляет новые индексы автоматически (куда она тогда помещает новые символы ?) ?
И если так тогда как предусматреть это?
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
30.04.2011, 20:04 16
LedZeppelin, какой там автоматически, это же вам не std::string. Элементы помещаются, как, по идее, и надо, в память, следующую за последним фактическим элементом массива. Только вот как на это отреагирует программа - не определено. Может, она отработате на этот раз без ошибок, может повиснуть сразу при попытке записи в неправильную область памяти, а может отказать в совершенно другом месте. Таковы последствия выхода за пределы массива.

Добавлено через 23 секунды
Цитата Сообщение от LedZeppelin Посмотреть сообщение
И если так тогда как предусматреть это?
Выделять под строку память заведомо большего размера, например.
1
7 / 7 / 1
Регистрация: 19.04.2011
Сообщений: 68
30.04.2011, 20:23  [ТС] 17
silent_1991,
если дописать:
C++
1
2
3
4
cout<<f[7];//выведет b
cout<<f[8];//выведет e
cout<<f[9];//выведет e
cout<<f[10];//выведет r
значит индексы добавились, или как ?О_о
1
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
30.04.2011, 21:07 18
LedZeppelin, ничего не добавилось, вы просто вышли за пределы массива. Память не обрывается на конце массива, а продолжается дальше, вот в неё запись и происходит. В С/С++ предполагается, что программист сам будет следить за такими ситуациями.

Не по теме:

+1 случайно жамкнул)))

0
30.04.2011, 21:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.04.2011, 21:07
Помогаю со студенческими работами здесь

Область видимости
У меня возникла проблема с областью видимости. вот у меня два класса class Obj { ...

Область видимости
Даю фрагмент программы: #include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;cmath&gt; struct elem...

Область видимости в С++
В книге С++ Бархатный путь. (...

Область видимости
Здравствуйте. Тут такое дело: #include &lt;vector&gt; class SomeClass { public: SomeClass(...


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

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