Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Тамика
Котовчанин
868 / 448 / 140
Регистрация: 16.02.2010
Сообщений: 2,821
Записей в блоге: 27
#1

Передача данных в функцию - C++

21.07.2014, 12:33. Просмотров 393. Ответов 16
Метки нет (Все метки)

Добрый день, форумчане!
Интересует следующий странно глупый вопрос...
Не могу понять! Вот никак.
Есть фукция:
C++
1
2
3
4
5
6
7
8
9
10
int solve(int count_of_digits)
{
        int start, end;
        if (count_of_digits == 2) { start = 10; end = 99; }
        if (count_of_digits == 3) { start = 100; end = 999; }
 
        // ... тут происходят разные события
 
        return max;
}
И есть ее вызов в мейне.
C++
1
2
3
4
5
6
7
8
9
10
int main()
{
        assert(solve(2) == 9009);
        auto  now = std::chrono::high_resolution_clock::now();
        auto answer = solve(3);
        auto elapsed = std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::high_resolution_clock::now() - now);
        std::cout << "Answer = " << answer << "\n";
        std::cout << "Time : " << elapsed.count() << "ns.\n";
        return 0;
}
Не пойму, почему при передаче значения в функцию, туда приходит мусор?
Если я изменю сигнутару solve на такую:
C++
1
int solve(const int& count_of_digits)
всё правильно передаёт.
Объясните, пожалуйста...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4876 / 3015 / 370
Регистрация: 10.11.2010
Сообщений: 11,075
Записей в блоге: 10
Завершенные тесты: 1
21.07.2014, 12:42     Передача данных в функцию #2
Какой "мусор"? Как выяснили что там мусор? Конкретный пример можно?
Тамика
Котовчанин
868 / 448 / 140
Регистрация: 16.02.2010
Сообщений: 2,821
Записей в блоге: 27
21.07.2014, 12:44  [ТС]     Передача данных в функцию #3
Пошагово отлаживала и смотрела значения переменных.
При первом запуске пришло 4323284, потом 2095280 и так далее.
Если нужно - могу скрин приложить.
castaway
Эксперт С++
4876 / 3015 / 370
Регистрация: 10.11.2010
Сообщений: 11,075
Записей в блоге: 10
Завершенные тесты: 1
21.07.2014, 12:47     Передача данных в функцию #4
А если между 2-й и 3-й строками вставить: std::cout << count_of_digits << std::endl;
И вызвать функцию с параметром 3, то что выведет программа?
Ilot
Модератор
Эксперт С++
1785 / 1160 / 225
Регистрация: 16.05.2013
Сообщений: 3,056
Записей в блоге: 5
Завершенные тесты: 1
21.07.2014, 12:48     Передача данных в функцию #5
Общее замечание - крайне нежелательно помещать пользовательский код в макрос assert. Попробуйте записать условие следующим образом:
C++
1
2
int temp = solve(2) ;
assert(temp == 9009);
Тамика
Котовчанин
868 / 448 / 140
Регистрация: 16.02.2010
Сообщений: 2,821
Записей в блоге: 27
21.07.2014, 12:52  [ТС]     Передача данных в функцию #6
Цитата Сообщение от castaway Посмотреть сообщение
А если между 2-й и 3-й строками вставить: std::cout << count_of_digits << std::endl;
И вызвать функцию с параметром 3, то что выведет программа?
Чёрт... Таки три выводит...
Компилятор ошибками плевался после ифчиков... Подумала, что проблема с этой переменной, так как при брейкпоинте показала кашу.
Спасибо!

Добавлено через 51 секунду
Цитата Сообщение от Ilot Посмотреть сообщение
Общее замечание - крайне нежелательно помещать пользовательский код в макрос assert. Попробуйте записать условие следующим образом:
Исправила.
А почему нежелательно?
Ilot
Модератор
Эксперт С++
1785 / 1160 / 225
Регистрация: 16.05.2013
Сообщений: 3,056
Записей в блоге: 5
Завершенные тесты: 1
21.07.2014, 12:59     Передача данных в функцию #7
Цитата Сообщение от Тамика Посмотреть сообщение
А почему нежелательно?
Во-первых, при релизе все ассерты как правило удаляются. Второе следствие первого удалится код и все результаты его работы и т.д. Другими словами ассерт не предназначет для программирования, а только лишь для проверки конкретных условий. Кто знает, что на самом деле может сделать вызов solve(2)...
Croessmah
Модератор
Эксперт CЭксперт С++
12877 / 7263 / 810
Регистрация: 27.09.2012
Сообщений: 17,940
Записей в блоге: 2
Завершенные тесты: 1
21.07.2014, 13:01     Передача данных в функцию #8
Цитата Сообщение от Тамика Посмотреть сообщение
А почему нежелательно?
Цитата Сообщение от Ilot Посмотреть сообщение
Во-первых, при релизе все ассерты как правило удаляются.
Для примера:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
//#define NDEBUG
#include <cassert>
 
