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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 33, средняя оценка - 4.70
outoftime
║XLR8║
511 / 433 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
#1

Функция возвращающая массив - C++

09.01.2011, 14:28. Просмотров 4250. Ответов 5
Метки нет (Все метки)

Здравствуйте. Для возврата массива возвращаю указатель на него, но вне предела области в которой он был создан память выделенная под массив используется программой, при этом состояние массива меняется, т.е. данные в нем меняются. Как передать массив так, что-бы данные в нем не терялись, что-бы сборщик мусора на него не действовал.
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <iostream>
 
namespace lab1 {
 
const int n = 7,
    m = 9,
    a[ n ][ m ] = {
        {0, 0, 3, 0, 5, 0, 0, 0, 9},
        {0, 2, 3, 0, 5, 6, 0, 0, 0},
        {0, 2, 3, 4, 0, 0, 0, 0, 9},
        {1, 0, 0, 4, 5, 0, 0, 8, 9},
        {0, 0, 0, 0, 5, 6, 0, 8, 0},
        {1, 2, 0, 4, 0, 6, 0, 0, 0},
        {1, 0, 0, 0, 0, 0, 7, 8, 0} }, 
    p[ n ] = {1, 3, 2, 3, 1, 2, 2};
 
int check( int fill[] ) {
    for( int i = 0; i < m; ++i ) {
        if( !fill[ i ] ) return 0;
    }
    return 1;
}
 
int * cost() {
    int was[ n ] = {0},
        fill[ m ] = {0};
    while( !lab1::check( fill ) ) {
        int index = 0;
        double max = 0.0;
        for( int i = 0; i < n; ++i ) {
            if( was[ i ] ) continue;
            int sum = 0;
            for( int j = 0; j < m; ++j ) {
                sum += !fill[ j ] && a[ i ][ j ];
            }
            if( max < sum / p[ i ] ) {
                index = i;
                max = sum * 1.0 / p[ i ];
            }
        }
        was[ index ] = 1;
        for( int i = 0; i < m; ++i ) {
            fill[ i ] = !fill[ i ] ? a[ index ][ i ] : fill[ i ];
        }
    }
    return was;
}
 
};
 
int main() {
    int *res = lab1::cost();
    for( int i = 0; i < lab1::n; ++i ) {
        if( res[ i ] ) {
            printf("%c\n", 'A' + i );
        }
    }
}
Суть кода - покрытие множества за минимальную цену.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.01.2011, 14:28
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Функция возвращающая массив (C++):

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

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

Функция возвращающая массив - C++
#include &lt;iostream&gt; #include &quot;conio.h&quot; int *convertToBin() { int a = { 1, 2, 3, 4, 5}; return a; } int...

Функция, возвращающая массив - C++
Возможно ли что функция возвращает массив. Если да то было бы хорошо листинг программы где выполняется такая реализация Спасибо!

Функция, возвращающая массив - C++
Нужно вернуть из функции массив. int F(int a,int* b) { for(int i=0;i&lt;a;i++) *b++; for(int i=0;i&lt;3;i++) printf(&quot;%d\n&quot;, b); ...

Функция, возвращающая указатель на двумерный массив - C++
Добрый день! Столкнулся с конструкцией которую раньше не видел, и не до конца понимаю что это и как работает: #include &lt;stdio.h&gt; ...

5
Patch
2277 / 492 / 11
Регистрация: 01.04.2009
Сообщений: 2,178
09.01.2011, 14:33 #2
C++
1
int * was = new int[n];
так выделяется память в глобальном пуле.
обнуление массива очень желательно делать.
и удалять выделенную память, после прекращения использования.
последней строкой программы:
C++
1
delete res;
1
reich
110 / 46 / 3
Регистрация: 03.09.2009
Сообщений: 112
09.01.2011, 14:41 #3
Нужно передавать указатель на матрицу в функцию cost()
получится так:
C++
1
2
3
4
5
6
7
8
9
int** cost( int **a ){
    /*...*/
    return a;
}
int main(void){
    const int m = 9, n = 7;
    int a[n][m];
    a = lab1::cost( a );
}
Добавлено через 2 минуты
ну или использовать указатель на указатель на указатель.
int a[n][m];
lab1::cost( &a );
0
outoftime
║XLR8║
511 / 433 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
09.01.2011, 14:51  [ТС] #4
reich, ваш совет неуместный.
Patch, переписал по вашему совету
C++
1
2
3
    int *was = new int[ n ],
        fill[ m ] = {0};
    memset( was, 0, n * sizeof( int ) );
Все работает. Правильность еще не проверял, а так все нормально. Только неудобно как-то получается создавать обнуленный массив, можно как-то через calloc и free сделать? Или выделение памяти будет не в куче?
0
reich
110 / 46 / 3
Регистрация: 03.09.2009
Сообщений: 112
09.01.2011, 15:03 #5
Цитата Сообщение от outoftime Посмотреть сообщение
reich, ваш совет неуместный.
вопросы научись задавать
0
Patch
2277 / 492 / 11
Регистрация: 01.04.2009
Сообщений: 2,178
09.01.2011, 15:04 #6
Цитата Сообщение от outoftime Посмотреть сообщение
можно как-то через calloc и free сделать?
можно.
new можно считать эквивалентом оператора malloc.
new/delete - операторы языка "С++", malloc/realloc/calloc/free - аналогичные операторы языка "С".
в программе на "С++" все операторы "С" работают.

а для чистого "С" уже лет 10 и компиляторов не выпускают.
1
09.01.2011, 15:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.01.2011, 15:04
Привет! Вот еще темы с ответами:

Шаблонная функция возвращающая созданный динамический массив - C++
Здравствуйте! Нужна Ваша помощь! Нужна шаблонная функция которая возвращает созданный динамический массив, который на 2...

Функция возвращающая позицию первого вхождения числа в массив - C++
Задача: Написать функцию, которая получает в качестве параметров адрес числового массива данных, его размер и число. Функция...

Функция возвращающая позицию первого вхождения числа в массив - C++
Вот задача: Написать функцию, которая получает в качестве параметров адрес числового массива данных, его размер и число. Функция...

Функция возвращающая константу - C++
Почему добавление спецификатора const ничего не меняет? const int f(int a) { return a; } int main(int argc, char *argv)...


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

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

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