Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
49 / 33 / 9
Регистрация: 27.12.2017
Сообщений: 1,402
1

Конвертация с long unsigned в int ошибка

03.02.2020, 20:52. Показов 3756. Ответов 45
Метки нет (Все метки)

warning: conversion to ‘long unsigned int’ from ‘int’ may change the sign of the result [-Wsign-conversion]
offset == 2? offset = 4 : offset ==4? offset = 6 :offset == 6? offset = 2,i+=8: throw("Base64ToASCII error");
C++
1
int offset = 2;
компилятор выдает странную ошибку, как пофиксить?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.02.2020, 20:52
Ответы с готовыми решениями:

Требуется написать функцию long long pow(long long a, unsigned int p), которая возводит число a в степень p
Требуется написать функцию long long pow(long long a, unsigned int p), которая возводит число a в...

Быстрое вычисление наибольшего общего делителя для unsigned long long int
Даны два числа типа unsigned long long int, в них могут оказаться любые представимые значения,...

Перевести long long unsigned int в массив char
Подскажите, пожалуйста, как превратить число типа long long unsigned int в массив символов? Каждый...

Работа с unsigned long long int на 32-битных системах
В программе испольуется тип данных unsigned long int, но в некоторых (хотя и очень редких) случаях...

45
Параллельный Кот
1902 / 825 / 349
Регистрация: 25.03.2016
Сообщений: 2,041
03.02.2020, 20:55 2
Цитата Сообщение от ReYalp Посмотреть сообщение
offset == 2? offset = 4 : offset ==4? offset = 6 :offset == 6? offset = 2,i+=8
А это что? Весь код покажите.
0
49 / 33 / 9
Регистрация: 27.12.2017
Сообщений: 1,402
03.02.2020, 21:10  [ТС] 3
valen10, это обычная проверка переменной типа int

Добавлено через 12 секунд
Цитата Сообщение от ReYalp Посмотреть сообщение
int offset = 2;
этой

Добавлено через 25 секунд
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int ch = 0,offset = 2;
    unsigned char * pCharByteArray = CharByteArray; //pointer to CharByteArray to move through this array
    for(unsigned long i = 0;i < sizeof64*8-1;++i && ++pCharByteArray){
        for(int q = 0; q < 8-offset;++i && ++q){
            if(CHECKBIT(Base64CharToDec(base64[i/8]),i%8))
                SETBIT(ch,q);
        }
        ch = ch << offset;
        for(int q = 0;q < offset;++i && ++q){
            if(CHECKBIT(Base64CharToDec(base64[(i+6)/8]),(i+6)%8))
                SETBIT(ch,q);
        }
        --i;
        offset == 2? offset = 4 : offset ==4? offset = 6 :offset == 6? offset = 2,i+=8: throw("Base64ToASCII error");
        *pCharByteArray = static_cast<unsigned char>(ch);
        ch = 0;
    }
Добавлено через 11 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
switch(offset){
            case 2 :
                offset = 4;
                break;
            case 4:
                offset = 6;
                break;
            case 6:
                offset =2;
                i+=8;
                break;
            default:
                break;
        }
так все окей
0
Параллельный Кот
1902 / 825 / 349
Регистрация: 25.03.2016
Сообщений: 2,041
03.02.2020, 21:17 4
Цитата Сообщение от ReYalp Посмотреть сообщение
так все окей
Потому что использовать ?: так, как у вас в первом случае - идеальный способ найти приключения.

И это не весь код. Там наверняка еще много сюрпризов может быть.
0
49 / 33 / 9
Регистрация: 27.12.2017
Сообщений: 1,402
03.02.2020, 21:29  [ТС] 5
valen10, в чем проблема в данном случае использовать "?" ?
0
DrOffset
03.02.2020, 21:37
  #6

Не по теме:

Цитата Сообщение от ReYalp Посмотреть сообщение
offset == 2? offset = 4 : offset ==4? offset = 6 :offset == 6? offset = 2,i+=8: throw("Base64ToASCII error");
За такое надо отлучать от программирования на год :)

0
49 / 33 / 9
Регистрация: 27.12.2017
Сообщений: 1,402
03.02.2020, 21:39  [ТС] 7
DrOffset, та что не так то? первый раз решил использовать этот метод записи и сразу такое
0
15248 / 8216 / 1992
Регистрация: 30.01.2014
Сообщений: 13,998
03.02.2020, 21:54 8
Цитата Сообщение от ReYalp Посмотреть сообщение
та что не так то?
Забиваете шурупы молотком.
Или гвозди микроскопом.
Или как-то так
Вы не видите?

Не экономьте строки.
Если есть какая-то обособленная операция - вынесите ее в функцию.
Городить такие однострочники - не надо. Они плохо читаются. Вы легко можете допустить ошибку.
1
49 / 33 / 9
Регистрация: 27.12.2017
Сообщений: 1,402
03.02.2020, 21:56  [ТС] 9
DrOffset, но в чем ошибка в данном случае? ее нету
0
15248 / 8216 / 1992
Регистрация: 30.01.2014
Сообщений: 13,998
03.02.2020, 22:08 10
Цитата Сообщение от ReYalp Посмотреть сообщение
но в чем ошибка в данном случае?
Вас просили целиком код показать
0
49 / 33 / 9
Регистрация: 27.12.2017
Сообщений: 1,402
03.02.2020, 22:09  [ТС] 11
DrOffset, так я же уже показывал в теме "Оценка кода".
Кликните здесь для просмотра всего текста
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
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
#include "asn1der.h"
#include <iostream>
#include <cstring>
 
#define SETBIT(number,bit) ((number) |= (pow(2,bit)))
#define CHECKBIT(number,bit) ((number) & (1 << (bit)))
 
decoder::decoder(){
    Result = new char[1]{};
}
 
decoder::decoder(const decoder& obj){
    sizeofascii = obj.sizeofascii;
    sizeof64 = obj.sizeof64;
    unsigned char * NewChar = new unsigned char[sizeofascii+1];
    memcpy(NewChar,obj.CharByteArray,sizeofascii+1);
    CharByteArray = NewChar;
    pArr = CharByteArray;
    Result = new char[1]{};
    Append(&Result,obj.Result);
}
 
 
decoder::decoder(decoder && obj){
    sizeofascii = obj.sizeofascii;
    sizeof64 = obj.sizeof64;
    CharByteArray = obj.CharByteArray;
    obj.CharByteArray = nullptr;
    pArr = CharByteArray;
    obj.pArr = nullptr;
    Result = obj.Result;
    obj.Result = nullptr;
}
 
 
decoder::~decoder(){
    if(CharByteArray)
        delete[] CharByteArray;
    if(Result)
        delete[] Result;
}
 
 
decoder& decoder::operator=(decoder && obj){
    sizeofascii = obj.sizeofascii;
    sizeof64 = obj.sizeof64;
    CharByteArray = obj.CharByteArray;
    obj.CharByteArray = nullptr;
    obj.pArr = nullptr;
    pArr = CharByteArray;
    Result = obj.Result;
    obj.Result = nullptr;
    return *this;
}
 
 
decoder& decoder::operator=(const decoder& obj){
    sizeofascii = obj.sizeofascii;
    sizeof64 = obj.sizeof64;
    unsigned char * NewChar = new unsigned char[sizeofascii+1];
    memcpy(NewChar,obj.CharByteArray,sizeofascii+1);
    CharByteArray = NewChar;
    pArr = CharByteArray;
    Result = new char[1]{};
    Append(&Result,obj.Result);
    return *this;
}
 
