Ошибка при программировании на языке С++.

Аватар пользователя
Potapych
Сообщений: 10
Зарегистрирован: 04 мар 2014, 21:00

Ошибка при программировании на языке С++.

Сообщение Potapych » 14 мар 2014, 12:22

balans писал(а):Source of the post
На сколько я понимаю, не инициализированная величина автоматически приравнивается нулю.


Как минимум не локальная переменная.
Последний раз редактировалось Potapych 27 ноя 2019, 21:27, всего редактировалось 1 раз.
Причина: test

balans
Сообщений: 2030
Зарегистрирован: 29 дек 2012, 21:00

Ошибка при программировании на языке С++.

Сообщение balans » 14 мар 2014, 18:25

Здравия Вам желаю.
zam2 писал(а):Source of the post
Подозреваю, что это из-за разного числа выполненных итераций.


NT писал(а):Source of the post
И не удивительно.
Поставьте инициaлизацию для int i и будет вам счастье.


Вот отфортраненная версия тела программы.

Код: Выбрать все

       1  do
        z=(1+a)/k1-a
       sk = z-sqrt(z*z-1)
       t=sn/sk
       a=0.5*((t+1/t)*k2-2)/(1-k2)
       i=i+1
       if (i<30) then       go to 1       end if        if (i>30) then
       print*,'параметр, a
       print*,'критическое скольжение', sk
       stop
       end if
       end do

Вроде бы число итерации одинаковое и в обоих вариантах инициировал i=0, а результат вычислении разный.
Последний раз редактировалось balans 27 ноя 2019, 21:27, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
NT
Сообщений: 3384
Зарегистрирован: 25 янв 2010, 21:00

Ошибка при программировании на языке С++.

Сообщение NT » 14 мар 2014, 20:13

balans писал(а):Source of the post

Код: Выбрать все

...
 i=i+1
if (i<30) then
go to 1
end if
if (i>30) then
print*,'параметр, a
...

Вроде бы число итерации одинаковое и в обоих вариантах инициировал i=0, а результат вычислении разный.

Я плохо знаю Fortran.
Подскажите, как же вы умудряетесь печатать результат?
Ведь, после выхода из цикла - i равно 30,
а печатать указано - если i больше 30.

Upd. Да еще, было бы интересно узнать, как задекларировали переменные в Fortrane.

Uupd. Всё это, если вам действительно интересно узнать - в чем причины разных результатов.
Последний раз редактировалось NT 27 ноя 2019, 21:27, всего редактировалось 1 раз.
Причина: test

balans
Сообщений: 2030
Зарегистрирован: 29 дек 2012, 21:00

Ошибка при программировании на языке С++.

Сообщение balans » 15 мар 2014, 03:21

Здравия Вам желаю.
NT писал(а):Source of the post
Подскажите, как же вы умудряетесь печатать результат?
Ведь, после выхода из цикла - i равно 30,
а печатать указано - если i больше 30.

Спасибо Вам N T, теперь мне ясно, и я изменил последнее условие добавив знак "="

Код: Выбрать все

if (i>=30) then
 print*, a
 print*, sk
 stop
 end if

Результаты вычислений совпадают.
Последний раз редактировалось balans 27 ноя 2019, 21:27, всего редактировалось 1 раз.
Причина: test

folk
Сообщений: 4177
Зарегистрирован: 11 сен 2009, 21:00

Ошибка при программировании на языке С++.

Сообщение folk » 15 мар 2014, 10:25

На сколько я понимаю, не инициализированная величина автоматически приравнивается нулю.

На это нельзя полагаться. Считайте что значение неинциализированной переменной может быть любым.
Переменная может быть расположена в регистре, на стеке, в памяти, в пуле, в области констант, в кодовом сегменте. В некоторых случаях механизм автоматического приравнивания нулю существует - например загрузчик в паре с операционной системой может прописать область памяти в нули при загрузке программы. Но не во всех операционках это гарантируется (хотя вроде как должно). Не говоря уже про стек и регистры.

Если конкретней то переменные вроде
static int i = 0x64;
Помещаются компилятором в сегмент данных .data который лежит в исполняемем файле. При загрузке программы этот сегмент кладется одним куском в памть из выполняемого файла (один раз). И далее в исполняемом коде проставляются правильные адреса в те места где используется наша переменная. (Это если мы не используем оверлеи)
Переменные вроде
static int i;
Кладутся в сегмент .bss который в исполняемом файле не имеет места быть - только сказано какая у него длина. Загрузчик просит у ОС кусок памяти необходимого размера и также настраивает ссылки. И вроде как ОС обязуется прописать туда нули. Но не все это делают.
Особо интересно все происходит если ваша переменная часть кода динамической библиотеки - тогда она (библиотека) может быть одна на несколько копий приложения. Опять же забота компилятора и загрузчика разместить ее в таком сегменте который либо копируется для каждой программы либо один для библиотеки - все сильно усложняется при этом)
Последний раз редактировалось folk 27 ноя 2019, 21:27, всего редактировалось 1 раз.
Причина: test


Вернуться в «Computer Science»

Кто сейчас на форуме

Количество пользователей, которые сейчас просматривают этот форум: нет зарегистрированных пользователей и 0 гостей