Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.58/55: Рейтинг темы: голосов - 55, средняя оценка - 4.58
0 / 0 / 1
Регистрация: 01.03.2017
Сообщений: 32

Передача типа переменной через аргумент функции

16.10.2017, 19:01. Показов 11146. Ответов 28
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Стоит задача: реализовать свой вариант динамических массивов без использования STL(т.е. без new, как я понимаю). При этом должно работать не только для стандартных типов данных. Я решил, что память буду выделять malloc-ом, но столкнулся с проблемой. Если бы нужно было реализовывать только для стандартных типов, то я бы просто перегрузил функцию для разных типов, но тогда это не будет работать для пользовательских типов.
Думал сделать как-нибудь через шаблоны, что-то типо:

C++
1
2
3
4
template <typename T>
void memoryAlloc(T ptr, int length) {
ptr=(T*)malloc(sizeof(*ptr)*length);
}
В общем вся суть: как можно реализовать поддержку любого пользовательского типа?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.10.2017, 19:01
Ответы с готовыми решениями:

Неверная передача массива через возвращаемое значение функции типа int**
Не могу понять причину неработоспособности кода. Прошу помочь и объяснить! Пользуюсь исключительно представленным инструментарием, т.е....

Передача переменной типа double из c# в переменную типа float в SQL
Здравствуйте, имеется проблема с передачей данных из кода c# в бд SQL Имеется переменная типа double, к примеру double newPrice =...

Передача строки через аргумент
Здравствуйте! Проблема такая: необходимо при наведении на иконку отобразить некоторый текст в отдельном label и заменить значек на более...

28
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
17.10.2017, 15:05
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от DU3 Посмотреть сообщение
Присутствующий в табличке new это оператор, пунктуатор или что-то другое?
Оператор.

Цитата Сообщение от DU3 Посмотреть сообщение
Как понимать предложение из первого абзаца в разделе 5?
An expression is a sequence of operators and operands that specifies a computation.
Тут все проще, чем кажется. new-expression подразумевает неявное выполнение оператора new. Иногда, если тип тривиальный, на этом все и заканчивается. Тоже самое, например, в случае cast-expression.
C++
1
2
A a;
int x = (int)a;
Тут тоже будет попытка неявного выполнения оператора A::operator int(), хотя в самом выражении в явном виде никаких операторов нет.
Поэтому фраза выше, в общем-то, совершенно точно описывает что происходит. new-expression разрешается в выполнение оператора new и возможный вызов конструктора (или конструкторов) в случае нетривиального типа.
В стандарте даже есть отдельные примеры:
[ Example:

new T results in one of the following calls:

operator new(sizeof(T))
operator new(sizeof(T), std::align_val_t(alignof(T)))

new(2,f) T results in one of the following calls:

operator new(sizeof(T), 2, f)
operator new(sizeof(T), std::align_val_t(alignof(T)), 2, f)

new T[5] results in one of the following calls:

operator new[](sizeof(T) * 5 + x)
operator new[](sizeof(T) * 5 + x, std::align_val_t(alignof(T)))

new(2,f) T[5] results in one of the following calls:

operator new[](sizeof(T) * 5 + x, 2, f)
operator new[](sizeof(T) * 5 + x, std::align_val_t(alignof(T)), 2, f)

Here, each instance of x is a non-negative unspecified value representing array allocation overhead; the result of the new-expression will be offset by this amount from the value returned by operator new[].
This overhead may be applied in all array new-expressions, including those referencing the library function operator new[](std​::​size_*t, void*) and other placement allocation functions.
The amount of overhead may vary from one invocation of new to another.
— end example ]
Цитата Сообщение от DU3 Посмотреть сообщение
new int(0);
- Что тут оператор(ы)?
- Что тут операнд(ы)?
Согласно сказанному выше (см. примеры):
Оператор тут - это operator new(std::size_t);
А операнд - это sizeof(int).

Цитата Сообщение от DU3 Посмотреть сообщение
о отличается ли эта штука от функции аллокации памяти с именем "operator new" или это одно и тоже? Если это одно и тоже, то в каких пунктах стандарта это явно или неявно определено? Если не одно и тоже, то можно ли переопределить этот оператор (не функцию выделения памяти, а оператор)?
Я думаю ответы на эти вопросы очевидны из предоставленного материала. Единственное что мне не понятно, раз уж ты сам посмотрел текст стандарта, то мог бы и сам увидеть все вышесказанное и самостоятельно сделать выводы. Поэтому мне кажется, что ты просто хочешь поспорить, а не разобраться.

