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

Продолжаю разбираться с Си.

Требуется сделать двухмерный текстовый массив.

В принципе он создается нормально.

Но когда добавил free(massive_var[0][0]);

Программа скомпилировалась нормально, но при исполнении упала:



***munmap_chunk(): invalid pointer: 0x00000000004007f9 ***
======= Backtrace: =========
...
======= Memory map: ========
0158c000-015af000 rw-p 00000000 00:00 0 [heap]
7fddb5fa5000-7fddb5fba000 r-xp 00000000 fd:00 585126 /usr/lib64/libgcc_s-4.8.5-20150702.so.1
7fddb5fba000-7fddb61b9000 ---p 00015000 fd:00 585126 /usr/lib64/libgcc_s-4.8.5-20150702.so.1
...
Aborted



Вот сам код:



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>



int
main()
{
char* massive_var[0][0]; 
massive_var[0][0] = (char*)calloc(10000, sizeof(char));
massive_var[0][0] = "first_record";
printf("%s \n", massive_var[0][0]);

free(massive_var[0][0]);

    return 0;
}






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

Ну и у всего массива.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129504
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тебе точно С надо? Может С++ задействовать?

Это совсем не то что ты думаешь
Код: plaintext
1.
char* massive_var[0][0];


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

Гуглить. Курсы по Си. Массивы
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129518
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Siemargl
Уткъ,

Гуглить. Курсы по Си. Массивы



тут нашел пример, последнее сообщение
https://www.cyberforum.ru/c-beginners/thread2496725.html


массив объявляется так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    //динамическое выделение памяти для одномерного массива
    char *slov = (char*)malloc(N*sizeof(char));
    printf("Введите массив: \n");
    //далее будет выделятся память для двумерного массива
    char **slay = (char**)malloc(M*sizeof(char*)); //выделение памяти для указателя на строки(первого элемента в массиве)
    //выделение памяти для нужного колличества элементов в строке
    for(i=0;i<M;i++)
    {
        slay[i] = (char*)malloc(N*sizeof(char));
    }



но непонятно это верно или нет.


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

Это совсем не то что ты думаешь
Код: plaintext
1.
char* massive_var[0][0];


если честно я сам не готов объяснить почему это скомпилировалось, наверно потому что это Си





другие элементы всталял - работает.

но раз это не то что надо, как-то по-другому придется.

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

Гуглить. Курсы по Си. Массивы



тут нашел пример, последнее сообщение
https://www.cyberforum.ru/c-beginners/thread2496725.html


массив объявляется так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    //динамическое выделение памяти для одномерного массива
    char *slov = (char*)malloc(N*sizeof(char));
    printf("Введите массив: \n");
    //далее будет выделятся память для двумерного массива
    char **slay = (char**)malloc(M*sizeof(char*)); //выделение памяти для указателя на строки(первого элемента в массиве)
    //выделение памяти для нужного колличества элементов в строке
    for(i=0;i<M;i++)
    {
        slay[i] = (char*)malloc(N*sizeof(char));
    }



но непонятно это верно или нет.


Может есть какой-нибудь пример как надо делать?



В общем, в этом примере двумерный массив, но одна мерность занимает строка, т.е. по сути это это одномерный массив из строк.

Ищу дальше.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129538
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T
Тебе точно С надо? Может С++ задействовать?

Это совсем не то что ты думаешь
Код: plaintext
1.
char* massive_var[0][0];


если честно я сам не готов объяснить почему это скомпилировалось, наверно потому что это Си







Работало т.к. по первому символу как-то вся строка вытаскивалась наверное.

Смотрите, это получился двухмерный массив из сиволов (не строк).

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

Это получается 2-х мерный строковый.


так работает:


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

int main()
{

 char massive[1][3][30];
  
  strcpy(massive[0][0],"a0");
  strcpy(massive[0][1],"a1");
  strcpy(massive[0][2],"a2");
  strcpy(massive[1][0],"b0");
  strcpy(massive[1][1],"b1");
  strcpy(massive[1][2],"b2");

printf("%s   %s   %s \n",massive[0][0],massive[0][1],massive[0][2]);
printf("%s   %s   %s \n",massive[1][0],massive[1][1],massive[1][2]);

return 0;
}





Вывод:

Код: plaintext
1.
2.
a0   a1   a2
b0   b1   b2




Но тут хочется strcpy поменять на calloc + присваивание (=)


и в объявлении массива использовать не char а char*


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

Гуглить. Курсы по Си. Массивы



тут нашел пример, последнее сообщение
https://www.cyberforum.ru/c-beginners/thread2496725.html


массив объявляется так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    //динамическое выделение памяти для одномерного массива
    char *slov = (char*)malloc(N*sizeof(char));
    printf("Введите массив: \n");
    //далее будет выделятся память для двумерного массива
    char **slay = (char**)malloc(M*sizeof(char*)); //выделение памяти для указателя на строки(первого элемента в массиве)
    //выделение памяти для нужного колличества элементов в строке
    for(i=0;i<M;i++)
    {
        slay[i] = (char*)malloc(N*sizeof(char));
    }



но непонятно это верно или нет.


Может есть какой-нибудь пример как надо делать?

Все тут верно. Только учти что это не двухмерный массив, а массив массивов, точнее массив строк, т.к. строка это массив символов.

Хотя ты тоже массив массивов хочешь, двумерный массив так объявляется:
Код: plaintext
1.
char arr[10,20];



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



тут нашел пример, последнее сообщение
https://www.cyberforum.ru/c-beginners/thread2496725.html


массив объявляется так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    //динамическое выделение памяти для одномерного массива
    char *slov = (char*)malloc(N*sizeof(char));
    printf("Введите массив: \n");
    //далее будет выделятся память для двумерного массива
    char **slay = (char**)malloc(M*sizeof(char*)); //выделение памяти для указателя на строки(первого элемента в массиве)
    //выделение памяти для нужного колличества элементов в строке
    for(i=0;i<M;i++)
    {
        slay[i] = (char*)malloc(N*sizeof(char));
    }



но непонятно это верно или нет.


Может есть какой-нибудь пример как надо делать?

Все тут верно. Только учти что это не двухмерный массив, а массив массивов, точнее массив строк, т.к. строка это массив символов.

Хотя ты тоже массив массивов хочешь, двумерный массив так объявляется:
Код: plaintext
1.
char arr[10,20];



PS Тебе точно Си надо? Если да, то сначала теорию почитай, книжку какую-нибудь, т.к. это азы, без их знания ничего путного не напишешь.


Ритчи бегло прочел.

Так не дает объявить:

Код: plaintext
1.
 char massive[1,3];



str5.c: In function ‘main’:
str5.c:11:16: error: expected ‘]’ before ‘,’ token
char massive[1,3];



А вот этот вариант нормальный?
22426237

Мне там только надо сделать чтобы массив можно было вне функции main тоже использовать, для этого, как я понял надо не char а char*
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129584
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ
str5.c: In function ‘main’:
str5.c:11:16: error: expected ‘]’ before ‘,’ token
char massive[1,3];

Похоже тут уже я напутал, это из C#, нет в С/С++ двумерных массивов. Есть только массивы массивов.

Уткъ
Ритчи бегло прочел.

Очень бегло похоже. Иначе не было бы этого вопроса:
Уткъ
Мне там только надо сделать чтобы массив можно было вне функции main тоже использовать, для этого, как я понял надо не char а char*

Читай про указатели. Очень внимательно читай, т.к. кроме С/С++ их нигде нет, а на них строится вся работа с памятью.

Указатель (char*) это массив, указатель на массив указателей (char**) это массив массивов (двумерный) и т.д.

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

Требуется сделать двухмерный текстовый массив.

Здесь немножко есть терминологическая путаница и срыв шаблона. В С строки всегда повышают -мерность
коллекции. Тоесть 1-мерный массив строк - это 2-мерный (зубчатый) массив chars. И так далее.

Вообще если варьировать количество звездочек перед указателем то ты можешь варьировать мерность
коллекции.

Например

Код: plaintext
1.
char *p; // указатель на массив символов (или 1 строка)



или

Код: plaintext
1.
char **p; // указатель на массив указателей на массив символов (или массив строк)



в функции main например второй аргумент как раз прилетает в виде такого массива.

и так далее

Код: plaintext
1.
char ***p; // три уровня вложенности указателей (матрица рядков произвольной длины, где в каждом элементе - строка)



аллокацию такого массива делают по-слоям. Тоесть сначала слой внешний. Потов второй. И потом строчки.

Альтренатива зубчатости - это прямоугольная матрица. Но это подходит для строк фиксированного размера. Например
номера телефонов. Если средняя длина телефона 7 цифр (в локальной городской сети)
то для хранения 1000 телефонов тебе достаточно будет выделять 1000 * (7 + 1) символов.

Или многомерная матрица с теми-же явными лимитами. Куб. Например Куб телефонных номеров по всем городам.
Допустим гордов 15. Тогда надо аллоцировать 15 * 1000 * (7 + 1) символов.

Для таких кубов и гипер-кубов нам нужен только один указатель.

Код: plaintext
1.
char *p; // левый верхний угол матрицы или куба 



Куб экономит память только для лимитированных строчек. Навигацию по кубу можно просто делать по формуле
остчитывая расстояние от левого верхнего угла в символах.

Для языков С/C++ существует аналогия между указателем и именем массива. Недавно на эту тему был
очень жаркий спор. Не хотелось-бы углубляться.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129593
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
Уткъ

Требуется сделать двухмерный текстовый массив.

Здесь немножко есть терминологическая путаница и срыв шаблона. В С строки всегда повышают -мерность
коллекции. Тоесть 1-мерный массив строк - это 2-мерный (зубчатый) массив chars. И так далее.

Вообще если варьировать количество звездочек перед указателем то ты можешь варьировать мерность
коллекции.

Например

Код: plaintext
1.
char *p; // указатель на массив символов (или 1 строка)



или

Код: plaintext
1.
char **p; // указатель на массив указателей на массив символов (или массив строк)



в функции main например второй аргумент как раз прилетает в виде такого массива.

и так далее

Код: plaintext
1.
char ***p; // три уровня вложенности указателей (матрица рядков произвольной длины, где в каждом элементе - строка)



аллокацию такого массива делают по-слоям. Тоесть сначала слой внешний. Потов второй. И потом строчки.

Альтренатива зубчатости - это прямоугольная матрица. Но это подходит для строк фиксированного размера. Например
номера телефонов. Если средняя длина телефона 7 цифр (в локальной городской сети)
то для хранения 1000 телефонов тебе достаточно будет выделять 1000 * (7 + 1) символов.

Или многомерная матрица с теми-же явными лимитами. Куб. Например Куб телефонных номеров по всем городам.
Допустим гордов 15. Тогда надо аллоцировать 15 * 1000 * (7 + 1) символов.

Для таких кубов и гипер-кубов нам нужен только один указатель.

Код: plaintext
1.
char *p; // левый верхний угол матрицы или куба 



Куб экономит память только для лимитированных строчек. Навигацию по кубу можно просто делать по формуле
остчитывая расстояние от левого верхнего угла в символах.

Для языков С/C++ существует аналогия между указателем и именем массива. Недавно на эту тему был
очень жаркий спор. Не хотелось-бы углубляться.



Большое спасибо!

Впитываю информацию.




Строки разной длинны, поэтому куб не подойдет, вариант с *** должно быть самое то, по описанию.


Пробую повысить мерность вот этого массива, с которым экспериментирую:



Код: 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.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define M 5 //строки в массиве
#define N 100 // допустимое колличесвто элементов в строке


int main()
{

    //переменные для итерации
    int i,j=0;
    //динамическое выделение памяти для одномерного массива
    char* element = (char*)malloc(N*sizeof(char));
    printf("Введите массив: \n");
    //далее будет выделятся память для двумерного массива
    char** stroka = (char**)malloc(M*sizeof(char*)); //выделение памяти для указателя на строки(первого элемента в массиве)
    //выделение памяти для нужного колличества элементов в строке
    for(i=0;i<M;i++)
    {
        stroka[i] = (char*)malloc(N*sizeof(char));
    }
    /*в цикле мы будем сравнивать каждый элемент
    в одномерном массиве на предмет совпадением с элементом пробела*/
    for(i=0;i<M;i++)
    {
//stroka[i]=strcat("sroka",(char*)i);
strcpy(stroka[i],"stroka");
    }
    printf("Вывод массива на консоль: \n");
    for(i=0;i<M;i++)
    {
        printf("%s\n",stroka[i]);
    }
    //высвобождение памяти от предусмотренного колличесва элементов в массиве 
    for(i=0;i<M;i++)
        free(stroka[i]);
    //высвобождение памяти от указателя на строки(на первый элемент массива) 
    free(stroka);
 
    return 0;
}
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129594
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я понимаю что выгляжу довольно глупо с такими вопросами, но прошу потерпеть какое-то время, пока не наберу критическую массу шишек и граблей :-(
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129600
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это лишнее
Код: plaintext
1.
2.
    char* element = (char*)malloc(N*sizeof(char));
    printf("Введите массив: \n");


В примере было два выделения массива. Это одномерный, у тебя не используется.

в остальном нормальный код 22426300
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129604
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ
Я понимаю что выгляжу довольно глупо с такими вопросами, но прошу потерпеть какое-то время, пока не наберу критическую массу шишек и граблей :-(

Ты-же копируешь на линуксы и там собираешь? Тогда гоняй valgrind каждый раз при каждом запуске.
Это будет лакмусовая бумажка. Как только что-то не то с утечкой или доступом по неаллоцированому - ты получишь
желтую карточку.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129608
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
Уткъ
Я понимаю что выгляжу довольно глупо с такими вопросами, но прошу потерпеть какое-то время, пока не наберу критическую массу шишек и граблей :-(

Ты-же копируешь на линуксы и там собираешь? Тогда гоняй valgrind каждый раз при каждом запуске.
Это будет лакмусовая бумажка. Как только что-то не то с утечкой или доступом по неаллоцированому - ты получишь
желтую карточку.


Да, так и есть, копирую и там собираю.

valgrind , почитаю, спасибо )
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129611
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T
Это лишнее
Код: plaintext
1.
2.
    char* element = (char*)malloc(N*sizeof(char));
    printf("Введите массив: \n");


В примере было два выделения массива. Это одномерный, у тебя не используется.

в остальном нормальный код 22426300



Это убрать, понятно, т.к. я там заменил ввод с клавиатуры на присваивание:
Код: plaintext
1.
    printf("Введите массив: \n");




Выделение памяти думал если убрать:
Код: plaintext
1.
    char* element = (char*)malloc(N*sizeof(char));



то ошибка будет.

А нет, ошибки нет, вы правы.

Все убрал как вы сказали.



Только осталось мерность повысить у массива )
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129614
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно выделять память проще, быстрее и эффективней
Вот тоже самое с двумя malloc()Комментарии написал, надеюсь поймешь
Код: 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.
int main() {
    // Массив указателей
    char** stroka = (char**)malloc(M * sizeof(char*));
    //Память под M строк по N символов
    stroka[0] = (char*)malloc(M * N * sizeof(char));
    // Заполнение массива указателями на строки
    for (int i = 1; i < M; i++) {
        stroka[i] = stroka[i-1] + N;
    }
    // Заполнение массива
    for (int i = 0; i < M; i++) {
        strcpy(stroka[i], "stroka   ");
        stroka[i][7] = '0' + i;
    }
    printf("Вывод массива на консоль: \n");
    for (int i = 0;i < M;i++) {
        printf("%s\n", stroka[i]);
    }
    //высвобождение памяти для строк
    free(stroka[0]); // можно писать free(*stroka)
    //высвобождение памяти под массив указателей на строки
    free(stroka);

    return 0;
}


Можно одним malloc() обойтись, но это уже изврат будет.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129624
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем, добавил константу:

Код: plaintext
1.
#define K 2 //количество строк



Добавил 3-хмерный массив и выделение для него памяти:

Код: plaintext
1.
	char*** stolbetc = (char***)malloc(K*sizeof(char**)); 




Все остальное выделение памяти поместил в цикл:

Код: plaintext
1.
2.
3.
4.
5.
for(x=0;x<K;x++)
{
stolbetc[x] = (char**)malloc(K*sizeof(char));
...
}





Вот так компилируется и даже запускается без ошибок:




Код: 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.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define K 2 //строк
#define M 5 //количество столбцов
#define N 100 // максимальная длинна строки


int main()
{

    //переменные для итерации
    int i,j,x=0;

	//выделение памяти для 3-мерного массива
	char*** stolbetc = (char***)malloc(K*sizeof(char**)); //выделение памяти для указателя на строки(первого элемента в массиве)

for(x=0;x<K;x++)
{
stolbetc[x] = (char**)malloc(K*sizeof(char));
	
    //далее будет выделятся память для двумерного массива		
    char** stroka = (char**)malloc(M*sizeof(char*)); //выделение памяти для указателя на строки(первого элемента в массиве)
    //выделение памяти для нужного колличества элементов в строке
    for(i=0;i<M;i++)
    {
        stroka[i] = (char*)malloc(N*sizeof(char));
    }
    /*в цикле мы будем сравнивать каждый элемент
    в одномерном массиве на предмет совпадением с элементом пробела*/

}

/*

    for(i=0;i<M;i++)
    {
//stroka[i]=strcat("sroka",(char*)i);
strcpy(stroka[i],"stroka");
    }
    printf("Вывод массива на консоль: \n");
    for(i=0;i<M;i++)
    {
        printf("%s\t",stroka[i]);
    }




	printf("\n");
    //высвобождение памяти от предусмотренного колличесва элементов в массиве 
    for(i=0;i<M;i++)
        free(stroka[i]);
    //высвобождение памяти от указателя на строки(на первый элемент массива) 
    free(stroka);

*/

	
    return 0;
}








Подскажите, я в том направлении двигаюсь?


И как обращаться к отдельному элементу массива?


если заменяю:
Код: plaintext
1.
2.
3.
stroka[i] = (char*)malloc(N*sizeof(char));
на
stroka[x][i] = (char*)malloc(N*sizeof(char));



то ошибка

str7.c:28:22: warning: assignment makes integer from pointer without a cast [enabled by default]
stroka[x][i] = (char*)malloc(N*sizeof(char));


И при присвоении если вместо
Код: plaintext
1.
2.
3.
strcpy(stroka[i],"stroka");
это:
strcpy(stroka[0][i],"stroka");



str7.c:40:8: error: ‘stroka’ undeclared (first use in this function)
strcpy(stroka[0][i],"stroka");
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129631
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Откуда stolbetc взялся? Надо
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
// Массив указателей на массивы указателей на строки
char*** stroka = (char***)malloc(K*sizeof(char**));
// Заполнение 
for(x=0;x<K;x++)
{
    //далее будет выделятся память для двумерного массива		
    stroka[x] = (char**)malloc(M*sizeof(char*));
...


Комментарии не ленись писать по существу
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129635
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T
Откуда stolbetc взялся? Надо
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
// Массив указателей на массивы указателей на строки
char*** stroka = (char***)malloc(K*sizeof(char**));
// Заполнение 
for(x=0;x<K;x++)
{
    //далее будет выделятся память для двумерного массива		
    stroka[x] = (char**)malloc(M*sizeof(char*));
...


Комментарии не ленись писать по существу



а, stroka так и остается, только на нее указатель...
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129639
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут ты просто устроил утечку памяти
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
for(x=0;x<K;x++)
{
stolbetc[x] = (char**)malloc(K*sizeof(char));
	
    //далее будет выделятся память для двумерного массива		
    char** stroka = (char**)malloc(M*sizeof(char*)); //выделили память
    //выделение памяти для нужного колличества элементов в строке
    for(i=0;i<M;i++)
    {
        stroka[i] = (char*)malloc(N*sizeof(char));
    }
    /*в цикле мы будем сравнивать каждый элемент
    в одномерном массиве на предмет совпадением с элементом пробела*/

} // потерял указатель на эту память, т.к. конец зоны видимости переменной stroka 
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129640
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ
а, stroka так и остается, только на нее указатель...

так и остается, только было stroka[i] а стало stroka[x][i] т.к. ты еще один уровень вложенности добавил
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129691
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T
Тут ты просто устроил утечку памяти
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
for(x=0;x<K;x++)
{
stolbetc[x] = (char**)malloc(K*sizeof(char));
	
    //далее будет выделятся память для двумерного массива		
    char** stroka = (char**)malloc(M*sizeof(char*)); //выделили память
    //выделение памяти для нужного колличества элементов в строке
    for(i=0;i<M;i++)
    {
        stroka[i] = (char*)malloc(N*sizeof(char));
    }
    /*в цикле мы будем сравнивать каждый элемент
    в одномерном массиве на предмет совпадением с элементом пробела*/

} // потерял указатель на эту память, т.к. конец зоны видимости переменной stroka 










Так и есть:





Код: 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.
67.
68.
69.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define K 2 //количество строк
#define M 5 //количество столбцов
#define N 100 // максимальная длинна строки


int main()
{

    //переменные для итерации
    int i,j,x=0;

	//выделение памяти для 3-мерного массива
	char*** stroka = (char***)malloc(K*sizeof(char**)); 

for(x=0;x<K;x++)
{
stroka[x] = (char**)malloc(K*sizeof(char));
	
    //далее будет выделятся память для двумерного массива		
    char** stroka = (char**)malloc(M*sizeof(char*)); //выделение памяти для указателя на строки(первого элемента в массиве)
    //выделение памяти для нужного колличества элементов в строке
    for(i=0;i<M;i++)
    {
        stroka[i] = (char*)malloc(N*sizeof(char));
    }
    /*в цикле мы будем сравнивать каждый элемент
    в одномерном массиве на предмет совпадением с элементом пробела*/

	
//ТУТ НОРМАЛЬНО ПРИСВАИВАЕТ И ВЫВЫОДИТ	
strcpy(stroka[x],"stroka");	
printf("%s\n",stroka[x]);	
}

//ТУТ Segmentation fault
strcpy(stroka[0][0],"stroka");



/*

    for(i=0;i<M;i++)
    {
//stroka[i]=strcat("sroka",(char*)i);
strcpy(stroka[0][i],"stroka");
    }
    printf("Вывод массива на консоль: \n");
    for(i=0;i<M;i++)
    {
        printf("%s\t",stroka[0][i]);
    }


	printf("\n");
    //высвобождение памяти от предусмотренного колличесва элементов в массиве 
    for(i=0;i<M;i++)
        free(stroka[i]);
    //высвобождение памяти от указателя на строки(на первый элемент массива) 
    free(stroka);

*/

	
    return 0;
}






А как сделать чтобы указатель не терялся?


Я подозреваю что вместо:

Код: plaintext
1.
stroka[x] = (char**)malloc(K*sizeof(char));




надо что-то типа этого использовать:

Код: plaintext
1.
*stroka[x] = (char**)malloc(K*sizeof(char));




Но если так указать то компилятор ругается:

str7.c: In function ‘main’:
str7.c:21:12: warning: assignment from incompatible pointer type [enabled by default]
*stroka[x] = (char**)malloc(K*sizeof(char));
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129703
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,

прочитал тему "Правила и рекомендации к оформлению сообщений на форуме С++"

я довольно глупые вопросы задаю для уровня этого форума.

Поэтому готов немного задонатить за решение этого вопроса.

Надо сделать этот массив
Показать как обращаться(читать-писать) к строке по адрессу типа (stroka[x][i])

С вашим уровнем знаний, уверен, для вас это 5 минут.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129708
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я против донаторства в данном под-форуме. Но я могу перенести этот топик в Работу.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129718
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
Я против донаторства в данном под-форуме. Но я могу перенести этот топик в Работу.


не, переносить не надо.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129722
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T
Тут ты просто устроил утечку памяти
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
for(x=0;x<K;x++)
{
stolbetc[x] = (char**)malloc(K*sizeof(char));
	
    //далее будет выделятся память для двумерного массива		
    char** stroka = (char**)malloc(M*sizeof(char*)); //выделили память
    //выделение памяти для нужного колличества элементов в строке
    for(i=0;i<M;i++)
    {
        stroka[i] = (char*)malloc(N*sizeof(char));
    }
    /*в цикле мы будем сравнивать каждый элемент
    в одномерном массиве на предмет совпадением с элементом пробела*/

} // потерял указатель на эту память, т.к. конец зоны видимости переменной stroka 




Если
Код: plaintext
1.
char** stroka = (char**)malloc(M*sizeof(char*));


объявить до for


Код: 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.
int main()
{

    //переменные для итерации
    int i,j,x=0;

	//выделение памяти для 3-мерного массива
	char*** stroka = (char***)malloc(K*sizeof(char**));
	char** stroka = (char**)malloc(M*sizeof(char*));

for(x=0;x<K;x++)
{
stroka[x] = (char**)malloc(K*sizeof(char));
	
    //далее будет выделятся память для двумерного массива		
    //char** stroka = (char**)malloc(M*sizeof(char*)); //выделение памяти для указателя на строки(первого элемента в массиве)
    //выделение памяти для нужного колличества элементов в строке
    for(i=0;i<M;i++)
    {
        stroka[i] = (char*)malloc(N*sizeof(char));
    }
    /*в цикле мы будем сравнивать каждый элемент
    в одномерном массиве на предмет совпадением с элементом пробела*/

	
//ТУТ НОРМАЛЬНО ПРИСВАИВАЕТ И ВЫВЫОДИТ	
strcpy(stroka[x],"stroka");	
printf("%s\n",stroka[x]);	
}



то ошибка:
str7.c:18:9: error: conflicting types for ‘stroka’
char** stroka = (char**)malloc(M*sizeof(char*));
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129737
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дружище. По обучению. Мой совет. Попробуй возьми бумажку в клеточку и каранадаш. И нарисуй
память. Массивы указателей и твои строки.

Указатель может выглядеть в памяти как целое число длиной 8 байтов (64 бит). Возможен вариант что и 32 бит
для старых машин или мелких устройств.

Особый указатель NULL - это ноль приведенный к типу указателя может быть терминатором
или волшебной константой которая говорит например что память для этого указателя
еще не аллоцирована или уже удалена.

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

прочитал тему "Правила и рекомендации к оформлению сообщений на форуме С++"

я довольно глупые вопросы задаю для уровня этого форума.

Поэтому готов немного задонатить за решение этого вопроса.

Надо сделать этот массив
Показать как обращаться(читать-писать) к строке по адрессу типа (stroka[x][i])

С вашим уровнем знаний, уверен, для вас это 5 минут.

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

Если надо только готовое решение, то в форуме работа за донат сделают студенты чуть умнее тебя. Только им сразу всю задачу описывай.

Ты влез в очень сложную тему, она не только для новичка сложная, судя по последним постам мозг уже кипит, начался подбор места куда воткнуть строчку лишь бы скомпилировалось, это неправильно.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129744
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ
Код: plaintext
1.
2.
3.
	//выделение памяти для 3-мерного массива
	char*** stroka = (char***)malloc(K*sizeof(char**));
	char** stroka = (char**)malloc(M*sizeof(char*));



Ты два раза объявил переменную stroka, такое ни один компилятор не пропустит.

PS Эту подсказку не учел 22426362
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129746
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
Дружище. По обучению. Мой совет. Попробуй возьми бумажку в клеточку и каранадаш. И нарисуй
память. Массивы указателей и твои строки.

Указатель может выглядеть в памяти как целое число длиной 8 байтов (64 бит). Возможен вариант что и 32 бит
для старых машин или мелких устройств.

Особый указатель NULL - это ноль приведенный к типу указателя может быть терминатором
или волшебной константой которая говорит например что память для этого указателя
еще не аллоцирована или уже удалена.

Символы соотв могут быть как 1 байт так и 2 в зависимости от разных настроек окружения.


Пока нарисовал строки.

"A" - это 1 символ.

"А1" - это два символа, объединенных в одномерный массив

{"А1", "А2", "А3"} - это уже двумерный массив.

{"А1", "А2", "А3"}
{"B1", "B2", "B3"} - это трехмерный массив
{"C1", "C2", "C3"}


Сейчас с указателями попробую.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129748
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T
Уткъ
Код: plaintext
1.
2.
3.
	//выделение памяти для 3-мерного массива
	char*** stroka = (char***)malloc(K*sizeof(char**));
	char** stroka = (char**)malloc(M*sizeof(char*));



Ты два раза объявил переменную stroka, такое ни один компилятор не пропустит.

PS Эту подсказку не учел 22426362


А как получается сделать, чтобы за пределами if не терялся указатель?

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


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

Теперь пронумеруй клеточки, все подряд, пустые, непустые: 1,2,3,...,100500. Так вот указатель на строку это номер клеточки в которой начинается строка.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129751
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
УткъПоказать как обращаться(читать-писать) к строке по адрессу типа (stroka[x][i])

Никак. С любым уровнем знания это невозможно в Си.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129752
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T
Уткъ
Пока нарисовал строки.

Теперь пронумеруй клеточки, все подряд, пустые, непустые: 1,2,3,...,100500. Так вот указатель на строку это номер клеточки в которой начинается строка.


Сделал это мысленно, до 3-й мерности.


На третей надо еще пару листов, но смысл уже проясняется.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129753
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ
А как получается сделать, чтобы за пределами if не терялся указатель?

Нет у тебя if, есть for :)

Как начать я уже показал 22426351 , как продолжить намекнул 22426362 , еще чуть-чуть и ответ получится.

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

Нет у тебя if, есть for :)

Как начать я уже показал 22426351 , как продолжить намекнул 22426362 , еще чуть-чуть и ответ получится.

Думай, сегодня я ушел, завтра продолжим.


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

Скомпилилировалось и даже пару раз отработало :-)

Вот что получилось:



Код: 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.
67.
68.
69.
70.
71.
72.
73.
74.
75.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define K 2 //количество строк
#define M 3 //количество столбцов
#define N 100 // максимальная длинна строки


int main()
{

    //переменные для итерации
    int i,j,x=0;

	//выделение памяти для 3-мерного массива
	char*** stroka = (char***)malloc(K*sizeof(char**));

for(x=0;x<K;x++)
{
	//выделение памяти для 2-мерного массива
    stroka[x] = (char**)malloc(M*sizeof(char));
	
    for(i=0;i<M;i++)
    {
		//выделение памяти для 1-мерного массива
        stroka[x][i] = (char*)malloc(N*sizeof(char));
    }


}


//printf("strcat %s \n", strcat("stroka00","0"));


//простое присваивание
strcpy(stroka[0][0],"stroka00");
strcpy(stroka[0][1],"stroka01");
strcpy(stroka[0][2],"stroka02");

strcpy(stroka[1][0],"stroka10");
strcpy(stroka[1][1],"stroka21");
strcpy(stroka[1][2],"stroka22");


//простой вывод
printf("00 %s\t",stroka[0][0]);	
printf("01 %s\t",stroka[0][1]);	
printf("02 %s\t",stroka[0][2]);	
printf("\n");
printf("10 %s\t",stroka[1][0]);	
printf("11 %s\t",stroka[1][1]);	
printf("12 %s\t",stroka[1][2]);
printf("\n");




//освобождение памяти
for(x=0;x<K;x++)
{	
       for(i=0;i<M;i++)
       {		
           free(stroka[x][i]);
       }
	free(stroka[x]);   
}
    free(stroka);




    return 0;
}





Освобождение памяти сделал аналогично выделению, но в обратном порядке.

Посмотрите пожалуйста, это рабочий вариант или опять я куда-то не туда зашел?


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

Еще остался один вопрос, ниже его напишу.


А вопрос вот какой.

Если делаю простое присваивание:

Код: plaintext
1.
strcpy(stroka[0][0],"stroka00");



Все проходит нормально.

А если пытаюсь собрать ту же строку из двух, то ошибка:

Код: plaintext
1.
strcpy(stroka[0][0],strcat("stro","ka00"));



Segmentation fault

Максимальная длинна строки задана в 100-1 символ (define N 100) и непонятно почему тут ошибка.

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

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

Еще остался один вопрос, ниже его напишу.


А вопрос вот какой.

Если делаю простое присваивание:

Код: plaintext
1.
strcpy(stroka[0][0],"stroka00");



Все проходит нормально.

А если пытаюсь собрать ту же строку из двух, то ошибка:

Код: plaintext
1.
strcpy(stroka[0][0],strcat("stro","ka00"));



Segmentation fault

Максимальная длинна строки задана в 100-1 символ (define N 100) и непонятно почему тут ошибка.

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

Подскажите пожалуйста как правильно в массив вставить запись, сложив строки?




Вот так сработало, за два шага:

Код: plaintext
1.
2.
strcpy(stroka[0][0],"stro");
stroka[0][0]=strcat(stroka[0][0],"ka00");




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

Код: plaintext
1.
strcpy(stroka[0][0],strcat("stro","ka00"));



Segmentation fault

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

"stro" это const char*, т.е. строка только для чтения, физически она распологается в сегменте памяти помеченной только для чтения, а strcat туда писать пытается, поэтому Segmentation fault

Писать можно только в stroka[0][0], поэтому делай так:
Код: plaintext
1.
2.
3.
stroka[0][0][0] = 0; // делаем пустую строку stroka[0][0]
strcat(stroka[0][0], "stro");
strcat(stroka[0][0], "ka00");



Или так как сделал тут 22426543
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129771
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ
strcat не может просто две строки сложить, надо чтобы первая уже была в памяти получается )

