LINUX.ORG.RU

Cи. Что это за «фокус»?


0

2

Приветствую, читая статью на вики про термопары, наткнулся на пример кода:

float GetPt100Temperature(float r)
{
    float const Pt100[] = { 	80.31,	 82.29,  84.27,	 86.25,	 88.22,	 90.19,	 92.16,	 94.12,	 96.09,	 98.04,
                                100,	101.95,	103.9,	105.85,	107.79,	109.73,	111.67,	113.61,	115.54,	117.47,
                                119.4,	121.32,	123.24,	125.16,	127.07,	128.98,	130.89,	132.8,	134.7,	136.6,
                                138.5,	140.39,	142.29,	157.31,	175.84,	195.84};
    int t = -50, i, dt = 0;
    if (r > Pt100[i = 0])
      while (250 > t) {
        dt = (t < 110) ? 5 : (t > 150) ? 50 : 40;
        if (r < Pt100[++i])
          return t + (r - Pt100[i-1]) * dt / (Pt100[i] - Pt100[i-1]);
        t += dt;
      };
 
    return t;
}

привлекла моё внимание строчка:

if (r > Pt100[i = 0])
Собственно, что это такое (i=0)? просто Pt100(i) я бы понял. Инициализация переменной что-ли? О_о

★★★★★

Последнее исправление: xterro (всего исправлений: 1)

Выражение присваивания тоже имеет значение — это только что присвоенное значение. Так что

if (r > Pt100[i = 0])
это то же самое, что и
i = 0;
if (r > Pt100[0])

ilammy ★★★
()
Ответ на: комментарий от ilammy

Да уж, я бы даже пьяный до такого не додумался ))

xterro ★★★★★
() автор топика
Ответ на: комментарий от xterro

Ну и ССЗБ! Ты хоть тот же самый датчик используешь, для которого эту калибровочную кривую строили? А то придется тебя расстроить...

Eddy_Em ☆☆☆☆☆
()

это два зайца сразу, обнуляем i и переходим в начало маcсива Pt100. И проверяем r больше 80.31 или нет.

Dron ★★★★★
()
Ответ на: комментарий от Eddy_Em

Я ничего не использую, это просто пример кода с вики.

это два зайца сразу,

лучше бы i=0 сразу при объявлении переменной написали, стало бы сильно понятней )

xterro ★★★★★
() автор топика
Последнее исправление: xterro (всего исправлений: 1)
Ответ на: комментарий от xterro

Понятно. Ты еще Богатырева почитай, были там примеры вроде этого. Между прочим, очень даже удобно. Главное — если ты внутри if'а делаешь присваивание, тщательно проверь, что это присваивание а не ошибка в пропуске одного = в проверке условия. К счастью -Wall -Werror таких косяков допускать не дает.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Между прочим, очень даже удобно

Да-да, особенно тем кто потом будет пытаться это прочитать

anonymous
()
Ответ на: комментарий от xterro

лучше бы i=0 сразу при объявлении переменной написали, стало бы сильно понятней )

Мне кажется, автор набора символов кода посчитал, что Pt[i = 0] будет лучше перекликаться с Pt[++i] дальше.

ilammy ★★★
()
Ответ на: комментарий от xterro

В данном случае да. Так как она объявлена строчкой выше.

Dron ★★★★★
()
Ответ на: комментарий от Eddy_Em

Главное — если ты внутри if'а делаешь присваивание, тщательно проверь, что это присваивание а не ошибка в пропуске одного = в проверке условия. К счастью -Wall -Werror таких косяков допускать не дает.

В подобных случаях возможны более серьёзные проблемы, чем пропуск '=':

if (something || (r > Pt100[i = 0]))

Deleted
()

привлекла моё внимание строчка:
if (r > Pt100[i = 0])
Собственно, что это такое (i=0)?

присвоение значения переменной, так можно, но этот стиль считается «не гуд»

Boy_from_Jungle ★★★★
()

float const Pt100[] =

читая статью на вики про термопары

Pt100 это вроде термосопротивление, а не термопара?

golodranez ★★★★
()

«1291 An assignment expression has the value of the left operand after the assignment, but is not an lvalue.»

Из той же серии (первые страницы K&R):

while((c = getchar()) != EOF) ...

invy ★★★★★
()

Человек выпендрился, бывает. С опытом проходит.

crowbar
()
Ответ на: комментарий от invy

Это нормально: получаем символ и сразу проверяем. А у ТС в том месте где должна быть инициализация, ее нет, зато она есть в совсем не предназначенном для этого месте.

crowbar
()

Дешевый выпендрёж. А еще бывает дорогой:

	if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0)
		goto fail;
		goto fail;
edigaryev ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.