|
Си. Освободить память 2-мерного сторкового массива
|
|||
---|---|---|---|
#18+
Уткъ Пока нарисовал строки. "A" - это 1 символ. "А1" - это два символа, объединенных в одномерный массив {"А1", "А2", "А3"} - это уже двумерный массив. {"А1", "А2", "А3"} {"B1", "B2", "B3"} - это трехмерный массив {"C1", "C2", "C3"} Сейчас с указателями попробую. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2022, 05:13 |
|
Си. Освободить память 2-мерного сторкового массива
|
|||
---|---|---|---|
#18+
Уткъ Так должно быть? Код: plaintext 1.
Да ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2022, 06:51 |
|
Си. Освободить память 2-мерного сторкового массива
|
|||
---|---|---|---|
#18+
Уткъ Dima T Тебе в тестеры надо, ты умудрился откомпилировать то что не должно компилироваться. Не пользуйся тем компилятором. Вот такой компилятор: gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44) Странно, GCC очень дотошный, более мелкие ляпы отказывается компилировать. Надо попробовать. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2022, 06:54 |
|
Си. Освободить память 2-мерного сторкового массива
|
|||
---|---|---|---|
#18+
Уткъ 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 только не зацикливайся на тех цифрах, там нагрузку на проц мерили, а у тебя на память и ввод/вывод, поэтому все ЯП будут одинаковы. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2022, 07:24 |
|
Си. Освободить память 2-мерного сторкового массива
|
|||
---|---|---|---|
#18+
Уткъ Нужно сделать высоконагруженное приложение с парралельными запросами и копированием данных туда-сюда на огромное количество серверов (1000+) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2022, 07:40 |
|
Си. Освободить память 2-мерного сторкового массива
|
|||
---|---|---|---|
#18+
Dima T Уткъ Так должно быть? Код: plaintext 1.
Да Отлично :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2022, 10:24 |
|
Си. Освободить память 2-мерного сторкового массива
|
|||
---|---|---|---|
#18+
Dima T Уткъ пропущено... Вот такой компилятор: gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44) Странно, GCC очень дотошный, более мелкие ляпы отказывается компилировать. Надо попробовать. Я по умолчанию запускаю gcc file.c -o file наверняка там какая-то опции запуска есть, которые повышают блидетьность. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2022, 10:25 |
|
Си. Освободить память 2-мерного сторкового массива
|
|||
---|---|---|---|
#18+
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 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2022, 10:28 |
|
Си. Освободить память 2-мерного сторкового массива
|
|||
---|---|---|---|
#18+
Basil A. Sidorov Уткъ Нужно сделать высоконагруженное приложение с парралельными запросами и копированием данных туда-сюда на огромное количество серверов (1000+) А что такое runtime? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2022, 10:29 |
|
Си. Освободить память 2-мерного сторкового массива
|
|||
---|---|---|---|
#18+
Кстати, правильлно ли я понял что количество столбцов массива надо обязательно через константу присваивать, а количество строк можно из константы вывести в переменную? Т.е. K вывести в переменную: Код: plaintext 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2022, 10:44 |
|
Си. Освободить память 2-мерного сторкового массива
|
|||
---|---|---|---|
#18+
Уткъ А что такое runtime? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2022, 11:04 |
|
Си. Освободить память 2-мерного сторкового массива
|
|||
---|---|---|---|
#18+
А что такое runtime?компоненты, библиотеки времени выполнения. Без Runtime код работать не будет Условно Для Java - это JRE Для C# - .NET и т.д. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2022, 11:09 |
|
Си. Освободить память 2-мерного сторкового массива
|
|||
---|---|---|---|
#18+
Alex_Ustinov А что такое runtime? Условно Для Java - это JRE Для C# - .NET и т.д. Звучит довольно мерзко. А разве для выполнения скомпилированного exe файла на С# требуются какие-то запущенные процессы в ОС? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2022, 11:11 |
|
Си. Освободить память 2-мерного сторкового массива
|
|||
---|---|---|---|
#18+
Добавил проверку выделилась ли память при аллокации, надеюсь верно написал: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2022, 11:14 |
|
Си. Освободить память 2-мерного сторкового массива
|
|||
---|---|---|---|
#18+
Уткъ Нужно сделать высоконагруженное приложение с парралельными запросами и копированием данных туда-сюда на огромное количество серверов (1000+) В современном бизнес-программировании большая пропускная способность вобщем-то не зависит от выбора языка разработки. А зависит от того насколько грамотно ты смог распараллелить задачу на независимые части. Например разработчик AWS-Lambda делает бизнес-функцию затем закидывает ее в облако и далее ее можно умножить на 1000 просто в конфиге. Много экземпляров функции + грамотно партицированный S3 storage решают почти все мыслимые задачи. Я не знаю что ты там надумал в плане с копированием 1000+ серверов но разработку POC можно было вполне начать с Java, Python, Ruby, Node e.t.c. Все это прекрасно устанавливается на современный Linux. Тоесть мне кажется тебе надо сосредоточиться именно на решении собственно твоей задачи копирования данных. А менеджмент памяти языка С тебя похоронит надолго. Закопаешся просто. Вот реально когда тебе понадобиться язык С - это когда например Java/Python уже перестанут успевать с копированием данных и ты исчерпаешь все возможности их оптимизации. Но этой точки очень сложно достигнуть. Обычно I/O является первым барьером для достижения ее. Вот, к примеру, было непонятно кое-что с копированием данных - открыл исходник PostgreSQL и взял код прям оттуда, немного адаптировав под себя. Сам факт копирования фрагмента кода приводит меня в изумление. Я думаю что копировать без контекста (без глобальных переменны) нельзя. По моему только язык Форт позволял такое делать. Для языка С таким глобальным контекстом по любому будет память, переменные библиотеки и объекты ОС. Поэтому то что ты копировал нужно подвергнуть code-review. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2022, 11:15 |
|
Си. Освободить память 2-мерного сторкового массива
|
|||
---|---|---|---|
#18+
Уткъ, если "Hello word!" в консоли - то имхо ничего не надо ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2022, 11:20 |
|
Си. Освободить память 2-мерного сторкового массива
|
|||
---|---|---|---|
#18+
Уткъ Alex_Ustinov пропущено... компоненты, библиотеки времени выполнения. Без Runtime код работать не будет Условно Для Java - это JRE Для C# - .NET и т.д. Звучит довольно мерзко. А разве для выполнения скомпилированного exe файла на С# требуются какие-то запущенные процессы в ОС? И для С это надо, и для С++. Только это не отдельные процессы, библиотеки работающие в твоем процессе, если упрощенно DLL. Ты против использования DLL? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2022, 12:18 |
|
Си. Освободить память 2-мерного сторкового массива
|
|||
---|---|---|---|
#18+
Уткъ Кстати, правильлно ли я понял что количество столбцов массива надо обязательно через константу присваивать, а количество строк можно из константы вывести в переменную? Т.е. K вывести в переменную: Код: plaintext 1. 2. 3.
У тебя динамическое выделение памяти, можешь заменить константы на переменные. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2022, 12:24 |
|
Си. Освободить память 2-мерного сторкового массива
|
|||
---|---|---|---|
#18+
Уткъ Добавил проверку выделилась ли память при аллокации, надеюсь верно написал: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Правильно, но учти что при срабатывании ранее выделенная память у тебя не освободится, а будет хз в каком состоянии и по хорошему при такой сработке надо совсем завершать работу всего приложения. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2022, 12:27 |
|
Си. Освободить память 2-мерного сторкового массива
|
|||
---|---|---|---|
#18+
mayton Вот, к примеру, было непонятно кое-что с копированием данных - открыл исходник PostgreSQL и взял код прям оттуда, немного адаптировав под себя. Сам факт копирования фрагмента кода приводит меня в изумление. Я думаю что копировать без контекста (без глобальных переменны) нельзя. По моему только язык Форт позволял такое делать. Для языка С таким глобальным контекстом по любому будет память, переменные библиотеки и объекты ОС. Поэтому то что ты копировал нужно подвергнуть code-review. Я так подозреваю это был пример работы с либой libpq на С. Я так понял это либа для работы из С напрямую с PostgreSQL . Погуглил, примеры на С везде, как понимаю отсюда и родилось требование использовать С. PS Если так, то С++ тоже справится, код править не придется. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2022, 12:35 |
|
Си. Освободить память 2-мерного сторкового массива
|
|||
---|---|---|---|
#18+
Уткъ А разве для выполнения скомпилированного exe файла на С# требуются какие-то запущенные процессы в ОС? А линуксоиды не понимают своего счастья и до сих пор не включили Mono/NetCore в базовые компоненты своих дистрибутивов. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2022, 12:54 |
|
Си. Освободить память 2-мерного сторкового массива
|
|||
---|---|---|---|
#18+
mayton А менеджмент памяти языка С тебя похоронит надолго. Закопаешся просто. Есть такое, с массивом не думал что будет так сложно. Планировал массив создать за час максимум ) mayton Вот реально когда тебе понадобиться язык С - это когда например Java/Python уже перестанут успевать с копированием данных и ты исчерпаешь все возможности их оптимизации. Но этой точки очень сложно достигнуть. Обычно I/O является первым барьером для достижения ее. Тут довольно большая нагрузка ожидается. mayton Сам факт копирования фрагмента кода приводит меня в изумление. Я думаю что копировать без контекста (без глобальных переменны) нельзя. По моему только язык Форт позволял такое делать. Для языка С таким глобальным контекстом по любому будет память, переменные библиотеки и объекты ОС. Поэтому то что ты копировал нужно подвергнуть code-review. Да, конечно, я там переменные подправил, мне нужно было понять сам принцип, примеров не было, в итоге скопировал из исходника строчек 5 и переделал их под себя. ) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2022, 13:50 |
|
Си. Освободить память 2-мерного сторкового массива
|
|||
---|---|---|---|
#18+
Alex_Ustinov Уткъ, если "Hello word!" в консоли - то имхо ничего не надо Хеллоу ворд - это вчерашний день. А точнее я его еще на прошлой неделе сделал :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2022, 13:51 |
|
Си. Освободить память 2-мерного сторкового массива
|
|||
---|---|---|---|
#18+
Dima T Ты против использования DLL? нет. я просто думал что там какая-нить служба\демон должны были крутиться чтобы работало. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2022, 13:51 |
|
Си. Освободить память 2-мерного сторкового массива
|
|||
---|---|---|---|
#18+
Dima T Уткъ Кстати, правильлно ли я понял что количество столбцов массива надо обязательно через константу присваивать, а количество строк можно из константы вывести в переменную? Т.е. K вывести в переменную: Код: plaintext 1. 2. 3.
У тебя динамическое выделение памяти, можешь заменить константы на переменные. Супер! ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2022, 13:51 |
|
|
start [/forum/topic.php?fid=57&msg=40129809&tid=2017122]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
31ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
2ms |
others: | 284ms |
total: | 422ms |
0 / 0 |