- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
namespace
{
struct list {
type pole1;
list *pole2;
}
stack;
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+3
namespace
{
struct list {
type pole1;
list *pole2;
}
stack;
}
Пример описания стека
−1
namespace belugina
{
struct list {
type elem ;
list *next, *pred ;
}
list *headlist ;
}
не могу понять что люблю больше, английски или транслит.
0
namespace belugina{
struct Node {
int key;//информационное поле
Node*next;//адресное поле
};
struct point {
char*name;//информационное поле
int age;//информационное поле
point*next;//адресное поле
};
struct Single_List {//структура данных
int Data; //информационное поле
Single_List *Next; //адресное поле
};
Single_List *Head; //указатель на первый элемент списка
Single_List *Current; //указатель на текущий элемент списка (при необходимости)
void Make_Single_List (int n,Single_List** Head){
if (n > 0) {
(*Head) = new Single_List();
//выделяем память под новый элемент
cout << "Введите значение ";
cin >> (*Head)->Data;
//вводим значение информационного поля
(*Head)->Next=NULL;
//обнуление адресного поля
Make_Single_List(n-1,&((*Head)->Next));
}
}
void Print_Single_List(Single_List* Head) {
if (Head != NULL) {
cout << Head->Data << "\t";
Print_Single_List(Head->Next);
//переход к следующему элементу
}
else cout << "\n";
}
Single_List* Insert_Item_Single_List(Single_List* Head,
int Number, int DataItem){
Number--;
Single_List *NewItem=new(Single_List);
NewItem->Data=DataItem;
NewItem->Next = NULL;
if (Head == NULL) {//список пуст
Head = NewItem;//создаем первый элемент списка }
else {//список не пуст
Single_List *Current=Head;
for(int i=1; i < Number && Current->Next!=NULL; i++)
Current=Current->Next;
if (Number == 0){
//вставляем новый элемент на первое место
NewItem->Next = Head;
Head = NewItem;
}
else {//вставляем новый элемент на непервое место
if (Current->Next != NULL)
NewItem->Next = Current->Next;
Current->Next = NewItem;
}
}
return Head;
}
Single_List* Delete_Item_Single_List(Single_List* Head,
int Number){
Single_List *ptr;//вспомогательный указатель
Single_List *Current = Head;
for (int i = 1; i < Number && Current != NULL; i++)
Current = Current->Next;
if (Current != NULL){//проверка на корректность
if (Current == Head){//удаляем первый элемент
Head = Head->Next;
delete(Current);
Current = Head;
}
else {//удаляем непервый элемент
ptr = Head;
while (ptr->Next != Current)
ptr = ptr->Next;
ptr->Next = Current->Next;
delete(Current);
Current=ptr;
}
}
return Head;
}
bool Find_Item_Single_List(Single_List* Head,
int DataItem){
Single_List *ptr; //вспомогательным указатель
ptr = Head;
while (ptr != NULL){//пока не конец списка
if (DataItem == ptr->Data) return true;
else ptr = ptr->Next;
}
return false;
}
void Delete_Single_List(Single_List* Head){
if (Head != NULL){
Delete_Single_List(Head->Next);
delete Head;
}
}
//удаляем непервый элемент .
У человека проблемы не только с кодом но и с русским языком.
+1
void Merging_Sort (int n, int *x){
int i, j, k, t, s, Fin1, Fin2;
int* tmp = new int[n];
k = 1;
while (k < n){
t = 0; s = 0;
while (t+k < n){
Fin1 = t+k;
Fin2 = (t+2*k < n ? t+2*k : n);
i = t; j = Fin1;
for ( ; i < Fin1 && j < Fin2 ; s++){
if (x[i] < x[j]) {
tmp[s] = x[i]; i++;
} else {
tmp[s] = x[j]; j++;
}
}
for ( ; i < Fin1; i++, s++) tmp[s] = x[i];
for ( ; j < Fin2; j++, s++) tmp[s] = x[j];
t = Fin2;
} k *= 2;
for (s = 0; s < t; s++) x[s] = tmp[s];
}
delete(tmp);
}
Это новый вид искусство?
+1
namespace belugina
{
void Hoar_Sort (int k, int *x){
Quick_Sort (0, k-1, x);}
}
Как вы думаете это новая форма рекурсии?
0
namespace belugina
{
void Exchange (int i, int j, int *x){
int tmp;
tmp = x[i];
x[i] = x[j];
x[j] = tmp;
}
void sifting (int left, int right, int *x){
int q, p, h;
q=2*left+1;
p=q+1;
if (q <= right){
if (p <= right && x[p] > x[q])
q = p;
if (x[left] < x[q]){
Exchange (left, q, x);
sifting(q, right, x);
}
}
}
}
Бред сумасшедшего. По утверждению автора алгоритм "Просеивание" элементов.
0
// https://github.com/QWalk/mainline/blob/b12ea3652226caef23c2f5fc7b168746c89096f2/src/system/Pseudopotential_so.cpp#L36
doublevar legendre_so(doublevar x, int n)
{
switch(n)
{
case 0:
return 1;
case 1:
return x;
case 2:
return .5*(3*x*x-1);
case 3:
return .5*(5*x*x*x - 3*x);
case 4:
return 0.125*(35*x*x*x*x -30*x*x +3);
case 5:
return 0.125*(63*x*x*x*x*x - 70*x*x*x + 15*x);
default:
error("Do not have legendre polynomial of order ", n);
return 0; //shouldn't get here, but gets rid of a compiler message
}
}
Вот нет чтоб через шаблоноговно нагенерировать эти свои многочлены Лагранжа.
https://en.wikipedia.org/wiki/Legendre_polynomials#Rodrigues'_formula_and_other_explicit_formulas
Интересно, сколько строк шаблоноговна на это придется потратить?
И вообще, надо чтоб гомоиконность!
+4
#include <iostream>
#include <string>
#include <string_view>
int main() {
std::string s = "Hellooooooooooooooo ";
std::string_view sv = s + "World\n";
std::cout << sv;
}
https://alexgaynor.net/2019/apr/21/modern-c++-wont-save-us/
What's happening here is that s + "World\n" allocates a new std::string, and then is converted to a std::string_view. At this point the temporary std::string is freed, but sv still points at the memory that used to be owned by it. Any future use of sv is a use-after-free vulnerability. Oops! C++ lacks the facilities for the compiler to be aware that sv captures a reference to something where the reference lives longer than the referent. The same issue impacts std::span, also an extremely modern C++ type.
+2
// https://github.com/WebKit/webkit/blob/e0e7e8f907f4c01c723374e8230a63d46e89e6a0/Source/WebCore/platform/graphics/filters/FEComposite.cpp#L98
static unsigned char clampByte(int c)
{
unsigned char buff[] = { static_cast<unsigned char>(c), 255, 0 };
unsigned uc = static_cast<unsigned>(c);
return buff[!!(uc & ~0xff) + !!(uc & ~(~0u >> 1))];
}
+2
https://habr.com/ru/article/448466/
*/
А последние пару лет набирает популярность boost.hana. Это boost.fusion,
но с constexpr'ом и лямбдами. Автор hana, Луис Дионе (Louis Dionne),
используя на полную мощь все возможности новых стандартов, в некотором
смысле очеловечил метапрограммирование. С помощью hana всяческие
манипуляции с типами, их кортежами, отображениями, а также компайл- и
рантайм-работа с ними обрели практически человеческое лицо и читаемый
вид. Ну, с поправкой на синтаксис C++, разумеется. Вот, например, как выглядит
универсальный сериализатор структур, написанный с помощью hana:
*/
// 1. Give introspection capabilities to 'Person'
struct Person {
BOOST_HANA_DEFINE_STRUCT(Person,
(std::string, name),
(int, age)
);
};
// 2. Write a generic serializer (bear with std::ostream for the example)
auto serialize = [](std::ostream& os, auto const& object) {
hana::for_each(hana::members(object), [&](auto member) {
os << member << std::endl;
});
};
// 3. Use it
Person john{"John", 30};
serialize(std::cout, john);
/*
Ну да, структуры приходится описывать особым образом. А кому сейчас легко?
И тут хочется также отметить библиотеку tinyrefl за авторством Manu Sánchez
(Мануэля Санчеса). Довольно неплохая попытка принести в мир C++-разработки
статическую рефлексию без расширения компилятора. Для своей работы библиотека
требует стороннюю утилиту (cppast), но зато предоставляет довольно удобный доступ
к информации о структурах, которую можно использовать в процессе разработки
программы. Преимущество этой библиотеки (по сравнению с другими) в том, что для
работы с ней не надо использовать «птичий язык», а элементы структур (как и сами
структуры) можно произвольным образом атрибутировать прямо в исходном коде:
*/
struct [[serializable]] Person {
std::string name;
int age;
};
template<typename Class>
auto serialize(std::ostream& os, Class&& object) -> std::enable_if_t<
tinyrefl::has_metadata<std::decay_t<Class>>() &&
tinyrefl::has_attribute<std::decay_t<Class>>("interesting"),
std::ostream&>
{
tinyrefl::visit_member_variables(object, [&os](const auto& /* name */, const auto& var) {
os << var << std::endl;
});
return equal;
}
/*
Таких примеров можно привести ещё много (или найти на гитхабе или гитлабе).
Объединяет все эти библиотеки и инструменты одна особенность: значительно
облегчая жизнь своим пользователям, они имеют такую реализацию, что остаётся
лишь предполагать, какое количество страданий испытали их разработчики. Достаточно
заглянуть в реализацию, увидеть забор из ifdef'ов и угловых скобок — и всё понятно.
Нередко эти реализации делаются на грани возможностей компиляторов. workaround'ы
банальных ошибок (или особенностей реализации языка конкретной версии конкретного
компилятора с конкретными флагами) здорово раздувают их код. Желание поддерживать
несколько стандартов сразу заставляет придумывать зубодробильные конструкции.
Безусловно, простая попытка реализовать что-нибудь подобное здорово поднимает уровень
владения языком (иногда — и самооценку). Но в какой-то момент, после многочасовой возни
с очередной ошибкой, или непроходящим тестом, или крэшем компилятора руки опускаются,
хочется плюнуть и бросить, ибо силы бороться иссякают.
*/
Именно поэтому я за гомоиконность