Не фантазируй. Он не складывает, а дописывает вторую в конец первой. Читай документацию .
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129773
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T

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


Вот такой компилятор:
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44)






Dima T

"stro" это const char*, т.е. строка только для чтения, физически она распологается в сегменте памяти помеченной только для чтения, а strcat туда писать пытается, поэтому Segmentation fault


Я интуитивно догадывался что что-то не так с "stro", когда она не в переменной, а вы смогли все четко объяснить.

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

Скомпилилировалось и даже пару раз отработало :-)

Вот что получилось:



Код: 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.
67.
68.
69.
70.
71.
72.
73.
74.
75.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define K 2 //количество строк
#define M 3 //количество столбцов
#define N 100 // максимальная длинна строки


int main()
{

    //переменные для итерации
    int i,j,x=0;

	//выделение памяти для 3-мерного массива
	char*** stroka = (char***)malloc(K*sizeof(char**));

for(x=0;x<K;x++)
{
	//выделение памяти для 2-мерного массива
    stroka[x] = (char**)malloc(M*sizeof(char));
	
    for(i=0;i<M;i++)
    {
		//выделение памяти для 1-мерного массива
        stroka[x][i] = (char*)malloc(N*sizeof(char));
    }


}


//printf("strcat %s \n", strcat("stroka00","0"));


//простое присваивание
strcpy(stroka[0][0],"stroka00");
strcpy(stroka[0][1],"stroka01");
strcpy(stroka[0][2],"stroka02");

strcpy(stroka[1][0],"stroka10");
strcpy(stroka[1][1],"stroka21");
strcpy(stroka[1][2],"stroka22");


//простой вывод
printf("00 %s\t",stroka[0][0]);	
printf("01 %s\t",stroka[0][1]);	
printf("02 %s\t",stroka[0][2]);	
printf("\n");
printf("10 %s\t",stroka[1][0]);	
printf("11 %s\t",stroka[1][1]);	
printf("12 %s\t",stroka[1][2]);
printf("\n");




//освобождение памяти
for(x=0;x<K;x++)
{	
       for(i=0;i<M;i++)
       {		
           free(stroka[x][i]);
       }
	free(stroka[x]);   
}
    free(stroka);




    return 0;
}





Освобождение памяти сделал аналогично выделению, но в обратном порядке.

Посмотрите пожалуйста, это рабочий вариант или опять я куда-то не туда зашел?


Еще остался один вопрос, ниже его напишу.


Почти верно, косяк тут
Код: plaintext
1.
    stroka[x] = (char**)malloc(M*sizeof(char));
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129775
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T
Уткъ
Есть прогресс.

Скомпилилировалось и даже пару раз отработало :-)

Вот что получилось:



Код: 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.
67.
68.
69.
70.
71.
72.
73.
74.
75.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define K 2 //количество строк
#define M 3 //количество столбцов
#define N 100 // максимальная длинна строки


int main()
{

    //переменные для итерации
    int i,j,x=0;

	//выделение памяти для 3-мерного массива
	char*** stroka = (char***)malloc(K*sizeof(char**));

for(x=0;x<K;x++)
{
	//выделение памяти для 2-мерного массива
    stroka[x] = (char**)malloc(M*sizeof(char));
	
    for(i=0;i<M;i++)
    {
		//выделение памяти для 1-мерного массива
        stroka[x][i] = (char*)malloc(N*sizeof(char));
    }


}


//printf("strcat %s \n", strcat("stroka00","0"));


//простое присваивание
strcpy(stroka[0][0],"stroka00");
strcpy(stroka[0][1],"stroka01");
strcpy(stroka[0][2],"stroka02");

strcpy(stroka[1][0],"stroka10");
strcpy(stroka[1][1],"stroka21");
strcpy(stroka[1][2],"stroka22");


//простой вывод
printf("00 %s\t",stroka[0][0]);	
printf("01 %s\t",stroka[0][1]);	
printf("02 %s\t",stroka[0][2]);	
printf("\n");
printf("10 %s\t",stroka[1][0]);	
printf("11 %s\t",stroka[1][1]);	
printf("12 %s\t",stroka[1][2]);
printf("\n");




//освобождение памяти
for(x=0;x<K;x++)
{	
       for(i=0;i<M;i++)
       {		
           free(stroka[x][i]);
       }
	free(stroka[x]);   
}
    free(stroka);




    return 0;
}





Освобождение памяти сделал аналогично выделению, но в обратном порядке.

Посмотрите пожалуйста, это рабочий вариант или опять я куда-то не туда зашел?


Еще остался один вопрос, ниже его напишу.


Почти верно, косяк тут
Код: plaintext
1.
    stroka[x] = (char**)malloc(M*sizeof(char));








Так должно быть?
Код: plaintext
1.
stroka[x] = (char**)malloc(M*sizeof(char*));
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129800
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ, дружище. Судя по профилю ты - Postgres-щик.

Тебе действительно очень надо кодить на сях? Я почему спрашиваю. Для админ- или девопс- задачек
можно задействовать целый спектр языков которые и проще и быстрее в освоении. Ruby, Python, e.t.c.

И драйвера и клиенты PG для них давно созданы.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129801
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
Уткъ, дружище. Судя по профилю ты - Postgres-щик.

Тебе действительно очень надо кодить на сях? Я почему спрашиваю. Для админ- или девопс- задачек
можно задействовать целый спектр языков которые и проще и быстрее в освоении. Ruby, Python, e.t.c.


Нужно сделать высоконагруженное приложение с парралельными запросами и копированием данных туда-сюда на огромное количество серверов (1000+)

Поэтому выбор пал на Си (+libpq), как родной язык для PostgreSQL.

В принципе, это все работало на psql+bash, но логика стала на столько сложна, что это пора выносить на уровень приложения.

У Си оказались свои особенности, с которыми потихоньку разбираюсь.

Хорошо этот раздел форума оказался живой и тут есть реальная помощь :-)

Ну и сами понимаете, Си - это что-то реальное, основательное.

Вот, к примеру, было непонятно кое-что с копированием данных - открыл исходник PostgreSQL и взял код прям оттуда, немного адаптировав под себя.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129803
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ
Пока нарисовал строки.

"A" - это 1 символ.

"А1" - это два символа, объединенных в одномерный массив

{"А1", "А2", "А3"} - это уже двумерный массив.

{"А1", "А2", "А3"}
{"B1", "B2", "B3"} - это трехмерный массив
{"C1", "C2", "C3"}


Сейчас с указателями попробую.
Рисунок не правильный. В памяти нету объема. Вся память компьютера это один большой листочек в клеточку. Плоский. Так что первые картинки - правильно, а последняя (трехмерный массив) это уже неправильно.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129804
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ
Так должно быть?
Код: plaintext
1.
stroka[x] = (char**)malloc(M*sizeof(char*));


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

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


Вот такой компилятор:
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44)

Странно, GCC очень дотошный, более мелкие ляпы отказывается компилировать. Надо попробовать.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129807
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ
mayton
Уткъ, дружище. Судя по профилю ты - Postgres-щик.

Тебе действительно очень надо кодить на сях? Я почему спрашиваю. Для админ- или девопс- задачек
можно задействовать целый спектр языков которые и проще и быстрее в освоении. Ruby, Python, e.t.c.


Нужно сделать высоконагруженное приложение с парралельными запросами и копированием данных туда-сюда на огромное количество серверов (1000+)

Поэтому выбор пал на Си (+libpq), как родной язык для PostgreSQL.

В принципе, это все работало на psql+bash, но логика стала на столько сложна, что это пора выносить на уровень приложения.

У Си оказались свои особенности, с которыми потихоньку разбираюсь.

Хорошо этот раздел форума оказался живой и тут есть реальная помощь :-)

Ну и сами понимаете, Си - это что-то реальное, основательное.

Вот, к примеру, было непонятно кое-что с копированием данных - открыл исходник PostgreSQL и взял код прям оттуда, немного адаптировав под себя.

Си это инструмент для написания драйверов и т.п. Я думал это студенческое творчество, типа задали сделать на чистом С, для этого потянет, а для реального ПО - нет.

Во-первых элементарно можно накосячить, например пропустил ты тут звездочку 22426622 , и вроде работает, а на самом деле ты такие себе грабли подложил что устанешь их искать когда наступишь. Ты выделил M байт (char 1 байт) вместо M*8 байт (char* 8 байт), таким образом ты будешь работать с памятью за пределами массива, и оно будет работать до какого-то момента. В лучшем случае словишь Segmentation fault, в худшем будешь удивляться почему меняются данные в совсем другой переменной.

Во-вторых то что мы с тобой сочинили тянет только на студенческую поделку, 100500 вызовов malloc() это тормоз и неэффективное использование памяти. Это надо оптимизировать, например как тут показывал 22426324

Возьми хотя бы С++, в нем есть все возможности С и более удобные средства управления памятью. По производительности они не отличаются. Хотя и это не лучший выбор, т.к. завтра ты захочешь распараллелить работу, а тут это нетривиально.
В идеале надо брать Java, Go, C# или что-то подобное, где скрыты все рутинные моменты и можно писать не сильно опасаясь выстрелов в ногу.

Тут тестировали скорость работы разных ЯП 21542058 только не зацикливайся на тех цифрах, там нагрузку на проц мерили, а у тебя на память и ввод/вывод, поэтому все ЯП будут одинаковы.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129809
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ
Нужно сделать высоконагруженное приложение с парралельными запросами и копированием данных туда-сюда на огромное количество серверов (1000+)
Ну так возьмите Java. Рантайм есть везде, драйвера к базам данных - тоже, но вы, при этом, не будете наступать на кучу разнообразных и совершенно неочевидных грабель.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129822
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T
Уткъ
Так должно быть?
Код: plaintext
1.
stroka[x] = (char**)malloc(M*sizeof(char*));


Да


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


Вот такой компилятор:
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44)

Странно, GCC очень дотошный, более мелкие ляпы отказывается компилировать. Надо попробовать.


Я по умолчанию запускаю gcc file.c -o file

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


Нужно сделать высоконагруженное приложение с парралельными запросами и копированием данных туда-сюда на огромное количество серверов (1000+)

Поэтому выбор пал на Си (+libpq), как родной язык для PostgreSQL.

В принципе, это все работало на psql+bash, но логика стала на столько сложна, что это пора выносить на уровень приложения.

У Си оказались свои особенности, с которыми потихоньку разбираюсь.

Хорошо этот раздел форума оказался живой и тут есть реальная помощь :-)

Ну и сами понимаете, Си - это что-то реальное, основательное.

Вот, к примеру, было непонятно кое-что с копированием данных - открыл исходник PostgreSQL и взял код прям оттуда, немного адаптировав под себя.

Си это инструмент для написания драйверов и т.п. Я думал это студенческое творчество, типа задали сделать на чистом С, для этого потянет, а для реального ПО - нет.

Во-первых элементарно можно накосячить, например пропустил ты тут звездочку 22426622 , и вроде работает, а на самом деле ты такие себе грабли подложил что устанешь их искать когда наступишь. Ты выделил M байт (char 1 байт) вместо M*8 байт (char* 8 байт), таким образом ты будешь работать с памятью за пределами массива, и оно будет работать до какого-то момента. В лучшем случае словишь Segmentation fault, в худшем будешь удивляться почему меняются данные в совсем другой переменной.

Во-вторых то что мы с тобой сочинили тянет только на студенческую поделку, 100500 вызовов malloc() это тормоз и неэффективное использование памяти. Это надо оптимизировать, например как тут показывал 22426324

Возьми хотя бы С++, в нем есть все возможности С и более удобные средства управления памятью. По производительности они не отличаются. Хотя и это не лучший выбор, т.к. завтра ты захочешь распараллелить работу, а тут это нетривиально.
В идеале надо брать Java, Go, C# или что-то подобное, где скрыты все рутинные моменты и можно писать не сильно опасаясь выстрелов в ногу.

Тут тестировали скорость работы разных ЯП 21542058 только не зацикливайся на тех цифрах, там нагрузку на проц мерили, а у тебя на память и ввод/вывод, поэтому все ЯП будут одинаковы.


Да там по сути простые операции, просто надо массив серверов и по ним подключения идут потом.
С++ да, рассматриваю.
Остальные вряд ли, т.к. требуется парралельное выполнение запросов, т.е. использование библиотеки libpq
+ надо чтоб компилился и под винду и под linux
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129827
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. Sidorov
Уткъ
Нужно сделать высоконагруженное приложение с парралельными запросами и копированием данных туда-сюда на огромное количество серверов (1000+)
Ну так возьмите Java. Рантайм есть везде, драйвера к базам данных - тоже, но вы, при этом, не будете наступать на кучу разнообразных и совершенно неочевидных грабель.


А что такое runtime?
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129829
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кстати, правильлно ли я понял что количество столбцов массива надо обязательно через константу присваивать, а количество строк можно из константы вывести в переменную?

Т.е. K вывести в переменную:

Код: plaintext
1.
2.
3.
#define K 2 //количество строк
#define M 3 //количество столбцов
#define N 100 // максимальная длинна строки
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129833
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ
А что такое runtime?
J(ava)R(untime)E(nvironment).
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129835
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что такое runtime?компоненты, библиотеки времени выполнения. Без Runtime код работать не будет
Условно
Для Java - это JRE
Для C# - .NET
и т.д.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129837
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex_Ustinov
А что такое runtime?
компоненты, библиотеки времени выполнения. Без Runtime код работать не будет
Условно
Для Java - это JRE
Для C# - .NET
и т.д.

Звучит довольно мерзко.


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



Код: 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;}
    }


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

Нужно сделать высоконагруженное приложение с парралельными запросами и копированием данных туда-сюда на огромное количество серверов (1000+)

В современном бизнес-программировании большая пропускная способность вобщем-то не зависит
от выбора языка разработки. А зависит от того насколько грамотно ты смог распараллелить
задачу на независимые части. Например разработчик AWS-Lambda делает бизнес-функцию затем
закидывает ее в облако и далее ее можно умножить на 1000 просто в конфиге. Много экземпляров
функции + грамотно партицированный S3 storage решают почти все мыслимые задачи.

