- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define SQARESZ 3
void rotateclockwise(char *ptra, size_t sz)
{
char (*a_ar)[sz] = (void *)ptra;
char b_ar[sz][sz];
for (size_t y = 0; y < sz; y++)
{
for (size_t x = 0; x < sz; x++)
{
b_ar[y][x] = a_ar[sz-1-x][y];
}
}
memcpy(a_ar, b_ar, sz*sz);
}
void print_ar(char *ptra, size_t sz)
{
char (*a_ar)[sz] = (void *)ptra;
for (size_t y = 0; y < sz; y++)
{
for (size_t x = 0; x < sz; x++)
{
printf("%i ", a_ar[y][x]);
}
printf("\n");
}
}
int main()
{
char a[SQARESZ][SQARESZ] =
{
{1,2,3},
{4,5,6},
{7,8,9}
};
print_ar((char *)a, SQARESZ);
printf("\n");
rotateclockwise((char *)a, SQARESZ);
print_ar((char *)a, SQARESZ);
printf("\n");
rotateclockwise((char *)a, SQARESZ);
print_ar((char *)a, SQARESZ);
printf("\n");
rotateclockwise((char *)a, SQARESZ);
print_ar((char *)a, SQARESZ);
printf("\n");
rotateclockwise((char *)a, SQARESZ);
print_ar((char *)a, SQARESZ);
printf("\n");
return 0;
}
bootcamp_dropout 26.12.2018 18:35 # 0
j123123 26.12.2018 18:36 # 0
bootcamp_dropout 26.12.2018 18:38 # +3
j123123 26.12.2018 18:41 # 0
bootcamp_dropout 26.12.2018 18:48 # 0
Ты или крестик сними или трусы надень. Не хочется писать костыли - есть Boost. Не хочется Boost и писать костыли - не знаю, на fortran пиши. Кто вообще сказал что многомерные массивы оттуда должны быть в стандарте.
j123123 26.12.2018 18:53 # 0
1024-- 26.12.2018 18:59 # 0
Люди не создавали время и не знают, что такое время. Это нормально.
Люди создали кучу языков программирования, но не знают, что такое язык программирования.
"Сделать что-то в языке", "сделать стандартными средствами", "сделать кратко и надёжно" и "сделать просто" - разные, порою не пересекающиеся вещи. И даже если вводить термины вроде "стандартная библиотека", "стандартный способ", окажется, что всё равно их никто не будет использовать потому, что они бесполезны.
roman-kashitsyn 26.12.2018 19:07 # +1
[1] https://abseil.io/docs/cpp/guides/time
j123123 30.12.2018 12:49 # 0
gost 30.12.2018 12:57 # 0
bootcamp_dropout 26.12.2018 19:09 # 0
Спасибо, что объяснил. Я так понимаю, сетевого взаимодействия в тоже "Нет в С++"?
https://stackoverflow.com/questions/27126126/why-is-there-a-networking-library-proposal-for-c14-17
roman-kashitsyn 26.12.2018 19:10 # +2
Нет, что вы, мы только факториалы в компайл-тайме считаем.
bootcamp_dropout 26.12.2018 19:17 # 0
roman-kashitsyn 26.12.2018 19:26 # +1
j123123 26.12.2018 19:40 # +2
bormand 26.12.2018 19:41 # 0
j123123 26.12.2018 20:04 # +1
guest8 26.12.2018 23:03 # −999
roman-kashitsyn 26.12.2018 23:05 # 0
Нет, ведь для этого нужно обращаться к сети, а в C++ этого нет.
j123123 26.12.2018 23:22 # 0
guest8 26.12.2018 23:27 # −999
j123123 26.12.2018 23:42 # 0
https://www.cs.swarthmore.edu/~newhall/papers/cluster11.pdf
guest8 26.12.2018 23:48 # −999
j123123 27.12.2018 00:10 # 0
Или ты еще хочешь чтоб у тебя несколько процессорных ядер на разных компах одним процессом компилятора захавывались и компилировали один единственный сраный файл говноплюсов? А вот хер тебе! Этого не умеют никакие из известных мне компиляторов. Да и нахер это не нужно, в общем-то.
guest8 27.12.2018 00:16 # −999
j123123 27.12.2018 00:27 # 0
> SWAP
Сдохнет быстро. Лучше под такое дело сделать жесткий диск из оперативы. Была такая хрень, GIGABYTE i-RAM и HyperOs HyperDrive.
guest8 27.12.2018 00:37 # −999
j123123 26.12.2018 23:45 # 0
Можешь там SWAP делать себе
guest8 26.12.2018 23:49 # −999
j123123 26.12.2018 19:36 # +1
Естественно нет. Вот например если ты захочешь на "C++" написать под какую-нибудь нестандартную ОС, под которую сеть будет реализована через какую-то свою, особую, несовместимую ни с чем жопу, то тебе придется через эту жопу делать сетевое взаимодействие.
1024-- 26.12.2018 18:49 # 0
А написать свой хороший контейнер - уже достаточно нетривиальная задача, чтобы не пользоваться полустандартной библиотекой.
roman-kashitsyn 26.12.2018 18:47 # 0
j123123 26.12.2018 19:00 # 0
roman-kashitsyn 26.12.2018 19:04 # +2
В языке C++ ты можешь легко написать функции, которые будут работать с произвольными типами данных, а не только с char. ну и про malloc() и free() тоже можно будет забыть, за временем жизни будет следить вектор.
j123123 26.12.2018 19:16 # +3
roman-kashitsyn 26.12.2018 23:03 # 0
j123123 29.12.2018 14:57 # 0
https://dev.by/news/intervyu-s-krisom-kasperski-aka-mysch-h
— Как я понял, твой успех был отчасти в том, что все пытались найти общее универсальное решение и впоследствии увязали в нарастающей сложности. Ты же решил узкоспециализированную задачу, зато смог это сделать эффективно и быстро. Немного отвлекаясь от основной темы, здесь мы снова возвращаемся к любимому тобой спору вокруг назначения языков C и C++.
— Каждый конкретный язык определяет мышление, хотим мы того или нет. Так вот, постоянно сталкиваюсь, что «плюсовики» тяготеют к решениям в общем виде, в то время как «сишники» решают задачу в частном виде, что в разы быстрее.
Одну текущую задачу сначала показали «плюсовику», спросив, сколько займёт её решение. Он сказал: «Здесь нужно писать могучий движок. Короче говоря, это проект на полгода». Его коллега-«сишник» поинтересовался: «А зачем?» Ведь поставленная задача укладывается в сотню строк кода! Ответ был ошеломляющим: «Ну и что, мы так и будем по сотне строк кода писать для решения частных задач, каждый раз, как они возникают? Нетушки, задачи надо решать раз и навсегда!».
По моему глубокому личному убеждению, проблемы нужно решать по мере их возникновения. Писать программы на вырост с избыточным универсализмом нужно лишь очень хорошо предварительно подумав, ибо это из серии «Почему сегодня не делают корабли, летающие к звёздам?» Ответ прост: потому что корабль, построенный завтра, прибудет быстрее, а корабль, построенный послезавтра, еще быстрее. И их обоих обгонит корабль, построенный лет через пятьдесят, но когда он вернётся обратно, то обнаружит, что у человечества совсем другие проблемы».
j123123 29.12.2018 14:59 # 0
KitKat 29.12.2018 15:10 # −103
guest8 29.12.2018 15:22 # −999
guest8 29.12.2018 18:32 # −999
guest8 29.12.2018 18:33 # −999
nemyx 29.12.2018 18:36 # 0
guest8 29.12.2018 18:36 # −999
nemyx 29.12.2018 18:42 # +1
Например, нужно получить имя пользователя № 25580. Я пишу так:
Если вдруг в $_GET['user_id'] придёт не число, то просто выскочит предупреждение, что такокококой-то ключ массива отсутствует. А если бы хранил в СУБД, то была бы инъекция.
guest8 29.12.2018 18:47 # −999
nemyx 29.12.2018 18:50 # +1
И найти юзера по шаблону имени можно программой grep!
nemyx 29.12.2018 18:56 # 0
Через FUSE отображаем базу данных на текстовые файлы и ищем в них грепом, что нужно.
guest8 29.12.2018 19:03 # −999
KitKat 29.12.2018 18:47 # −101
P.S.: Ты забыло раскококошить слово "выскочит".
nemyx 29.12.2018 18:51 # +1
Morgoth 29.12.2018 18:59 # 0
nemyx 29.12.2018 19:00 # +1
Morgoth 29.12.2018 19:02 # +1
guest8 29.12.2018 19:04 # −999
nemyx 29.12.2018 19:07 # +1
nemyx 29.12.2018 19:09 # +1
http://php.net/manual/ru/class.swoole-mmap.php
Признавайтесь, кто написал расширение Swoole!
nemyx 29.12.2018 19:25 # 0
А с текстовым файлом будет жопа. По-любому придётся сканировать весь файл в поисках переводов строк.
guest8 29.12.2018 23:52 # −999
nemyx 29.12.2018 19:05 # +2
guest8 29.12.2018 19:14 # −999
nemyx 29.12.2018 19:16 # +1
Так делает печеньковый монстр.
guest8 30.12.2018 00:32 # −999
Morgoth 29.12.2018 19:22 # +1
Morgoth 29.12.2018 19:34 # +1
roman-kashitsyn 29.12.2018 19:47 # +2
Какое-то вербозное говно Именно поэтому я за "AWK".
rajluTo3Huk 29.12.2018 22:14 # 0
Полкило колбасы, москальский салат, пара бутылок шмурдяка?
BUTTHURT 29.12.2018 22:43 # −102
После него пук очень вонючий
guest8 29.12.2018 22:44 # −999
BUTTHURT 29.12.2018 22:45 # −102
guest8 29.12.2018 22:57 # −999
nemyx 30.12.2018 11:18 # +1
j123123 30.12.2018 11:20 # 0
nemyx 30.12.2018 11:23 # 0
Morgoth 30.12.2018 12:03 # 0
1024-- 30.12.2018 13:24 # +1
Xyu_HE_3HAET 30.12.2018 13:37 # 0
bormand 30.12.2018 12:56 # +1
Не шуми, спать мешаешь.
nemyx 31.12.2018 01:40 # 0
nemyx 31.12.2018 02:07 # 0
nemyx 31.12.2018 05:57 # 0
Morgoth 31.12.2018 08:41 # +2
Самое время ложиться спать.
nemyx 31.12.2018 09:00 # 0
bormand 31.12.2018 09:06 # 0
Именно так.
guest8 30.12.2018 15:39 # −999
guest8 30.12.2018 15:42 # −999
guest8 30.12.2018 15:44 # −999
guest8 30.12.2018 00:54 # −999
guest8 30.12.2018 15:51 # −999
KAPABAH 30.12.2018 19:09 # +1
guest8 30.12.2018 00:20 # −999
antox 30.12.2018 02:46 # +1
Как раз в угоду любителей awk, ключ -a включает разбиение на поля в массив @F. Но и без него цикл можно уплотнить:
guest8 31.12.2018 02:10 # −999
antox 31.12.2018 02:53 # 0
guest8 31.12.2018 03:06 # −999
antox 31.12.2018 03:14 # 0
nemyx 31.12.2018 06:12 # 0
antox 31.12.2018 03:34 # 0
- строковый литерал ' ' в качестве шаблона split эмулирует awk'овое разбиение (отличается от /\s+/);
- цикл while <> таки не завершается, если из файла прочитана строка "0" (в булевом контексте она ложь); например, строка "0" может быть последней перед EOF без "\n"; также ромбик <> может возвращать по одному символу, когда задан размер записи $/ = \1.
Именно поэтому я не за Perl. :(
nemyx 31.12.2018 06:04 # +1
Погодите...
gost 29.12.2018 22:13 # 0
UPD: размер буфера в 6 байт установлен для демонстрации работы олгоритма.
guest8 29.12.2018 22:22 # −999
rajluTo3Huk 29.12.2018 22:25 # 0
rajluTo3Huk 29.12.2018 22:29 # 0
Dummy00001 27.12.2018 00:56 # 0
* std::vector<std::vector<int>> (топорный вариант, проверено временем - работает ок-ish)
* std::map< int, std::vector<int> > ( если часто надо переаллоцировать первый уровень )
я в прошлом начал с первого, но закончил std::list<std::vector<int>>, потому что по первому индексу надо было только итерировать (прямое индексировние был не нужен), и надо было добавлять новые строки часто.
на glibc под прыщами, аллокатор как-то хитрожопо соптимизирован, что существенной разницы по расходуемой памяти было почти невозможно померять. может только если размерности в тысячах/миллионах. но мне это было не надо.
roman-kashitsyn 27.12.2018 01:08 # +1
Mежду чем и чем разницы? Между одним вектором и N векторами? Так она отличается только на примерно на ~3*N интов.
Существенное отличие не в потреблении памяти, а в кол-ве обращений к аллокатору. Если ты создаёшь один вектор, у тебя будет ровно одна аллокация на всю матрицу. Если ты делаешь вектор/список/мапу векторов, у тебя будет N+1/2*N аллокаций (а в случае списка/мапы ещё и куча мелких объектов). Для числодробилок это может быть важно.
Память лучше выделять редко и большими блоками.
Если тебя устраивает list<vector>, то пирфоманс тебе явно не особо важен.
Dummy00001 27.12.2018 01:35 # 0
в курсе. про это не написал - но точно также на линухе никакой существенной разницы не видел.
если конечно в tight loop впихнуть там будет сильно заметно.
но в приложении которое еще что-то делает - это капля в море.
честно говоря самого удивило. колличество аллокаций я поэтому и не мерял - потому что я видел что glibc/stdc++ какую-то магию творит уже на расходе памяти.
на старых системах/старых STL версиях я делал оптимизации std::map/list -> std::vector и видел 2-5х меньше расход памяти и 2х прирост производительности. тест аналогичного кода на линухе - разница была в пределах ошибки измерения.
Sers 27.12.2018 02:21 # −2
Доставка по России. Анонимно.
[email protected]
j123123 27.12.2018 12:23 # +1
Как минимум тем, что у тебя эта хрень будет хуже кешироваться процессором из-за того, что аллокатор как попало может это дело разбросать. Да и операция взятия конкретного элемента из такого "двумерного массива" будет больше тактов проца жрать
Dummy00001 27.12.2018 15:38 # 0
> В C++17 до сих пор нет нормальных многомерных массивов, которые были в Fortran начиная с Fortran 90
У автора статьи - и похоже у тебя тоже - какое-то очень предвзятое понимание как массивы в Фортране работают. (Сам Фортрана не знаю - но было в прошлом несколько коллег которые десятилетия на нем пахали. Народ этот язык сильно переоценивает. Кучи фортранщиков на кресты перешли, к слову, и куча софта на кресты уже спортирована.)
Все недостатки - и достоинтства - той или иной реализации массивов, как ты не крути, в независимости языка, будут присутствовать.
Если ты хочешь размерность массива в рантайм менять - ... со всеми вытекающими.
Если ты хочешь оптимальный кэш футпринт - ... со всеми вытекающими.
Если ты хочешь оптимальную прямую индексацию - ... со всеми вытекающими.
С/С++ тебе позволяет через библиотеку делать как тебе нравится.
На Фортране (и Пасцале, и Лиспе) уже в язык захардкожено.
Wähle Dein Gift.
guest8 27.12.2018 16:07 # −999
guest8 27.12.2018 16:10 # −999
guest8 27.12.2018 16:12 # −999
Morgoth 29.12.2018 17:44 # 0
Отнял у тебя работу. Проверь.
roman-kashitsyn 27.12.2018 18:55 # 0
Можно подумать, там сложно либу написать поверх массивов. В крайнем случае FFI.
j123123 28.12.2018 06:36 # 0
В Фотртане и Паскале у тебя есть указатели, можешь поверх них свои массивы делать через написание библиотеки (даже без FFI).
KitKat 28.12.2018 11:32 # −103
roman-kashitsyn 26.12.2018 18:48 # +2
Правильно, чтобы ногу с корнем оторвало.
j123123 26.12.2018 18:49 # 0
roman-kashitsyn 26.12.2018 18:54 # 0
А для чего код в топике? Там же во время компиляции все размеры известны, автор статьи другого хочет.
j123123 26.12.2018 18:55 # 0
roman-kashitsyn 26.12.2018 19:02 # 0
вай вай
К слову, на 90 градусов очень легко развернуть in-place: транспозиция + отражение дают поворот.
Т.е. к примеру если транспонировать и отразить каждую строку, получишь поворот по часовой стрелке. Если отразить каждый столбец — против часовой стрелки.
А теперь напиши функцию, которая будет вращать матрицу на произвольное кол-во элементов относительно центра.
j123123 26.12.2018 19:07 # 0
> вай вай
Пффф...
j123123 26.12.2018 19:13 # 0
Как вращать, квадратными кольцами такими?
Написать-то я напишу, только что мне за это будет? Лень мне.
crestoblyad 26.12.2018 22:21 # 0
guest8 26.12.2018 22:30 # −999
roman-kashitsyn 26.12.2018 23:02 # 0
Как что? 80 очков на хакирранке!
guest8 27.12.2018 00:10 # −999
crestoblyad 27.12.2018 20:45 # 0
KitKat 27.12.2018 21:58 # −102
crestoblyad 28.12.2018 14:33 # 0
Morgoth 28.12.2018 14:58 # 0
crestoblyad 28.12.2018 14:59 # 0
Morgoth 28.12.2018 15:11 # 0
crestoblyad 28.12.2018 15:13 # 0
Morgoth 29.12.2018 17:24 # 0
Именно поэтому я за S" Forth"
guest8 29.12.2018 17:38 # −999
Morgoth 29.12.2018 18:12 # +1
nemyx 29.12.2018 18:29 # +1
Пример. Возьмём исходный текст:
Чтобы сохранить программу, состоящую из «Отдохнёшь и ты.», нужно отпилить от стихотворения последнюю строчку.
Правда, я пока ещё не придумал, как будет интерпретироваться такая программа.
guest8 29.12.2018 18:31 # −999
nemyx 29.12.2018 18:33 # 0
Morgoth 29.12.2018 18:47 # 0
Morgoth 29.12.2018 18:50 # 0
Ksyrx 04.01.2019 00:03 # 0
6A9lHuCT 01.01.2019 00:59 # −103