Вы так говорите, как будто мне это нравится. А ведь это не так, на самом-то деле.
Я за справедливость. И если по справедливости, то те же немцы осуждать Красную Армию за это не имеют никакого морального права. Равно как и другие страны Оси. Но ведь осуждают же.
Тут много писали про гуманность смертной казни, закину и я свои пять копеек.
За свою недолгую жизнь (а мне 21,5 года) я прошёл эволюцию взглядов от «давить этих мразей под прессом, а останки использовать в качестве биотоплива» до полного неприятия смертной казни за исключением военного времени.
Рассуждать на тему можно много и долго, я же в таких случаях прерываю дискуссию в голове и стараюсь ухватить мысль, после которой любая рефлексия лично для меня потеряет всякий смысл. Например по поводу наших войск в Сирии — при Асаде женщины там могли на пляжи выходить в купальниках, притом что население арабское. Знание подобных фактов зарубает любые «а если» и «но ведь» на корню.
Что до смертной казни, то тут подобная мысль очень проста: общество не должно опускаться до уровня тех, кого оно осуждает и наказывает, иначе оно теряет всякое моральное право так делать. Да, с каждого гражданина в год уходит сколько-то копеек на содержание пожизненно заключённых. Но на другой чаше весов — моральный облик общества и право его членов называться людьми.
Приведу ещё пример. Все знают о зверствах фашистов во времена Великой Отечественной. Однако сейчас намного чаще вспоминают почему-то не их, а несоизмеримые по масштабам и последующим наказаниям, но всё же имевшие место быть зверства Красной Армии при освобождении европейских населённых пунктов.
Здесь можно долго разглагольствовать про информационную войну и прочее, однако лучше задать самим себе вопрос — а как так получилось, что коммунистов стали отождествлять с фашистами? А именно благодаря таким вот эксцессам. Грех одних затмил славу многих, а сопоставление масштабов, увы, никого не интересует.
Сверху упоминали Солженицына — это из той же оперы. К слову, все его талмуды с лёгкостью перевешивает «Открытое письмо Сталину» Раскольникова, ИМХО.
Собственно, наличие смертной казни в США, Белоруссии, да и неполная отмена её в России меня как гуманиста очень сильно печалит.
А тем временем, один из создателей UML упорно пилит очередную таблетку от всего, которая решит все наши проблемы ещё раз:
В настоящее время Якобсон возглавляет проект SEMAT, посвящённый созданию единой теории, способной стать фундаментальным научным основанием для процесса разработки программного обеспечения. Ядро SEMAT было одобрено комитетом по стандартизации OMG и принято как свободный стандарт. Активно продвигает инициативу и принимает участие в написании статьи в английской Википедии, посвящённых проекту.
Так и вижу уже чью-нибудь статью под названием "Go 2 Considered Harmful" и прочий сарказм о созвучии "Go 2" и "goto".
Не совсем удачное название, ИМХО.
#include <stdlib.h>
#include <stdio.h>
#include "genvector/genvector.h"
typedef struct person_s {
char Name[32];
int Age;
} person_t;
GVEC_INSTANTIATE( person_t, person, GVEC_USE_VAL, GVEC_USE_REF );
int main() {
gvec_person_t family = gvec_person_new(3);
gvec_person_push( &family, (person_t){
.Name = "Alice",
.Age = 30
} );
gvec_person_push( &family, (person_t){
.Name = "Bob",
.Age = 32
} );
gvec_person_push( &family, (person_t){
.Name = "Kate",
.Age = 10
} );
printf( "%zu\n", gvec_count( family ) );
while ( gvec_count( family ) > 0 ) {
person_t member = *gvec_person_back( family );
printf( "name %s, age %d\n", member.Name, member.Age );
gvec_pop( family );
}
gvec_free( family );
}
Прошу прощения, но не силён в примерах. Целью было именно описание примерного хода мыслей при создании библиотеки.
К тому же, для приведения примеров пришлось бы описывать оба реализованных подхода к использованию библиотеки (статический и модульный), что сильно бы увеличило размер статьи.
Статья изначально предполагалась размера примерно в полтора раза большего, чем она вышла в итоге. Очень хотелось описать ещё следующие вещи:
конкретные детали реализации специализирования макросами, в частности то, как именно реализовано указание передачи и возврата по ссылке или по значению;
статический и модульный подходы к использованию библиотеки (и их поддержка ею самой);
почему последний коммит на момент публикации — это монстр под названием "Полностью изменён интерфейс вектора".
Однако было решено не заниматься переписыванием ReadMe из репозитория. К тому же, для иллюстрации потребовались бы большие куски кода. Это всё раздуло бы статью и сделало бы её менее приятной для чтения, и это при живом-то наличии вроде аккуратного репозитория.
Смысл пункта (5) прост: если типы значений в двух разных векторах имеют одинаковый размер, то мы можем прочитать вектор одного типа как вектор другого, и наоборот. У меня был конкретный пример использования, где это было полезно.
Пункт (7) подразумевает, что вектор ведёт себя аналогично std::vector из C++11, а набор его функций идентичен (пусть и слегка неполон). Я в самом деле сидел с открытым cppreference.com и реализовывал поведение вектора и его хранилища так, как описано там.
Допустим, у нас есть вектор, содержащий целые значения, и вектор содержащий числа двойной точности. Что будет означать попытка присвоить один вектор другому? Мы хотим, просто, скопировать значения из одного массива в другой и сделать так, чтобы копия автоматически поменяла бы тип?
Описанное Вами — это по сути изменение размера вектора плюс один цикл по элементам. Такую задачу в виде функции можно решить только определив callback присваивания. С другой стороны, более элегантно с точки внешнего вида кода пользователя будет вариант с макросом, которому будут переданы массив назначения и исходный массив. Однако такой вариант будет заметно выбиваться из изначальной концепции "не делаем функции макросами".
Я честно пока не решил, какой из этих вариантов лучше, а поскольку это не входило в необходимый мне (и в итоге реализованный) минимум возможностей, то я оставил это на потом. Быть может, я потом напишу отдельно заголовочные файлы для поддержки подобных вещей. Также были планы дописать отдельно некоторые дополнительные функции для использования этого вектора в качестве динамической строки. Есть намётки и на систему callback'ов, и на итераторы. Но — не сейчас.
Тем не менее, я буду рад появлению в репозитории issue, посвящённых таким вещам, а также pull request'ам.
Этот комментарий и двапредыдущих окончательно убедили меня в том, что надо было делать возможность указывать собственную функцию роста.
Единственная проблема в том, что написание таких возможностей не было основной целью создания этой библиотеки. Однако я буду рад, если кто-нибудь кинет мне PR, реализующий это. :)
Не знаю, но картинка судя по всему настоящая. По крайней мере, похожие дома я видел.
Когда она впервые попалась мне на глаза, первой ассоциацией был двухмерный массив. И вот она мне пригодилась.
Да, знаю про это. Как-никак один из важнейших нюансов при написании динамического массива. :)
Нет, у меня именно что происходит увеличение в 1.5 раза. Причём коэффициент можно изменить, переопределив GVEC_GROWTH_FACTOR при компиляции библиотеки.
Значение 1.5 выбрано из-за тех самых тонкостей с оптимальным выбором. Вот хороший ответ на SO, после прочтения которого мне стали понятны преимущества: ссылка.
Я за справедливость. И если по справедливости, то те же немцы осуждать Красную Армию за это не имеют никакого морального права. Равно как и другие страны Оси. Но ведь осуждают же.
За свою недолгую жизнь (а мне 21,5 года) я прошёл эволюцию взглядов от «давить этих мразей под прессом, а останки использовать в качестве биотоплива» до полного неприятия смертной казни за исключением военного времени.
Рассуждать на тему можно много и долго, я же в таких случаях прерываю дискуссию в голове и стараюсь ухватить мысль, после которой любая рефлексия лично для меня потеряет всякий смысл. Например по поводу наших войск в Сирии — при Асаде женщины там могли на пляжи выходить в купальниках, притом что население арабское. Знание подобных фактов зарубает любые «а если» и «но ведь» на корню.
Что до смертной казни, то тут подобная мысль очень проста: общество не должно опускаться до уровня тех, кого оно осуждает и наказывает, иначе оно теряет всякое моральное право так делать. Да, с каждого гражданина в год уходит сколько-то копеек на содержание пожизненно заключённых. Но на другой чаше весов — моральный облик общества и право его членов называться людьми.
Приведу ещё пример. Все знают о зверствах фашистов во времена Великой Отечественной. Однако сейчас намного чаще вспоминают почему-то не их, а несоизмеримые по масштабам и последующим наказаниям, но всё же имевшие место быть зверства Красной Армии при освобождении европейских населённых пунктов.
Здесь можно долго разглагольствовать про информационную войну и прочее, однако лучше задать самим себе вопрос — а как так получилось, что коммунистов стали отождествлять с фашистами? А именно благодаря таким вот эксцессам. Грех одних затмил славу многих, а сопоставление масштабов, увы, никого не интересует.
Сверху упоминали Солженицына — это из той же оперы. К слову, все его талмуды с лёгкостью перевешивает «Открытое письмо Сталину» Раскольникова, ИМХО.
Собственно, наличие смертной казни в США, Белоруссии, да и неполная отмена её в России меня как гуманиста очень сильно печалит.
Dixi. Минусуйте.
А тем временем, один из создателей UML упорно пилит очередную таблетку от всего, которая решит все наши проблемы ещё раз:
https://ru.wikipedia.org/wiki/Якобсон,_Ивар
https://en.wikipedia.org/wiki/SEMAT
http://semat.org/
Так и вижу уже чью-нибудь статью под названием "Go 2 Considered Harmful" и прочий сарказм о созвучии "Go 2" и "goto".
Не совсем удачное название, ИМХО.
Каюсь, не сравнивал. Но в планах есть.
1) Добавил пример из сообщения выше в статью.
2) Да, но нет, потому что присвоить строковой литерал нельзя — мы в Си. :)
Но можно сделать вот так, да:
Прошу прощения, но не силён в примерах. Целью было именно описание примерного хода мыслей при создании библиотеки.
К тому же, для приведения примеров пришлось бы описывать оба реализованных подхода к использованию библиотеки (статический и модульный), что сильно бы увеличило размер статьи.
Я буду рад, если вы поделитесь потом своими размышлениями.
Спасибо.
А про "кроссплатформенный ассемблер" — это же ирония. Там всё предисловие ею заляпано.
Добавил, спасибо. Однако эта реализация тоже не лишена тех же недостатков, которые разобраны прямо после списка. :)
Не заметил сразу.
Это есть, кстати говоря. См.
gvec_resize()
иgvec_reserve()
.Благодарю.
Статья изначально предполагалась размера примерно в полтора раза большего, чем она вышла в итоге. Очень хотелось описать ещё следующие вещи:
Однако было решено не заниматься переписыванием ReadMe из репозитория. К тому же, для иллюстрации потребовались бы большие куски кода. Это всё раздуло бы статью и сделало бы её менее приятной для чтения, и это при
живом-тоналичии вроде аккуратного репозитория.Смысл пункта (5) прост: если типы значений в двух разных векторах имеют одинаковый размер, то мы можем прочитать вектор одного типа как вектор другого, и наоборот. У меня был конкретный пример использования, где это было полезно.
Пункт (7) подразумевает, что вектор ведёт себя аналогично
std::vector
из C++11, а набор его функций идентичен (пусть и слегка неполон). Я в самом деле сидел с открытым cppreference.com и реализовывал поведение вектора и его хранилища так, как описано там.Описанное Вами — это по сути изменение размера вектора плюс один цикл по элементам. Такую задачу в виде функции можно решить только определив callback присваивания. С другой стороны, более элегантно с точки внешнего вида кода пользователя будет вариант с макросом, которому будут переданы массив назначения и исходный массив. Однако такой вариант будет заметно выбиваться из изначальной концепции "не делаем функции макросами".
Я честно пока не решил, какой из этих вариантов лучше, а поскольку это не входило в необходимый мне (и в итоге реализованный) минимум возможностей, то я оставил это на потом. Быть может, я потом напишу отдельно заголовочные файлы для поддержки подобных вещей. Также были планы дописать отдельно некоторые дополнительные функции для использования этого вектора в качестве динамической строки. Есть намётки и на систему callback'ов, и на итераторы. Но — не сейчас.
Тем не менее, я буду рад появлению в репозитории issue, посвящённых таким вещам, а также pull request'ам.
Этот комментарий и два предыдущих окончательно убедили меня в том, что надо было делать возможность указывать собственную функцию роста.
Единственная проблема в том, что написание таких возможностей не было основной целью создания этой библиотеки. Однако я буду рад, если кто-нибудь кинет мне PR, реализующий это. :)
Простите, если заголовок желтоват — у меня родители журналисты как-никак. :)
Не знаю, но картинка судя по всему настоящая. По крайней мере, похожие дома я видел.
Когда она впервые попалась мне на глаза, первой ассоциацией был двухмерный массив. И вот она мне пригодилась.
Да, знаю про это. Как-никак один из важнейших нюансов при написании динамического массива. :)
Нет, у меня именно что происходит увеличение в 1.5 раза. Причём коэффициент можно изменить, переопределив GVEC_GROWTH_FACTOR при компиляции библиотеки.
Значение 1.5 выбрано из-за тех самых тонкостей с оптимальным выбором. Вот хороший ответ на SO, после прочтения которого мне стали понятны преимущества: ссылка.