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

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

Восстановить пароль Регистрация
 
Тамика
Котовчанин
 Аватар для Тамика
859 / 439 / 129
Регистрация: 16.02.2010
Сообщений: 2,537
Записей в блоге: 27
21.07.2014, 12:33     Передача данных в функцию #1
Добрый день, форумчане!
Интересует следующий странно глупый вопрос...
Не могу понять! Вот никак.
Есть фукция:
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)
всё правильно передаёт.
Объясните, пожалуйста...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.07.2014, 12:33     Передача данных в функцию
Посмотрите здесь:

передача в функцию C++
Передача двухмерного массива из функцию в функцию C++
передача параметра в функцию C++
C++ Передача в функцию
C++ Передача данных в функцию
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4837 / 2976 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
21.07.2014, 12:42     Передача данных в функцию #2
Какой "мусор"? Как выяснили что там мусор? Конкретный пример можно?
Тамика
Котовчанин
 Аватар для Тамика
859 / 439 / 129
Регистрация: 16.02.2010
Сообщений: 2,537
Записей в блоге: 27
21.07.2014, 12:44  [ТС]     Передача данных в функцию #3
Пошагово отлаживала и смотрела значения переменных.
При первом запуске пришло 4323284, потом 2095280 и так далее.
Если нужно - могу скрин приложить.
castaway
Эксперт С++
4837 / 2976 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
21.07.2014, 12:47     Передача данных в функцию #4
А если между 2-й и 3-й строками вставить: std::cout << count_of_digits << std::endl;
И вызвать функцию с параметром 3, то что выведет программа?
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
21.07.2014, 12:48     Передача данных в функцию #5
Общее замечание - крайне нежелательно помещать пользовательский код в макрос assert. Попробуйте записать условие следующим образом:
C++
1
2
int temp = solve(2) ;
assert(temp == 9009);
Тамика
Котовчанин
 Аватар для Тамика
859 / 439 / 129
Регистрация: 16.02.2010
Сообщений: 2,537
Записей в блоге: 27
21.07.2014, 12:52  [ТС]     Передача данных в функцию #6
Цитата Сообщение от castaway Посмотреть сообщение
А если между 2-й и 3-й строками вставить: std::cout << count_of_digits << std::endl;
И вызвать функцию с параметром 3, то что выведет программа?
Чёрт... Таки три выводит...
Компилятор ошибками плевался после ифчиков... Подумала, что проблема с этой переменной, так как при брейкпоинте показала кашу.
Спасибо!

Добавлено через 51 секунду
Цитата Сообщение от Ilot Посмотреть сообщение
Общее замечание - крайне нежелательно помещать пользовательский код в макрос assert. Попробуйте записать условие следующим образом:
Исправила.
А почему нежелательно?
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
21.07.2014, 12:59     Передача данных в функцию #7
Цитата Сообщение от Тамика Посмотреть сообщение
А почему нежелательно?
Во-первых, при релизе все ассерты как правило удаляются. Второе следствие первого удалится код и все результаты его работы и т.д. Другими словами ассерт не предназначет для программирования, а только лишь для проверки конкретных условий. Кто знает, что на самом деле может сделать вызов solve(2)...
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11800 / 6779 / 765
Регистрация: 27.09.2012
Сообщений: 16,829
Записей в блоге: 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
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 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
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 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.
Тамика
Котовчанин
 Аватар для Тамика
859 / 439 / 129
Регистрация: 16.02.2010
Сообщений: 2,537
Записей в блоге: 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
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 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++ Передача объекта в функцию или функцию друга

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

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

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