Я не знаю что ты там надумал в плане с копированием 1000+ серверов но разработку POC можно
было вполне начать с Java, Python, Ruby, Node e.t.c. Все это прекрасно устанавливается на
современный Linux.

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

А менеджмент памяти языка С тебя похоронит надолго. Закопаешся просто.

Вот реально когда тебе понадобиться язык С - это когда например Java/Python уже перестанут успевать
с копированием данных и ты исчерпаешь все возможности их оптимизации. Но этой точки очень
сложно достигнуть. Обычно I/O является первым барьером для достижения ее.

Вот, к примеру, было непонятно кое-что с копированием данных - открыл исходник PostgreSQL и взял код прям оттуда, немного адаптировав под себя.
Сам факт копирования фрагмента кода приводит меня в изумление. Я думаю что копировать без контекста (без глобальных переменны)
нельзя. По моему только язык Форт позволял такое делать. Для языка С таким глобальным контекстом
по любому будет память, переменные библиотеки и объекты ОС. Поэтому то что ты копировал нужно
подвергнуть code-review.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129841
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ,

если "Hello word!" в консоли - то имхо ничего не надо
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129850
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ
Alex_Ustinov
пропущено...
компоненты, библиотеки времени выполнения. Без Runtime код работать не будет
Условно
Для Java - это JRE
Для C# - .NET
и т.д.


Звучит довольно мерзко.


А разве для выполнения скомпилированного exe файла на С# требуются какие-то запущенные процессы в ОС?

И для С это надо, и для С++.

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

Т.е. K вывести в переменную:

Код: plaintext
1.
2.
3.
#define K 2 //количество строк
#define M 3 //количество столбцов
#define N 100 // максимальная длинна строки


У тебя динамическое выделение памяти, можешь заменить константы на переменные.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129854
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;}
    }


}


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

Сам факт копирования фрагмента кода приводит меня в изумление. Я думаю что копировать без контекста (без глобальных переменны)
нельзя. По моему только язык Форт позволял такое делать. Для языка С таким глобальным контекстом
по любому будет память, переменные библиотеки и объекты ОС. Поэтому то что ты копировал нужно
подвергнуть code-review.
Я так подозреваю это был пример работы с либой libpq на С. Я так понял это либа для работы из С напрямую с PostgreSQL . Погуглил, примеры на С везде, как понимаю отсюда и родилось требование использовать С.

PS Если так, то С++ тоже справится, код править не придется.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129865
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ
А разве для выполнения скомпилированного exe файла на С# требуются какие-то запущенные процессы в ОС?
Вы не поверите, но "скомпилированному файлу" нужны (внешние) динамически компонуемые библиотеки (.dll/.so).
А линуксоиды не понимают своего счастья и до сих пор не включили Mono/NetCore в базовые компоненты своих дистрибутивов.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129884
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton

А менеджмент памяти языка С тебя похоронит надолго. Закопаешся просто.


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




mayton

Вот реально когда тебе понадобиться язык С - это когда например Java/Python уже перестанут успевать
с копированием данных и ты исчерпаешь все возможности их оптимизации. Но этой точки очень
сложно достигнуть. Обычно I/O является первым барьером для достижения ее.


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



mayton

Сам факт копирования фрагмента кода приводит меня в изумление. Я думаю что копировать без контекста (без глобальных переменны)
нельзя. По моему только язык Форт позволял такое делать. Для языка С таким глобальным контекстом
по любому будет память, переменные библиотеки и объекты ОС. Поэтому то что ты копировал нужно
подвергнуть code-review.


Да, конечно, я там переменные подправил, мне нужно было понять сам принцип, примеров не было, в итоге скопировал из исходника строчек 5 и переделал их под себя. )
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40129886
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex_Ustinov
Уткъ,

если "Hello word!" в консоли - то имхо ничего не надо


Хеллоу ворд - это вчерашний день.

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


нет.

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

Т.е. K вывести в переменную:

Код: plaintext
1.
2.
3.
#define K 2 //количество строк
#define M 3 //количество столбцов
#define N 100 // максимальная длинна строки


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


Супер!
...
Рейтинг: 0 / 0
Си. Освободить память 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
Си. Освободить память 2-мерного сторкового массива
    #40130577
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В последних версиях есть средства и потяжелее (топику не поможет, но может остальным=)

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

Alex_Ustinov-Wall И -Werror

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

И это - самый надёжный способ не упустить что-то важное, всё правильно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130590
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
получаем что - Werror перекроет - Wall (+ - Wextra )
получаем ИЛИ )
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130602
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, он не перекрывает, а дополняет. Без -Wall/extra он бесполезен, поскольку не
активизируется без наличия предупреждений. И сам по себе не повышает уровень
диагностики.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130611
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у меня так (какой то код вначале этого топика)
gcc-8.3.0 (Win10)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
g++.exe -Werror  -c Projects\111\main.cpp -o obj\Release\main.o
g++.exe  -o bin\Release\111.exe obj\Release\main.o   
\111\main.cpp: In function 'int main()':
\111\main.cpp:11:14: error: ISO C++ forbids converting a string constant to 'char*' [-Werror=write-strings]
   11 |     ip_var = "192.168.0.1";
      |              ^~~~~~~~~~~~~
cc1plus.exe: all warnings being treated as errors
Process terminated with status 1 (0 minute(s), 0 second(s))
1 error(s), 0 warning(s) (0 minute(s), 0 second(s))

...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130613
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Ustinovу меня так (какой то код вначале этого топика)
А без -Werror ты получаешь чистый вывод или то же самое в виде
предупреждения?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130622
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

предупреждение
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
g++.exe   -c Projects\111\main.cpp -o obj\Release\main.o
g++.exe  -o bin\Release\111.exe obj\Release\main.o   
Projects\111\main.cpp: In function 'int main()':
Projects\111\main.cpp:11:14: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
   11 |     ip_var = "192.168.0.1";
      |              ^~~~~~~~~~~~~
Output file is bin\Release\111.exe with size 322.79 KB
Process terminated with status 0 (0 minute(s), 0 second(s))
0 error(s), 1 warning(s) (0 minute(s), 0 second(s))

выше наврал
gcc version 9.2.0 (tdm64-1) CBlocks20
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130651
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Ustinov
у меня так (какой то код вначале этого топика)
gcc-8.3.0 (Win10)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
g++.exe -Werror  -c Projects\111\main.cpp -o obj\Release\main.o
g++.exe  -o bin\Release\111.exe obj\Release\main.o   
\111\main.cpp: In function 'int main()':
\111\main.cpp:11:14: error: ISO C++ forbids converting a string constant to 'char*' [-Werror=write-strings]
   11 |     ip_var = "192.168.0.1";
      |              ^~~~~~~~~~~~~
cc1plus.exe: all warnings being treated as errors
Process terminated with status 1 (0 minute(s), 0 second(s))
1 error(s), 0 warning(s) (0 minute(s), 0 second(s))

Ну правильно. С++ на такое смотрит косо. А С разрешает. Одно из различий между языками.
А если будешь внимательнее читать топик, то узнаешь что этот код рассчитывался именно на С.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130655
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Ustinovgcc version 9.2.0 (tdm64-1)

Кстати, эта версия имеет бага в обработке исключений на 64-х битах.
Скомпилированная программа крашится если адрес исключения выше четырёх гигабайт.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130657
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl
Ну правильно. С++ на такое смотрит косо. А С разрешает. Одно из различий между языками.
А если будешь внимательнее читать топик, то узнаешь что этот код рассчитывался именно на С.
если посмотреть внимательно о чем говорилось в конце - то речь об опциях компилятора ("с чем едят" -Werror) ... зачем спать за рулем?)

Dimitry SibiryakovКстати, эта версия имеет бага в обработке исключений на 64-х битах.давно не обновлялся, летом "сено косил")
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130658
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Ustinovдавно не обновлялся, летом "сено косил")

Десятка TDM вообще не работает, так что можно даже не пробовать. Я вернулся к
8.1 от MinGW-W64.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130709
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

8.1 тоже есть, рядом стоит
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130718
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Появилась проблема.

Нужно динамически сформировать имя переменной, типа такого:


Код: plaintext
1.
char*      conninfo_127.123.123.123=(char *)malloc(1000);




Этих переменных будет формироваться огромное количество и статически их задать не получится.

сами строки типа conninfo_127.123.123.123 я сформирую, но как потом сформированную строку объявить как переменную?

Подскажите пожалуйста.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130722
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Динамических имен переменных в Си нет. Для таких целей обычно используют ассоциативные массивы, но в Си их тоже нет.
Есть в С++ std::map и std::unordered_map
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130726
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T
Динамических имен переменных в Си нет. Для таких целей обычно используют ассоциативные массивы, но в Си их тоже нет.
Есть в С++ std::map и std::unordered_map


Ну смотрите:


Код: 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.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>



int main()
{

char* server5_ip="172.0.0.5";
char* conn_info=(char *)malloc(1000);


conn_info[0] = 0; //занулить

//собрать строку
strcat(conn_info,"conn_");
strcat(conn_info,server5_ip);


//выводит  conn_172.0.0.5
printf("conn_info: %s\n", conn_info);



//надо как-то conn_172.0.0.5
//объявить как:
// char*      conn_172.0.0.5=(char *)malloc(1000);


    return 0;
}
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130727
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,

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

Никак. Меняй постановку задачи. Начни с вопроса "зачем мне все эти переменные
нужны, да ещё и одновременно".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130729
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

Уткъно как потом сформированную строку объявить как переменную?

Никак. Меняй постановку задачи. Начни с вопроса "зачем мне все эти переменные
нужны, да ещё и одновременно".


они нужны для парралельных коннектов, которых может быть от 1 до 10000.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130730
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Похоже придется статически объявить и использовать поочереди, но это очень неудобно :(
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130731
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
объявить какое-то количество, равное сколько коннектов одновременно может выполняться, 100 например.

И использовать поочереди, но это очень неудобно :(
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130733
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъони нужны для парралельных коннектов, которых может быть от 1 до 10000.

А зачем нужны параллельные коннекты?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130734
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Повторяю, для таких целей используют ассоциативные массивы.
Схематично это выглядит так
Код: plaintext
1.
2.
3.
arr["172.0.0.5"] = "..."; //Присваиваешь

printf("%s\n", arr["172.0.0.5"]); // Используешь


Это в С++ так.

PS Имена переменных условны, во время работы они превращаются в адрес памяти, где хранится содержимое.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130741
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T
Повторяю, для таких целей используют ассоциативные массивы.
Схематично это выглядит так
Код: plaintext
1.
2.
3.
arr["172.0.0.5"] = "..."; //Присваиваешь

printf("%s\n", arr["172.0.0.5"]); // Используешь


Это в С++ так.

PS Имена переменных условны, во время работы они превращаются в адрес памяти, где хранится содержимое.


Все время забываю проусловность переменных )


Кстати, такая идея пришла:

Можно же стуктуру наверное использовать, точнее массив из структуры.

Там просто типы не только char*, но и специфичиские библиотечные типа буфера и тп.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130742
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

Уткъони нужны для парралельных коннектов, которых может быть от 1 до 10000.

А зачем нужны параллельные коннекты?


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

За счёт чего должно уменьшиться время выполнения программы?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130748
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

Уткъчтобы уменьшить время выполнения программы.

За счёт чего должно уменьшиться время выполнения программы?

За счет параллельных коннектов (и запросов).
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130755
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
УткъЗа счет параллельных коннектов (и запросов).

Каким образом коннекты и запросы станут параллельными?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130760
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

УткъЗа счет параллельных коннектов (и запросов).

Каким образом коннекты и запросы станут параллельными?

они будут вызваны параллельно.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130761
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так понимаю что эти настройки
- max_parallel *
- * processes

будут ограничивать любой параллелизм сверху.

https://www.postgresql.org/docs/current/how-parallel-query-works.html
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130763
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъони будут вызваны параллельно.

КАК?

API PostgeSQL синхронное, функция не вернётся пока не выполнит операцию.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130766
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

Уткъони будут вызваны параллельно.

КАК?

API PostgeSQL синхронное, функция не вернётся пока не выполнит операцию.




В том-то и дело что вернет.

Чтобы здесь не забивать лишней информацией топик, выслал вам на почту, указанную в профиле, информацию про параллельные запросы.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130767
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
Я так понимаю что эти настройки
- max_parallel *
- * processes

будут ограничивать любой параллелизм сверху.

https://www.postgresql.org/docs/current/how-parallel-query-works.html


Не, это когда уже запрос отправлен и он в несколько потоков выполняется.

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


PQsendQuery

Отправляет команду серверу, не ожидая получения результата .
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130769
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А подскажите, можно сдеать функцию, передай ей переменную и чтобы она эту переменную изменила так, чтобы измененная переменная была доступна в main() ?


У меня пока пулучилось передать в функию в переменную, она там считывается в локальную переменную функции и изменить эту переменную ы функции так. чтобы она и в в main() поменялась - не получается.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130770
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъвыслал вам на почту, указанную в профиле

В моём профиле не указана почта.

В любом случае - да, массив (даже обычный, а не ассоциативный) тебе поможет. Это
как раз и есть пачка слепленных вместе переменных.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130771
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чета как-то сложно всё. Вот мне в любой DBMS нужно например ее jdbc-драйвер, пул коннектов (типа Hikari),
и примитивы мультипоточки Future/Callable.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130773
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ
А подскажите, можно сдеать функцию, передай ей переменную и чтобы она эту переменную изменила так, чтобы измененная переменная была доступна в main() ?


У меня пока пулучилось передать в функию в переменную, она там считывается в локальную переменную функции и изменить эту переменную ы функции так. чтобы она и в в main() поменялась - не получается.

Можно, в параметрах передаешь указатель на переменную https://metanit.com/cpp/c/5.7.php
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130774
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ
mayton
Я так понимаю что эти настройки
- max_parallel *
- * processes

будут ограничивать любой параллелизм сверху.

https://www.postgresql.org/docs/current/how-parallel-query-works.html


Не, это когда уже запрос отправлен и он в несколько потоков выполняется.

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


PQsendQuery

Отправляет команду серверу, не ожидая получения результата .
Для параллельных запросов это тебе не поможет. Когда ты отправишь второй запрос таким образом - получишь ошибку "занято".
Чтобы действительно распараллелить запросы надо делать множество независимых коннектов к базе и посылать разные запросы через них. А там делаешь ты синхронные или асинхронные запросы уже не важно.

Асинхронный запрос очень удобен если тебе лень самостоятельно делать многопоточное приложение, а программа кроме ожидания ответа сервера должна делать что-то еще, например мигать надписью "ждем ответа от сервера уже Х секунд". Чтобы юзер не думал что ты завис.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130775
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

Уткъвыслал вам на почту, указанную в профиле

В моём профиле не указана почта.

В любом случае - да, массив (даже обычный, а не ассоциативный) тебе поможет. Это
как раз и есть пачка слепленных вместе переменных.



выслал сюда, наверное это не почта...


Массив, получается надо делать из структуры?


Т.к. там разные типы данных, довольно экзотические...
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130776
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T
Уткъ
А подскажите, можно сдеать функцию, передай ей переменную и чтобы она эту переменную изменила так, чтобы измененная переменная была доступна в main() ?


У меня пока пулучилось передать в функию в переменную, она там считывается в локальную переменную функции и изменить эту переменную ы функции так. чтобы она и в в main() поменялась - не получается.

Можно, в параметрах передаешь указатель на переменную https://metanit.com/cpp/c/5.7.php


Спасибо, читаю )
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130778
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl
Уткъ
пропущено...


Не, это когда уже запрос отправлен и он в несколько потоков выполняется.

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


PQsendQuery

Отправляет команду серверу, не ожидая получения результата .
Для параллельных запросов это тебе не поможет. Когда ты отправишь второй запрос таким образом - получишь ошибку "занято".
Чтобы действительно распараллелить запросы надо делать множество независимых коннектов к базе и посылать разные запросы через них. А там делаешь ты синхронные или асинхронные запросы уже не важно.

Асинхронный запрос очень удобен если тебе лень самостоятельно делать многопоточное приложение, а программа кроме ожидания ответа сервера должна делать что-то еще, например мигать надписью "ждем ответа от сервера уже Х секунд". Чтобы юзер не думал что ты завис.


Так, парралельные запросы это не 100500 запросов к одному серверу.

А 1 запрос к 100500 серверам.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130781
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ
Dima T
Повторяю, для таких целей используют ассоциативные массивы.
Схематично это выглядит так
Код: plaintext
1.
2.
3.
arr["172.0.0.5"] = "..."; //Присваиваешь

printf("%s\n", arr["172.0.0.5"]); // Используешь


Это в С++ так.

PS Имена переменных условны, во время работы они превращаются в адрес памяти, где хранится содержимое.


Все время забываю проусловность переменных )


Кстати, такая идея пришла:

Можно же стуктуру наверное использовать, точнее массив из структуры.

Там просто типы не только char*, но и специфичиские библиотечные типа буфера и тп.
Да, это делается массивом структур.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
struct pair {
    char *key;
    char *value;
};

struct pair *arr = malloc(sizeof(struct pair) * N);
arr[123].key = "172.0.0.5";
arr[123].value = "some other text";



а для нахождения делаешь цикл типа:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
struct pair *get_value(char *key) {
  struct pair *found_pair = NULL;
  for( int i=0; i<N; i++) {
     if( strcmp(arr[i].key, key) == 0) {
       found_pair = arr[i];
       break;
     }
  }
  if(found_pair) return found_pair.value;
  return NULL;
}
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130782
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Утк. Ты всех запутал. Это называется distributed .
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130783
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати задолго до 100500 сетевых коннектов количество портов на 1 ethernet интерфейс
резко закончится ... поэтому тут уж или Ишак сдохнет или Султан.

Я-бы предложил внести в топик более близкое к задаче число.

100? 1000?
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130784
wst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно начать с совсем приземленных вещей и спросить про готовность версии для 1 соединения.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130787
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ
White Owl
пропущено...
Для параллельных запросов это тебе не поможет. Когда ты отправишь второй запрос таким образом - получишь ошибку "занято".
Чтобы действительно распараллелить запросы надо делать множество независимых коннектов к базе и посылать разные запросы через них. А там делаешь ты синхронные или асинхронные запросы уже не важно.

Асинхронный запрос очень удобен если тебе лень самостоятельно делать многопоточное приложение, а программа кроме ожидания ответа сервера должна делать что-то еще, например мигать надписью "ждем ответа от сервера уже Х секунд". Чтобы юзер не думал что ты завис.


Так, парралельные запросы это не 100500 запросов к одному серверу.

А 1 запрос к 100500 серверам.
Если у тебя много серверов - то ты делаешь много коннектов. А к одному серверу или многим - без разницы.

Кстати, из личного опыта - это не обязательно ускоряет работу.
У меня была задача: из центрального офиса узнать состояние дел в филиалах. Из центрального офиса подключались к БД филиала, отправляли несколько запросов на итоговые суммы и отключались. Если база в филиалах работала как полагается, то весь цикл подключение-запрос-отключение укладывался в пару секунд. И последовательный опрос всех филиалов занимал около двух-трех минут. Проблемы были если филиал выключил свою БД или сеть до филиала упала - тогда подключение могло занять до полуминуты прежде чем выдать ошибку.
Сделали параллельные запросы ко всем филиалам разом - серьезно улучшили время работы если есть проблемы в сети, но примерно в три раза ухудшили работу если с филиалами нет проблем. Затык был в клиентской библиотеке подключения, она не могла держать более десятка подключений разом. Внутри самой библиотеки был "тайный" пул (в смысле не описанный в документации), и если в данный момент уже есть десять параллельных коннектов (не важно рабочих или нет) одиннадцатый будет висеть внутри connect() функции.
Впрочем, это было в 2005-ом и на другой БД. Что будет с Постгресом в 2022-ом - надо пробовать.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130798
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl
Уткъ
пропущено...


Так, парралельные запросы это не 100500 запросов к одному серверу.

А 1 запрос к 100500 серверам.
Если у тебя много серверов - то ты делаешь много коннектов. А к одному серверу или многим - без разницы.

Кстати, из личного опыта - это не обязательно ускоряет работу.
У меня была задача: из центрального офиса узнать состояние дел в филиалах. Из центрального офиса подключались к БД филиала, отправляли несколько запросов на итоговые суммы и отключались. Если база в филиалах работала как полагается, то весь цикл подключение-запрос-отключение укладывался в пару секунд. И последовательный опрос всех филиалов занимал около двух-трех минут. Проблемы были если филиал выключил свою БД или сеть до филиала упала - тогда подключение могло занять до полуминуты прежде чем выдать ошибку.
Сделали параллельные запросы ко всем филиалам разом - серьезно улучшили время работы если есть проблемы в сети, но примерно в три раза ухудшили работу если с филиалами нет проблем. Затык был в клиентской библиотеке подключения, она не могла держать более десятка подключений разом. Внутри самой библиотеки был "тайный" пул (в смысле не описанный в документации), и если в данный момент уже есть десять параллельных коннектов (не важно рабочих или нет) одиннадцатый будет висеть внутри connect() функции.
Впрочем, это было в 2005-ом и на другой БД. Что будет с Постгресом в 2022-ом - надо пробовать.


Ага, интересный случай.

Я этот способ использую давно, сейчас просто на Си решил переложить, так что сам метод опробованный.

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


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

Я-бы предложил внести в топик более близкое к задаче число.

100? 1000?


ну в райное 100-1000 в итоге думаю и будет.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130801
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl
Уткъ
пропущено...


Все время забываю проусловность переменных )


Кстати, такая идея пришла:

Можно же стуктуру наверное использовать, точнее массив из структуры.

Там просто типы не только char*, но и специфичиские библиотечные типа буфера и тп.
Да, это делается массивом структур.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
struct pair {
    char *key;
    char *value;
};

struct pair *arr = malloc(sizeof(struct pair) * N);
arr[123].key = "172.0.0.5";
arr[123].value = "some other text";



а для нахождения делаешь цикл типа:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
struct pair *get_value(char *key) {
  struct pair *found_pair = NULL;
  for( int i=0; i<N; i++) {
     if( strcmp(arr[i].key, key) == 0) {
       found_pair = arr[i];
       break;
     }
  }
  if(found_pair) return found_pair.value;
  return NULL;
}




..сейчас попробую сделать...

Спасибо )
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130805
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ
mayton
Кстати задолго до 100500 сетевых коннектов количество портов на 1 ethernet интерфейс
резко закончится ... поэтому тут уж или Ишак сдохнет или Султан.

Я-бы предложил внести в топик более близкое к задаче число.

100? 1000?


ну в райное 100-1000 в итоге думаю и будет.

Хорошо. Пускай пессиместично это будет до 1000 соединений с 1 клиента.

Но здесь у меня (к моему ужасу) возникает другой вопрос. Как ты будешь их координировать?
Нужно-ли сводить их результаты в 1 точку? Просто здесь нужна либо много unix-processes или threads.

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

Но здесь у меня (к моему ужасу) возникает другой вопрос. Как ты будешь их координировать?
Нужно-ли сводить их результаты в 1 точку? Просто здесь нужна либо много unix-processes или threads.

Беря во внимание что ты только недавно разбирался со строками. Тебе дальше надо разбираться
с темой еще более сложной.



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

Да, ему предстоит освоить циклы.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130834
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

maytonТебе дальше надо разбираться с темой еще более сложной.

Да, ему предстоит освоить циклы.


Циклы вроде были уже тут.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130835
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У тебя есть словесное описание всего алгоритма? Тоесть
Без всяких бизнес названий и секретной инфы.

Типа.

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

Типа.

1) Подконнектится к 1000 баз (в наличии должен быть список столько же хостов-паролей)
2) и т.д.



Да, конечно.

1) подключиться к 1 серверу, взять с него список ip (1000+).

2) На эти 1000+ прогрузить табличку около 200 тыс записей, маленькая в общем.

3) На этих 1000+ выполнить простой SQL запрос и собрать результат выполнения в одно место.



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

Передача char переменных в функци и обратно получилась нормльно, а специфических переменных (PGconn* и PGresult* ) что-то не получилось пока из функции вытащить, только в нее передались.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130843
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ
а специфических переменных (PGconn* и PGresult* ) что-то не получилось пока из функции вытащить, только в нее передались.

Это указатели, поэтому надо использовать указатели на указатели (PGconn** и PGresult** )
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130846
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ

==> 2) На эти 1000+ прогрузить табличку около 200 тыс записей, маленькая в общем.

3) На этих 1000+ выполнить простой SQL запрос и собрать результат выполнения в одно место.

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

Допустим у тебя 100 Мбит. И тогда каждая БД получит канал навроде 100 / 1000 = 0.1 Мбит
или 100 Килобит или 12 килобайт в секунду. Это скорость модема.

Если ты не хочешь пропорционально (будет например что-то типа Round-Robin) 10 работающих
при 980 ожидающих - то это будет более умная схема и более понятная.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130847
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу надёжности. Тут даже в датацентрах где виртуализация и внутрення сетка - всё равно
часть хостов отъезжают по разным причинам. Гарантировать-же оркестровку даже 100 хостов
офигенски сложно. Постоянно что-то не пингуется. Что-то недоступно. Где-то мигает канал.
То есть то нет. Где-то полоса пропускания упала.

Вобщем тут еще должно быть до чёрта технологий retry/reconnect. Ведение статусов хостов в отдельной
табличке.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130851
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Уткъ

==> 2) На эти 1000+ прогрузить табличку около 200 тыс записей, маленькая в общем.

3) На этих 1000+ выполнить простой SQL запрос и собрать результат выполнения в одно место.

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

Допустим у тебя 100 Мбит. И тогда каждая БД получит канал навроде 100 / 1000 = 0.1 Мбит
или 100 Килобит или 12 килобайт в секунду. Это скорость модема.

Если ты не хочешь пропорционально (будет например что-то типа Round-Robin) 10 работающих
при 980 ожидающих - то это будет более умная схема и более понятная.

ИМХО тут проще наоборот решать: данные из таблички в архиве кидаешь куда-нибудь в инет, а всем ожидающим ссылку на скачивание. Дальше все качают и заливают каждый в свою БД.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130857
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ

3) На этих 1000+ выполнить простой SQL запрос и собрать результат выполнения в одно место.

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

ИМХО тут проще наоборот решать: данные из таблички в архиве кидаешь куда-нибудь в инет, а всем ожидающим ссылку на скачивание. Дальше все качают и заливают каждый в свою БД.

Это при условии что у него единый шаблон обновления для всех баз.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130864
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T
Уткъ
а специфических переменных (PGconn* и PGresult* ) что-то не получилось пока из функции вытащить, только в нее передались.

Это указатели, поэтому надо использовать указатели на указатели (PGconn** и PGresult** )



Сделал в объявлении функции:

Код: plaintext
1.
my_funk(PGconn** conn_1, PGresult** res_1)



А при вызове функции
Код: plaintext
1.
my_funk(&conn_1, &res_1)



При этом в main они объявленны:

Код: plaintext
1.
2.
PGconn*    conn_1;
PGresult*  res_1;




Теперь передаются из функции обратно в main, надеюсь верно сделал.


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

==> 2) На эти 1000+ прогрузить табличку около 200 тыс записей, маленькая в общем.

3) На этих 1000+ выполнить простой SQL запрос и собрать результат выполнения в одно место.

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

Допустим у тебя 100 Мбит. И тогда каждая БД получит канал навроде 100 / 1000 = 0.1 Мбит
или 100 Килобит или 12 килобайт в секунду. Это скорость модема.

Если ты не хочешь пропорционально (будет например что-то типа Round-Robin) 10 работающих
при 980 ожидающих - то это будет более умная схема и более понятная.


Есть такое дело.

Тут уже не будет негативного влияния длинных запросов, как если бы это было сделано на psql, поэтому парралельность можно и уменьшать.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130866
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
По поводу надёжности. Тут даже в датацентрах где виртуализация и внутрення сетка - всё равно
часть хостов отъезжают по разным причинам. Гарантировать-же оркестровку даже 100 хостов
офигенски сложно. Постоянно что-то не пингуется. Что-то недоступно. Где-то мигает канал.
То есть то нет. Где-то полоса пропускания упала.

Вобщем тут еще должно быть до чёрта технологий retry/reconnect. Ведение статусов хостов в отдельной
табличке.


Пока на это можно не образать внимания, главное чтобы 95%-99% хостов были доступны.

если недоступен - просто пропускается.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130879
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
УткъТут уже не будет негативного влияния длинных запросов, как если бы это было
сделано на psql

С чего ты это взял? Твоя программа ничем не будет отличаться от десятков
параллельно запущенных psql.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130881
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проще осуществить обратную задачу - на серверах по "крону" отдать отчет на центральный сервер
ну если только это надо не по "щелчку клерка"
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130883
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кто то переизобретает колесо Заббикс
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130889
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl
Уткъ
пропущено...


Все время забываю проусловность переменных )


Кстати, такая идея пришла:

Можно же стуктуру наверное использовать, точнее массив из структуры.

Там просто типы не только char*, но и специфичиские библиотечные типа буфера и тп.
Да, это делается массивом структур.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
struct pair {
    char *key;
    char *value;
};

struct pair *arr = malloc(sizeof(struct pair) * N);
arr[123].key = "172.0.0.5";
arr[123].value = "some other text";



а для нахождения делаешь цикл типа:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
struct pair *get_value(char *key) {
  struct pair *found_pair = NULL;
  for( int i=0; i<N; i++) {
     if( strcmp(arr[i].key, key) == 0) {
       found_pair = arr[i];
       break;
     }
  }
  if(found_pair) return found_pair.value;
  return NULL;
}




Спасибо!

Это похоже на то что надо.




Ради теста объявил такую структуру:

Код: plaintext
1.
2.
3.
4.
struct pair {
    char* key;
    PGconn* conn;
};




Вот так массив объявил (причем если N даже 0 задать - все равно работает):

Код: plaintext
1.
struct pair *arr = malloc(sizeof(struct pair) * N);






Вот так элементы присваваются:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
arr[0].key = "172.0.0.1";
arr[0].conn = PQconnectdb("host=172.0.0.1 -U postgres");

arr[1].key = "172.0.0.2";
arr[1].conn = PQconnectdb("host=172.0.0.2 -U postgres");

arr[2].key = "172.0.0.3";
arr[2].conn = PQconnectdb("host=172.0.0.3 -U postgres");

//и т.д.



Причем коннекты в БД создаются успешно.


Ну это вообще то что надо!!!


Только сильно похоже на первый пост, где я пытался делать так:

Код: plaintext
1.
2.
3.
char* massive_var[0][0]; 
massive_var[0][0] = (char*)calloc(10000, sizeof(char));
massive_var[0][0] = "first_record";




Скажите, так (массив из структур) точно можно массив объявлять, без ссылок на ссылки и т.п. ?
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130890
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А есть в Postgres аналог DBMS_SCHEDULER или DBMS_JOB ?
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130891
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
А есть в Postgres аналог DBMS_SCHEDULER или DBMS_JOB ?


Прямо в голом постгрессе нет.

Есть какие-то поделки, я ими не пользовался.

крон удобнее.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130893
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Читаю про массивы структур. Это круто.

Но меня смущает что там ни где не выделяют и не высвобождают память:

https://metanit.com/cpp/c/6.4.php


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
#include <stdio.h>
 
struct person 
{
    int age;
    char name[20];
};
 
int main(void)
{
    struct person people[] = {23, "Tom", 32, "Bob", 26, "Alice", 41, "Sam"};
    int n = sizeof(people)/sizeof(people[0]);
    for(int i=0; i<n; i++)
    {
        printf("Name:%s \t Age: %d \n", people[i].name, people[i].age);
    }
    return 0;
}






