Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.69/29: Рейтинг темы: голосов - 29, средняя оценка - 4.69
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484

Оценка кода

28.01.2020, 22:43. Показов 7124. Ответов 123
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, прошу вас всех оценить мой код , по возможности дать советы что так , а что не так и как это исправить либо в каком направлении смотреть , это моя первая попытка создать что-то не ради забавы , а чтобы использовать это в реальной жизни. Сразу скажу что еще не все доделал что хотел бы. Это декодер asn1.der , данные передаются в decode() в виде BLOB конвертированного в массив знаков.
header
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include "string.h"
 
#define ENDOFARRAY -1
 
#define INTEGER 0x02
#define OCTET_STRING 0x04
#define OBJECT_IDENTIFIER 0x06
#define SEQUENCE 0x30
 
#define SETBIT(number,bit) ((number) |= (pow(2,bit)))
#define CHECKBIT(number,bit) ((number) & (1 << (bit)))
 
class decoder{
    public:
        decoder();
 
        ~decoder();
 
        char * decode(const unsigned char * ,int,char * cipherT = nullptr, char * Other = nullptr);
 
        void decode64(const char * ,char * cipherT = nullptr, char * Other = nullptr);
 
    private:
        //Calculates number in power
        int pow(int,int);
 
        char* IntToHexChar(int);
 
        void AppendOctetString(int);
 
        int CalculateLongSID(int&);
 
        //Calculates all decimal values of indentifier
        void CalculateIdentifier(int);
 
        //Calculates first byte of indentifier which is decoded to two values
        void CalculateIdentifierFirstByte();
 
        //Convert byte array to decimal value
        int CalculateBytes(int);
 
        //Decoding encoded ans1.der string
        void ParseData();
 
        //Appends passed array with new array
        char * Append(char *,char *);
 
        //Decodes length of front bytes
        int ParseLength(int);
 
        //Handles Octet String
        void OctetStringHandler();
 
        //Handles Object Indentifier
        void ObjectIdentifierHandler();
 
        //Handles Integer
        void IntegerHandler();
 
        //Handles Sequance
        void SequenceHandler();
 
        //Converts char array to int array
        void ToIntArray();
 
        //Copies value of passed array and returns new created one with same values
        const unsigned char *  NewArr(const unsigned char* );
 
        //Byte array as integers
        int * IntByteArray = nullptr;
 
        //Pointer to IntByteArray which is used to move through array
        int * pArr = nullptr;
 
        //Byte array as char
        const unsigned char * CharByteArray = nullptr;
 
        //The result decoded string
        char * Result = new char[1]{};
 
        //Size of IntByteArray
        int size = 0;
};

cpp
Кликните здесь для просмотра всего текста
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
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
#include "asn1der.h"
 