Цитата Сообщение от DU3 Посмотреть сообщение
Почему акцент сделан на слове "new", а не как в большинстве других мест, которые мне попались на глаза:
"operator new", или "operator new function" или "allocation function operator new" или new-expression?
Это место можно заподозрить в какой-то неоднозначности формулировок. Но это было бы важно, если бы терминология не была разжевана на почти четырех страницах в этом параграфе.

Цитата Сообщение от DU3 Посмотреть сообщение
И еще любопытно было бы узнать, как следует понимать популярного автора следующих строк:
Это текст из издания 1995 года, тогда еще не было стандарта. А в черновиках могли быть всяческие неточности.
Можно заметить, что в третьем издании (которое 55 советов) этого же автора уже нет упоминания о какой-либо сложности. Т.к. в стандарте на тот момент уже устаканилась вся терминология. В третьем издании вся терминология приведена к стандартной, в частности там, где new рассматривается как выражение, используется термин new-expression. Вот пример из правила 16:
When you employ a new expression (i.e., dynamic creation of an object
via a use of new), two things happen. First, memory is allocated (via a function named
operator new — see Items 49 and 51). Second, one or more constructors are called
for that memory. When you employ a delete expression (i.e., use delete), two
other things happen: one or more destructors are called for the memory, then the
memory is deallocated (via a function named operator delete — see Item 51).
В общем-то я влез исключительно потому, что такие посты, как твой, которые культивируют путаницу, подтверждают, грубо говоря, что она есть, не делают лучше общей картине. Новичок прочитает такой пост, и не будет разбираться, а если она на самом деле. И, спустя время, пойдет учить других, уже бездумно повторяя твои слова о путанице. Вот это мне не нравится, поэтому я решил поправить.
1
techpriest
 Аватар для Mirmik
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
17.10.2017, 16:01
Если вам так неймется, переопределите placement new. Вам его за глаза хватит.

Добавлено через 2 минуты
И то только потому, что язык почему-то запрещает явный вызов конструктора. Так бы можно было и без placement new обойтись.
0
27 / 27 / 16
Регистрация: 22.08.2017
Сообщений: 126
17.10.2017, 16:11
Если вам так неймется, переопределите placement new. Вам его за глаза хватит.
Невозможно переопределить new и/или placement_new для произвольного типа, не ковыряя компилятор не внося изменения в компилятор.
0
techpriest
 Аватар для Mirmik
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
17.10.2017, 16:50
Зачем для произвольного то типа?
0
27 / 27 / 16
Регистрация: 22.08.2017
Сообщений: 126
17.10.2017, 16:57
Зачем для произвольного то типа?
Так у него в задании написано - для произвольного типа.
0
techpriest
 Аватар для Mirmik
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
17.10.2017, 17:05
Через шаблон.

Дело в том, что ТС неправильно понял своё задание.
Его всего-то попросили разработать аналог класса std::vector. Никто не говорил, что при этом нельзя использовать оператор new.

Формально реализация оператора new входит в стандартную библиотеку (Надо сказать, что это даже не stl, но шут с ним).
Если мы хотим сделать своё vector, не используя вообще ничего из стандартной библиотеки, нам, так или иначе придётся вызывать конструкторы через placement new.

Если мы не хотим тянуть его из стандартной либы мы можем написать ему свою реализацию. Вот такая логика.
0
27 / 27 / 16
Регистрация: 22.08.2017
Сообщений: 126
17.10.2017, 20:19
ТС приводил тут задание:

Точная формулировка: Создать программу, реализующую класс «динамический массив элементов произвольного типа» без использования стандартной библиотеки C++. Предусмотреть возможность добавления, удаления элементов в любую часть массива.
Хм, может действительно это просто нужно написать свой аналог вектора из STL. И, естественно, без new тут нельзя обойтись.



Добавлено через 9 минут
Как-то я писал свой шаблонный вектор. Давно это было правда, но все работало.

C++
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
 
//Copyright (C) 2004-2013 MKTMK Moscow, Russia
//e-mail: mktmk<at>narod.ru
//e-mail: openbasicsoft<at>gmail.com
//v.1.01 12.02.2001(last modification 22.04.2012)
//Vector
 
#ifndef MVECT_THIS
#define MVECT_THIS
 
#ifndef MVECT_NULL
#define MVECT_NULL (0)
#endif
 
#ifndef MVECT_INLINE
#define MVECT_INLINE inline
#endif
 
