проблемка
От: dcb-BanDos Россия  
Дата: 25.04.07 13:29
Оценка:
Имеем MS 2005
имеем код:


for (int j=0 ; j < 10 ; ++j)
{
//поскипано
};
int j=0;


после прохода int j=0; j остается = 10.

имеем код :
for (int j=0 ; j < 10 ; ++j)
{
//поскипано
};
int j;
j=0;

эффект тот же самый

имеем код:
for (int j=0 ; j < 10 ; ++j)
{
//поскипано
};
j=0;


error C2065: 'j' : undeclared identifier

Где грабли?
Ничто не ограничивает полет мысли программиста так, как компилятор.
Re: проблемка
От: Александра Россия  
Дата: 25.04.07 13:37
Оценка:
Здравствуйте, dcb-BanDos, Вы писали:
DB>Где грабли?

код:
#include <iostream>
int main()
{
  for (int j=0 ; j < 10 ; ++j)
  {
    //поскипано
  };
  int j=0;
  std::cout << j;
}

output:

0

Re: проблемка
От: Аноним  
Дата: 25.04.07 13:37
Оценка: +1
Здравствуйте, dcb-BanDos, Вы писали:

DB>Где грабли?

Глюк дебагера
Re: проблемка
От: Lorenzo_LAMAS  
Дата: 25.04.07 13:44
Оценка:
DB>Где грабли?

Ты отладчиком смотришь? Ну, стало быть, в нем и грабли.
Of course, the code must be complete enough to compile and link.
Re: проблемка
От: vasil_sh  
Дата: 25.04.07 13:46
Оценка:
Здравствуйте, dcb-BanDos, Вы писали:

DB>Где грабли?

код

for (int j=0 ; j < 10 ; ++j)
{

}
int j=0;
printf("j = %d", j);

выведет 0 если ты смотришь в закладке watch то просто видешь j которое в цикле объявлено,
посмотри в закладке Locals там их вообще 2 штуки будет. Вообще это глюк дебагера не может в стеке разобраться
Re: счастье
От: Erop Россия  
Дата: 25.04.07 14:03
Оценка:
Здравствуйте, dcb-BanDos, Вы писали:

DB>Где грабли?


Грабли в том, что ты зачем-то завёл в одной функции две разные переменные j.

Они конечно одновременно существовать не должны, но деструктор у int тривиальный, а память на стеке компилятор может освобождать когда угодно, тем более в debug версии...

Ты всё время смотришь отладчиком на место в памяти, где лежит параметр цикла, а вторую j заводят где-то ещё.
Но ты запутываешь не только отладчик, но и читателя своей программы (а может и себя самого).
Не заводи в одной функции две одноимённые переменные и будет тебе счастье
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: счастье
От: Lorenzo_LAMAS  
Дата: 25.04.07 14:07
Оценка:
у int нет деструктора, даже тривиального
Of course, the code must be complete enough to compile and link.
Re[3]: аргумент
От: Erop Россия  
Дата: 25.04.07 14:18
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>у int нет деструктора, даже тривиального

Ну "существует ли тривиальный деструктор" -- прекрасная тема для теологического спора
Вот, например, аргумент за:
template<typename T> void f( T& t ) { t.~T(); }
void ggg()
{
    int q;
    f( q );
}
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: аргумент
От: Lorenzo_LAMAS  
Дата: 25.04.07 14:29
Оценка:
E>Вот, например, аргумент за:

http://rsdn.ru/Forum/Message.aspx?mid=300137&amp;only=1
Автор: Андрей Тарасевич
Дата: 18.06.03
Of course, the code must be complete enough to compile and link.
Re[2]: счастье
От: Zigmar Израиль  
Дата: 25.04.07 15:26
Оценка:
Здравствуйте, Erop, Вы писали:
E>Не заводи в одной функции две одноимённые переменные и будет тебе счастье
Я бы скорее сформулировал как "Не доверяй слепо дебагеру, и будет тебе счастье"
Дебагер это часто полезная штука, но из за многочисленных особенностей, к информации из дебагера стоит относится очень осторожно, не в коем случае не считая её истинной в последней инстанции.
"To protect people you must slay people. To let people live you must let people die. This is the true teaching of the sword."
-Seijuro Hiko, "Rurouni Kensin"
Re[5]: аргумент
От: Erop Россия  
Дата: 25.04.07 16:10
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