decoder::decoder(){
}
 
 
decoder::~decoder(){
    if(CharByteArray)
        delete[] CharByteArray;
    if(IntByteArray)
        delete[] IntByteArray;
}
 
 
char * decoder::Append(char * dst,char * src){  
     int dstlen = strlen(dst),srclen =  strlen(src);
     char* temp = new char[dstlen+srclen+1]{};
     memcpy(temp, dst, dstlen);
     strcat(temp,src);
     delete[] dst;
     return temp;
}
 
 
const unsigned char *  decoder::NewArr(const unsigned char* arr) {
    unsigned char * temp = new unsigned char[size+1]{};
    for(int i = 0;i < size;++i){
        temp[i] = arr[i];
    }
    return temp;
}
 
 
void decoder::ToIntArray(){
    IntByteArray = new int[size+1]{};
    for(int i = 0;i<size;++i){
        IntByteArray[i] = (unsigned int)CharByteArray[i];
    }
    IntByteArray[size] = -1;
    pArr = IntByteArray;
}
 
 
void decoder::ParseData(){
    switch (*pArr)
    {
        case ENDOFARRAY:
            break;
        case INTEGER:
            IntegerHandler();
            ParseData();
            break;
        case OCTET_STRING:
            OctetStringHandler();
            ParseData();
            break;
        case OBJECT_IDENTIFIER:
            ObjectIdentifierHandler();
            ParseData();
            Result = Append(Result,const_cast<char *>("}"));
            break;
        case SEQUENCE:
            SequenceHandler();
            ParseData();
            Result = Append(Result,const_cast<char *>("\n}"));
            break;
        default:
            break;
    }
}
 
 
char * decoder::decode(const unsigned char * Text,int length,char * cipherT, char * Other){
    size = length;
      CharByteArray = NewArr(Text);
      ToIntArray();
      try{
          ParseData();
      }
      catch(const char* exception){
         std::cout << exception;
          return nullptr;
      }
      return Result;
}
 
 
int decoder::ParseLength(int num){
    num &= 63;
    return num;
}
 
 
int decoder::pow(int num, int times){
    if(times == 0)
        return 1;
    if(times == 1)
        return 2;
    if(times > 1)
        return num*pow(num,--times);
}
 
 
int decoder::CalculateBytes(int len){
    int calculated = 0,power = len*8-1;
    for(int i = 0;i < len && ++pArr;i++){
 
        if(*pArr == -1 )
            throw "CalculateBytes error";
 
        for(int q = 7;q >= 0;--q){
            if(CHECKBIT(*pArr,q)){
                calculated += pow(2,power);
            }
            --power;
        }
    }
    return calculated;
}
 
 
void decoder::CalculateIdentifierFirstByte(){ //there are only three types of first node 1,2,3 , first byte is calculated with (firstnode*40 + secondnode)
    if(*++pArr < 80){ //if first byte is less than 80 it means that first node is 1
 
        if(*pArr == -1 )
            throw "CalculateIndentifierFirstByte error";
 
        Result = Append(Result,const_cast<char *>((std::to_string(1) + ".").c_str()));
        Result = Append(Result,const_cast<char *>((std::to_string(*pArr-40)+ ".").c_str())); //if first node is 1 the second node is : number - (firstnode * 40)
        return;
    }else if (*pArr < 120) //means that first node is 2
    {
        Result = Append(Result,const_cast<char *>((std::to_string(2) + ".").c_str()));
        Result = Append(Result,const_cast<char *>((std::to_string(*pArr-80)+ ".").c_str())); //if first node is 1 the second node is : number - (firstnode * 40)
        return;
    }else // first node is 3
    {
        Result = Append(Result,const_cast<char *>((std::to_string(3) + ".").c_str()));
        Result = Append(Result,const_cast<char *>((std::to_string(*pArr-120)+ ".").c_str()));
        return;
    }
}
 
 
int decoder::CalculateLongSID(int& size) {
  int length = 1, value = 0, SID = 0;
  for (;; ++pArr) {
    if (!CHECKBIT(*pArr, 7)) {
      ++length;
      *pArr &= 127;
      value |= *pArr;
      break;
    }
    else
    {
      ++length;
      *pArr &= 127;
      value |= *pArr;
      value = value << 8;
    }
  }
  for (int i = 0; i < length*8-1; ++i) {
    if(CHECKBIT(value,i)){
        SETBIT(SID,i-i/8);
    }
  }
  size += length-2;
  return SID;
 
}
 
 
void decoder::CalculateIdentifier(int len){
    CalculateIdentifierFirstByte();
    for(int i = 0; i<len && ++pArr ; ++i){
        if(*pArr == -1 || *(pArr+1) == -1)
            throw "CalculateIndentifier error";
        if(!CHECKBIT(*pArr,7)){ //if decimal number consists of only one byte
            Result = Append(Result,const_cast<char *>((std::to_string(*pArr) + ".").c_str()));
        }else //if bit 7 is set it means that length of decimal number in bytes is bigger than one byte
        {
            Result = Append(Result,const_cast<char *>((std::to_string(CalculateLongSID(i)) + ".").c_str()));
        }
    }
}
 
 
char * decoder::IntToHexChar(int number){
    char * hex = new char[3]{};
    int num = number/16;
    for(int i = 0;i < 2;++i)
    switch (num)
    {
    case 15:
        hex[i] = 'F';
        num = number%16;
        break;
    case 14:
        hex[i] = 'E';
        num = number%16;
        break;
    case 13:
        hex[i] = 'D';
        num = number%16;
        break;
    case 12:
        hex[i] = 'C';
        num = number%16;
        break;
    case 11:
        hex[i] = 'B';
        num = number%16;
        break;
    case 10:
        hex[i] = 'A';
        num = number%16;
        break;
    case 9:
        hex[i] = '9';
        num = number%16;
        break;
    case 8:
        hex[i] = '8';
        num = number%16;
        break;
    case 7:
        hex[i] = '7';
        num = number%16;
        break;
    case 6:
        hex[i] = '6';
        num = number%16;
        break;
    case 5:
        hex[i] = '5';
        num = number%16;
        break;
    case 4:
        hex[i] = '4';
        num = number%16;
        break;
    case 3:
        hex[i] = '3';
        num = number%16;
        break;
    case 2:
        hex[i] = '2';
        num = number%16;
        break;
    case 1:
        hex[i] = '1';
        num = number%16;
        break;
    case 0:
        hex[i] = '0';
        num = number%16;
        break;
    default:
        break;
    }
    return hex;
}
 
 
void decoder::AppendOctetString(int length){
     for(int i = 0; i < length && ++pArr;++i){
         char * p = IntToHexChar(*pArr);
         Result = Append(Result,p);
         delete[] p;
     }
}
 
 
void decoder::OctetStringHandler(){
    if(!CHECKBIT(*++pArr,7)){
        if(*pArr == -1 )
            throw "IntegerHandler error";
 
        Result = Append(Result,const_cast<char *>(" Octet String : { "));
        AppendOctetString(ParseLength(*pArr));
        Result = Append(Result,const_cast<char *>("}"));
    }
    ++pArr;
}
 
 
void decoder::ObjectIdentifierHandler(){
    Result = Append(Result,const_cast<char *>(" OBJECT INDENTIFIED WITH VALUE: { "));
    if(!CHECKBIT(*++pArr,7)){ //if length in one byte
 
        if(*pArr == -1 )
            throw "IntegerHandler error";
 
        CalculateIdentifier(*pArr-1);
    }
    else //behaviour not described
    {
        CalculateIdentifierFirstByte();
        CalculateIdentifier(ParseLength(*pArr));
    }
    ++pArr;
}
 
 
void decoder::IntegerHandler(){
    if(!CHECKBIT(*++pArr,7)){
 
        if(*pArr == -1 )
            throw "IntegerHandler error";
 
        Result = Append(Result,const_cast<char *>(" INTEGER WITH VALUE: { "));
        Result = Append(Result, const_cast<char *>((std::to_string(CalculateBytes(ParseLength(*pArr)))+ " }").c_str()));
    }
    else
    {
        Result = Append(Result,const_cast<char *>(" INTEGER WITH VALUE: { "));
        Result = Append(Result, const_cast<char *>((std::to_string(CalculateBytes(CalculateBytes(ParseLength(*pArr))))+ " }").c_str()));
    }
    ++pArr;
}
 
 
void decoder::SequenceHandler(){
    if(!CHECKBIT(*++pArr,7)){
 
            if(*pArr == -1 )
                throw "SequenceHandler error";
 
            Result = Append(Result,const_cast<char *>(" SEQUENCE WITH LENGTH: "));
            Result = Append(Result, const_cast<char *>((std::to_string(*pArr) + "{ \n\t").c_str()));
      }
    else
    {
        Result = Append(Result,const_cast<char *>(" SEQUENCE WITH LENGTH: "));
        Result = Append(Result, const_cast<char *>((std::to_string(CalculateBytes(ParseLength(*pArr)))+ "\n\t").c_str()));
    }
    ++pArr;
}
 
 
void decoder::decode64(const char * Text,char * cipherT, char * Other){
    
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.01.2020, 22:43
Ответы с готовыми решениями:

Советы по ускорению работы кода + оценка самого кода
Вчера вечером сел написать 3 консольные программки для работы с шаблонами размножения текста: 1.Выборка групп синонимов(создание словаря)...

Оценка кода
Добрый день! Есть задание в ВУЗе: Я сделал следующий код: #include &lt;iostream&gt; #include &lt;conio.h&gt; int...

Оценка кода
Суть задачи описал вначале кода, хотелось бы услышать, что можно было сделать лучше, где можно было бы написать/описать...

123
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
07.02.2020, 23:06
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от avgoor Посмотреть сообщение
И ТС-у ее читать - явно рано.
мне - не явно.

Макконнелл популярно и доходчиво объясняет в общем то капитанские вещи.
он даёт простое понимание простых вещей.

к нему удобно отсылать, когда лень в сотый раз объяснять одно и тоже.

Цитата Сообщение от avgoor Посмотреть сообщение
Если хочешь, могу примеры, даже с этого форума, где, в общем-то, годную идею довели до маразма. Но, только в личку, обидятцо.
хочу)