template <class typebase>
class mvect_common:public typebase{
public:
 
typedef typename typebase::tstore typestore;
typedef typename typebase::tcount typecount;
 
mvect_common(){}
mvect_common(typecount s):typebase(s){}
mvect_common(typestore* data1,typecount s):typebase(data1,s){}
 
mvect_common(typestore* data1,typestore end,typecount max):
typebase(data1,end,max){}
 
typestore& operator[](typecount i){return typebase::data[i];}
 
//operator typestore*() {return c_str();}
typestore* c_str(){return typebase::data;}
 
template <class F>
bool find(F* f,
typecount startcount,
typecount endcount,
typecount* current);
 
template <class typebase1>
mvect_common& operator =(const mvect_common<typebase1>& d){
*((typebase*)this)=*((typebase1*)&d);
}
 
mvect_common& operator =(const mvect_common& d){
*((typebase*)this)=*((typebase*)&d);
return *this;
}
 
mvect_common(const mvect_common<typebase>& d):typebase(*((typebase*)&d)){
}
 
template <class typebase1>
mvect_common(const mvect_common<typebase1>& d):typebase(*((typebase1*)&d)){
}
 
template <class typebase1>
bool operator ==(const mvect_common<typebase1>& d) const;
 
template <class typebase1>
bool operator <(const mvect_common<typebase1>& d) const;
 
template <class typebase1>
bool operator >(const mvect_common<typebase1>& d) const;
 
template <class typebase1>
bool operator <=(const mvect_common<typebase1>& d) const {return !(operator >(d));}
 
template <class typebase1>
bool operator >=(const mvect_common<typebase1>& d) const {return !(operator <(d));}
 
template <class typebase1>
bool operator !=(const mvect_common<typebase1>& d) const {return !(operator ==(d));}
 
bool
compareless(const typestore* data,const typestore* data1,typecount count,typecount count1) const;
 
bool
comparegreat(const typestore* data,const typestore* data1,typecount count,typecount count1) const;
 
template <class typebase1>
bool compareless(const mvect_common<typebase1>* d) const;
 
template <class typebase1>
bool comparegreat(const mvect_common<typebase1>* d) const;
};
 
template <class typebase>
template <class typebase1>
MVECT_INLINE
bool mvect_common<typebase>::operator ==(const mvect_common<typebase1>& d) const {
 
typecount l=typebase::getcount();
if(l==d.getcount()){
 
typecount i;
 
  for(i=typecount();i!=l;++i){
    if(typebase::data[i]!=d.getdata()[i]){
    return false;
    }//if
  }//for
return true;
}//if
 
else{
return false;
}//else
}
 
template <class typebase>
bool
mvect_common<typebase>::
compareless(const typestore* data,const typestore* data1,typecount count,typecount count1) const {
 
if(count>count1) return false;
if(count==typecount()) return false;
 
typecount i;
 
  for(i=typecount();i!=count;++i){
    if(data[i]>=data1[i]){
    return false;
    }//if
  }//for
 
return true;
}
 
template <class typebase>
bool
mvect_common<typebase>::
comparegreat(const typestore* data,const typestore* data1,typecount count,typecount count1) const {
 
if(count<count1) return false;
if(count1==typecount()) return false;
 
typecount i;
 
  for(i=typecount();i!=count1;++i){
    if(data[i]<=data1[i]){
    return false;
    }//if
  }//for
 
return true;
}
 
//compare for string
template <class typebase>
template <class typebase1>
MVECT_INLINE
bool mvect_common<typebase>::operator <(const mvect_common<typebase1>& d) const {
return 
compareless(
typebase::getdata(),d.getdata(),typebase::getcount()-1,d.getcount()-1);
}
 
template <class typebase>
template <class typebase1>
MVECT_INLINE
bool mvect_common<typebase>::operator >(const mvect_common<typebase1>& d) const {
return 
comparegreat(
typebase::getdata(),d.getdata(),typebase::getcount()-1,d.getcount()-1);
}
 
//compare for full vector
template <class typebase>
template <class typebase1>
MVECT_INLINE
bool mvect_common<typebase>::compareless(const mvect_common<typebase1>* d) const {
return compareless(this->getdata(),d->getdata(),this->getcount(),d->getcount());
}
 
template <class typebase>
template <class typebase1>
MVECT_INLINE
bool mvect_common<typebase>::comparegreat(const mvect_common<typebase1>* d) const {
return comparegreat(this->getdata(),d->getdata(),this->getcount(),d->getcount());
}
 
