powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / C++ [игнор отключен] [закрыт для гостей] / Си. Освободить память 2-мерного сторкового массива
25 сообщений из 308, страница 4 из 13
Си. Освободить память 2-мерного сторкового массива
    #40129889
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T
Уткъ
Добавил проверку выделилась ли память при аллокации, надеюсь верно написал:



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
	char*** stroka = (char***)malloc(K*sizeof(char**));
    if (NULL == stroka) {printf("Memory does not given.\n");return 1;}
for(x=0;x<K;x++)
{
	//выделение памяти для 2-мерного массива
    stroka[x] = (char**)malloc(M*sizeof(char*));
	if (NULL == stroka[x]) {printf("Memory does not given.\n");return 1;}
    for(i=0;i<M;i++)
    {
		//выделение памяти для 1-мерного массива
        stroka[x][i] = (char*)malloc(N*sizeof(char));
		if (NULL == stroka[x][i]) {printf("Memory does not given.\n");return 1;}
    }


}


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


Это у меня в main выполняется, я думал что return 1; в main завершает работу приложения, протестирую.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129890
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T

Я так подозреваю это был пример работы с либой libpq на С. Я так понял это либа для работы из С напрямую с PostgreSQL . Погуглил, примеры на С везде, как понимаю отсюда и родилось требование использовать С.

.


Так точно!
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129891
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ

Есть такое, с массивом не думал что будет так сложно. Планировал массив создать за час максимум )

большинство С/С++ newcomers умирают на указателях. Потом они всплывают в районе C#/Delphi/1C e.t.c.

А поскольку в С строки и указатели - принципиально неотделимы - то вот приходится получать такой
высокий порог вхождения. А ты на что расчитывал?

УткъТут довольно большая нагрузка ожидается.

Нагруженные системы (условно) делятся на 2 категории.
- optimized by throughput
- by response time

И в зависимости от этого рода нагрузки в системе крутятся разные гайки и разные
выбираются языки и технологии.

Предполагаю что твоя задача с базами связанная с репликациями или с ETL. Если это так то они попадают
в первую категорию.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129907
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ
Это у меня в main выполняется, я думал что return 1; в main завершает работу приложения, протестирую.

Правильно думал, если это в main() то будет завершение. Если в другом месте, то просто вернешься на уровень вверх.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129912
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton

Нагруженные системы (условно) делятся на 2 категории.
- optimized by throughput
- by response time

И в зависимости от этого рода нагрузки в системе крутятся разные гайки и разные
выбираются языки и технологии.

Предполагаю что твоя задача с базами связанная с репликациями или с ETL. Если это так то они попадают
в первую категорию.


Тут немного другая категория.

Главная задача не держать коннекты в БД и чтобы ничего не зависло.

Т.е. главное это надежность и прозрачность для конечных пользоватлей.

А высокая нагрузка планируется просто из-за большого количества узлов.

Т.е. тут нет такого что аптайм 24\7 требуется, просто запуск по расписанию с минималным воздействием на узлы.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129913
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T
Уткъ
Это у меня в main выполняется, я думал что return 1; в main завершает работу приложения, протестирую.

Правильно думал, если это в main() то будет завершение. Если в другом месте, то просто вернешься на уровень вверх.



Ага, понял, значит надо exit использовать, чтоб везде сработал )
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129914
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ

Тут немного другая категория.

Главная задача не держать коннекты в БД и чтобы ничего не зависло.

Т.е. главное это надежность и прозрачность для конечных пользоватлей.

А высокая нагрузка планируется просто из-за большого количества узлов.

Т.е. тут нет такого что аптайм 24\7 требуется, просто запуск по расписанию с минималным воздействием на узлы.

Сокетный пул?

А по какому принципу вы будете "отрубать" коннекты?
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129919
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
Уткъ

Тут немного другая категория.

Главная задача не держать коннекты в БД и чтобы ничего не зависло.

Т.е. главное это надежность и прозрачность для конечных пользоватлей.

А высокая нагрузка планируется просто из-за большого количества узлов.

Т.е. тут нет такого что аптайм 24\7 требуется, просто запуск по расписанию с минималным воздействием на узлы.

Сокетный пул?