int foo ()
{
    int x ;
    std::cin >> x ;
    return x ;
}
 
int main()
{
    std::cout << "begin\n" ;
    assert ( foo() != 5 ) ;
    std::cout << "end" << std::endl ;
}
Скомпилируй, запусти, проверь как работает. Потом "раскоментируй" строчку и повтори найди отличия в работе
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
21.07.2014, 13:04     Передача данных в функцию #9
Тамика, быть может, вы проект в Release дебажить пытаетесь? Похоже очень на вашу проблему
Ilot
Модератор
Эксперт С++
1785 / 1160 / 225
Регистрация: 16.05.2013
Сообщений: 3,056
Записей в блоге: 5
Завершенные тесты: 1
21.07.2014, 13:06     Передача данных в функцию #10
Цитата Сообщение от Croessmah Посмотреть сообщение
Скомпилируй, запусти, проверь как работает. Потом "раскоментируй" строчку и повтори найди отличия в работе
А в чем сакральный смысл?
Croessmah
21.07.2014, 13:07
  #11

Не по теме:

Цитата Сообщение от Ilot Посмотреть сообщение
А в чем сакральный смысл?
это не Вам Код просто как пояснение к "при релизе все ассерты как правило удаляются."

Ilot
21.07.2014, 13:09
  #12

Не по теме:

Croessmah, ну хорошо... а то я было подумал кошачий заговор

Croessmah
21.07.2014, 13:16
  #13

Не по теме:

Ilot, мыши взбунтовались Да, Гайчушка?

Ilot
Модератор
Эксперт С++
1785 / 1160 / 225
Регистрация: 16.05.2013
Сообщений: 3,056
Записей в блоге: 5
Завершенные тесты: 1
21.07.2014, 13:19     Передача данных в функцию #14
Тамика, небольшой пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#define NDEBUG
#include <cassert>
int foo (int& x) {
    x = 4;
    return x;
}
int main() {
    int x;
    assert ( foo(x) != 5 ) ;
    std::cout << x << std::endl ;
    return 0;
}
Операции те же, что указал Croessmah.
Тамика
Котовчанин
868 / 448 / 140
Регистрация: 16.02.2010
Сообщений: 2,821
Записей в блоге: 27
21.07.2014, 13:31  [ТС]     Передача данных в функцию #15
Цитата Сообщение от Ilot Посмотреть сообщение
Тамика, небольшой пример:
У меня он не компилируется ввиду неинициализации переменной х.

Добавлено через 3 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
Скомпилируй, запусти, проверь как работает. Потом "раскоментируй" строчку и повтори найди отличия в работе
В случае раскоментирования программа просто игнорирует ассерт. Даже если я введу пять.

Добавлено через 1 минуту
Цитата Сообщение от Ilot Посмотреть сообщение
Тамика, небольшой пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#define NDEBUG
#include <cassert>
 
int foo (int& x) {
    x = 4;
    return x;
}
int main() {
    int x;
    std::cin >> x;
    assert ( foo(x) != 5 ) ;
    std::cout << x << std::endl ;
    return 0;
}
Вот такой код игнорирует тоже ассерт... Ввожу пять - оно спокойно выводит мне её.
Ilot
Модератор
Эксперт С++
1785 / 1160 / 225
Регистрация: 16.05.2013
Сообщений: 3,056
Записей в блоге: 5
Завершенные тесты: 1
21.07.2014, 13:40     Передача данных в функцию #16
Цитата Сообщение от Тамика Посмотреть сообщение
У меня он не компилируется ввиду неинициализации переменной х.
Уверены? Скорее всего у вас студия и скорее всего у вас не отключены соответствующие варнинги...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.07.2014, 13:46     Передача данных в функцию
Еще ссылки по теме:

C++ Передача данных в функцию
C++ Передача массива в функцию
C++ Передача аргументов в функцию
C++ Не происходит передача данных в функцию
Передача указателя на функцию C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Тамика
Котовчанин
868 / 448 / 140
Регистрация: 16.02.2010
Сообщений: 2,821
Записей в блоге: 27
21.07.2014, 13:46  [ТС]     Передача данных в функцию #17
Цитата Сообщение от Ilot Посмотреть сообщение
Уверены? Скорее всего у вас студия и скорее всего у вас не отключены соответствующие варнинги...
Студия, да.
Запустила на линуксе - просто вывело ноль...
Yandex
Объявления
21.07.2014, 13:46     Передача данных в функцию
Ответ Создать тему
Опции темы

Текущее время: 23:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru