|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Сен 26, 2003 18:23:19 Тестировался - MS.NET 2002. Результаты различаются в Debug/Release версиях! Код:
#include <iostream>
void main(void)
{
char c[4];
c[0]='a';
c[1]='b';
c[2]='c';
c[3]='d';
std::cout << "before: " << c[0] << c[1] << c[2] << c[3] << std::endl;
for (int n=2 ; n>0; n--)
{
for (int i=0; i<3; i++)
{
c[i] = c[i+1];
}
c[3] = 'x';
}
std::cout << "after: " << c[0] << c[1] << c[2] << c[3] << std::endl;
return;
}
|
|
|
Дата: Сен 26, 2003 18:29:44 А насколько отличается? Он и должен отличаться. Насколько? Все от натстроек компилятора/линкера зависит. |
|
|
Дата: Сен 26, 2003 18:48:13 · Поправил: Black_mirror volodya Отличаются результаты работы программы? Или генерируемый код? |
|
|
Дата: Сен 26, 2003 18:54:45 volodya Это не баг, скорее ОПТИМИАЗТОР %))) Только что именно отличается? |
|
|
Дата: Сен 26, 2003 19:31:51 Это точно не баг компилятора. Это баг кода ;) Такое иногда бывает, что работает только Debug версия, попробуй увеличить размер массива с 4 до 5. Т.е. было: char c[4]; стало: char c[5]; хотя мона попробовать и так: char c[5] = {0}; Иногда помогает.......может быть :) |
|
|
Дата: Сен 26, 2003 21:56:11 · Поправил: Fixer masquer Он и должен отличаться. Это почему он должен отличаться. Тут не используется ничего такого что могло бы привести к такому дефекту. Я прогнал на VC++ 6.0 все нормально работает. Если это гадит оптимизатор можно применить модификатор volatile, но оч-ч-чень мало вероятно. Весьма возможно что это всего лишь кусок программы и тогда корни проблемы надо искать во всей остальной программе. |
|
|
Дата: Сен 26, 2003 22:01:20 · Поправил: Fixer Кладу код для пояснения природы глюка char sdf[5];
char c[4];
c[0]='a';
c[1]='b';
c[2]='c';
c[3]='d';
std::cout << "before: " << c[0] << c[1] << c[2] << c[3] << std::endl;
for (int n=2 ; n>0; n--)
{
for (int i=0; i<3; i++)
{
c[i] = c[i+1];
}
c[3] = 'x';
}
*(sdf-1) = 'f';
std::cout << "after: " << c[0] << c[1] << c[2] << c[3] << std::endl;
return;
|
|
|
Дата: Сен 27, 2003 01:34:07 Fixer Если честно, мне этот код мало что поясняет :( Для чего заводить еще массив? masquer Он никогда не должен различаться. Вывод строки на экран должен быть одним и тем же. В теории, мне плевать, что там компилятор наваял! Наплевать и растереть! To all Так кто-то может проверить это на своей VS? Я еще на 2003 на выходных проверю. Edmond Запусти да посмотри. У тебя же 2002/2003 точно есть :) В дебажной версии скомпили и в релизной. И посмотри. СТРОКА НА ЭКРАН ВЫВОДИТСЯ РАЗНАЯ :(((((( Может и в самом деле volitale... А уж ассемблерные листинги чего только стоят... Похоже и в самом деле оптимизатор перестарался, т.к. ошибки в логике цикла я не вижу, такие циклы часто можно встретить :((( |
|
|
Дата: Сен 27, 2003 04:06:46 Фишка в том, что оптимизатор (или кто-то еще) оператор c[3] = 'x';считает не влияющим на работу внутреннего цикла и переносит его в начало внешнего. (это видно в отладчике). решение проблемы для данного случая: c[i] = 'x';т.к. i = 3 после выполнения цикла. А в целом, нужно, наверное, более тщательно продумывать циклы. |
|
|
Дата: Сен 27, 2003 05:38:42 DaemoniacaL Баг не мой :) Я тоже придерживался такого же мнения - в первую очередь виноват человек, т.к. оптимизирующие компиляторы чертовски тщательно отлаживаются :) Fixer NEOx DaemoniacaL Спасибо, ребята :) |
|
|
Дата: Сен 27, 2003 06:06:10 Глазам своим не верю!!! Значит вижуал суксь, суксь и ещё раз суксь! Как же он вообще компилит серьёзные проекты?! И компилит же... Наверное уже можно открывать раздел по багам в компиляторах. |
|
|
Дата: Сен 27, 2003 08:47:00 Quantum Но! Баг не компилятора, а человека. Тот, кто это наваял, это пИсал, а не писАл :) |
|
|
Дата: Сен 27, 2003 09:11:17 · Поправил: Black_mirror volodya Это баг компилятора! У меня он проявился в программе примерно следующего вида: while((r=fread(buf,bufsize,1,fin))>0) { for(int i=0;i<r;i++) buf[i-1]+=buf[i]; fwrite(buf,r,1,fout); } В реальной программе буфер обрабатывался немного по другому, но переменная цикла изменялась именно так. VС либо операцию записи выносил за пределы цикла, либо выполнял всего одну итерацию внутреннего цикла. А вот BC31 компилировал все нормально. |
|
|
Дата: Сен 27, 2003 09:39:43 volodya А может просто отключить оптимизацию, определённого куска кода? Вывести код в отдельную функцию, и поставить прагмы Например: #pragma optimize("g", off) VOID MyFunction(VOID) { // Здесь твой код, который находится в main } #pragma optimize("g", on) |
|
|
Дата: Сен 27, 2003 09:54:21 Немного ошибся, вот так: #pragma optimize("", off) VOID MyFunction(VOID) { // Здесь твой код, который находится в main } #pragma optimize("", on) Это уже точно поможет. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.066 |