E>>Вот, например, аргумент за:


L_L>http://rsdn.ru/Forum/Message.aspx?mid=300137&amp;only=1
Автор: Андрей Тарасевич
Дата: 18.06.03


А верно ли это для тривиального деструктора? Например деструктора POD?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: счастье
От: dcb-BanDos Россия  
Дата: 26.04.07 06:48
Оценка:
Здравствуйте, Erop, Вы писали:

E>Грабли в том, что ты зачем-то завёл в одной функции две разные переменные j.


E>Они конечно одновременно существовать не должны, но деструктор у int тривиальный, а память на стеке компилятор может освобождать когда угодно, тем более в debug версии...


E>Ты всё время смотришь отладчиком на место в памяти, где лежит параметр цикла, а вторую j заводят где-то ещё.

E>Но ты запутываешь не только отладчик, но и читателя своей программы (а может и себя самого).
E>Не заводи в одной функции две одноимённые переменные и будет тебе счастье

Да это все понятно, хотел просто разобраться =)
Ничто не ограничивает полет мысли программиста так, как компилятор.
Re[6]: аргумент
От: Lorenzo_LAMAS  
Дата: 26.04.07 07:07
Оценка:
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, Lorenzo_LAMAS, Вы писали:


E>>>Вот, например, аргумент за:


L_L>>http://rsdn.ru/Forum/Message.aspx?mid=300137&amp;only=1
Автор: Андрей Тарасевич
Дата: 18.06.03


E>А верно ли это для тривиального деструктора? Например деструктора POD?


Если ты говоришь о POD, подразумевая int (а он тоже POD) — то нет у него никаких деструкторов. В свое время Элджер очень неудачно написал бред вроде "у целых тоже есть деструкторы, просто все разумные разработчики компиляторов оптимизируют — удаляют их". Т.е. возникало впечатление, что можно столкнуться с реализацией (от менее разумных разработчиков), где все же имеют место вызовы деструкторов для целых — и этот человек еще с пафосом об АРМе говорил в предисловии.
Of course, the code must be complete enough to compile and link.
Re: проблемка
От: Какая разница Украина  
Дата: 26.04.07 09:50
Оценка: +1 :)
Здравствуйте, dcb-BanDos, Вы писали:


DB>
DB>for (int j=0 ; j < 10 ; ++j)
DB>{
DB>//поскипано
DB>};
DB>int j=0;
DB>


В завершении темы дам тебе хороший совет — не ставь точку с запятой после закрывающей фигурной скобки Постарайся избавиться от этой вредной привычки
!0xDEAD
Re[2]: проблемка
От: dcb-BanDos Россия  
Дата: 26.04.07 14:09
Оценка:
Здравствуйте, Какая разница, Вы писали:

КР>Здравствуйте, dcb-BanDos, Вы писали:



DB>>
DB>>for (int j=0 ; j < 10 ; ++j)
DB>>{
DB>>//поскипано
DB>>};
DB>>int j=0;
DB>>


КР>В завершении темы дам тебе хороший совет — не ставь точку с запятой после закрывающей фигурной скобки Постарайся избавиться от этой вредной привычки


я не ставлю, просто из начально было for (int j=0 ; j < 10 ; ++j);
для видимости скобки вставил, точку с запятой не убрал
Ничто не ограничивает полет мысли программиста так, как компилятор.
Re[2]: };
От: Пётр Седов Россия  
Дата: 27.04.07 01:11
Оценка:
Здравствуйте, Какая разница, Вы писали:
DB>>
DB>>for (int j=0 ; j < 10 ; ++j)
DB>>{
DB>>//поскипано
DB>>};
DB>>int j=0;
DB>>

КР>В завершении темы дам тебе хороший совет — не ставь точку с запятой после закрывающей фигурной скобки Постарайся избавиться от этой вредной привычки
enum Enum { Item1, Item2 };

int Nums[] = { 1, 2, 3 };

class Window
{
  ...
};

struct Node
{
  ...
};

Пётр Седов (ушёл с RSDN)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.