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

Свой класс string, нужна помощь с перегрузкой операторов

15.01.2024, 17:03. Показов 6212. Ответов 99

Студворк — интернет-сервис помощи студентам
Доброго времени суток.
Создал свой класс string. Цель создания своего класса строк - это скорость работы со строками и второе в образовательных целях. Если реализация получится удачной сделаю библиотеку для личного использования. Сейчас реализованы строки типа char потом добавлю wchar_t. new и delete решил не использовать, так как использую простой тип char. Вроде утечек памяти нет, а работать в теории должно быстрее. Прошу просмотреть код и дать рекомендации по оптимизации или указать на ошибки в коде, буду очень признателен. У меня возник вопрос с перегрузкой операторов, не понимаю как их сделать правильно, представленная реализация вроде работает правильно. Подскажите как правильно перегрузить [], +=, =, +. За ранее благодарю за ответы.

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
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <locale.h>
#include <malloc.h>
 
namespace str
{ 
struct string
{
private:
#pragma region ========================== Variable ==============================
    typedef struct 
    { 
        char *p_str; 
        size_t length;
    }stringA;
 
    stringA str{};
    const type_info& ti_c = typeid(const_cast<const char * >(str.p_str));
 
#pragma endregion 
 
#pragma region ========================== Private Function ==============================
_inline void clr()
{
    if(str.p_str)           free(str.p_str);    
    str.p_str = nullptr;    str.length = 0U;  
}
//------------------------------------------------------------------
_inline bool __type_c(const type_info& ti){return ti_c == ti;}
 
#pragma endregion 
 
 
public:
 
#pragma region ==================================== Constructor ======================================
/* Конструктор однобайтовые символы */
string(const char *p_str)
{   
    clr();
 
   // if(p_str){
        if((str.length = strnlen_s(p_str, SIZE_MAX) ) > 0U)
        { 
            if(str.p_str  = static_cast<char *>(malloc(sizeof(char) * (str.length + 1) ) ) ) 
            {
                strncpy_s(str.p_str, str.length + 1, p_str, _TRUNCATE); 
                str.p_str[str.length] = '\0'; 
                
            }
        }else{  str.p_str   = static_cast<char *>       (calloc(1, sizeof(char) ) );}
                
   // }
}
//------------------------------------------------------------------
 
/* Конструктор по умолчанию */
explicit string(){     
    clr();
    str.p_str   = static_cast<char *>       (calloc(1, sizeof(char) ) ); 
}
 
//------------------------------------------------------------------
/* Конструктор копирования */
string(const string& s) 
{
   // if(s.c_str() == ""){  str.p_str   = static_cast<char *>       (calloc(1, sizeof(char) ) );}else{
 
    clr();
 
    if ((str.length = strnlen_s(s.c_str(), SIZE_MAX)) > 0U) {
        if ((str.p_str = static_cast<char *>    (malloc(sizeof(char) * (str.length + 1) ) ) ) != nullptr) {
    
                strncpy_s(str.p_str, str.length + 1, s.c_str(), _TRUNCATE);
                str.p_str[str.length] = '\0';    
         }
     }
    //}     
}
 
//------------------------------------------------------------------
/* Конструктор перемещения */
string(string &&moved)  noexcept  // ссылка rvalue       
{
    str.p_str = moved.str.p_str;   
    str.length = moved.str.length;
    moved.str.p_str = nullptr;
     
  //  if(str.p_str == nullptr){  str.p_str   = static_cast<char *>       (calloc(1, sizeof(char) ) ); str.length=0U;}
}
 
//------------------------------------------------------------------
~string(){  clr();  }
 
#pragma endregion
 
#pragma region ====================================== Class Members =======================================
//------------------------------------------------------------------
_inline size_t length() const { return str.length ; }
 
//------------------------------------------------------------------
_inline size_t string_size() const  {   
       return (str.p_str == nullptr) ? 0U : ((str.length +  1) * sizeof(char));    
}
 
//------------------------------------------------------------------
/* Добавляем строку с реолакацией памяти */
void add(const char *p_str_in)
{   
    size_t l = 0U;
   // if(str.p_str == nullptr) return;    
   
    if ((l = strnlen_s(p_str_in, SIZE_MAX)) != 0U) {
        if ((str.p_str = static_cast<char *> (realloc(str.p_str, (str.length + l + 1) * sizeof(char) ) ) ) != nullptr) {
            
            if(!strcat_s(str.p_str, str.length + l + 1, p_str_in)) str.length += l;
            str.p_str[str.length] = '\0';
        }//else{  str.p_str   = static_cast<char *>       (calloc(1, sizeof(char) ) ); str.length=0U;}
    }
}
 
//------------------------------------------------------------------
_inline const char* c_str() const {
    return ((str.p_str != nullptr) ? str.p_str : const_cast< char * >(""));
}
 
//------------------------------------------------------------------
/* Вывести символ в строке по индексу от нуля до str.length - 1 */
_inline char ch_at(size_t index) const  {
        return (/*(str.p_str != nullptr) && */(index < str.length)) ? str.p_str[index] : '\0';
}
 
//------------------------------------------------------------------
/* Заменить символ встроке по индексу от нуля до str.length - 1 */
_inline void ch_set_at(size_t index, char ch)   {
            if(/*(str.p_str != nullptr) && */(index < str.length))  str.p_str[index] = ch;
}
//------------------------------------------------------------------
_inline void clear(){ str.p_str   = static_cast<char *>       (calloc(1, sizeof(char) ) ); str.length = 0U;}
 
 
#pragma endregion
 
#pragma region ====================================== Operator Reload ============================================
//------------------------------------------------------------------
 string& operator +=(string const &s )  {      
            this->add(const_cast<char *>(s.c_str()));
            return  *this;
}
 
//------------------------------------------------------------------
  string& operator +=(char *s )    {      
        this->add(static_cast<char *>(s));  
        return  *this;
}
 
//------------------------------------------------------------------
const auto& operator = (const string& s)
{      
   // if (s.c_str() == "")return this;
    clr();
    if ((str.length = strnlen_s(s.c_str(), SIZE_MAX)) != 0U) {
        if ((str.p_str = static_cast<char *>(malloc(sizeof(char) * (str.length + 1) ) ) ) != nullptr) {
    
                strncpy_s(str.p_str, str.length + 1, s.c_str(), _TRUNCATE);
                str.p_str[str.length] = '\0'; 
         }
     }                  
return this;
 
}
 
#pragma endregion
 
//------------------------------------------------------------------ 
 friend std::ostream &operator <<(std::ostream &ostr, string const &point) { ostr << point.c_str(); return ostr; }
 
/* Конец string  */
};
 
//------------------------------------------------------------------
const string operator + (const string &L, const string &R){ return string(L) += R;}    
 
/* Конец области str:: */
};
 