void decoder::Append(char ** dst,const char * src){  
     unsigned long dstlen = strlen(*dst),srclen =  strlen(src);
     char* temp = new char[dstlen+srclen+1];
     memcpy(temp, *dst, dstlen);
     memcpy(temp + dstlen, src, srclen + 1);
     delete[] *dst;
     *dst = temp;
}
 
 
char *  decoder::NewArr(const void* arr,unsigned long length) {
    char * temp = new char[length+1]{};
    memcpy(temp,arr,length);
    return temp;
}
 
 
unsigned long decoder::CalculateCharArrayLength(const char * array){
    unsigned long length = 0;
    while(*array != '\0'){
        ++length;
        ++array;
    }
    return length;
}
 
void decoder::ParseData(){
    switch (*pArr)
    {
         case ENDOFARRAY:
            break;
        case INTEGER:
            IntegerHandler();
            ParseData();
            break;
        case OCTET_STRING:
            OctetStringHandler();
            Append(&Result,("}\n"));
            ParseData();
            break;
        case OBJECT_IDENTIFIER:
            ObjectIdentifierHandler();
            Append(&Result,("}\n"));
            ParseData();
            break;
        case SEQUENCE:
            SequenceHandler();
            ParseData();
            Append(&Result,("\n}"));
            break;
        default:
            break;
    }
}
 
 
char * decoder::decode(const unsigned char * Text,unsigned long length){
    sizeofascii = length;
    if(CharByteArray) //clear 
        delete[] CharByteArray;
    CharByteArray = reinterpret_cast<unsigned char*>(NewArr(Text,sizeofascii));
    pArr = CharByteArray;
    try{
        ParseData();
    }
    catch(const char* exception){
        std::cout << exception;
        return nullptr;
    }
    return Result;
}
 
 
char * decoder::decode64(const char * Text){
    sizeof64 = CalculateCharArrayLength(Text);
    sizeofascii = sizeof64-(sizeof64/4);
    if(CharByteArray) //clear Base64CharArray if it exists
        delete[] CharByteArray;
    char * Base64Char = NewArr(Text,sizeof64);
    CharByteArray = new unsigned char[sizeofascii]{};
    Base64ToASCII(Base64Char);
    pArr = CharByteArray;
    delete[] Base64Char;
    try{
        ParseData();
    }
    catch(const char* exception){
        std::cout << exception;
        return nullptr;
    }
    return Result;
}
 
 
int decoder::Base64CharToDec(char base64){
    for(int i = 0;i<65;++i){
        if(Base64Chars[i] == base64)
            return i;
    }
    return -1;
}
 
 
void decoder::Base64ToASCII(char * base64){
    int ch = 0,offset = 2;
    unsigned char * pCharByteArray = CharByteArray; //pointer to CharByteArray to move through this array
    for(unsigned long i = 0;i < sizeof64*8-1;++i && ++pCharByteArray){
        for(int q = 0; q < 8-offset;++i && ++q){
            if(CHECKBIT(Base64CharToDec(base64[i/8]),i%8))
                SETBIT(ch,q);
        }
        ch = ch << offset;
        for(int q = 0;q < offset;++i && ++q){
            if(CHECKBIT(Base64CharToDec(base64[(i+6)/8]),(i+6)%8))
                SETBIT(ch,q);
        }
        --i;
        switch(offset){
            case 2 :
                offset = 4;
                break;
            case 4:
                offset = 6;
                break;
            case 6:
                offset =2;
                i+=8;
                break;
            default:
                break;
        }
        *pCharByteArray = static_cast<unsigned char>(ch);
        ch = 0;
    }
}
 
 
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 num;
    if(times > 1)
        return num*pow(num,--times);
    return -1;
}
 
 
int decoder::CalculateBytes(int len){
    int calculated = 0,power = len*8-1;
    for(int i = 0;i < len && ++pArr;i++){
 
        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
 
        Append(&Result,(std::to_string(1) + ".").c_str());
        Append(&Result,(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
    {
        Append(&Result,(std::to_string(2) + ".").c_str());
        Append(&Result,(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
    {
        Append(&Result,(std::to_string(3) + ".").c_str());
        Append(&Result,(std::to_string(*pArr-120)+ ".").c_str());
        return;
    }
}
 
 
int decoder::CalculateLongSID(int& sizeofascii) {
  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);
    }
  }
  sizeofascii += length-2;
  return SID;
 
}
 
 
void decoder::CalculateIdentifier(int len){
    CalculateIdentifierFirstByte();
    for(int i = 0; i<len && ++pArr ; ++i){
        if(!CHECKBIT(*pArr,7)){ //if decimal number consists of only one byte
            Append(&Result,(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
        {
            Append(&Result,(std::to_string(CalculateLongSID(i)) + ".").c_str());
        }
    }
}
 
 
char * decoder::IntToHexChar(int number){
    char * hex = new char[3]{};
    char hexarr[] = "0123456789ABCDEF";
    int num = number/16;
    hex[0] = hexarr[num];
    num = number%16;
    hex[1] = hexarr[num];
    return hex;
}
 
 
void decoder::AppendOctetString(int length){
     for(int i = 0; i < length && ++pArr;++i){
         char * p = IntToHexChar(*pArr);
         Append(&Result,p);
         delete[] p;
     }
}
 
 
void decoder::OctetStringHandler(){
    if(!CHECKBIT(*++pArr,7)){
 
        Append(&Result," Octet String : { ");
        AppendOctetString(ParseLength(*pArr));
        Append(&Result,"}");
    }
    ++pArr;
}
 
 
void decoder::ObjectIdentifierHandler(){
    Append(&Result," OBJECT INDENTIFIED WITH VALUE: { ");
    if(!CHECKBIT(*++pArr,7)){ //if length in one byte
 
        CalculateIdentifier(*pArr-1);
    }
    else //behaviour not described
    {
        CalculateIdentifierFirstByte();
        CalculateIdentifier(ParseLength(*pArr));
    }
    ++pArr;
}
 
 
void decoder::IntegerHandler(){
    if(!CHECKBIT(*++pArr,7)){
 
        Append(&Result," INTEGER WITH VALUE: { ");
        Append(&Result, ((std::to_string(CalculateBytes(ParseLength(*pArr)))+ " }").c_str()));
    }
    else
    {
        Append(&Result," INTEGER WITH VALUE: { ");
        Append(&Result, (std::to_string(CalculateBytes(CalculateBytes(ParseLength(*pArr))))+ " }").c_str());
    }
    ++pArr;
}
 
 
void decoder::SequenceHandler(){
    if(!CHECKBIT(*++pArr,7)){
 
        Append(&Result," SEQUENCE WITH LENGTH: ");
        Append(&Result, (std::to_string(*pArr) + "{ \n\t").c_str());
      }
    else
    {
         Append(&Result," SEQUENCE WITH LENGTH: ");
         Append(&Result, (std::to_string(CalculateBytes(ParseLength(*pArr)))+ "\n\t").c_str());
    }
    ++pArr;
}


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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#ifndef DECODER_H
#define DECODER_H
 class decoder{
    public:
        decoder();
 
        decoder(const decoder&);
 
        decoder(decoder&&);
 
        ~decoder();
 
        decoder& operator=(const decoder&);
 
        decoder& operator=(decoder&&);
 
        char * decode(const unsigned char * ,unsigned long);
 
        char * decode64(const char * );
    private:
        enum TYPES{
            ENDOFARRAY = 0x00,
            INTEGER = 0x02,
            OCTET_STRING = 0x04,
            OBJECT_IDENTIFIER = 0x06,
            SEQUENCE = 0x30
        };
        //Calculates number in power
        int pow(int,int);
 
        char* IntToHexChar(int);
 
        void AppendOctetString(int);
 
        int CalculateLongSID(int&);
 
        //Calculates length of char array which ends with '\0'
        unsigned long CalculateCharArrayLength(const char *);
 
        //Converts Base64 char to decimal number
        int Base64CharToDec(char );
 
        //Convert base64 to ASCII
        void Base64ToASCII(char *);
 
        //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
        void Append(char **,const 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
        char *  NewArr(const void* ,unsigned long );
 
        //Pointer to CharByteArray which is used to move through array
        unsigned char * pArr = nullptr;
 
        //Byte array as char
        unsigned char * CharByteArray = nullptr;
 
        //The result decoded string
        char * Result = nullptr;
 
        //Size of CharByteArray
        unsigned long sizeofascii = 0;
 
        //Size of Base64CharArray
        unsigned long sizeof64 = 0;
 
        //base64 array of chars
        char Base64Chars[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
};
#endif
0
15248 / 8216 / 1992
Регистрация: 30.01.2014
Сообщений: 13,998
03.02.2020, 22:12 12
ReYalp, где в данном случае возникает проблема?
0
49 / 33 / 9
Регистрация: 27.12.2017
Сообщений: 1,402
03.02.2020, 22:15  [ТС] 13
DrOffset, в данном коде - нигде тк я поменял ? на свитч , но если поменять
Цитата Сообщение от ReYalp Посмотреть сообщение
switch(offset){
case 2 :
offset = 4;
break;
case 4:
offset = 6;
break;
case 6:
offset =2;
i+=8;
break;
default:
break;
}
на
Цитата Сообщение от ReYalp Посмотреть сообщение
offset == 2? offset = 4 : offset ==4? offset = 6 :offset == 6? offset = 2,i+=8: throw("Base64ToASCII error");
то возникнет предупреждение компилятора
Цитата Сообщение от ReYalp Посмотреть сообщение
warning: conversion to ‘long unsigned int’ from ‘int’ may change the sign of the result [-Wsign-conversion]
offset == 2? offset = 4 : offset ==4? offset = 6 :offset == 6? offset = 2,i+=8: throw("Base64ToASCII error");
0
15248 / 8216 / 1992
Регистрация: 30.01.2014
Сообщений: 13,998
03.02.2020, 22:21 14
ReYalp, что такое оператор запятая - знаете?
Какой тип у этого выражения?
C++
1
offset = 2,i+=8
1
49 / 33 / 9
Регистрация: 27.12.2017
Сообщений: 1,402
03.02.2020, 22:26  [ТС] 15
DrOffset, что такое оператор запятая - не знаю) пытался наугад писать это условие тк использовал его впервые и такое большое видел только один раз, можете объяснить в чем в данной ситуации ошибка?
0
15248 / 8216 / 1992
Регистрация: 30.01.2014
Сообщений: 13,998
03.02.2020, 22:38 16
Лучший ответ Сообщение было отмечено ReYalp как решение

Решение

Цитата Сообщение от ReYalp Посмотреть сообщение
что такое оператор запятая - не знаю) пытался наугад писать это условие тк использовал его впервые и такое большое видел только один раз, можете объяснить в чем в данной ситуации ошибка?
Глобально ошибка в том, что вы пользуетесь конструкциями языка, без предварительного чтения документации к ним.

В конкретно этом случае тип выражения
C++
1
offset = 2,i+=8
unsigned long

Тип у этого выражения
C++
1
offset == 2? offset = 4 : offset ==4? offset = 6 :offset == 6? offset = 2,i+=8: throw("Base64ToASCII error");
также из-за этого получается unsigned long.

А вот подвыражение
C++
1
offset = 6
и
C++
1
offset = 4
имеют тип int.

Не смотря на то, что вы не используете результат всего условного выражения, он, тем не менее, существует. И тип этого результата unsigned int, но два подвыражения имеют тип int, и при срабатывании соответствующих условий результат этих подвыражений будет применен к результату всего условного выражения.

Я уверен, что вы сейчас ничего не поняли, поэтому сразу дам другое объяснение. Все ваше условное выражение можно представить вот такой функцией:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
unsigned long selectOffset(int & offset, unsigned long & i)
{
    if(offset == 2)
    {
        return offset = 4; // вот она, ваша ошибка int -> unsigned long conv
    }
    else if(offset == 4)
    {
        return offset = 6; // вот она, ваша ошибка int -> unsigned long conv
    }
    else if(offset == 6)
    {
        return offset = 2, i += 8; 
    }
    throw("Base64ToASCII error"); 
}
0
Комп_Оратор)
Эксперт по математике/физике
8720 / 4431 / 598
Регистрация: 04.12.2011
Сообщений: 13,300
Записей в блоге: 16
03.02.2020, 22:43 17
Цитата Сообщение от ReYalp Посмотреть сообщение
что такое оператор запятая - не знаю) пытался наугад писать
главное, что не против ветра хоть, слава богу.
Тут несколько ошибок. Но то, что ошибка есть в том, что вы присвоили offset двойку видно сразу. Если он таки unsigned long. Это потому, что сайд эффектов тут быть не может, а переприсвоение значению i неизбежно. Но если, это int то при i<8 ваш offset станет нереально большим на системах, где для отрицательных чисел используется дополнение. А они все из известных - такие. Компилятор не умеет догадываться, волноваться или нервничать. Пишет, что сказано.
0
49 / 33 / 9
Регистрация: 27.12.2017
Сообщений: 1,402
03.02.2020, 22:54  [ТС] 18
DrOffset,
Цитата Сообщение от DrOffset Посмотреть сообщение
В конкретно этом случае тип выражения
C++
Выделить код
1
offset = 2,i+=8
unsigned long
мне не понятно только вот это,можно подробнее?

Добавлено через 1 минуту
IGPIGP, я присвоил офсет двойку тк мне нужно чтобы он первый раз был 2 ,потом 4, потом 6 и так по кругу
0
15248 / 8216 / 1992
Регистрация: 30.01.2014
Сообщений: 13,998
03.02.2020, 23:01 19
Цитата Сообщение от ReYalp Посмотреть сообщение
можно подробнее?
Тип выражения с запятой определяется типом последнего подвыражения. В данном случае
C++
1
i += 8
имеет тип unsigned long, потому что i имеет тип unsigned long.
1
Комп_Оратор)
Эксперт по математике/физике
8720 / 4431 / 598
Регистрация: 04.12.2011
Сообщений: 13,300
Записей в блоге: 16
03.02.2020, 23:29 20
Цитата Сообщение от DrOffset Посмотреть сообщение
Тип выражения с запятой определяется типом последнего подвыражения. В данном случае
При инициализации с auto? Так или иначе:
Значение тоже и в этом больше проблем может быть. Отрицательное же может случиться. ReYalp, вы зачем это:
Цитата Сообщение от ReYalp Посмотреть сообщение
IGPIGP, я присвоил офсет двойку тк мне нужно чтобы он первый раз был 2 ,потом 4, потом 6 и так по кругу
??
То что по кругу - логическая несуразица и компилятор не парится. Иначе отлучил бы на год и более. DrOffset, прав. Но я же про сообщение. Даже не глядя в код - оно информативно. Почитайте о форматах для знаковых и беззнаковых целых. Иначе и с третьего раза не поймёте о чём я толкую.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.02.2020, 23:29

Не понятный undefined reference to `unsigned long long f<unsigned long long, void>
test.cpp: #include &lt;iostream&gt; template &lt;typename FormalType, typename FactType = typename...

Как написать такое явное преобразование из double в unsigned long int
как написать такое явное преобразование из double в unsigned long int??? спасибо всем кто...

Размер для данных (int, char, long, double, short, unsigned, float)
Напишите программу, которая будет определять размер для данных (int, char, long, double, short,...

Проблема с сравнением unsigned long long int числа
Написала программу для перевода чисел типа unsigned long long int с десятичной системы счисления в...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.