Ну и меня насторажило что не выпало ни разу сегментайшн фаулт, с массивом структур.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130895
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То что ты делаешь похоже на координатор распределенных ... толи отчетов толи репликаций.

Мне кажется что в топике мы еще не исчерпали всех инженерных возможностей.
Cron мне кажется неудобным к использованию. Ну .. пускай админы с девопсами
его лупят. Для них - текстовые файлы - это native programming а для нас - нормальный
API имеет обычно вид вызова функции из твоего языка разработки.

Поэтому к чорту крон.

Вот если-бы на всех slave-машинах (я буду эту 1000 штук хостов называть slave) был поднят
какой-то Tomcat - тогда другое дело. Можно делать красивые задачи и чтоб сами slaves
ходили в центр и получали задачи и исполняли их.

Идея Димы - выкладывать на доступ табличку - хорошая. Я ее полностью поддерживаю.
Но это в рамках вашей инфраструктуры надо обсуждать. Не в торренты конечно кидать.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130896
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
То что ты делаешь похоже на координатор распределенных ... толи отчетов толи репликаций.

Мне кажется что в топике мы еще не исчерпали всех инженерных возможностей.
Cron мне кажется неудобным к использованию. Ну .. пускай админы с девопсами
его лупят. Для них - текстовые файлы - это native programming а для нас - нормальный
API имеет обычно вид вызова функции из твоего языка разработки.

Поэтому к чорту крон.

Вот если-бы на всех slave-машинах (я буду эту 1000 штук хостов называть slave) был поднят
какой-то Tomcat - тогда другое дело. Можно делать красивые задачи и чтоб сами slaves
ходили в центр и получали задачи и исполняли их.

Идея Димы - выкладывать на доступ табличку - хорошая. Я ее полностью поддерживаю.
Но это в рамках вашей инфраструктуры надо обсуждать. Не в торренты конечно кидать.


Да, конечно, в идеале все через веб вызовы.

Но на данном этапе выбрано такое архитектурное решение, довольно жесткое, но оно тут оправдано.

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



Код: plaintext
1.
2.
3.
4.
5.
6.
struct pair {
    char* key;
    PGconn* conn;
};

struct pair *arr = malloc(sizeof(struct pair) * N);




char* - это получается ссылка, для хранение строки в структуре это нормально или лучще как-нить так:

Код: plaintext
1.
2.
3.
4.
struct pair {
    char[100] key;
    PGconn* conn;
};
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130898
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не буду ничего советовать. Просто кажется что ты окончательно выбрал "C" как инструмент
написания этого Proof-Of-Concept, хотя по идее надо было его сналача обкатать даже на shell-скриптах или Python
и посмотреть где там что первое умрёт. Обежден что проблемы сетью и ошибки тебя похоронят. Просто закопаешся
в нюансах.

По мультипоточке - создай отдельный топик обязательно. Это будет длинная тема...
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130899
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
Не буду ничего советовать. Просто кажется что ты окончательно выбрал "C" как инструмент
написания этого Proof-Of-Concept, хотя по идее надо было его сналача обкатать даже на shell-скриптах или Python
и посмотреть где там что первое умрёт. Обежден что проблемы сетью и ошибки тебя похоронят. Просто закопаешся
в нюансах.

По мультипоточке - создай отдельный топик обязательно. Это будет длинная тема...


На баше отработано. Немного другая архитектура и нагрузка на сеть меньша раз в 20 примерно, но суть такая же.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130900
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ура, удалось получить Segmentation fault

когда закомментировал выделение памяти в массиве, что ожидаемо:

Код: plaintext
1.
struct pair *arr; // = malloc(sizeof(struct pair) * N);





Но настораживает отсутствие Segmentation fault даже когда N=0, даже когда прямо 0 прописываю:


Код: plaintext
1.
struct pair *arr = malloc(sizeof(struct pair) * 0);



все равно нет ошибок.

Не пойму почему так...
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130901
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
После каждого творческого эксперимента запускай свой бинарь под valgrind.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130902
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ

На баше отработано. Немного другая архитектура и нагрузка на сеть меньша раз в 20 примерно, но суть такая же.

Даже не буду спрашивать как вы там ошибки отрабатываете и retry-logic.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130905
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
Уткъ

На баше отработано. Немного другая архитектура и нагрузка на сеть меньша раз в 20 примерно, но суть такая же.

Даже не буду спрашивать как вы там ошибки отрабатываете и retry-logic.


чуть что kill -9 и все бояться и работает хорошо )
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130907
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы почти создали Erlang/OTP. Ну дай бог.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130925
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ
Ура, удалось получить Segmentation fault

когда закомментировал выделение памяти в массиве, что ожидаемо:

Код: plaintext
1.
struct pair *arr; // = malloc(sizeof(struct pair) * N);

Здесь неизвестно куда показывает указатель. Может показывать на доступную память, может показывать на недоступную. И раз у тебя упало - значит показывал туда, куда тебе лазить нельзя (в смысле в адресное пространство других процессов).


Уткъ

Но настораживает отсутствие Segmentation fault даже когда N=0, даже когда прямо 0 прописываю:


Код: plaintext
1.
struct pair *arr = malloc(sizeof(struct pair) * 0);



все равно нет ошибок.

Не пойму почему так...
А здесь ты задал указателю адрес в твоей родной куче и туда лазить можно.
Но ты что ты выделил ноль байт - означает что если ты начнешь в эту память писать - ты залезешь в пространство другого указателя который выдал тебе другой malloc();
Например:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
int *a = malloc(sizeof(int) * 3);
int *b = malloc(sizeof(int) * 0);
int *c = malloc(sizeof(int) * 3);
printf("a=%p b=%p c=%p\n", a, b, c);

for (int i=0; i<3; i++) {
   a[i] = 0;
   c[i] = 0;
}

b[1] = 123;

for(int i=0; i<3; i++) printf("a[%d] = %d\n", i, a[i]);
for(int i=0; i<3; i++) printf("c[%d] = %d\n", i, c[i]);

Чаще всего, ты обращаясь к b залезешь в память c, но может быть и в a - это зависит от менеджера памяти (который предоставляется твоим компилятором).
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130931
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ
Читаю про массивы структур. Это круто.

Но меня смущает что там ни где не выделяют и не высвобождают память:

https://metanit.com/cpp/c/6.4.php


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
#include <stdio.h>
 
struct person 
{
    int age;
    char name[20];
};
 
int main(void)
{
    struct person people[] = {23, "Tom", 32, "Bob", 26, "Alice", 41, "Sam"};
    int n = sizeof(people)/sizeof(people[0]);
    for(int i=0; i<n; i++)
    {
        printf("Name:%s \t Age: %d \n", people[i].name, people[i].age);
    }
    return 0;
}


Ну и меня насторажило что не выпало ни разу сегментайшн фаулт, с массивом структур.


Если кратко: память для переменных может выделятся на стеке и в куче . Когда явно выделяешь (malloc()), то выделяется в куче, неявно - на стеке. В основном на стеке располагаются локальные переменные, но ничто не мешает массив там расположить как в данном примере. Только имей ввиду что стек маленький, всего 1Мб обычно. Если будешь большие массивы там хранить, то словишь переполнение стэка (stack overflow)
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130943
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl
Уткъ
Ура, удалось получить Segmentation fault

когда закомментировал выделение памяти в массиве, что ожидаемо:

Код: plaintext
1.
struct pair *arr; // = malloc(sizeof(struct pair) * N);

Здесь неизвестно куда показывает указатель. Может показывать на доступную память, может показывать на недоступную. И раз у тебя упало - значит показывал туда, куда тебе лазить нельзя (в смысле в адресное пространство других процессов).


Уткъ

Но настораживает отсутствие Segmentation fault даже когда N=0, даже когда прямо 0 прописываю:


Код: plaintext
1.
struct pair *arr = malloc(sizeof(struct pair) * 0);



все равно нет ошибок.

Не пойму почему так...
А здесь ты задал указателю адрес в твоей родной куче и туда лазить можно.
Но ты что ты выделил ноль байт - означает что если ты начнешь в эту память писать - ты залезешь в пространство другого указателя который выдал тебе другой malloc();
Например:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
int *a = malloc(sizeof(int) * 3);
int *b = malloc(sizeof(int) * 0);
int *c = malloc(sizeof(int) * 3);
printf("a=%p b=%p c=%p\n", a, b, c);

for (int i=0; i<3; i++) {
   a[i] = 0;
   c[i] = 0;
}

b[1] = 123;

for(int i=0; i<3; i++) printf("a[%d] = %d\n", i, a[i]);
for(int i=0; i<3; i++) printf("c[%d] = %d\n", i, c[i]);

Чаще всего, ты обращаясь к b залезешь в память c, но может быть и в a - это зависит от менеджера памяти (который предоставляется твоим компилятором).


Теперь понятно, благодарю :-)
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130944
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T
Уткъ
Читаю про массивы структур. Это круто.

Но меня смущает что там ни где не выделяют и не высвобождают память:

https://metanit.com/cpp/c/6.4.php


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
#include <stdio.h>
 
struct person 
{
    int age;
    char name[20];
};
 
int main(void)
{
    struct person people[] = {23, "Tom", 32, "Bob", 26, "Alice", 41, "Sam"};
    int n = sizeof(people)/sizeof(people[0]);
    for(int i=0; i<n; i++)
    {
        printf("Name:%s \t Age: %d \n", people[i].name, people[i].age);
    }
    return 0;
}


Ну и меня насторажило что не выпало ни разу сегментайшн фаулт, с массивом структур.


Если кратко: память для переменных может выделятся на стеке и в куче . Когда явно выделяешь (malloc()), то выделяется в куче, неявно - на стеке. В основном на стеке располагаются локальные переменные, но ничто не мешает массив там расположить как в данном примере. Только имей ввиду что стек маленький, всего 1Мб обычно. Если будешь большие массивы там хранить, то словишь переполнение стэка (stack overflow)


Как все не просто оказалось, хорошо что 0 попробовал поставить.

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

типа

Код: plaintext
1.
2.
3.
4.
5.
6.
begin

пробуем что-то сделать

exception
end;
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130946
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ
Кстати, в чистом Си есть исключения?

типа

Код: plaintext
1.
2.
3.
4.
5.
6.
begin

пробуем что-то сделать

exception
end;


Нет. В С++ есть
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130953
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T
Уткъ
Кстати, в чистом Си есть исключения?

типа

Код: plaintext
1.
2.
3.
4.
5.
6.
begin

пробуем что-то сделать

exception
end;


Нет. В С++ есть


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



Ага....


Получается после каждой опасной команды надо статус выполнения проверять и обрабатывать если что-то нет так идет...
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130970
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Совершенно верно. Почти все функции kernel возвращают результат. В виде целого числа. Или в виде NULL/not NULL
указателя. И твоя обязанность как С-разработчика всегда проверять этот результат. Открыл файл через fopen - тут-же
проверил. Отпавил пачку данных в сокет через send - тут-же проверил на (-1) и так далее. С функциями libpq - тоже
самое. Проверяй вообще все что можно проверять.

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

Нет. В С++ есть


Жалко.
Ничуть. Исключения рулят, когда они поддержаны на уровне основных библиотек. А в C++ ошибки обычно ловят по возврату функции. Я, по делфийской привычке, поначалу в try catch код обертывал, а потом большими глазами смотрел в отладке, как у меня успешно считываются неадекватные значения из несуществующих полей БД и т.д.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130996
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Когда никто не выкидывает исключений - некому их и ловить.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40131008
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Когда блок catch ничего не делает - складывается ощущение что ... Все... Чики-пики
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40131017
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ
Пока нарисовал строки.
"A" - это 1 символ.
Уже неправильно - C API это ASCIIZ-строки, завершаемые нулевым байтом.
Если объявлять строку символов в тексте ("Ц"), то "компилятор умный" и нулевой байт добавит.
Если работать с char-массивами, то "плюсадын и (временами) \0". Как-то так.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40131509
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

в 1000 потоков не хочет:

connection to server failed: could not create socket: Too many open files

похоже коннекты как-то файлы занимают в ОС...




А подскажите что еще занимать файлы?
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40131528
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эта поведение не связано с С++. Особенности ОС linux.

Глянь как тут пишут https://stackoverflow.com/questions/880557/socket-accept-too-many-open-files
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40131532
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И даже не "особенности", а конфигурация защиты от дураков.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40131642
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
Эта поведение не связано с С++. Особенности ОС linux.

Глянь как тут пишут https://stackoverflow.com/questions/880557/socket-accept-too-many-open-files


Да, я понимаю это с С напрямую не связано.

Настройки в ОС поменял конечно-же сразу.

Но интересует, на что эти самые файлы расходуются?

Я подозреваю что на коннекты к БД .

А на что-нибудь еще может расходоваться?
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40131646
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут надо читать книжки по архитектуре Linux. Я точно всех типов не помню но кажется pipes, sockets, и файловые
дескрипторы - это один и тот-же тип ресурса с точки зрения Linux.

Почему их надо ограничивать? Ну наверное потому что это не просто целое число или указатель. Это какая-то структура
в памяти которая имеет размеры (очень актуально для TCP). И просто огульное использование открытых одновременно
файлов или сокетов может скушать память.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40131649
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кроме того сам PG-драйвер тоже на каждый сеанс может что-то аллоцировать. Переменные сеанса.
Буфера для батчинга. Тоесть не только TCP сокет но и еще некое неизвестное X умножается на 1000 в твоейм кейсе.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132526
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton,

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

Код: plaintext
1.
sleep(1) 


При компиляции для Linux и Windows - это 1 сек и 0.001 сек сотвественно.


Причем в виндоус sleep c большой буквы - Sleep.


Подскажите, может быть есть какая-то универсальная задержка и под вин и под линукс?


Если нет, то как это обходить?


Переменную объявлять что за ОС и в зависимости от нее ставить sleep(1) или Sleep(1000)
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132529
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Делай как тут https://stackoverflow.com/questions/6649936/c-compiling-on-windows-and-linux-ifdef-switch

Ну если с паузой ты выкрутился то с мультипоточкой такой фокус не прокатит. Слишком много всего
переделать надо будет. Лучше делай 2 версии софта под 2 платформы.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132533
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
Делай как тут https://stackoverflow.com/questions/6649936/c-compiling-on-windows-and-linux-ifdef-switch

Ну если с паузой ты выкрутился то с мультипоточкой такой фокус не прокатит. Слишком много всего
переделать надо будет. Лучше делай 2 версии софта под 2 платформы.


Понял, спасибо :-)
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132537
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
От sleep() в секундах мало пользы, обычно надо покороче паузы. Для этого в линуксе есть nanosleep()
Код: plaintext
1.
2.
3.
4.
5.
6.
void Sleep(int msec) {
    struct timespec t;
    t.tv_sec  =  msec / 1000;
    t.tv_nsec = (msec % 1000) * 1000000;
    nanosleep (&t, NULL);
}
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132546
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача же вроде бы была "сделать чтобы работало быстрее", нет?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132547
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T
От sleep() в секундах мало пользы, обычно надо покороче паузы. Для этого в линуксе есть nanosleep()
Код: plaintext
1.
2.
3.
4.
5.
6.
void Sleep(int msec) {
    struct timespec t;
    t.tv_sec  =  msec / 1000;
    t.tv_nsec = (msec % 1000) * 1000000;
    nanosleep (&t, NULL);
}



Да, я его тоже использую, вот так:

Код: plaintext
1.
nanosleep((const struct timespec[]){{0, 100000000L}}, NULL);
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132548
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov
Задача же вроде бы была "сделать чтобы работало быстрее", нет?..
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132549
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Делай как тут https://stackoverflow.com/questions/6649936/c-compiling-on-windows-and-linux-ifdef-switch

Ну если с паузой ты выкрутился то с мультипоточкой такой фокус не прокатит. Слишком много всего
переделать надо будет. Лучше делай 2 версии софта под 2 платформы.
pthreads переносима
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132553
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl
mayton
Делай как тут https://stackoverflow.com/questions/6649936/c-compiling-on-windows-and-linux-ifdef-switch

Ну если с паузой ты выкрутился то с мультипоточкой такой фокус не прокатит. Слишком много всего
переделать надо будет. Лучше делай 2 версии софта под 2 платформы.
pthreads переносима

Ну ОК. Просто не видел чтоб кто-то под Windows затаскивал такие порты.

Я не против тогда. Пускай берет pthreads.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132554
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я лично сделал наоборот: портировал _beginthreadex() на линух.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132557
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, а как ты реализовал

Код: plaintext
1.
EnterCriticalSection(...)



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

Ну ОК. Просто не видел чтоб кто-то под Windows затаскивал такие порты.

Я не против тогда. Пускай берет pthreads.
С mingw идет в коробке, я пробовал, под msvc есть в nuget да и вообще
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132567
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ

Да, я его тоже использую, вот так:

Код: plaintext
1.
nanosleep((const struct timespec[]){{0, 100000000L}}, NULL);


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

Я лично сделал наоборот: портировал _beginthreadex() на линух.

И в чём заключалось такое портирование? Просто как я понимаю _beginthreadex() настраивает Си-рантайм для MSVC.
Как вы это портировали не очень понятно.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132570
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonа как ты реализовалEnterCriticalSection
Это я не эмулировал, использую обёртку:
Код: sql
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.
class CriticalSection
{
#ifdef __WIN32__
	CRITICAL_SECTION s;
#else
     // Most likely fast mutex is enough, but as long as performance problems 
are not reported,
     // let's play safetly
     pthread_mutex_t m = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
#endif
public:
	CriticalSection(unsigned SpinCount = 0)
	{
#ifdef __WIN32__
         InitializeCriticalSectionAndSpinCount(&s, SpinCount);
#else
         (void)SpinCount;
         // pthread_mutex_init(); Not needed as mutex is initialized statically
#endif // __WIN32__
     }
	CriticalSection(const CriticalSection&) = delete;   // Cannot be copied
	CriticalSection(const CriticalSection&&) = delete;  // Cannot be moved

	~CriticalSection()
     {
#ifdef __WIN32__
         DeleteCriticalSection(&s);
#else
         pthread_mutex_destroy(&m); // Most likely no-op
#endif // __WIN32__
     }

	void enter()
     {
#ifdef __WIN32__
         EnterCriticalSection(&s);
#else
         assert_perror(pthread_mutex_lock(&m));
#endif // __WIN32__
     }

	void leave()
	{
#ifdef __WIN32__
         LeaveCriticalSection(&s);
#else
         assert_perror(pthread_mutex_unlock(&m));
#endif // __WIN32__
     }
};


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132572
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravИ в чём заключалось такое портирование?

Так же как с остальной пачкой используемого мною Win32 API: я открыл
спецификацию на MSDN и написал процедуру, реализующую этот функционал на линухе.

Мне сугубо всё равно что оно творит "унутре" себя на винде пока я могу просто
скомпилировать исходник своего приложения и получить тот же результат.

PS: В случае с критической секцией выше мне просто пока лень разбираться с футексами чтобы эмулировать busy wait.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132573
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А был-ли бенчмарк который сравнивает вот эти две реализации? На коротких потоках (от 100-200мс).


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
     {
#ifdef __WIN32__
         EnterCriticalSection(&s);
#else
         assert_perror(pthread_mutex_lock(&m));
#endif // __WIN32__
     }
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132578
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonА был-ли бенчмарк который сравнивает вот эти две реализации?

Не было. В моём приложении нет коротких потоков.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132580
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
А был-ли бенчмарк который сравнивает вот эти две реализации? На коротких потоках (от 100-200мс).


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
     {
#ifdef __WIN32__
         EnterCriticalSection(&s);
#else
         assert_perror(pthread_mutex_lock(&m));
#endif // __WIN32__
     }


А что означает «короткий поток»? Время жизни потока небольшое? Странная терминология.
И как от времени жизни потока может зависеть время блокирования мьютекса?
Теоретически, в определённых ситуация критическая секция выигрывает, потому что в начале использует спин лок.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132604
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну да. Про 200 мс это я конечно загнул. Надо чтоб поток хоть какую-то полезную задачу сделал.

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

Да, именно для этого в линухе футексы и комментарий в моём исходнике. Когда
придёт время для оптимизации - буду копаться.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132645
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
А был-ли бенчмарк который сравнивает вот эти две реализации? На коротких потоках (от 100-200мс).


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
     {
#ifdef __WIN32__
         EnterCriticalSection(&s);
#else
         assert_perror(pthread_mutex_lock(&m));
#endif // __WIN32__
     }


Если не путаю линуксовый мутекс не тоже самое что виндовый мутекс, он менее функционален, его в другой процесс не передашь.
Поэтому он по реализации ближе к критической сессии, может блокироваться без переключения в режим ядра, за счет этого быстрее.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132672
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
petrav
Уткъ

Да, я его тоже использую, вот так:

Код: plaintext
1.
nanosleep((const struct timespec[]){{0, 100000000L}}, NULL);


Это С++ конструкция такая или Си?


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




Под линукс все нормально скопилирвалось и работает.


Под виндоус скомпилировалось, но при запуске:

не удалось продолжить выполнение кода поскольку система не обнаружила LIBPQ.dll

При попытке зарегистрировать библиотеку:
regsvr32 "C:\Program Files\PostgreSQL\11\lib\libpq.dll"
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132674
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это я рано радовался то компилиться )))


Подскажите пожалуйста, как на windows обойти эту проблему с библиотекой?

Она существует по указанному пути, более того она используется постгрессом.

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



Maxim Boguk
Уткъ
мож как-то связано х32 и х64 ?

Не то чтобы вам никто не хочет отвечать но этот вопрос уже совсем оффтопик на этом форуме и просто специалистов нет.
Я последний раз что то под винду 22 года назад собирал.
Вам бы в сишный форум обратиться.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132679
bk0010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ

не удалось продолжить выполнение кода поскольку система не обнаружила LIBPQ.dll
При попытке зарегистрировать библиотеку:
regsvr32 "C:\Program Files\PostgreSQL\11\lib\libpq.dll"
Зачем вы ее пытаетесь регистрировать? Это не com-объект, это либа клиента postgres (ЕМНИП). Самое простое - пропишите к ней путь в path (В панели управления: Система-Дополнительные параметры системы-Переменные среды)
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132681
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
bk0010
Уткъ

не удалось продолжить выполнение кода поскольку система не обнаружила LIBPQ.dll
При попытке зарегистрировать библиотеку:
regsvr32 "C:\Program Files\PostgreSQL\11\lib\libpq.dll"
Зачем вы ее пытаетесь регистрировать? Это не com-объект, это либа клиента postgres (ЕМНИП). Самое простое - пропишите к ней путь в path (В панели управления: Система-Дополнительные параметры системы-Переменные среды)


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

Спасибо, есть продвижения!

Теперь жалуется на отсутсвие нескольких других dll

libssl-1_1-x64.dll
libcrypto-1_1-x64.dll
libintl-9.dll

Попробую их поискать.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132685
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уткъ
bk0010,

Спасибо, есть продвижения!

Теперь жалуется на отсутсвие нескольких других dll

libssl-1_1-x64.dll
libcrypto-1_1-x64.dll
libintl-9.dll

Попробую их поискать.



Есть просто


Код: plaintext
1.
2.
3.
libssl.lib
libcrypto.lib
libintl.lib



Без указания версии. И не ddl, а lib.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132696
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Друзья. Давайте без ёрничания.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132702
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема решилась добавлением в PATH другого каталога, а lib убрал.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132703
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Компилируется нормально, без ошибок а при запуске просто падает, вот с такой ошибкой.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132704
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я так понимаю это типа segmentation falls, только для виндоус...
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132738
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ
я так понимаю это типа segmentation falls, только для виндоус...

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

Да, оно. Подозреваю какой-нибудь вызов библиотеки вернул ошибку, ты ее не проверил и на следующем шаге вылетел.


все проще.

это антивирус.

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

Да, оно. Подозреваю какой-нибудь вызов библиотеки вернул ошибку, ты ее не проверил и на следующем шаге вылетел.


все проще.

это антивирус.

видно по логу касперского.

Трояны пишешь
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132812
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что было в логах от антивируса?
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132927
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
А что было в логах от антивируса?

Позрение на XXX где XXX это условное название какого-то абстрактного трояна. Устал бороться с этим. Прога лезет в инет - троян. Каспер-интернет-секьюрити самый жопский антивирус, даже добавление в исключения не помогает ((
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132928
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как вообще можно на Windows-машине разрабатывать на С++ сетевые приложухи в условиях что антивирус все таки
тоже должен работать? Это не к автору вопрос а вообще всем.

Поделитесь опытом.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132936
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
А как вообще можно на Windows-машине разрабатывать на С++ сетевые приложухи в условиях что антивирус все таки
тоже должен работать? Это не к автору вопрос а вообще всем.

Поделитесь опытом.

Адекватные антивирусы исключения не проверяют.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132953
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
А как вообще можно на Windows-машине разрабатывать на С++ сетевые приложухи в условиях что антивирус все таки
тоже должен работать? Это не к автору вопрос а вообще всем.

Поделитесь опытом.


Например: https://support.microsoft.com/ru-ru/windows/добавление-исключения-в-систему-безопасность-windows-811816c0-4dfd-af4a-47e4-c301afe13b26#:~:text=Выберите Пуск > Параметры > Обновление и,нажмите Добавление или удаление исключений.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132985
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нормально все у KIS
добавляю в доверенные exe шник, ставлю все галки - не следить за дочерним не проверять открываемые не ограничивать родительские процессы и т.д
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40132987
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T
Уткъ
пропущено...


все проще.

это антивирус.

видно по логу касперского.

Трояны пишешь


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

Причем, если эту строку закомментировать, то антивирус не паникует.

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


В логах касперского:



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Программа:     Windows Problem Reporting
Пользователь:     (Активный пользователь)
Компонент:     Предотвращение вторжений
Результат:     Разрешено: Остановка других процессов
Действие:     Остановка процесса
Причина:     Остановка других процессов


Программа:     ххх.exe
Пользователь:     (Активный пользователь)
Компонент:     Предотвращение вторжений
Действие:     Программа помещена в группу
Объект:     Слабые ограничения
Причина:     Не удалось определить группу доверия




Я вообще об антивирусе без мата с трудом могу говорить :-)))
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40133086
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне было просто интересно какое действие Касперский посчитал вредоносным. Открытие сетевого сокета наружу?
Или просто ты полез в память чужих процессов?

Это просто было-бы полезно тебе знать для дальшейшей разработки. А мат тут не нужен. Антивирус просто делает
свою работу. Или быть может у тебя есть советы к антивирусу как ему различать твою полезную прогу от какого-нибудь
бэкдора. Просто когда ты займешся дистрибуцией своей утилиты - теже проблемы возникнут на хостах и их надо
как-то единообразно фиксить. Список файловых исключений - вариант. А может не только это вариант.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40133090
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

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



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

Требующий остановки других приложений, ага...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40133176
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

Уткътам был забор данных с другого сервера.

Требующий остановки других приложений, ага...


Поясните.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40133178
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, извиняюсь, невнимательно прочёл логи, не заметил, что первая запись относится
к WER.

Падение твоей программы не имеет ничего общего с аантивирусом.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40133186
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

А, извиняюсь, невнимательно прочёл логи, не заметил, что первая запись относится
к WER.

Падение твоей программы не имеет ничего общего с аантивирусом.


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

К багу в ней. Запускай под отладчиком, смотри call stack при падении.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134201
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

Уткъа к чему имеет?

К багу в ней. Запускай под отладчиком, смотри call stack при падении.


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


Пытаюсь забить программу на несколько файлов.

Надо объявить структуру чтобы она была доступна во всех частях программы (разные файлы)


Было вот так:


main.c

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
#include "header.h"

#define N 1500



int main()
{



struct pair {
	char* name;
	char* ip;
};

struct pair *arr = malloc(sizeof(struct pair) * N);



	return 0;
}





header.h

Код: plaintext
1.
2.
3.
4.
5.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <libpq-fe.h>
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134205
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
выношу в header:


header.h
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <libpq-fe.h>

struct pair {
	char* name;
	char* ip;
};




в main остается:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
#include "header.h"

#define N 1500



int main()
{

struct pair *arr = malloc(sizeof(struct pair) * N);



	return 0;
}





И нормально работает.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134206
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
но как только дописываю

extern

к определению структуры в header.h


Код: plaintext
1.
2.
3.
4.
extern struct pair {
	char* name;
	char* ip;
};



возникает ошибка:

data_control.h:22:8: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘struct’
exterm struct pair {



Подскажите пожалуйста как правильно определить структуру в заголовочном файле, и главном чтобы она была доступна из любого другого файла проекта?
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134207
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ
И нормально работает.

Почему оно не должно работать? Оба варианта верны.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134208
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T
Уткъ
И нормально работает.

Почему оно не должно работать? Оба варианта верны.



А с точки зрения доступность из других файлов, это нормальный вариант, без extern ?
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134209
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ
но как только дописываю

extern

к определению структуры в header.h


Код: plaintext
1.
2.
3.
4.
extern struct pair {
	char* name;
	char* ip;
};



возникает ошибка:

data_control.h:22:8: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘struct’
exterm struct pair {



Подскажите пожалуйста как правильно определить структуру в заголовочном файле, и главном чтобы она была доступна из любого другого файла проекта?

extern убери, он у тебя лишний. extern обозначает что искать объявление в другом месте.

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

extern

к определению структуры в header.h


Код: plaintext
1.
2.
3.
4.
extern struct pair {
	char* name;
	char* ip;
};



возникает ошибка:

data_control.h:22:8: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘struct’
exterm struct pair {



Подскажите пожалуйста как правильно определить структуру в заголовочном файле, и главном чтобы она была доступна из любого другого файла проекта?

extern убери, он у тебя лишний. extern обозначает что искать объявление в другом месте.

PS Ты бы книжку какую почитал, это азы.



Я просто про переменные читал, что их надо extern делать.

Ну читать еще и читать )))

Большое спасибо!!!
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134211
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В начале каждого .h файла ставь
Код: plaintext
1.
#pragma once


это чтобы препроцессор дважды не включил твой .h

И про препроцессор почитай
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134216
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T
В начале каждого .h файла ставь
Код: plaintext
1.
#pragma once


это чтобы препроцессор дважды не включил твой .h

И про препроцессор почитай


включил.

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

Багу достаточно одной. Трёх - мало для осмысленного функционирования программы,
работающей с БД.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134219
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,

еще такой вопрос, тестирую сколько памяти может выделиться для структуры:


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
#include "header.h"

#define N 1500



int main()
{

struct pair *arr = malloc(sizeof(struct pair) * N);
if (NULL == arr ) {printf("Memory does not given.\n");exit(1);}


	return 0;
}





Если ставлю в 1000000 раз больше, то память не выделяется:


Код: plaintext
1.
struct pair *arr = malloc(sizeof(struct pair) * N * 1000000);




Но это же не обльше чем память на сервере, на сервере 8 Гб доступно, а они не выделяются.

Я так понимаю это идет занятие памяти стека, а она маленькая.

Подскажите пожалуйста как воспользоваться не памятью стека при выделении, а общей памятью на сервере?

