Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 21.12.2013
Сообщений: 49
1

Возврат массива из функции

02.01.2015, 17:30. Просмотров 1580. Ответов 10
Метки нет (Все метки)

Программа должна переводить числа с 10 системы в двоичную... но почемуто выводит некорректно... Вот код...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
 
using namespace std;
 
int* calc_m(int a)
{
    int n = a;
    int arr[8];
 
    for(int i = 0; i < 8; i++)
        arr[i] = 0;
    
    int j = 8;
 
    while(n != 0)
    {
        arr[--j] = a % 2;
        n /= 2;
        a = n;
    }
 
 
    return arr;
}
 
void main()
{
    cout << "Enter number: ";
    int nam;
 
    cin >> nam;
 
    int* arr1;
 
    arr1 = calc_m(nam);
    
    cout << arr1;
 
    system("pause >> void");
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.01.2015, 17:30
Ответы с готовыми решениями:

Возврат массива из функции
Здравствуйте. Не могу разобраться, почему при передачи массива из функции но не правильно...

Возврат массива из функции
В объекте есть массив int state;, который мне нужно из него вытащить. Вижуал показывал ошибку,...

Возврат массива из функции
Здравствуйте, Не пойму почему не работает данный код. Пишет cannot convert 'std::string*' to...

Возврат массива из функции
Здравствуйте! Нужно решить задачу, но для её решения я не могу понять как правильно вывести...

10
Эксперт С++
7941 / 3649 / 781
Регистрация: 15.11.2014
Сообщений: 8,305
02.01.2015, 17:34 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
using namespace std;
 
int* calc_m(int a)
{
    int n = a;
    static int arr[8];   //<---- здесь я добавил ключевое слово static 
 
    for(int i = 0; i < 8; i++)
        arr[i] = 0;
    
    int j = 8;
 
    while(n != 0)
    {
        arr[--j] = a % 2;
        n /= 2;
        a = n;
    }
 
 
    return arr;
}
 
int main()   //<---- возвращает int, а не void. 
{           //void - не стандартное расширения компиляторов visual studio
 
    cout << "Enter number: ";
    int nam;
 
    cin >> nam;
 
    int* arr1;
 
    arr1 = calc_m(nam);
    
    cout << arr1;
 
    system("pause >> void");
}
0
305 / 278 / 200
Регистрация: 21.02.2013
Сообщений: 667
02.01.2015, 17:41 3
потому что массив который ты возвращаешь стирается после выполнения функции, тут динамически надо память выделять
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
 
using namespace std;
 
int* calc_m(int a)
{
    int n = a;
    int *arr = new int[8];
 
    for(int i = 0; i < 8; i++)
        arr[i] = 0;
 
    int j = 8;
 
    while(n != 0)
    {
        arr[--j] = a % 2;
        n /= 2;
        a = n;
    }
 
 
    return arr;
}
 
int main()
{
    cout << "Enter number: ";
    int nam;
 
    cin >> nam;
 
    int* arr1;
 
    arr1 = calc_m(nam);
 
    for(int i = 0; i < 8; i++)
       cout<< arr1[i] ;
 
    delete[] arr1;
}
и как ты на экран таким способом cout << arr1; хотел вывести массив интов?
0
0 / 0 / 0
Регистрация: 21.12.2013
Сообщений: 49
02.01.2015, 17:57  [ТС] 4
Спасибо)
0
2530 / 1190 / 357
Регистрация: 30.11.2013
Сообщений: 3,817
02.01.2015, 19:45 5
Цитата Сообщение от hoggy Посмотреть сообщение
r
1) Нельзя так выносить адресс локальной переменной - пусть она и статическая. Через 5 минут он перевёдет 17 в двоичную и теперь первый указатель уже ссылается не на то значение.
2) Код с UB. Согласно стандарта языка - оператор delete может быть применён только к памяти которая выделеная через оператор new. Во всех других случаях UB.

P.S. не люблю когда умничают - но не могу оставить ваш код без внимания. ТС'y уже не важно - он "решил проблему", а вам +1 экспирионсу на тему "new-delete C++11"
0
Эксперт С++
7941 / 3649 / 781
Регистрация: 15.11.2014
Сообщений: 8,305
02.01.2015, 19:50 6
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Нельзя так выносить адресс локальной переменной - пусть она и статическая.
Вам стоит подучить язык с++, разделы "статический класс памяти", "локальная статическая переменная"

Добавлено через 1 минуту
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Код с UB. Согласно стандарта языка - оператор delete может быть применён
я не использовал операцию delete

Добавлено через 2 минуты
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
а вам +1 экспирионсу на тему "new-delete C++11"
1. Вам стоит быть повнимательнее. Для начала найти в моем коде хоть какие то упоминания об new/delete

2. Положения с++11 касательно new/delete остались неизменными с предыдущего стандарта.
Поэтому, аппелировать к с++11 избыточно, достаточно просто к с++.
0
2530 / 1190 / 357
Регистрация: 30.11.2013
Сообщений: 3,817
02.01.2015, 19:59 7
Не буду спорить ....... .
C++
1
2
3
4
static int arr[8];   
 
    for (int i = 0; i < 8; i++)
        arr[i] = 0;
1) обнуление static переменной - когда оно и так 0.
C++
1
2
static int arr[8];   
    return arr;
2) возращения указателя на локальную статическую переменную
3) при работе вашей программы выводит адресс, а не битовое представления числа
4) использовать указатель на ответ, который находится в функции и при повторном вызове с другим значениям изменит результат первого.

Возврат массива из функции
0
2530 / 1190 / 357
Регистрация: 30.11.2013
Сообщений: 3,817
02.01.2015, 20:05 8
5) и то, что при
C++
1
int* ptr = f(18);
надо знать об реализации метода, а иначе не-не и напишет кто-то
C++
1
delete ptr;
0
12138 / 6641 / 1603
Регистрация: 30.01.2014
Сообщений: 10,874
02.01.2015, 20:10 9
rikimaru2013, вот ты его критикуешь, но я тебя уверяю, он знает про все недостатки решения со static. Если уж собрался критиковать, то критикуй с предложением лучшего решения, а не просто так.
Например можно объяснить ТСу почему в C++ нельзя возвращать массивы по значению и как обойти это ограничение. Вот, например, так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
std::array<int, 8> calc_m(int a)
{
    int n = a;
    std::array<int, 8> arr = {};
     
    int j = 8;
 
    while(n != 0)
    {
        arr[--j] = a % 2;
        n /= 2;
        a = n;
    }
    return arr;
}
Давайте уж спорить аргументированно.
0
2530 / 1190 / 357
Регистрация: 30.11.2013
Сообщений: 3,817
02.01.2015, 20:28 10
C++
1
2
3
4
5
6
7
8
#include <iostream>
#include <bitset>
using namespace std;
#define INT_BITS 32
int main()  
{   
    cout << std::bitset<INT_BITS>(2928518);
}
0
Эксперт С++
7941 / 3649 / 781
Регистрация: 15.11.2014
Сообщений: 8,305
02.01.2015, 20:50 11
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Не буду спорить ....... .
Ваша критика - это критика решения из нуль-поста.
Вы осознаете это?

Не нужно мне объяснять, что решение ТС - не идеальное.
Объясняйте это ТС.

ТС не спрашивал: "как сделать правильно".
ТС интересуется что не так с тем кодом, что он привел в сабже.

Поэтому, я не ставил перед собой цель создать "правильную-альтернативу".
Лишь слегка поправил оригинальный код, что бы он просто заработал.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.01.2015, 20:50

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Возврат массива из функции
Есть задача: используя функции, вычислить количество элементов заранее введённых массивов, которые...

возврат динамического массива из функции
Всем привет, вот часть кода функцииchar *result=new char; int ind=0; int number=0; ...

Возврат созданного в функции массива
Верна ли следующая конструкция? void LoadArray(float* array, int &amp; count) { int fcount =...

Возврат двумерного массива из функции
При попытке возврата массива из функции выскакивает ошибка &quot;cannot convert ‘double (*)’ to ‘double’...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

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