template <class typebase>
template <class F>
MVECT_INLINE
bool mvect_common<typebase>::
find(F* f,
typecount startcount,
typecount endcount,
typecount* current){
 
typecount i;
 
typecount start=startcount;
typecount end=endcount;
 
if(start>end) {i=start;start=end;end=i;}
if(end>=typebase::getcount()) {end=typebase::getcount();--end;}
 
++end;
 
for(i=start;i!=end;++i){
  if((*f)((typebase::getdata())[i])==true){
  current=i;
  return true;
  }//if
}//for
return false;
}
 
#endif
0
284 / 232 / 114
Регистрация: 07.09.2016
Сообщений: 584
17.10.2017, 20:33
DrOffset:
т.е. сперва ты говоришь что new - это не оператор, а выражение. (с частным случаем выражения можно согласится, потому как попадает под определение последовательности операторов и операндов). потом это у тебя уже все-таки оператор.
упорно игнорируешь наличие такого понятия как new оператор, подменяя это выражением (new-expression), хотя new operator входит в состав той самой последовательности операторов и операндов, которые образуют выражение согласно определению в стандарте. далее идет отсылка на new-expression с "неявным выполнением оператора new". окей, из-за пачки примеров можно понять, что ты имел в виду вызов функции operator new, а не всего, что происходит помимо вызова этой этой функции, конструированием, отслеживанием исключений, освобождением памяти в случае чего. без пояснений это можно понимать по разному и в некоторых контекстах эта разница имеет значение. путаница имеется, и спустя пару сообщений уже признаешь это. сам факт этого диалога тоже об этом свидетельствует. автор по инфе из википедии не понял, что там речь идет о функциях operator new, а не о new операторе, который в составе new-expression.
Если заниматься буквоедством и мою фразу:
в с++ есть путаница
воспринимать как в стандарте напутали и перемешали одно с другим - окей. я не ожидал, что бывают столь чувствительные к такой формулировке некой путанацы в понимании того, что изложено в литературе по этой теме.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
17.10.2017, 23:49
Цитата Сообщение от DU3 Посмотреть сообщение
т.е. сперва ты говоришь что new - это не оператор, а выражение. (с частным случаем выражения можно согласится, потому как попадает под определение последовательности операторов и операндов). потом это у тебя уже все-таки оператор.
Я говорил вот что:
Цитата Сообщение от DrOffset Посмотреть сообщение
new - это выражение. которое приводит к вызову оператора new для распределения памяти, а затем обеспечивает вызов конструктора, если это требуется для заданного типа. По ссылке про это написано.
Как видно, в этом предложении речь и об операторе new и о выражении в целом. Не вижу, где я изменял этому впоследствии. Везде одно и то же:
Цитата Сообщение от DrOffset Посмотреть сообщение
new - это выражение. которое приводит к вызову оператора new для распределения памяти
Цитата Сообщение от DrOffset Посмотреть сообщение
new-expression подразумевает неявное выполнение оператора new
На вопрос о том, чем является new в табличке (Operators and punctuators) я сказал, что это именно оператор, т.е. operator new.
Никакого противоречия нет. Я всегда из сообщения в сообщение говорил одно и то же.

Цитата Сообщение от DU3 Посмотреть сообщение
окей, из-за пачки примеров можно понять, что ты имел в виду вызов функции operator new, а не всего, что происходит помимо вызова этой этой функции, конструированием, отслеживанием исключений, освобождением памяти в случае чего. без пояснений это можно понимать по разному и в некоторых контекстах эта разница имеет значение.
Хм.
Цитата Сообщение от DrOffset
приводит к вызову оператора new для распределения памяти
и чуть далее
Цитата Сообщение от DrOffset Посмотреть сообщение
the allocation function’s name is operator new
Все без примеров было сразу прозрачно

Цитата Сообщение от DU3 Посмотреть сообщение
упорно игнорируешь наличие такого понятия как new оператор, подменяя это выражением (new-expression), хотя new operator входит в состав той самой последовательности операторов и операндов, которые образуют выражение согласно определению в стандарте. далее идет отсылка на new-expression с "неявным выполнением оператора new". окей, из-за пачки примеров можно понять, что ты имел в виду вызов функции operator new, а не всего, что происходит помимо вызова этой этой функции, конструированием, отслеживанием исключений, освобождением памяти в случае чего. без пояснений это можно понимать по разному и в некоторых контекстах эта разница имеет значение. путаница имеется, и спустя пару сообщений уже признаешь это. сам факт этого диалога тоже об этом свидетельствует. автор по инфе из википедии не понял, что там речь идет о функциях operator new, а не о new операторе, который в составе new-expression.
Ничего я не игнорирую, я еще двумя сообщениями выше сказал, что это одно и то же.
Цитата Сообщение от DrOffset
Цитата Сообщение от DU3 Посмотреть сообщение
1. оператор new
2. функция с именем operator new.
Это одно и то же.
Хорошо, поставим вопрос по-другому, раз мы никак не можем добиться взаимопонимания:
1. A a;
a++;
- тут ++ это оператор?
2. int A::operator++(int); - а это?
А если я напишу явно:
a.operator++(0); - что-то изменится?