//
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.01.2024, 17:03
Ответы с готовыми решениями:

Класс "Массив дробных чисел" с перегрузкой операторов
Создание консольной программы реализующей перегрузку функции Помогите пожалуйста сделать лабу! Создать проект консольной программы. ...

Класс "Длинные числа" с перегрузкой операторов
только-только начал изучение классов, задание написать класс длинных чисел с перегрузкой операторов если честно, еще очень смутно...

Создать класс "деньги" с перегрузкой операторов
Создать класс деньги поля- гривны, копейки 2 конструктора перегрузить операторы: деньги+деньги деньги-деньги деньги*int ...

99
фрилансер
 Аватар для Алексей1153
6472 / 5690 / 1131
Регистрация: 11.10.2019
Сообщений: 15,168
16.01.2024, 19:03
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Signum7 Посмотреть сообщение
explicit string()
кстати, а меня одного смущает наличие explicit тут?
0
27 / 24 / 4
Регистрация: 20.11.2023
Сообщений: 131
16.01.2024, 19:21
[quote="Алексей1153;17183118"]да да, чтобы забыть про встраивание функций.[/quote
Доказательство того, что компилятору все равно

C++
1
2
3
4
5
6
7
8
9
#include <iostream>
 
inline int some_junk(int a, int b) {
    return a * b;
}
 
int main() {
    std::cout << some_junk(10, 10);
}
clang++ 17.0.2
Ассемблер
Assembler
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
main:                                   # @main                               
.seh_proc main                                                                
# %bb.0:                                                                      
    pushq   %rbp                                                              
    .seh_pushreg %rbp                                                         
    subq    $32, %rsp                                                         
    .seh_stackalloc 32                                                        
    leaq    32(%rsp), %rbp                                                    
    .seh_setframe %rbp, 32                                                    
    .seh_endprologue                                                          
    callq   __main                                                            
    movl    $10, %edx                                                         
    movl    %edx, %ecx                                                        
    callq   _Z9some_junkii   # типа инлайн                                                 
    movl    %eax, %edx                                                        
    movq    .refptr._ZNSt3__14coutE(%rip), %rcx                               
    callq   _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEi               
    xorl    %eax, %eax                                                        
    addq    $32, %rsp                                                         
    popq    %rbp                                                              
    retq                                                                      
    .seh_endproc                                                              
                                        # -- End function                     
    .def    _Z9some_junkii;                                                   
    .scl    2;                                                                
    .type   32;                                                               
    .endef                                                                    
    .section    .text$_Z9some_junkii,"xr",discard,_Z9some_junkii              
    .globl  _Z9some_junkii                  # -- Begin function _Z9some_junkii
    .p2align    4, 0x90                                                       
_Z9some_junkii:                         # @_Z9some_junkii типа инлайн                     
.seh_proc _Z9some_junkii                                                      
# %bb.0:                                                                      
    pushq   %rax                                                              
    .seh_stackalloc 8                                                         
    .seh_endprologue                                                          
    movl    %ecx, 4(%rsp)                                                     
    movl    %edx, (%rsp)                                                      
    movl    4(%rsp), %eax                                                     
    imull   (%rsp), %eax                                                      
    popq    %rcx                                                              
    retq                                                                      
    .seh_endproc                                                              
                                        # -- End function
0
фрилансер
 Аватар для Алексей1153
6472 / 5690 / 1131
Регистрация: 11.10.2019
Сообщений: 15,168
16.01.2024, 19:25
Цитата Сообщение от pechka_ne_sed Посмотреть сообщение
Доказательство того, что компилятору все равно
так а где же тут
Цитата Сообщение от pechka_ne_sed Посмотреть сообщение
перенести реализацию в source-файл (.cc/.cpp/.cxx).
?
1
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
16.01.2024, 19:28
pechka_ne_sed, да ну тут же о другом речь... Если компилятору в месте вызова доступно определение (не важно инлайн или нет - тут в большинстве случаев ему действительно все равно), то у него появляется возможность встроить вызов. Если же определение не доступно, то такой возможности не будет (LTO и подобные технологиии пока не рассматриваем).
1
27 / 24 / 4
Регистрация: 20.11.2023
Сообщений: 131
16.01.2024, 19:42
DrOffset, спасибо, что разъяснили
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
16.01.2024, 19:44
Цитата Сообщение от Signum7 Посмотреть сообщение
типобезопасная конструкция в своих недрах использует
malloc/realloc/free
на сколько я помню, соответственно не может по определению быть быстрее
Это понятно.
Я просто не понимаю зачем вы отказываетесь от new / delete в пользу malloc/realloc/free?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13202 / 6837 / 1822
Регистрация: 18.10.2014
Сообщений: 17,294
16.01.2024, 19:54
Цитата Сообщение от pechka_ne_sed Посмотреть сообщение
Доказательство того, что компилятору все равно
Во-первых, в упор не вижу здесь никакого доказательства. Дебажная компиляция, то есть компиляция без -O3, бессмысленна для целей рассмотрения сгенерированного кода.

https://godbolt.org/z/zr8qbvT5o

Во-вторых, что можно тут вообще доказывать, если inline изначально был всего лишь "намек"? А сегодня это не более чем средство подавления ODR. Любые функции, тело который видно компилятору во время компиляции, являются встраиваемыми. Нет никакого смысла навешивать на них еще inline, если вам не нужно подавить ODR

https://godbolt.org/z/748x6roTK
0
1 / 1 / 0
Регистрация: 30.03.2017
Сообщений: 136
16.01.2024, 20:07  [ТС]
#pragma region Я использую в студии мне так удобно для форума уберу.
по поводу inline внутри класса методы действительно инлайнятся не явно. Но при указании inline/forceinline компилятор обратит внимание на просьбу и в зависимости от настроек компилятора и типа функции сам примет решение вставлять или нет. Ну а если по сути то для класса действительно это лишнее а актуально только для определения методов вне класса. Возможно уберу если не буду выносить определения во вне.
По поводу комментариев мой препод (дай бог ему долгих лет) когда-то Требовал! все комментировать, просто привычка мне так удобно.
explicit string() а хе его знает для конструктора без параметров наверно не нужно
0
фрилансер
 Аватар для Алексей1153
6472 / 5690 / 1131
Регистрация: 11.10.2019
Сообщений: 15,168
16.01.2024, 20:15
Цитата Сообщение от Signum7 Посмотреть сообщение
Требовал! все комментировать
комментировать нужно только не очевидные вещи
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
16.01.2024, 20:17
Цитата Сообщение от Signum7 Посмотреть сообщение
Подскажите как правильно перегрузить [], +=, =, +.
Еще полезно будет == и <
Примеры как перегружать операторы нагугливаются запросто. Беда только в том (для меня), что постоянно меняется мода как именно эту перегрузку делать. Надо найти какую-то свежую, но авторитетную статью. А то опять смеяться начинают
0
1 / 1 / 0
Регистрация: 30.03.2017
Сообщений: 136
16.01.2024, 20:27  [ТС]
я и так все не комментирую а то что мне нужно

Добавлено через 3 минуты
Еще полезно будет == и < и [] так ни кто и не подсказал за все время. но зато я почерпнул много разных советов сейчас пока обдумываю как рефакторить свой класс.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
16.01.2024, 20:30
Цитата Сообщение от Signum7 Посмотреть сообщение
Еще полезно будет == и < и [] так ни кто и не подсказал за все время
Не подсказали, потому что код сперва нужно привести в порядок.
Иначе "подсказка" превратится в переписывание вашего кода для нормальной организации необходимых перегрузок.
Править наживую, прямо по вашему коду и ничего не переделывая, можно, но дело это неблагодарное (не стоит затраченных усилий).
1
1 / 1 / 0
Регистрация: 30.03.2017
Сообщений: 136
16.01.2024, 20:32  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Не подсказали, потому что код сперва нужно привести в порядок.
Иначе "подсказка" превратится в переписывание вашего кода для нормальной организации необходимых перегрузок.
Править наживую, прямо по вашему коду и ничего не переделывая, можно, но дело это неблагодарное (не стоит затраченных усилий).
Да я чуть позже исправленный класс выложу. Замечание актуально.
0
фрилансер
 Аватар для Алексей1153
6472 / 5690 / 1131
Регистрация: 11.10.2019
Сообщений: 15,168
16.01.2024, 20:34
Signum7, внутри класса string:

C++
1
2
3
4
5
6
7
8
9
friend bool operator < (const string& l, const string& r)noexcept
{
   реализация
}
 
friend bool operator == (const string& l, const string& r)noexcept
{
   реализация
}
а для operator[] - нужно для начала определиться, что он будет делать
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
16.01.2024, 20:36
Цитата Сообщение от Signum7 Посмотреть сообщение
[] так ни кто и не подсказал за все время
Вот жеж
Цитата Сообщение от KSergey9 Посмотреть сообщение
Примеры как перегружать операторы нагугливаются запросто.
Без обид, но вот правда: запрос "C++ перегрузить оператор []" выдаст вам массу отличных готовых классных примеров.
Можно даже схитрить и добавить string - и тогда вообще все готовенькое на блюдечке будет

Добавлено через 1 минуту
Ну или книжку любую открыть по С++, там точно будет глава "перегрузка операторов", где все подробно написано.
Не понятно какая подсказка нужна, потому и нет их.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
16.01.2024, 20:46
Листал предыдущие варианты и нашел это:
Цитата Сообщение от Signum7 Посмотреть сообщение
C++
1
2
3
4
/* Конструктор перемещения */
string(string &&moved) noexcept // ссылка rvalue 
{ 
 if (&moved != this) /* избегаем самоприсваивания*/
На всякий случай: в конструкторе нет проблемы самоприсваивания.

Добавлено через 5 минут
Цитата Сообщение от Signum7 Посмотреть сообщение
string& operator +=(char *s ) {
Здесь лучше const char * передавать.

Цитата Сообщение от Signum7 Посмотреть сообщение
auto & operator = (const string & s)
Реализация этого оператора не учитывает уже потенциально доступную память в объекте, а просто выделяет новую.
Но если уж хочется именно такой стратегии, то лучше и проще применить Copy&Swap Idiom, код станет гораздо приятнее с той же семантикой.

Добавлено через 4 минуты
Цитата Сообщение от Signum7 Посмотреть сообщение
[]
У вас есть вот такая функция.
Цитата Сообщение от Signum7 Посмотреть сообщение
C++
1
2
3
4
/* Вывести символ в строке по индексу от нуля до str.length - 1 */
_inline char ch_at(size_t index) const {
 return (/*(str.p_str != nullptr) && */(index < str.length)) ? str.p_str[index] : '\0';
}
operator[] похож на нее, но обычно обладает следующими свойствами:
1) существует в двух вариантах - некостантном и константном
2) для классов подобным string он возвращает ссылку и константную ссылку на char type соответственно
3) в нем нет постоянных проверок выхода за диапазон (подразумевается, что ее сделали уровнем выше), для проверки диапазона в отладке может стоять assert
1
1 / 1 / 0
Регистрация: 30.03.2017
Сообщений: 136
16.01.2024, 21:00  [ТС]
Цитата Сообщение от KSergey9 Посмотреть сообщение
Вот жеж