Цитата Сообщение от ReYalp Посмотреть сообщение
throw "CalculateBytes error";
за такой код убивать нужно.

нельзя кидать что попало.
воспитанные люди всегда кидают наследников std::exception

код цивилизованного человека выглядит так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
     try{
          ParseData();
      }
      catch(const ::std::exception& e){
         std::cout << e.what();  // <--- мы можем получить диагностику
         // и понять, в чем заключалась проблема
 
         return nullptr;
      }
      catch(...)
      {
        // сюда залетает всякий хлам непонятного происхождения
        // здесь мы никак не можем понять что произошло
      }
и позволяет отловить и обработать любые исключительные ситуации.
в том числе такие, о которых разработчик может даже и не знать.

Цитата Сообщение от ReYalp Посмотреть сообщение
void decoder::CalculateIdentifier(int len){
ты допускаешь мысль, что длина может быть отрицательной?

Цитата Сообщение от ReYalp Посмотреть сообщение
int num = number/16;
    hex[0] = hexarr[num];
исходя из контекста использования num - индекс массива.
почему int ?
ты допускаешь мысль, что индекс массива может быть отрицательным?

а так в целом, уже гораздо, гораздо лучше.
1
07.02.2020, 23:22

Не по теме:

Цитата Сообщение от hoggy Посмотреть сообщение
за такой код убивать нужно.
меня из за такого в одну конторку не взяли)))) года так 3 назад

0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
07.02.2020, 23:27
Цитата Сообщение от hoggy Посмотреть сообщение
Макконнелл популярно и доходчиво объясняет в общем то капитанские вещи.
Во во. Впрочем как и Майерс и куча других авторов. Другой вопрос для кого они очевидные. Мое мнение: есть вещи которые постигаются только через боль. Тогда человек начинает задавать правильные вопросы типа, как "избавиться от геморроя с ..." В этот момент и нужно читать эти книжки. Т.е. когда цель "писать эффективно", а не когда чтоб "пацаны похвалили за код".
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
08.02.2020, 00:25
Цитата Сообщение от avgoor Посмотреть сообщение
Мое мнение: есть вещи которые постигаются только через боль.
есть такая поговорка: умный человек учится на чужих ошибках.

Цитата Сообщение от avgoor Посмотреть сообщение
правильные вопросы типа, как "избавиться от геморроя с ..."
лично я предпочитаю изначально не употреблять наркотики.
что бы затем не нужно было задать правильных вопросов типа: "как избавиться от...".
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
08.02.2020, 01:15
Цитата Сообщение от hoggy Посмотреть сообщение
лично я предпочитаю изначально не употреблять наркотики.
Что ты употребляешь, мне все равно.
Цитата Сообщение от hoggy Посмотреть сообщение
умный человек учится на чужих ошибках.
Умными не рождаются.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
08.02.2020, 01:33  [ТС]
hoggy, спасибо) но поздновато, мне уже рассказали обо всех ошибках и посоветовали книжечку которую я сейчас читаю)
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
08.02.2020, 02:08
Цитата Сообщение от avgoor Посмотреть сообщение
Что ты употребляешь, мне все равно.
дык, неудивительно:
Цитата Сообщение от avgoor Посмотреть сообщение
Мое мнение: есть вещи которые постигаются только через боль. Тогда человек начинает задавать правильные вопросы типа, как "избавиться от геморроя с ..."
Цитата Сообщение от avgoor Посмотреть сообщение
Умными не рождаются.
когда мне было 12 лет, один мой друг задал мне вопрос:
"сколько ещё тебе нужно скушать дерьма, что бы понять, что дерьмо - не есть твой любимый продукт?"
(ц)

что бы ответить на этот вопрос,
не нужно быть семи пядей во лбу.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
08.02.2020, 03:27
Цитата Сообщение от hoggy Посмотреть сообщение
один мой друг задал мне вопрос:
"сколько ещё тебе нужно скушать дерьма, что бы понять, что дерьмо - не есть твой любимый продукт?"
Цитата Сообщение от avgoor Посмотреть сообщение
Что ты употребляешь, мне все равно.
Дерьмо? Не, тогда не все равно!