Ну или я что-то путаю (
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134228
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты не указал какой битности у тебя код. Будем считать что x64, тогда sizeof(struct pair) = 16 байт, и всего
Код: plaintext
1.
sizeof(struct pair) * N * 1000000 = 24 000 000 000


24 Гб свободной памяти у тебя просто нет, как минимум поэтому не дает выделить столько памяти.

В 32-битных было просто, адресное пространство процесса позволяет выделить максимум 1.7 Гб, и они выделялись даже если памяти не хватало, остальное свопилось.

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

Код: plaintext
1.
2.
3.
4.
struct pair {
	char* name;
	DWORD32 ip;
};



Это сэкономит память. Есть формулы трансляции из строк типа "192.168.0.1" в целые числа и обратно.

Но мне кажется что тебе не стоит сразу кушать слона. Поработай хотя-бы с 1000 штук таких пар.
Отшлифуй просто корректную работу. А уже потом - растягивай до мильярдов.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134234
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
УткъНу или я что-то путаю (

Ты, как и в остатке топика, путаешь всё. Абсолютно всё. Вследствие хронического
незнания азов функционирования компьютера.

Даже если бы sizeof(pair) было 1 байт, то ты пытался бы выделить 1500000000
байт. Что, внезапно, полтора гигабайта. У тебя pair - 16 байт. Простая
арифметика и вуаля - мы видим попытку выделить 24 гигабайта при доступных восьми.

Но, как верно упомянул тёзка, тебе мог бы прийти на помощь своп. Если бы ты не
пытался скомпилировать 32-х разрядное приложение, где sizeof(pair) - 8 байт. Что
сокращает потуги до 12 гигабайт при максимально доступном адресном пространстве
в четыре (практически не более двух, максимум трёх).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134239
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T
Ты не указал какой битности у тебя код. Будем считать что x64, тогда sizeof(struct pair) = 16 байт, и всего
Код: plaintext
1.
sizeof(struct pair) * N * 1000000 = 24 000 000 000


24 Гб свободной памяти у тебя просто нет, как минимум поэтому не дает выделить столько памяти.

В 32-битных было просто, адресное пространство процесса позволяет выделить максимум 1.7 Гб, и они выделялись даже если памяти не хватало, остальное свопилось.

В x64 адресное пространство не ограничивает, поэтому придуманы какие-то хитрые алгоритмы искусственного ограничения, т.к. одна кривая прога запросто может занять всю память и своп в придачу. Какие ограничения, как их обходить, я не вникал, в каждой ОС свои правила.


Ого, я не думал что прям 24 гига....

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

Спасибо за разьяснение.

Раз вся память доступна - это хорошо!
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134240
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

УткъНу или я что-то путаю (

Ты, как и в остатке топика, путаешь всё. Абсолютно всё. Вследствие хронического
незнания азов функционирования компьютера.

Даже если бы sizeof(pair) было 1 байт, то ты пытался бы выделить 1500000000
байт. Что, внезапно, полтора гигабайта. У тебя pair - 16 байт. Простая
арифметика и вуаля - мы видим попытку выделить 24 гигабайта при доступных восьми.

Но, как верно упомянул тёзка, тебе мог бы прийти на помощь своп. Если бы ты не
пытался скомпилировать 32-х разрядное приложение, где sizeof(pair) - 8 байт. Что
сокращает потуги до 12 гигабайт при максимально доступном адресном пространстве
в четыре (практически не более двух, максимум трёх).


я немного туповат просто (

прошу принять это и простить.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134241
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
Вместо ip можно поставить беззнаковое целое число.

Код: plaintext
1.
2.
3.
4.
struct pair {
	char* name;
	DWORD32 ip;
};



Это сэкономит память. Есть формулы трансляции из строк типа "192.168.0.1" в целые числа и обратно.

Но мне кажется что тебе не стоит сразу кушать слона. Поработай хотя-бы с 1000 штук таких пар.
Отшлифуй просто корректную работу. А уже потом - растягивай до мильярдов.


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

https://docs.microsoft.com/en-us/windows/win32/api/ws2tcpip/nf-ws2tcpip-inet_pton
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134248
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А потом ещё можно почитать про getaddrinfo() и IPv6. И выкинуть всю эту
массивную фигню чуть более чем целиком, потому что для задачи она не нужна.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134274
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Непонятная ситуация:

вот файл

header.h

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <libpq-fe.h>

struct pair {
	char* name;
	char* ip;
};




Создал функцию в отдельном файле:


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
#include "header.h"

int get_retails()
}
    printf("Я функция\n");
	return 0;
}





При компиляции пишет:

error: expected declaration specifiers before ‘printf’
printf("здравствуй, мир\n");


Как буд-то

Код: plaintext
1.
#include <stdio.h>



не прописан в новом файле.

Но он же должен подтягиваться из заголовочного файла строчкой:

Код: plaintext
1.
#include "header.h"



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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
#include "header.h"

int get_retails()
}
    printf("Я функция\n");
	return 0;
}



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

Ты в среде разработки пишешь?


А вот оно в чем дело...


Поменял на { - все скомпилировалось!

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


Ты в среде разработки пишешь?


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


Ты в среде разработки пишешь?


не, я в блокноте пишу.

вижуал студию поставь, писать научишься - продолжишь в блокноте
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134378
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я начинал с Borland C++ под DOS но я не помню была ли там подсветка парных bracers?

Кто помнит?
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134405
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Я начинал с Borland C++ под DOS но я не помню была ли там подсветка парных bracers?

Кто помнит?
Нет, точно нет. Там была раскраска ключевых слов, но динамической подсветки парных скобок не было.

Впрочем, она появилась довольно давно - в lisp-машинах, и кажется еще в 80-х. Но точно, не уверен.
Я сам ей пользоваться начал только в начале века, в FAR. Когда colorer набрал популярность.
А потом и всяческие IDE подтянулись.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134430
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl
Я сам ей пользоваться начал только в начале века, в FAR. Когда colorer набрал популярность.

Нынче colorer по умолчанию с Far ставится. Еще есть notepad++, там тоже подсветка синтаксиса.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134745
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброе утро.

Столкнулся с непонятной ситуацией.

Заменил тип в структуре с char* на int и память для ячейки структуры перестала выделяться.

Вот такая структура и массив из структур:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
struct pair {
	char* name;
	char* ip;
        int status;
};

struct pair *arr;






Было так на i-м шаге в цикле:
Код: plaintext
1.
arr[i].status=(char*)malloc(10*sizeof(char*));






Стало так:
Код: plaintext
1.
arr[i].status=(int)malloc(sizeof(int));




Ошибка вот такая:

warning: cast from pointer to integer of different size



Но когда полностью убрал выделение памяти - скомпилировалось и работает.

Скажите, это нормально, не выделять память для int в массиве структур?
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134750
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Под примитивные типы не надо выделять память. Они уже есть в структуре как ее часть.


Код: plaintext
1.
arr[i].status=42;
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134762
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
Под примитивные типы не надо выделять память. Они уже есть в структуре как ее часть.


Код: plaintext
1.
arr[i].status=42;




Получается под char тоже не надо, только под char*

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

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

Я так делал когда был студентом и изучал Borland C++.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134764
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ
Ошибка вот такая:

warning: cast from pointer to integer of different size



Но когда полностью убрал выделение памяти - скомпилировалось и работает.

Скажите, это нормально, не выделять память для int в массиве структур?

Ты утечку памяти устроил, компилятор об этом предупредил.

Если у тебя указатель (тип со звездочкой*), то это адрес в памяти где лежат данные этого типа (или массив). Без звездочки (не указатель) это уже выделенное место в памяти под переменную данного типа. Т.е. если у тебя тип int, то дополнительно ничего выделять не надо.

Указатель это тоже переменная, под нее тоже сразу выделяется память (8 байт в x64) и в эту память пишется адрес на который указывает указатель, т.е. тот адрес который вернет malloc() в твоем коде.

PS Про указатели почитай https://metanit.com/cpp/c/5.1.php
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40134795
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton, Dima T, впитываю информацию, спасибо :-)
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40136844
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброе утро.

Появилась вот такая проблема:

в строку

Код: plaintext
1.
char* str_temp;



попадает значение из функции

Код: plaintext
1.
PQerrorMessage(conn); 



типа:

Код: plaintext
1.
"...port 5432 failed: &#9618;&#9618;&#9618;&#9618;&#9618;:  &#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618; "postgres" &#9618;&#9618; &#9618;&#9618;&#9618;&#9618;&#9618; &#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618; &#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618; (&#9618;&#9618; &#9618;&#9618;&#9618;&#9618;&#9618;&#9618;)..."



А потом я пытаюсь это вставить в sql запрос и выпадает ошибка:

что строка содержит символ, не соответствующий utf-8


пытался обрезать строку до одного символа:

Код: plaintext
1.
strlcpy(str_temp, PQerrorMessage(conn), 1);




о там получается 1 нормльный символ, а потом еще како-то спецсимвол и такая же ошибка с utf-8



Подскажите пожалуйста как привести строку в соответствие с utf-8 ?
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40137275
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уткъ
Доброе утро.

Появилась вот такая проблема:

в строку

Код: plaintext
1.
char* str_temp;



попадает значение из функции

Код: plaintext
1.
PQerrorMessage(conn); 



типа:

Код: plaintext
1.
"...port 5432 failed: &#9618;&#9618;&#9618;&#9618;&#9618;:  &#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618; "postgres" &#9618;&#9618; &#9618;&#9618;&#9618;&#9618;&#9618; &#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618; &#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618;&#9618; (&#9618;&#9618; &#9618;&#9618;&#9618;&#9618;&#9618;&#9618;)..."



А потом я пытаюсь это вставить в sql запрос и выпадает ошибка:

что строка содержит символ, не соответствующий utf-8


пытался обрезать строку до одного символа:

Код: plaintext
1.
strlcpy(str_temp, PQerrorMessage(conn), 1);




о там получается 1 нормльный символ, а потом еще како-то спецсимвол и такая же ошибка с utf-8



Подскажите пожалуйста как привести строку в соответствие с utf-8 ?



Думаю посимвольно строку перебрать и оставить только те символы, которые к utf-8 относятся.

Но как понять относится символ к utf-8 или нет?
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40137286
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Покажи код. Декодировать вручную utf-8 не нужно. Что-то выше по коду было не так.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40137294
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
Покажи код. Декодировать вручную utf-8 не нужно. Что-то выше по коду было не так.


Тут дело такое.

Весь код довольно большой и слабочитаемый, тем более там специфическая библиотека. Особо нет смысла его приводить.

Код устроен так:

1) в char* переменную считывается сообщение об ошибке из функции libpq - PQerrorMessage().

2) это сообщение содержит руские буквы и спецсимволы.

3) формирую запрос на INSERT в БД. И в него через strcat() вставляю это сообщение.

4) ошибка об utf-8 именно от БД postgresql , её не Си выдает.

Получается, если сообщение об ошибке на английском - INSERT в БД проходит без проблем.
Если на русском, то он не проходит и программа работает дальше, просто нет записи в БД.
Надеюсь передал суть проблемы )


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

Код: plaintext
1.
postgresql://host1:123/............&client_encoding=
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40137311
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ
Задача: обработать эту переменную со спецсимволами, убрав их.
Оставить только символы, которые есть в utf-8

Все символы с кодами от 32 до 127 одинаковы в кодировке ANSI и UTF-8, остальные убрать можно так:
Код: plaintext
1.
2.
3.
for(char* p = str_temp;*p != 0; p++) {
    if(*p < 32) p = '?';
}


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

Все символы с кодами от 32 до 127 одинаковы в кодировке ANSI и UTF-8, остальные убрать можно так:
Код: plaintext
1.
2.
3.
for(char* p = str_temp;*p != 0; p++) {
    if(*p < 32) p = '?';
}


но так ты все русские буквы на вопросики заменишь.



Вопросики - не страшно.

Это похоже то что нужно.

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

Код: plaintext
1.
postgresql://host1:123/............&client_encoding=




Спасибо, проверю отпишусь.

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

Все символы с кодами от 32 до 127 одинаковы в кодировке ANSI и UTF-8, остальные убрать можно так:
Код: plaintext
1.
2.
3.
for(char* p = str_temp;*p != 0; p++) {
    if(*p < 32) p = '?';
}


но так ты все русские буквы на вопросики заменишь.




Ура, сработало!


Правда немного изменил:

Код: plaintext
1.
2.
3.
4.
5.
6.
char* str_temp=(char *)malloc(5000);
char* p=(char *)malloc(5000);

for(p = str_temp;*p != 0; p++) {
    if(*p < 32) {*p = '?';}
}



Большое спасибо!

Чуть позднее еще с кодировкой попробую.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40137380
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ

Правда немного изменил:

Код: plaintext
1.
2.
3.
4.
5.
6.
char* str_temp=(char *)malloc(5000);
char* p=(char *)malloc(5000);

for(p = str_temp;*p != 0; p++) {
    if(*p < 32) {*p = '?';}
}

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

Код: plaintext
1.
2.
3.
4.
5.
6.
char* str_temp=(char *)malloc(5000);
char* p=(char *)malloc(5000); // Как эту память освободить собираешься?

for(p = str_temp;*p != 0; p++) {
    if(*p < 32) {*p = '?';}
}



Большое спасибо!

Чуть позднее еще с кодировкой попробую.

Ничего что ты утечку памяти устроил?
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40137446
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl
Уткъ

Правда немного изменил:

Код: plaintext
1.
2.
3.
4.
5.
6.
char* str_temp=(char *)malloc(5000);
char* p=(char *)malloc(5000);

for(p = str_temp;*p != 0; p++) {
    if(*p < 32) {*p = '?';}
}

Маладэц! Организовал утечку памяти.
Компилятор на такое, кстати, ругаться должен. Ты эту ругань проигнорировал?



А из-за чего утечка?

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

Код: plaintext
1.
2.
3.
4.
5.
6.
char* str_temp=(char *)malloc(5000);
char* p=(char *)malloc(5000); // Как эту память освободить собираешься?

for(p = str_temp;*p != 0; p++) {
    if(*p < 32) {*p = '?';}
}



Большое спасибо!

Чуть позднее еще с кодировкой попробую.

Ничего что ты утечку памяти устроил?


Даже не представляю как правильно для нее free() сделать... думал после цикла где-нить.

А как ее освободить чтобы она не утекала?
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40137466
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
free нужно делать в момент когда память тебе уже не нужна. Где конкретно в твоем код - это нам не ведомо.

Ты-же хитрец. Всё не показал.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40137477
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ
Dima T
пропущено...

Ничего что ты утечку памяти устроил?


Даже не представляю как правильно для нее free() сделать... думал после цикла где-нить.

А как ее освободить чтобы она не утекала?

Как ты ее освободишь после цикла если ты указатель совсем в другое место направил?
Код: plaintext
1.
for(p = str_temp;*p != 0; p++) {


Ты потерял адрес, по которому была выделена память.

И начинать надо с того зачем ты вообще память выделял?

Подозреваю просто из-за собственной глупости.
Забыл что тебе лень книжки читать, так лучше напиши, без указателей
Код: plaintext
1.
2.
3.
for(int i = 0 ;str_temp[i] != 0; i++) {
    if(str_temp[i] < 32) {str_temp[i] = '?';}
}


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


Даже не представляю как правильно для нее free() сделать... думал после цикла где-нить.

А как ее освободить чтобы она не утекала?

Как ты ее освободишь после цикла если ты указатель совсем в другое место направил?
Код: plaintext
1.
for(p = str_temp;*p != 0; p++) {


Ты потерял адрес, по которому была выделена память.

И начинать надо с того зачем ты вообще память выделял?

Подозреваю просто из-за собственной глупости.
Забыл что тебе лень книжки читать, так лучше напиши, без указателей
Код: plaintext
1.
2.
3.
for(int i = 0 ;str_temp[i] != 0; i++) {
    if(str_temp[i] < 32) {str_temp[i] = '?';}
}


результат будет такой же 22440612



Так даже понятнее :-)


Да, это моя собственная глупость, мож через какое-то время чуток поумнею )

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

Ты-же хитрец. Всё не показал.


Да, я просто в конце ее освождаю.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40137556
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TИ начинать надо с того зачем ты вообще память выделял?

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


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