А по какому принципу вы будете "отрубать" коннекты?


Таймаут в соединении, а потом kill -9 приложения.

Думаю как-то так.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129924
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Капец вы вандалы
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129938
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для многомерных массивов не надо заморачиваться с отдельными массивами для размерностей, т.к. память все-равно одномерная.
Достаточно сделать явное преобразование многомерного индекса в одномерный. Считается это элементарно. Компилятор неявно тоже самое делает для многомерных массивов.

Например у тебя трехмерный массив размерностью [K,M,N] тогда всего ячеек будет K*M*N, такого размера и объявляешь массив для хранения.

Формула для получения индекса ячейки [k,m,n] такая:
Код: plaintext
1.
i = (k * M + m) * N + n


Исходник
Код: plaintext
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.
59.
60.
61.
62.
63.
64.
65.
66.
// Размеры куба и размер ячейки
int cube_k = 0, cube_m = 0, cube_n = 0, cube_size = 0;

// Массив строк
char* cube_data = NULL;

// Выделение памяти под куб
bool cube_init(int k, int m, int n, int size) {
    cube_data = (char*)calloc(k*m*n*size, sizeof(char)); // с заполнением нулями
    if(cube_data != NULL) {
        cube_k = k;
        cube_m = m;
        cube_n = n;
        cube_size = size;
        return true;
    }
    return false;
}

// Указатель на ячейку с индексом [k, m, n]
char* cube_cell(int k, int m, int n) {
    if(k < 0 || k >= cube_k || m < 0 || m >= cube_m || n < 0 || n >= cube_n) {
        printf("Wrong index [%d,%d,%d]", k, m, n);
        return NULL;
    }
    return cube_data + ((k * cube_m + m) * cube_n + n) * cube_size;
}

// Освобождение памяти
void cube_free() {
    if(cube_data != NULL) {
        free(cube_data);
        cube_data = NULL;
        cube_k = 0;
        cube_m = 0;
        cube_n = 0;
        cube_size = 0;
    }
}
 //*********************************************************************
int main() {
    // Выделение памяти
    if(!cube_init(2, 3, 100, 100)) return 1;
    // Заполнение
    for(int k = 0; k < 2; k++) {
        for(int m = 0; m < 3; m++) {
            for(int n = 0; n < 100; n++) {
                char* cell = cube_cell(k, m, n); // Указатель на ячейку с индексом [k, m, n]
                sprintf(cell, "stroka[%d,%d,%d]", k, m, n);
            }
        }
    }
    // Вывод 
    for (int k = 0; k < 2; k++) {
        for (int m = 0; m < 3; m++) {
            for (int n = 0; n < 100; n++) {
                char* cell = cube_cell(k, m, n);
                printf("%s ", cell);
            }
            printf("\n\n");
        }
    }
    // Освобождение памяти
    cube_free();
    return 0;
}

...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129944
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ
Добавил проверку выделилась ли память при аллокации, надеюсь верно написал:
Код: plaintext
1.
    if (NULL == stroka) {printf("Memory does not given.\n");return 1;}

Пассивный и активный залоги смешал в кучу.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129988
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T
Для многомерных массивов не надо заморачиваться с отдельными массивами для размерностей, т.к. память все-равно одномерная.
Достаточно сделать явное преобразование многомерного индекса в одномерный. Считается это элементарно. Компилятор неявно тоже самое делает для многомерных массивов.

Например у тебя трехмерный массив размерностью [K,M,N] тогда всего ячеек будет K*M*N, такого размера и объявляешь массив для хранения.

Формула для получения индекса ячейки [k,m,n] такая:
Код: plaintext
1.
i = (k * M + m) * N + n


Исходник
Код: plaintext
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.
59.
60.
61.
62.
63.
64.
65.
66.
// Размеры куба и размер ячейки
int cube_k = 0, cube_m = 0, cube_n = 0, cube_size = 0;

// Массив строк
char* cube_data = NULL;

// Выделение памяти под куб
bool cube_init(int k, int m, int n, int size) {
    cube_data = (char*)calloc(k*m*n*size, sizeof(char)); // с заполнением нулями
    if(cube_data != NULL) {
        cube_k = k;
        cube_m = m;
        cube_n = n;
        cube_size = size;
        return true;
    }
    return false;
}

// Указатель на ячейку с индексом [k, m, n]
char* cube_cell(int k, int m, int n) {
    if(k < 0 || k >= cube_k || m < 0 || m >= cube_m || n < 0 || n >= cube_n) {
        printf("Wrong index [%d,%d,%d]", k, m, n);
        return NULL;
    }
    return cube_data + ((k * cube_m + m) * cube_n + n) * cube_size;
}

// Освобождение памяти
void cube_free() {
    if(cube_data != NULL) {
        free(cube_data);
        cube_data = NULL;
        cube_k = 0;
        cube_m = 0;
        cube_n = 0;
        cube_size = 0;
    }
}
 //*********************************************************************
int main() {
    // Выделение памяти
    if(!cube_init(2, 3, 100, 100)) return 1;
    // Заполнение
    for(int k = 0; k < 2; k++) {
        for(int m = 0; m < 3; m++) {
            for(int n = 0; n < 100; n++) {
                char* cell = cube_cell(k, m, n); // Указатель на ячейку с индексом [k, m, n]
                sprintf(cell, "stroka[%d,%d,%d]", k, m, n);
            }
        }
    }
    // Вывод 
    for (int k = 0; k < 2; k++) {
        for (int m = 0; m < 3; m++) {
            for (int n = 0; n < 100; n++) {
                char* cell = cube_cell(k, m, n);
                printf("%s ", cell);
            }
            printf("\n\n");
        }
    }
    // Освобождение памяти
    cube_free();
    return 0;
}






Да, я про подобное слышал вот в этой лекции:
[youtube=https://www.youtube.com/watch?v=MQBV3PMx5sg]

Такое сделаю обязательно.


В общем, протестил, массив из данных базы на 7 тыс строк создается нормально, пару сек.

Сейчас буду массово цеплять libpq и запросы к массиву, как с ними разберусь буду оптимизировать по памяти )
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129989
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl
Уткъ
Добавил проверку выделилась ли память при аллокации, надеюсь верно написал:
Код: plaintext
1.
    if (NULL == stroka) {printf("Memory does not given.\n");return 1;}

Пассивный и активный залоги смешал в кучу.


Компилятор не ругнулся на такое )))
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130004
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ

В общем, протестил, массив из данных базы на 7 тыс строк создается нормально, пару сек.

Улыбнуло.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130010
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonУлыбнуло.

Самое смешное, что это всё в общем-то и не нужно, а скорость при использовании
COPY ещё и повысится.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130015
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня всё время крутится в голове что у Постгреса есть какой-то коробочный пул. Помню читал. Лень искать в документации.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130025
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пул и даже балансер есть, но для задачи автора ни один из них не нужен.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130029
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Убийство сессий?
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130086
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton

Улыбнуло.

Тысячи баз и софт на коленке писаный, забавно все там
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130109
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
Убийство сессий?



Вы будете смеятся, но некоторые сессии не убиваются, особенно это обидно когда она создана dblink-ом.

Тогда приходится рестартовать постгресс, по другому никак, иначе сессия висит вечно.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130111
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так понимаю что мы всё равно не поймем. В топике решается проблема XY.

Мы здесь знаем С++. И не знаем зачем вам нужно стрелять по сессиям Postgres. Но я догадываюсь.
Возможно у вас текут ресурсы?
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130433
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ
White Owl
пропущено...
Пассивный и активный залоги смешал в кучу.


Компилятор не ругнулся на такое )))
Компилятор то это пропустит. Но вот тот кто будет с твоей программой работать получит головную боль пытаясь понять что это за ошибка произошла. Мог бы и через гугл-переводчик прогнать текст пару раз.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130549
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Модератор: Удалил лишнее.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130572
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ
...
Я по умолчанию запускаю gcc file.c -o file

наверняка там какая-то опции запуска есть, которые повышают блидетьность.
-Wall или -Werror
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130574
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Ustinov-Wall И -Werror

-Wextra тоже рекомендую.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25 сообщений из 308, страница 4 из 13
Форумы / C++ [игнор отключен] [закрыт для гостей] / Си. Освободить память 2-мерного сторкового массива
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]