Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Прошу помочь с компилятором c++  (Прочитано 774 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн MatiZzz

  • Автор темы
  • Новичок
  • *
  • Сообщений: 8
    • Просмотр профиля
Доброй ночи.
Работаю под ubuntu 16.04 в IDE NetBeans компилятор g++
Имею следующий код:

(Нажмите, чтобы показать/скрыть)

И вот такой вывод в  консоль:
(Нажмите, чтобы показать/скрыть)
       

Подскажите, пожалуйста, почему я не вижу свои double f1 = 0.1, f2 = 0.2, f3 = 0.3, f4 = 0.4, f5 = 0.5; ??
P.S. на винде вижу, если выбрать компиляцию в 64 бит.
Пробовал применять g++ с флагом -m32 и -m64. желанные числа всё равно не вижу.

Оффлайн Peter_I

  • Старожил
  • *
  • Сообщений: 3037
    • Просмотр профиля
Re: Прошу помочь с компилятором c++
« Ответ #1 : 28 Мая 2017, 11:17:26 »
Потому что это в принципе неправильный код.
Во-перых, если функция может принимать переменное количество параметров,
её надо использовать с помощью va_arg(), man va_arg.
Во-вторых, простые переменные в качестве аргументов передаются в функцию по значению, а не по адресу
и вы должны это знать. Поэтому в вашей функции mult() адрес аргумента k - это не адрес переменной f1 в main,
это адрес участка памяти, куда компилятор поместил копию аргумента. Поэтому наращивать этот адрес для
извлечения следующих аргументов бессмыссленно, это ничего не гарантирует.
Делайте как положено и всё будет работать везде.


Пётр.

Оффлайн MatiZzz

  • Автор темы
  • Новичок
  • *
  • Сообщений: 8
    • Просмотр профиля
Re: Прошу помочь с компилятором c++
« Ответ #2 : 28 Мая 2017, 17:02:58 »
Пётр, большое спасибо за ответ.
Я делаю контрольную работу (учусь заочно, поэтому получить помощь на форумах проще чем от преподавателя). Позвольте привести выдержку из методички:
(Нажмите, чтобы показать/скрыть)
Цитировать
адрес аргумента k - это не адрес переменной f1 в main,
это адрес участка памяти, куда компилятор поместил копию аргумента.

как я понял, это как раз то что мне и нужно. Компилятор должен размещать копии аргументов в памяти последовательно. А я должен получать значения из памяти инкрементируя указатель, который содержит адрес. Под win 10 это работает, если выбрать компиляцию в 64 бит.

Пожалуйста, объясните, где я допускаю ошибку.


« Последнее редактирование: 28 Мая 2017, 17:06:34 от MatiZzz »

Оффлайн Peter_I

  • Старожил
  • *
  • Сообщений: 3037
    • Просмотр профиля
Re: Прошу помочь с компилятором c++
« Ответ #3 : 28 Мая 2017, 17:40:17 »
Меня не интересует методичка, читайте лучше учебник по C, желательно постарее или же переиздания.
Где ошибка, я уже сказал. Вы же сами видите, что результат неверный, но продолжаете рассуждать по-прежнему.
И вообще стек растёт вниз.

Пользователь добавил сообщение 28 Мая 2017, 23:48:17:
И ещё одно: если у вас нет задачи сделать функцию с переменным числом аргументов,
то передавайте количество аргументов и адрес 1-го аргумента, если все они в вызывающей
процедуре идут подряд,а лучше сведите их в массив.
« Последнее редактирование: 28 Мая 2017, 23:48:17 от Peter_I »
Пётр.

 

Страница сгенерирована за 0.048 секунд. Запросов: 25.