Вот давай мы пойдем в параграф с упомянутой тобой выше табличкой (Operators and punctuators ). Там написано:
Code
1
2
3
4
5
6
7
8
9
10
preprocessing-op-or-punc: one of
    {   }   [   ]   #   ##  (   )
    <:  :>  <%  %>  %:  %:%:    ;   :   ...
    new     delete  ?   ::  .   .*
    +   -   *   /   %   ^   &   |   ~
    !   =   <   >   +=  -=  *=  /=  %=
    ^=  &=  |=  <<  >>  >>=     <<=     ==  !=
    <=  >=  &&  ||  ++  --  ,   ->*     ->
    and     and_eq  bitand  bitor   compl   not     not_eq
    or  or_eq   xor     xor_eq
Each preprocessing-op-or-punc is converted to a single token in translation phase 7.
Идем смотреть эту фазу:
Each preprocessing token is converted into a token.
Смотрим что такое токен:
Tokens
Code
1
2
3
4
5
6
token:
    identifier
    keyword
    literal
    operator
    punctuator
1 There are five kinds of tokens: identifiers, keywords, literals, operators, and other separators.
Blanks, horizontal and vertical tabs, newlines, formfeeds, and comments (collectively, “white space”), as described below, are ignored except as they serve to separate tokens.
[ Note: Some white space is required to separate otherwise adjacent identifiers, keywords, numeric literals, and alternative tokens containing alphabetic characters.
— end note
 ]
Идем смотреть что такое оператор:
A function declaration having one of the following operator-function-ids as its name declares an operator function.
A function template declaration having one of the following operator-function-ids as its name declares an operator function template.
A specialization of an operator function template is also an operator function.
An operator function is said to implement the operator named in its operator-function-id.
Code
1
2
3
4
5
6
7
8
9
10
operator-function-id:
    operator operator
 
operator: one of
    new delete  new[]   delete[]
    +   -   *   /   %   ^   &   |   ~
    !   =   <   >   +=  -=  *=  /=  %=
    ^=  &=  |=  <<  >>  >>= <<= ==  !=
    <=  >=  &&  ||  ++  --  ,   ->* ->
    ( )   [ ]
Внезапно, да? Еще раз - это одно и то же. Оператор new, который ты выделяешь отдельно - это лишь короткое имя, которое заменяется на вызов соответствующей функции (встроенной или нет).
Вот этим всем
Цитата Сообщение от DU3 Посмотреть сообщение
конструированием, отслеживанием исключений, освобождением памяти в случае чего
занимается new-expression, а не оператор new (какой бы смысл ты в него не вкладывал). Вот обоснование:
Конструирование:
A new-expression that creates an object of type T initializes that object as follows:

(18.1)
If the new-initializer is omitted, the object is default-initialized ([dcl.init]).
[ Note: If no initialization is performed, the object has an indeterminate value.
— end note
 ]
(18.2)
Otherwise, the new-initializer is interpreted according to the initialization rules of [dcl.init] for direct-initialization.
Отслеживание исключений и деаллокация:
If the new-expression terminates by throwing an exception, it may release storage by calling a deallocation function.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.10.2017, 23:49

Передача функции в аргумент
Есть три функции: void MainMenu(); void MainMenu_MilkMenu(); bool ErrorMenu(void (*pf)()); Все прототипы находятся в...

Передача числа через аргумент командной строки
Здравствуйте. Мне необходимо передать число в программу, а затем работать с этим числом. Проблема состоит в том, что при...

Передача массива как аргумент функции
Здравствуйте! Не подскажете - как передать функции массив как аргумент без использования Variant? Попробовал для этого следующий код: ...

Передача динамического массива как аргумент функции
Вот кусок кода. Если разкомментировать вывод элементов массива на экран в main, то происходит ошибка сегментирования. Из-за того, что я...

Какого типа должен быть 3-ий аргумент функции make_heap?
make_heap(Iterator first,Iterator last,Compare comp); Так вот: &quot;Как написать 3-ий параметр?&quot; Я думал это: true или false, но выдает...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
29
Ответ Создать тему
Новые блоги и статьи
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru