HOME    FORUMS    MEMBERS    RECENT POSTS    LOG IN  
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > ПРОГРАММИРОВАНИЕ > С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #1461  
Старый 30.08.2008, 09:50
Cheka
Новичок
Регистрация: 23.08.2008
Сообщений: 5
Провел на форуме:
145863

Репутация: 6
По умолчанию

Цитата:
Сообщение от nerezus  
Он не должен работать - область видимости, где есть X, заканчивается после } цикла for.
Поэтому и 'x' : undeclared identifier - все верно.

Модифицируй так:

int x;
for (x = 1; x <= 10; x++)
{
Вообщето правило области видимости, работает для фукнций, а не для составных операторов и для тел циклов, если мне не изменяет память...

P.S. У меня на Визуал С++ 6 скомпилировалось без ошибок.
 
Ответить с цитированием

  #1462  
Старый 30.08.2008, 10:13
nerezus
Pagan Heart
Регистрация: 12.08.2004
Сообщений: 3,791
Провел на форуме:
6490435

Репутация: 2290


Отправить сообщение для nerezus с помощью ICQ
По умолчанию

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

Код:
#include "stdio.h"

int main() {
    int x = 1;
	printf("1: %d\n", x);
	{
		printf("2: %d\n", x);
        int x = 2;
		printf("3: %d\n", x);
	}
	printf("4: %d\n", x);
	getchar();
	return 0;
}
Переменная, объявленная во внутреннем блоке, замещает ту, которая объявлена во внешнем(примеры 2 и 3 в программе). Однако в конце блока она исчезает(примеры 3 и 4)


Цитата:
P.S. У меня на Визуал С++ 6 скомпилировалось без ошибок.
Очень старый компилятор. Обнови.
Более новые версии уже не компилят этот код. И правильно делают - в коде ошибка.
 
Ответить с цитированием

  #1463  
Старый 30.08.2008, 10:20
4y4o
Познающий
Регистрация: 22.01.2007
Сообщений: 40
Провел на форуме:
179857

Репутация: 4
По умолчанию

Ребятки ответы на Дейтела нужны!!! 2007 год книженция
 
Ответить с цитированием

  #1464  
Старый 30.08.2008, 11:31
Barttos
Новичок
Регистрация: 06.06.2008
Сообщений: 19
Провел на форуме:
49002

Репутация: 3
По умолчанию

Добрый день
Нужна книга по Visual C++ 2008
Нашол только старые и одну 2005-ого года
 
Ответить с цитированием

  #1465  
Старый 30.08.2008, 11:32
nerezus
Pagan Heart
Регистрация: 12.08.2004
Сообщений: 3,791
Провел на форуме:
6490435

Репутация: 2290


Отправить сообщение для nerezus с помощью ICQ
По умолчанию

Цитата:
Добрый день
Нужна книга по Visual C++ 2008
Нашол только старые и одну 2005-ого года
Спокойной ночи. Читай закрепленную в разделе тему.
 
Ответить с цитированием

  #1466  
Старый 30.08.2008, 13:02
BEGINER
Новичок
Регистрация: 16.08.2008
Сообщений: 19
Провел на форуме:
33376

Репутация: 3
По умолчанию

Цитата:
Сообщение от nerezus  
Он не должен работать - область видимости, где есть X, заканчивается после } цикла for.
Поэтому и 'x' : undeclared identifier - все верно.
Прошу прощения, я совершенно не понимаю, что такое область видимости.
Вы не могли бы показать где находится область видимости в коде полученном после компиляции этой программы?
Там четко видно, что переменная х находится по адресу dword ptr [ebp-4] даже после выхода из цикла for. И, следовательно, ее без проблем можно вывести на экран. Почему же тогда компилятор ругается?

Код:
//задаем х
00401588   mov         dword ptr [ebp-4],1 	//x=1
0040158F   jmp         0040159a
00401591   mov         eax,dword ptr [ebp-4] 	//
00401594   add         eax,1			//x++;
00401597   mov         dword ptr [ebp-4],eax	//
0040159A   cmp         dword ptr [ebp-4],0Ah	//x<=10
0040159E   jg            004015c6
//{
//проверка х
004015A0   cmp         dword ptr [ebp-4],5	//if(x==5)
004015A4   jne          004015a8
004015A6   jmp         004015c6		//break
//вывод х
004015A8   push        offset 0046c03c	//" "
004015AD   mov         ecx,dword ptr [ebp-4]	//x
004015B0   push        ecx
004015B1   mov         ecx,004777e0		//cout
004015B6   call          004010ff		//<<
004015BB   push        eax
004015BC   call          00401285		//<<
004015C1   add         esp,8
004015C4   jmp         00401591
//}
//вывод х
004015C6   push        offset 004010c8	// \n
004015CB   mov         edx,dword ptr [ebp-4]	// x
004015CE   push        edx
004015CF   push        offset  0046c01c 	//"Cukl prervan pri x == 5 "
004015D4   push        004777e0		//cout
004015D9   call          00401285 		//<<
004015DE   add         esp,8
004015E1   mov         ecx,eax
004015E3   call          004010ff		//<<
004015E8   mov         ecx,eax
004015EA   call          004011e0		//<<

Последний раз редактировалось BEGINER; 30.08.2008 в 13:08..
 
Ответить с цитированием

  #1467  
Старый 30.08.2008, 14:02
ExZoD
Новичок
Регистрация: 04.06.2008
Сообщений: 24
Провел на форуме:
55730

Репутация: 16
По умолчанию

область видимости переменной - это ее свойство, благодаря которому переменные можно делать локальными или глобальными. Если переменная объявлена в теле функции/цикла/условия, то и обращаться к ней можно только внутри тела функции/цикла/условия. Это вполне нормальное поведение для многих ЯП.
Например, если разработкой программы занимается целый отдел, то сколько человек в своих функциях объявят переменную i для использования в циклах. И надо как эти переменный разделять.
Еще пример: чтобы было в рекурсивных функциях, не будь у них своей области видимости? толку от них уж точно мало будет.
 
Ответить с цитированием

  #1468  
Старый 30.08.2008, 17:13
Barttos
Новичок
Регистрация: 06.06.2008
Сообщений: 19
Провел на форуме:
49002

Репутация: 3
По умолчанию

nerezus, читал ))
но книга старая...
 
Ответить с цитированием

  #1469  
Старый 30.08.2008, 19:56
nerezus
Pagan Heart
Регистрация: 12.08.2004
Сообщений: 3,791
Провел на форуме:
6490435

Репутация: 2290


Отправить сообщение для nerezus с помощью ICQ
По умолчанию

Цитата:
в коде полученном после компиляции этой программы?
После компиляции - это уже бинарник. В каждом компилере он свой и т.д.
Тем более чтот я не знаю асм в достаточной степени, чтобы его так легко читать.
Я вообще веб-программист)

Просто я сказал факт. И мои слова подтвердил код(см. мой пример) и ошибка компилятора.
 
Ответить с цитированием

  #1470  
Старый 30.08.2008, 20:17
4p3
Участник форума
Регистрация: 18.08.2008
Сообщений: 159
Провел на форуме:
750247

Репутация: 92
Отправить сообщение для 4p3 с помощью ICQ
По умолчанию

BEGINNER, это просто одно из правил С++, которое облегчает жизнь. Просто такое джентельменской соглашение. Это все равно что закрытые члены класса. Вроде как они закрыты, однако если провести фокус с указателями, то можно спокойно получить к ним доступ.
Вы продемонстрировали исходник на асме. Используется регистр Ebp, которые работает со стеком. В данном коде очень мало переменных, а если их будет больше? Кто даст гарантию, что Х будет все время находится именно по этому адресу? Может компилятор решит на его место записать что-то другое и что дальше произойдет? Правильно, Х перестанет существовать. Зачем хранить уже не нужные переменные?
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Часто задаваемые вопросы по MySQL Серый PHP 5 28.12.2006 18:26
Интернетчики задали российскому президенту очень странные вопросы podkashey Мировые новости. Обсуждения. 4 07.07.2006 16:53
Вопросы по Ipb 2.0 Voodoo_People Сценарии/CMF/СMS 26 15.02.2005 22:57



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