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

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

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

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

21.07.2014, 12:33. Просмотров 403. Ответов 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)
всё правильно передаёт.
Объясните, пожалуйста...
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.07.2014, 12:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Передача данных в функцию (C++):

Передача данных в функцию - C++
Подскажите пожалуйста, передаю в функцию набор значений, и пытаюсь производить с ними действия: void poly(const int N, const double...

Передача данных в функцию - C++
как лучше передавать примитивные типы данных в функцию по ссылке или по значению? В учебниках обычно пишут, что по ссылке. На практике...

Не происходит передача данных в функцию - C++
Не пойму что не так Надо что бы из функции interval брались 2 переменные, что я не так написал? Забираю переменные ниже строки cout &lt;&lt;...

Передача массива в функцию используя указатель на функцию - C++
У меня имеется готовая программа без передачи функции в функцию указателем, мне нужно передать функцию ввода масива в функцию его обработки...

Передача объекта в функцию или функцию друга - C++
Здравствуйте, уважаемые программисты :) К примеру есть такой код. #include &lt;iostream&gt; using namespace std; class My_Class1 { ...

Передача указателя на шаблонную функцию в другую функцию - C++
Пишу тест для нескольких улучшений квиксорта с измерением времени. Функция benchmark принимает итераторы для диапазона элементов, указатель...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
21.07.2014, 12:42 #2
Какой "мусор"? Как выяснили что там мусор? Конкретный пример можно?
0
Тамика
Котовчанин
870 / 450 / 143
Регистрация: 16.02.2010
Сообщений: 2,978
Записей в блоге: 27
21.07.2014, 12:44  [ТС] #3
Пошагово отлаживала и смотрела значения переменных.
При первом запуске пришло 4323284, потом 2095280 и так далее.
Если нужно - могу скрин приложить.
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
21.07.2014, 12:47 #4
А если между 2-й и 3-й строками вставить: std::cout << count_of_digits << std::endl;
И вызвать функцию с параметром 3, то что выведет программа?
1
Ilot
Модератор
Эксперт С++
1811 / 1168 / 229
Регистрация: 16.05.2013
Сообщений: 3,082
Записей в блоге: 5
Завершенные тесты: 1
21.07.2014, 12:48 #5
Общее замечание - крайне нежелательно помещать пользовательский код в макрос assert. Попробуйте записать условие следующим образом:
C++
1
2
int temp = solve(2) ;
assert(temp == 9009);
1
Тамика
Котовчанин
870 / 450 / 143
Регистрация: 16.02.2010
Сообщений: 2,978
Записей в блоге: 27
21.07.2014, 12:52  [ТС] #6
Цитата Сообщение от castaway Посмотреть сообщение
А если между 2-й и 3-й строками вставить: std::cout << count_of_digits << std::endl;
И вызвать функцию с параметром 3, то что выведет программа?
Чёрт... Таки три выводит...
Компилятор ошибками плевался после ифчиков... Подумала, что проблема с этой переменной, так как при брейкпоинте показала кашу.
Спасибо!

Добавлено через 51 секунду
Цитата Сообщение от Ilot Посмотреть сообщение
Общее замечание - крайне нежелательно помещать пользовательский код в макрос assert. Попробуйте записать условие следующим образом:
Исправила.
А почему нежелательно?
0
Ilot
Модератор
Эксперт С++
1811 / 1168 / 229
Регистрация: 16.05.2013
Сообщений: 3,082
Записей в блоге: 5
Завершенные тесты: 1
21.07.2014, 12:59 #7
Цитата Сообщение от Тамика Посмотреть сообщение
А почему нежелательно?
Во-первых, при релизе все ассерты как правило удаляются. Второе следствие первого удалится код и все результаты его работы и т.д. Другими словами ассерт не предназначет для программирования, а только лишь для проверки конкретных условий. Кто знает, что на самом деле может сделать вызов solve(2)...
1
Croessmah
Эксперт CЭксперт С++
13214 / 7485 / 842
Регистрация: 27.09.2012
Сообщений: 18,402
Записей в блоге: 3
Завершенные тесты: 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 ;
}
Скомпилируй, запусти, проверь как работает. Потом "раскоментируй" строчку и повтори найди отличия в работе
0
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
21.07.2014, 13:04 #9
Тамика, быть может, вы проект в Release дебажить пытаетесь? Похоже очень на вашу проблему
0
Ilot
Модератор
Эксперт С++
1811 / 1168 / 229
Регистрация: 16.05.2013
Сообщений: 3,082
Записей в блоге: 5
Завершенные тесты: 1
21.07.2014, 13:06 #10
Цитата Сообщение от Croessmah Посмотреть сообщение
Скомпилируй, запусти, проверь как работает. Потом "раскоментируй" строчку и повтори найди отличия в работе
А в чем сакральный смысл?
0
Croessmah
21.07.2014, 13:07
  #11

Не по теме:

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

0
Ilot
21.07.2014, 13:09
  #12

Не по теме:

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

0
Croessmah
21.07.2014, 13:16
  #13

Не по теме:

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

0
Ilot
Модератор
Эксперт С++
1811 / 1168 / 229
Регистрация: 16.05.2013
Сообщений: 3,082
Записей в блоге: 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.
1
Тамика
Котовчанин
870 / 450 / 143
Регистрация: 16.02.2010
Сообщений: 2,978
Записей в блоге: 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;
}
Вот такой код игнорирует тоже ассерт... Ввожу пять - оно спокойно выводит мне её.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.07.2014, 13:31
Привет! Вот еще темы с ответами:

Передача двухмерного массива из функцию в функцию - C++
Допустим у меня есть функция, в которой &quot;генерируется&quot; массив. Но нужно его передать в другую функцию, которая его выведет на экран. ...

Передача в функцию - C++
вот есть такие строки кода: typedef vector&lt; vector&lt;char&gt; &gt; string_sound; void sound_func(string_sound &amp;text_sound, int sum_words)...

Передача в функцию - C++
компилятор ругается на int sumcolumn (int **a, int n) sumcolumn(a,m) почему не могу передать массив i*1, таким образом? ...

Передача массива в функцию - C++
Кто может объяснить как передать элемент структуры в функцию? допустим, я объявил структуру: struct one{ int nom; int mass; ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
21.07.2014, 13:31
Ответ Создать тему
Опции темы

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