Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтение из файла 
:(
    Опции темы
MAKCim
Дата 10.8.2006, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



vinter, где тут видно что
Код

mov byte ptr [ch], 0Ah

записывает в сегмент данных
адрес куда указывает ch неизвестен (может быть он стековый)
а сама ch в сегменте данных


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
vinter
Дата 10.8.2006, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



На сколько я помню если в скобках не указаны [bp] или [sp] по умолчанию префиксом ставится сегмент данных...отсюда и мои выводы


--------------------
Мой блог
PM MAIL WWW   Вверх
dumb
Дата 11.8.2006, 02:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 8
Всего: 158



vinter,
Цитата(vinter @  10.8.2006,  18:20 Найти цитируемый пост)
dumb мы на "ты" не переходили smile

[off]мне никуда переходить не надо - так принято в сети. но если Вы настаиваете... имейте ввиду: тон такого общения считается "напряженным", а "выкающий" собеседник выдает в себе высокомерие, либо агрессивный настрой, даже если на самом деле это не так.[/off]

Цитата(vinter @  10.8.2006,  18:20 Найти цитируемый пост)
Цитата

а если уж речь зашла о конкретном случае, то компилятор никогда не "соптимизирует" переменную ch в регистр, ибо как-то так сложилось, что в качестве буфера для приема данных регистры не используются.

можно узнать откуда такие сведения(для собственного просвещения)

попробуйте еще раз перечитать предложение и подумать над его смыслом.

Цитата(vinter @  10.8.2006,  18:20 Найти цитируемый пост)
где это? то что я назвал "инициализацией " немного другой процесс(что то я нигде не встречал стандарта по названиям), многие даже именитые авторы книг по программированию называют разными словами одинаковые вещи?? в сущности я не был неправ...

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

Цитата(vinter @  10.8.2006,  18:20 Найти цитируемый пост)
почитайте вот это

итак, человек, который пытается доказывать "призрачные вероятности", используя при этом Debug версию, отправляет меня читать Как пережить release-версию!
Код

void read_string()
{
0041D2B0  push        ebp
0041D2B1  mov         ebp,esp 
0041D2B3  sub         esp,0D8h ; выделение места под стековые переменные
  ; много для двух чаров? так это дебаг-версия добавила кусок к переменным,
  ; дабы потом целостность стека проверить.
0041D2B9  push        ebx  
0041D2BA  push        esi  
0041D2BB  push        edi  
0041D2BC  lea         edi,[ebp-0D8h] ; заполнение выделенного куска значениями "0xCC"
  ; сие заполнение и является средством борьбы с неинициализированными данными.
  ; 0xCC - на всякий случай, если вдруг "переполнуха" приключится
0041D2C2  mov         ecx,36h 
0041D2C7  mov         eax,0CCCCCCCCh 
0041D2CC  rep stos    dword ptr [edi] ; закончили заполнять
    char p
  ;>почему здесь ничего не происходит???Обьясните пожалуйста
  ; а тут и не должно ничего происходить - место под переменную уже выделено.
    char ch = 10;    
0041D2CE  mov         byte ptr [ch],0Ah
  ;>вот кстати заносит значение в сегмент данных ,а не стека
  ; уважаемый, Вам же символьное имя показывают, а если б не показывали,
  ; то здесь было бы что-то около byte ptr [ebp-8]
    while(ch != 10)
0041D2D2  movsx       eax,byte ptr [ch] 
; ...

Цитата(vinter @  10.8.2006,  19:26 Найти цитируемый пост)
попробуйте посмотрите при отладке значение переменной...у меня оно ни разу не установилось в 10 при опред. без инициализации

занавес!

Цитата(vinter @  10.8.2006,  20:26 Найти цитируемый пост)
На сколько я помню если в скобках не указаны [bp] или [sp] по умолчанию префиксом ставится сегмент данных...отсюда и мои выводы

чтобы не было таких "непоняток", переменные надо называть bp и sp. smile
а память хорошая. даже слишком. мы уже давно живем в 32-битном мире. пытаемся даже на 64 переползти... smile

ps. даа... такое количество букв вредно как для физического здоровья пишущего, так и для психического - читающего. user posted image
pss. да... обижать никого не хотел, если вышло едковато, уж простите - сами такой импульс дали. user posted image
PM MAIL   Вверх
Damarus
Дата 11.8.2006, 07:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: 6
Всего: 29



Цитата(vinter @  10.8.2006,  19:20 Найти цитируемый пост)
можно узнать откуда такие сведения(для собственного просвещения)

vinter, а как Вы себе представляете применение операции взятия адреса (file.read((char*)&ch, 1);) к переменной, находящейся в регистре smile 


Это сообщение отредактировал(а) Damarus - 11.8.2006, 07:39
PM MAIL ICQ Jabber   Вверх
likehood
Дата 11.8.2006, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


Профиль
Группа: Участник
Сообщений: 536
Регистрация: 21.12.2005

Репутация: 8
Всего: 24



Цитата(vinter @  10.8.2006,  20:26 Найти цитируемый пост)
попробуйте посмотрите при отладке значение переменной...у меня оно ни разу не установилось в 10 при опред. без инициализации


Для такого кода
Код

void f() {
  int c;
  std::cout << c << "\n";
  c = 10;
}

int main() {
  f(); f(); f(); f(); f();
  return 0;
}

g++ выдал одно "левое" число и четыре десятки.


PM MAIL   Вверх
vinter
Дата 11.8.2006, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата

[off]мне никуда переходить не надо - так принято в сети.[/off]

OK 
Цитата

а как Вы себе представляете применение операции взятия адреса (file.read((char*)&ch, 1);) к переменной, находящейся в регистре

никак.. прочитал статью там так написано..
Цитата

итак, человек, который пытается доказывать "призрачные вероятности", используя при этом Debug версию, отправляет меня читать Как пережить release-версию!

а тебе прочитать тяжело было?? Там как раз и написано про оптимизацию!
Цитата

еловек, который пытается доказывать "призрачные вероятности", 

я как раз и доказывал отсутствие данной верятности!
Цитата

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

  smile 
dumb а вообще было бы просто замечательно если бы ты приводил бы еще какие нибудь факты к своим высказываниям..
Цитата

Для такого кода


void f() {    
  int c;    
  std::cout << c << "\n";    
  c = 10;    
}    
int main() {    
  f(); f(); f(); f(); f();    
  return 0;    
}    

g++ выдал одно "левое" число и четыре десятки.


Visual c++ 6.0,VS 2003 .NET и BC 3.1 все выдали постороннее значение smile 


--------------------
Мой блог
PM MAIL WWW   Вверх
Ignat
Дата 11.8.2006, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: 3
Всего: 73



Цитата(vinter @  11.8.2006,  10:45 Найти цитируемый пост)
все выдали постороннее значение

Но одно и тоже, исключая первое smile

Добавлено @ 10:06 
Во...

Код

C:\temp>cl test.cpp /EHsc

test.cpp
c:\temp\test.cpp(6) : warning C4700: local variable 'c' used without having been
 initialized

/out:test.exe
test.obj

C:\temp>test
1
1310640
1310640
1310640
1310640



--------------------
Теперь при чем :P
PM   Вверх
vinter
Дата 11.8.2006, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



у меня во всех случаях -858993460 при Debug  и 1 при Release 
с cout'ом в bc 3.1 так же как у baronp 


Это сообщение отредактировал(а) vinter - 11.8.2006, 10:44


--------------------
Мой блог
PM MAIL WWW   Вверх
dumb
Дата 11.8.2006, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 8
Всего: 158



vinter,
читать, то что пишут, надо, а не комментировать.
ты постоянно аппелируешь к результатам, которые тебе выдает debug версия проекта. а в той статье как-раз написано про проблемы, возникающие при переходе от дебага к релизу. одной из них и посвящен этот топик - неинициализированные переменные. тут читай внимательно: debug версия собирается с ключами, заставляющими компилятор генерировать код, заполняющий выделенное под переменные место определенными значениями. инициализирует он все переменные значением 0xCC, дабы проще было ловить оставленные без инициализации. в release версии нет этого кода! - в переменных содержится мусор, который остался от работы других переменных, адресов возврата, параметров функций итд - все, что помещается в стэк(мы говорим о локальных переменных)

твое -858993460 и есть 0xCCCCCCCC. собери уже наконец release версию любого из приведенных здесь исходников.

Добавлено @ 10:53 
пока писал, похоже, произошло чудо... smile
PM MAIL   Вверх
vinter
Дата 11.8.2006, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



dumb а сразу не мог аргументировать свои ответы...Всем спасибо что просветили  smile 


--------------------
Мой блог
PM MAIL WWW   Вверх
Dragon
Дата 11.8.2006, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 10.8.2006
Где: Киев

Репутация: нет
Всего: нет



Ну, вообще-то по стандарту использование неинициализированной переменной leads to undefined behavior. И это грубая ошибка. И даже если какой-то компилятор будет стабильно создавать ch в той же ячейке памяти, то все это делать определенно не будут - что сделает программу непортируемой и зависимой от типа/версии компилятора. 

Плюс, действительно некоторые компиляторы, вроде msvc действительно инициализируют все неинициализированные переменные 0 при Debug сборке smile Но расчитывать на это...


Это сообщение отредактировал(а) Dragon - 11.8.2006, 12:29
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.2194 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.