Цитата Сообщение от avgoor Посмотреть сообщение
как "избавиться от геморроя с ..."
Тут имелись в виду внешние проявления таких вещей, как, например, бездумное использование глобальных переменных, спагетти код и пр.
0
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
08.02.2020, 03:59
Цитата Сообщение от ReYalp Посмотреть сообщение
обо всех ошибках
это заблуждение

сразу поглядел в "то место где вам про все ошибки рассказали"
вот ваш код исправленный c индусского
C++
230
231
232
233
234
235
236
237
238
char * decoder::IntToHexChar(int number){
    char * hex = new char[3]{}; <<<--------------ОТКУДА УВЕРЕННОСТЬ ЧТО СТРОКА ТЕРМИНИРУЕТСЯ НУЛЕМ? это UB!
    char hexarr[] = "0123456789ABCDEF";
    int num = number/16;
    hex[0] = hexarr[num];
    num = number%16;
    hex[1] = hexarr[num];
    return hex;
}
и второе зачем дергать каждый раз релокацию?
если можно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
char* decoder::IntToHexChar(int number)
{   static char hex[3] = {0};
    const char  s  [ ] = {"0123456789ABCDEF"};
    hex[0] = s[number>>4];
    hex[1] = s[number&15];
    return hex;
}
 
void decoder::AppendOctetString(int length)
{   for(int i = 0; i < length && ++pArr; ++i)
    {   char * p = IntToHexChar(*pArr);
        Result = Append(Result,p);
    }
}
0
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
08.02.2020, 12:07
del
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
08.02.2020, 13:15
Цитата Сообщение от XLAT
вот ваш код исправленный c индусского
Да, давайте исправим ваш код с индусского:
Цитата Сообщение от XLAT
C++
1
char * hex = new char[3]{}; <<<--------------ОТКУДА УВЕРЕННОСТЬ ЧТО СТРОКА ТЕРМИНИРУЕТСЯ НУЛЕМ? это UB!
Открываем стандарт языка С++:
Цитата Сообщение от http://eel.is/c++draft/dcl.init#11
An object whose initializer is an empty set of parentheses, i.e., (), shall be value-initialized.
[ Note: Since () is not permitted by the syntax for initializer,
X a();
is not the declaration of an object of class X, but the declaration of a function taking no argument and returning an X. The form () is permitted in certain other initialization contexts ([expr.new], [expr.type.conv], [class.base.init]). — end note ]
Смотрим value initialization:
Цитата Сообщение от http://eel.is/c++draft/dcl.init#8
To value-initialize an object of type T means:
- if T is a (possibly cv-qualified) class type ([class]) with either no default constructor ([class.default.ctor]) or a default constructor that is user-provided or deleted, then the object is default-initialized;
- if T is a (possibly cv-qualified) class type without a user-provided or deleted default constructor, then the object is zero-initialized and the semantic constraints for default-initialization are checked, and if T has a non-trivial default constructor, the object is default-initialized;
- if T is an array type, then each element is value-initialized;
- otherwise, the object is zero-initialized.
1
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
08.02.2020, 14:12
Azazel-San, да помню
на трубе Стаус говорил про то, что современные кресты это не те что были раньше:
"Забудьте те кресты на которых вы писали раньше."
"Современный С++ это как бы уже новый язык. Встречайте."

мой контекст отличный от вашего.
спасибо конешно, но утром с ясной головой уже и сам догадался что херню написал:

Цитата Сообщение от XLAT Посмотреть сообщение
char* decoder::IntToHexChar(int number)
{ static char hex[3] = {0};
можно и лучше ваще без статика:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
char* IntToHexChar(unsigned char* number)
{   const char  s[] = {"0123456789ABCDEF"};
    number[1] = s[number[0]>>4];
    number[2] = s[number[0]&15];
    return (char*)(number+1);
}
 
 
void decoder::AppendOctetString(int length)
{   for(int i = 0; i < length && ++pArr; ++i)
    {   int a = *pArr;
        char * p = IntToHexChar((unsigned char*)&a);
        Result = Append(Result,p);
    }
}
Добавлено через 2 минуты
Azazel-San,
сама идея дергать new/delete на каждом чихе есть гуано.
помните притчу про ученика, которого однажды научили богу молиться?

Добавлено через 7 минут
с другой стороны, конеш и пофигу:
кто и кому запрещает писать на С++, как на бейсике,
пусть обо всём позаботиться компилятор и современный многоядерный хардвар.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
08.02.2020, 14:39
Цитата Сообщение от avgoor Посмотреть сообщение
Тут имелись в виду внешние проявления таких вещей, как, например, бездумное использование глобальных переменных, спагетти код и пр.
я сразу понял твою метафору.
а ты мою?

человеки, которым не всё равно, что принимают другие человеки,
способны брать себе на вооружение их опыт.

человеки, которым всё равно, считают, что жизнь - боль и страдания.
ведь им приходится лечить гемморой.

сколько ещё геммороев тебе нужно вылечить,
что бы понять, что гемморой - не твой любимый продукт?
0
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
08.02.2020, 15:19
бездумное использование глобальных переменных
заканчивался уже 21 век, но люди всё никак не могли решить:
нужно или не можно использовать глобальные переменные.
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
08.02.2020, 15:44
Цитата Сообщение от XLAT Посмотреть сообщение
Забудьте те кресты на которых вы писали раньше.
Раньше, тоже так можно было. Не было только braces-initialization.
Цитата Сообщение от XLAT Посмотреть сообщение
сама идея дергать new/delete на каждом чихе есть гуано
Ну, конечно, это не оптимально, но речь шла о другом, а именно об UB. Даже если бы там не было инициализации нулем, UB бы там не было. Вот если бы использовали какой-то strlen, тогда да, но все равно не в том месте где вы указали.
0
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
08.02.2020, 16:52
Цитата Сообщение от Azazel-San Посмотреть сообщение
Раньше, тоже так можно было
как?
я об этом ничаво не занаю.

C++
1
2
/// C++03
char* hex = new char[3]; // <<<---ПОКАЖИТЕ МНЕ, КАК ТУТ ИНИЦИАЛИЗИРОВАЛИ РАНЬШЕ?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
08.02.2020, 16:56
Цитата Сообщение от XLAT Посмотреть сообщение
как?
не уверен, но мож так?
C++
1
char* hex = new char[3]();
1
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
08.02.2020, 17:03
Цитата Сообщение от zayats80888 Посмотреть сообщение
не уверен, но мож так?
блин я вроде и так тыкал но выкидывало ошибку.
щас попробовал - работает!

цубер-эффект, однако
0
08.02.2020, 17:06

Не по теме:

Цитата Сообщение от XLAT Посмотреть сообщение
блин я вроде и так тыкал но выкидывало ошибку.
скорей всего пытался нолик в скобочки засунуть :)

0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
08.02.2020, 18:42  [ТС]
XLAT, это не заблуждение, я говорю не о тех постах которые раньше писали тк в них никто не написал к примеру о exception'ax о которых hoggy написал, мне все в ЛС пояснили ,но за исправления спасибо

Добавлено через 11 минут
XLAT,
Цитата Сообщение от XLAT Посмотреть сообщение
char* IntToHexChar(unsigned char* number)
{ const char s[] = {"0123456789ABCDEF"};
number[1] = s[number[0]>>4];
number[2] = s[number[0]&15];
return (char*)(number+1);
}
как работает эта штука? что она должна на вход принимать ? строку? почему строку ? в каком виде строку ?

Добавлено через 4 минуты
все, разобрался, спасибо
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.02.2020, 18:42

оценка кода
Дайте оценку моему коду (https://onlinegdb.com/r1i-i8Cqm), укажите на ошибки

Оценка стиля кода
Народ, есть предложение. Оцените мой код. Не в смысле функционала - в смысле стиля написания. Значится, вот тут есть некий код: bool...

Оценка кода динамического двумерного массива
Доброго времени суток. Прошу оценить правильность выделения и удаления памяти, а также заполнения массива. Два примера. Вот первый. В...

Список учеников имеет следующую структуру: фамилия – класс - оценка по алгебре - оценка по физике - средний балл
Задание такое Список учеников имеет следующую структуру: фамилия – класс - оценка по алгебре - оценка по физике - средний балл. При...

Оценка стиля написания кода
Здравствуйте! Я к вам пожаловал не с очередной проблемой. Код у меня рабочий. Меня интересует то, насколько стандартен мой стиль...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru