- 
	
- POV дал верную мысль. Компилятор прав, не прав был я. После объявления и реализации функции как f1(unsigned char* buff) всё стало работать. Всем большое спасибо за помощь. - RedFroggy(22.02.2013 12:10)
 - а если так -  Var1 = (unsigned char)(buff[2] + 4); - Vit(22.02.2013 11:33)
			
- Уж точно не так. 
Сначала надо бы buff в беззнаковый превратить. разве что скобочку поставить "как никто не ставил": Var1 = ((unsigned char)(buff[2])) + 4<- тоже не работает - POV(22.02.2013 11:35 - 11:55)- Но вопрос - а как афтор поста интерпретирует отрицательные значения буфера? Какой вообще результат он хочет получить? Знаковое 0xC0 - есть отрицательное и меньше 128. Т.е. с 1 в старших битах. Так шта преобразование в 0xFFC0 корректное. - POV(22.02.2013 11:49 - 11:54)
							
- вроде как (unsigned int)((unsigned char)(buf[2]+4)) не должно приводиться к signed long, но вот будет ли ((unsigned char)(buf[2]+4)) приводиться к signed int по-любому или не будет - не вкурсе - Vit(22.02.2013 11:57)
									
- Проверил на стимуляторе в кейле. Ничего не работает - всегда получается 0xFFC0 - и, как я выше написал, это, похоже, корректно. Ибо в кейле char по умолчанию знаковый, а афтар явно не этого хотел...  POV(312 знак., 22.02.2013 12:01 - 12:11)
											
- Гнусный паскализм. char нужно использовать только для символов (алфавита). Для чисел int. И не морочить мозги... - fk0(22.02.2013 12:10)
													
- Дык их жаба душит: целых 8 лишних битов. Вот и извращаются как могут. - SciFi(22.02.2013 12:38)
															
- Для жлобов есть int_fast8_t и uint_fast8_t. Для совсем жлобов -- uint8_t. - fk0(22.02.2013 13:47)
 
 
 - Дык их жаба душит: целых 8 лишних битов. Вот и извращаются как могут. - SciFi(22.02.2013 12:38)
															
 
 - Гнусный паскализм. char нужно использовать только для символов (алфавита). Для чисел int. И не морочить мозги... - fk0(22.02.2013 12:10)
													
 
 - Проверил на стимуляторе в кейле. Ничего не работает - всегда получается 0xFFC0 - и, как я выше написал, это, похоже, корректно. Ибо в кейле char по умолчанию знаковый, а афтар явно не этого хотел...  POV(312 знак., 22.02.2013 12:01 - 12:11)
											
 - Опппа. Неплохая мысль. После поздравлялок, если буду в состоянии - проверю сей факт. - RedFroggy(22.02.2013 11:56)
 
 - вроде как (unsigned int)((unsigned char)(buf[2]+4)) не должно приводиться к signed long, но вот будет ли ((unsigned char)(buf[2]+4)) приводиться к signed int по-любому или не будет - не вкурсе - Vit(22.02.2013 11:57)
									
 
 - Но вопрос - а как афтор поста интерпретирует отрицательные значения буфера? Какой вообще результат он хочет получить? Знаковое 0xC0 - есть отрицательное и меньше 128. Т.е. с 1 в старших битах. Так шта преобразование в 0xFFC0 корректное. - POV(22.02.2013 11:49 - 11:54)
							
 
 - Уж точно не так. 
 - А ещё... POV(92 знак., 22.02.2013 11:03)
 - Всё правильно кейл сделал. А бороться так: Var1 = (unsigned char)buff[2] + 4; - SciFi(22.02.2013 10:02)
			
- Возможно, это ошибка из разряда таких (из последнего Release Note): RedFroggy(1218 знак., 22.02.2013 10:25)
 - Это не помогает, пробывал  RedFroggy(143 знак., 22.02.2013 10:04 - 10:08)
					
- Не верю. - SciFi(22.02.2013 10:11)
 - Сразу опишите buff как unsigned char. И в каком положении у вас стоит галочка "Enable ANSI integer promotion rules" во вкладке C51 опций проекта? - vmp(22.02.2013 10:09)
							
- Enable ANSI integer promotion rules - галочка установлена - RedFroggy(22.02.2013 10:12)
									
- Тогда попробуйте Var1 = (unsigned int)buff[2] + 4; - vmp(22.02.2013 10:13)
											
- Это тоже не помогает - RedFroggy(22.02.2013 10:21)
													
- Ну а принудительно на ноль помножить? 0x00ff & (int)buf[] - Vladimir Ljaschko(22.02.2013 10:47)
															
- Самое плохое - что ошибка неявная. Т.е. все способы, которые сразу приходят в голову, по приведению типов и т.п.  - НЕ работают. Так как конструкцию 0xC0 + 4 работает, то всё что приходит в голову - какая-то проблема с передачей указателя на  RedFroggy(157 знак., 22.02.2013 10:56)
																	
- пробуем так abivan(522 знак., 22.02.2013 11:12 - 11:26)
 
 - Паяльником старший адрес закоротить на землю :-) - SciFi(22.02.2013 10:51)
																	
- Криптометод? RedFroggy(132 знак., 22.02.2013 11:07)
 
 - Вы не поверите - это было первое, что я сделал. Но увы... - RedFroggy(22.02.2013 10:50)
																	
- Попробуйте no int promotion. Тогда компилятор будет использовать байтовую арифметику, вместо полагаюшегося по стандарту предварительного перевода из char в int. - vmp(22.02.2013 10:54)
 - "Фу, кейл" подумали те, кто использует ИАР. Загадка. - Vladimir Ljaschko(22.02.2013 10:54)
																			
- Пользуюсь и тем, и другим. Надо только привыкнуть, что Keil C51 - это не язык Си, а некий специфический язык программирования, заточенный под архитектуру 8051. - vmp(22.02.2013 11:09)
																					
- Так и я тоже и тем и другим. Но сейчас Keil. Так получилось. - RedFroggy(22.02.2013 11:13)
 
 - Подумали и хорошо. Можно и в ИАРе на ровном месте яму с гов...м найти и в ней утонуть. - RedFroggy(22.02.2013 10:59)
 
 - Пользуюсь и тем, и другим. Надо только привыкнуть, что Keil C51 - это не язык Си, а некий специфический язык программирования, заточенный под архитектуру 8051. - vmp(22.02.2013 11:09)
																					
 
 
 - Самое плохое - что ошибка неявная. Т.е. все способы, которые сразу приходят в голову, по приведению типов и т.п.  - НЕ работают. Так как конструкцию 0xC0 + 4 работает, то всё что приходит в голову - какая-то проблема с передачей указателя на  RedFroggy(157 знак., 22.02.2013 10:56)
																	
 
 - Ну а принудительно на ноль помножить? 0x00ff & (int)buf[] - Vladimir Ljaschko(22.02.2013 10:47)
															
 - Это вредный совет, так как (unsigned int)(signed char)'\xC0' == 0xFFC0u. - SciFi(22.02.2013 10:18)
 
 - Это тоже не помогает - RedFroggy(22.02.2013 10:21)
													
 
 - Тогда попробуйте Var1 = (unsigned int)buff[2] + 4; - vmp(22.02.2013 10:13)
											
 
 - Enable ANSI integer promotion rules - галочка установлена - RedFroggy(22.02.2013 10:12)
									
 
 - И чего правильного? Ни разу на такое не наталкивался, а явное приведение типов использую только чтобы варнингов было поменьше... POV(69 знак., 22.02.2013 10:06)