Без обид, но вот правда: запрос "C++ перегрузить оператор []" выдаст вам массу отличных готовых классных примеров.
Можно даже схитрить и добавить string - и тогда вообще все готовенькое на блюдечке будет

Добавлено через 1 минуту
Ну или книжку любую открыть по С++, там точно будет глава "перегрузка операторов", где все подробно написано.
Не понятно какая подсказка нужна, потому и нет их.
да я смотрел но там есть обычный и константный вариант [] я не понял как мне реализовать для моего класса правильно. И нужно ли вообще оба варианта?
а нужно
C++
1
2
3
4
5
6
***
str::string str("Привет ");
***
где-то в цикле... 
if(str[i] == 'и')
***
Добавлено через 7 минут
Цитата Сообщение от Алексей1153 Посмотреть сообщение
Signum7, внутри класса string:

C++
1
2
3
4
5
6
7
8
9
friend bool operator < (const string& l, const string& r)noexcept
{
   реализация
}
 
friend bool operator == (const string& l, const string& r)noexcept
{
   реализация
}
я так понимаю внутри можно просто использовать strcmp я правильно думаю?
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
16.01.2024, 21:02
Для == можно длины сравнить сначала
1
1 / 1 / 0
Регистрация: 30.03.2017
Сообщений: 136
16.01.2024, 21:28  [ТС]
Сейчас буду переделывать класс.
Для начала переделал структуру строки
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
namespace str
{
 
class string
{
private:
const size_t size_string = _MAX_PATH * sizeof(char);
 
struct stringA
    { 
    private:    
        explicit    stringA(const stringA&)     = delete;    
        stringA&    operator=(const stringA&)   = delete;        
    public:  
        ~stringA(){;}
         stringA(void) : length(0U), size_str(0U), p_str(nullptr) {} 
 
        size_t length;      /* Количество символов в строке */
        size_t size_str;    /* Размер выделенной памяти для строки */     
        char *p_str;        
 
    };  stringA str;
const size_t size_string = _MAX_PATH * sizeof(char); для wchar соответственно будет умножение на 2

Для ускорения работы планирую выделять сразу память для строки размера size_string и в случае необходимости буду перевыделять память для более длинной строки.
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
16.01.2024, 21:32
А зачем структура внутри класс? почему не сразу в классе нужные поля?
Просто любопытствую
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.01.2024, 21:32
Помогаю со студенческими работами здесь

Разработать класс "Сотрудник" (с перегрузкой операторов)
задание следующее Разработать класс для хранения информации о сотруднике, включая ФИО, зарплату, должность (определяемую значениями...

Написать класс "Дата" с перегрузкой операторов
Здравствуйте, задание: написать класс Дата с перегрузкой операторов. Вот мой код. Почему-то компилятор выбивает, что в main Data и d1 не...

Создать класс "Полином" с перегрузкой операторов
Помимо функций, указанных в задании, включить в реализацию класса конструкторы всех типов, функции ввода-вывода. Необходимо также...

Перегрузка операторов. Класс String
Зравствуйте! У меня есть вопрос. Реализовать класс String для работы со строками символов. Память под строку выделять автоматически....

Свой класс String
Небольшой набросок на класс String #include &lt;iostream&gt; #include &lt;cstring&gt; using namespace std; class String { struct...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru