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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 33, средняя оценка - 4.70
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
09.01.2011, 14:28     Функция возвращающая массив #1
Здравствуйте. Для возврата массива возвращаю указатель на него, но вне предела области в которой он был создан память выделенная под массив используется программой, при этом состояние массива меняется, т.е. данные в нем меняются. Как передать массив так, что-бы данные в нем не терялись, что-бы сборщик мусора на него не действовал.
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 );
        }
    }
}
Суть кода - покрытие множества за минимальную цену.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Patch
2276 / 491 / 11
Регистрация: 01.04.2009
Сообщений: 2,178
09.01.2011, 14:33     Функция возвращающая массив #2
C++
1
int * was = new int[n];
так выделяется память в глобальном пуле.
обнуление массива очень желательно делать.
и удалять выделенную память, после прекращения использования.
последней строкой программы:
C++
1
delete res;
reich
 Аватар для 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 );
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
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 сделать? Или выделение памяти будет не в куче?
reich
 Аватар для reich
110 / 46 / 3
Регистрация: 03.09.2009
Сообщений: 112
09.01.2011, 15:03     Функция возвращающая массив #5
Цитата Сообщение от outoftime Посмотреть сообщение
reich, ваш совет неуместный.
вопросы научись задавать
Patch
2276 / 491 / 11
Регистрация: 01.04.2009
Сообщений: 2,178
09.01.2011, 15:04     Функция возвращающая массив #6
Цитата Сообщение от outoftime Посмотреть сообщение
можно как-то через calloc и free сделать?
можно.
new можно считать эквивалентом оператора malloc.
new/delete - операторы языка "С++", malloc/realloc/calloc/free - аналогичные операторы языка "С".
в программе на "С++" все операторы "С" работают.

а для чистого "С" уже лет 10 и компиляторов не выпускают.
Yandex
Объявления
09.01.2011, 15:04     Функция возвращающая массив
Ответ Создать тему
Опции темы

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