Javier Luis Lopez Ответов: 3

Ошибка компилятора VS2013 с символом #define в вызове функции


В следующем коде:

#define VMIN -210.0f
#define VMAX 220.0f
#define coef_a (0.5f*(VMIN+VMAX))
#define coef_b_green (510.0f/(VMAX-VMIN))
#define coef_b_red (510.0f/(VMIN-VMAX))

//#define LIMITUCHAR(a) ((a) < (255) ? (a) : 255)
uchar limit_uchar(float x)
{
	if (x<255.5f) 
	{
		if (x<0) return (uchar) 0;
		else return (uchar) x;
	}
	else return (uchar) 255;
}

/*
Generates a color as a function of v: if v<vmed, assign red, if v>vmed assign green
At the middle color=black
*/
void assigncolor(float v,uchar color[3])
{
	color[0]=0;
	color[1]=limit_uchar((v-coef_a)*coef_b_green);
	color[2]=limit_uchar((v-coef_a)*coef_b_red);
}



Следующая строка генерирует ошибку компиляции из-за coef_b_green должны быть изменяемые значения
color[1]=limit_uchar((v-coef_a)*coef_b_green);


Как я могу этого избежать?

Что я уже пробовал:

Это нормально. coef_b_red не создает проблем:

void assigncolor(float v,uchar color[3])
{
	color[0]=0;
	color[1]=limit_uchar((v-coef_a)*510.0f/(VMAX-VMIN));
	color[2]=limit_uchar((v-coef_a)*coef_b_red);
}


Я также пробовал разные уровни бракета

3 Ответов

Рейтинг:
6

Javier Luis Lopez

Я решил эту проблему путем изменения:

#define VMIN -210.0f

Около:
#define VMIN (-210.0f)


Проблема была в строке компилятора VS:

#define coef_b_green (510.0f/(VMAX-VMIN))

Компилятор не понимает double --
#define coef_b_green (510.0f/(VMAX--210.0f))


Примечание: Я принял решение-1, но используя const:
const float VMIN =-210.0f;
const float VMAX =(220.0f);
const float coef_a= (0.5f*(VMIN+VMAX));
const float coef_b= (510.0f/(VMAX-VMIN));


Пока таких не было принято, на мой компилятор VS2013.
В результате была увеличена скорость движения assigncolor() функция от 400 мегаопераций в секунду с использованием #определять в 454 швабры, используя константный поплавок


к сожалению, если вы арте с помощью C или openCL, вы должны использовать #define, но устанавливать отрицательные значения внутри скобок


Рейтинг:
24

CPallini

Следующий код

#include <iostream>
using namespace std;

typedef unsigned char uchar;

#define VMIN -210.0f
#define VMAX 220.0f
#define coef_a (0.5f*(VMIN+VMAX))
#define coef_b_green (510.0f/(VMAX-VMIN))
#define coef_b_red (510.0f/(VMIN-VMAX))

//#define LIMITUCHAR(a) ((a) < (255) ? (a) : 255)
uchar limit_uchar(float x)
{
  if (x<255.5f)
  {
    if (x<0) return (uchar) 0;
    else return (uchar) x;
  }
  else return (uchar) 255;
}

/*
Generates a color as a function of v: if v<vmed, assign red, if v>vmed assign green
At the middle color=black
*/
void assigncolor(float v,uchar color[3])
{
  color[0]=0;
  color[1]=limit_uchar((v-coef_a)*coef_b_green);
  color[2]=limit_uchar((v-coef_a)*coef_b_red);
}


int main()
{
  float v = 0.5;
  uchar c[3];
  assigncolor(v, c);

  for (const auto & x : c)
    cout << static_cast<unsigned int>(x) << endl;
}


Компилирует и производит некоторые выходные данные в моем Linux-боксе.
Пожалуйста, обратите внимание, C++ предлагает лучшие альтернативы #define например, вы можете написать:
constexpr float VMIN = -210.0f;
constexpr float VMAX = 220.0f;
constexpr float coef_a = (0.5f*(VMIN+VMAX));
constexpr float coef_b_green = (510.0f/(VMAX-VMIN));
constexpr float coef_b_red = (510.0f/(VMIN-VMAX));


Рейтинг:
2

KarstenK

CPallini-это абсолютно верно, но я бы пошел еще дальше: #define следует избегать там, где это возможно, потому что это усложняет читаемость кода и компилятора (а значит, компоновщика и оптимизации).

Мой компилятор действительно компилировался с приведенным выше кодом. Я предполагаю, что у вас есть какая-то опечатка (в вашем исходном коде, например, невидимые символы) или у VS 2013 есть некоторые проблемы.

Но на самом деле: избегайте #define, потому что это убивает некоторую логику обработки кода, которая поможет вам писать лучший код и поэтому лучшее приложение

Подумайте о потоке кода в диапазоне от 255. до 255.4999. Нравится:

limit_uchar(255.3);

В зависимости от того, как вы "ожидаете" свой ввод, функция может работать немного более плавно
uchar limit_uchar(float x)
{
  if (x>255.) {
     return (uchar) 255
  }
	
  if (x<0) {
    return (uchar) 0;
  }
  return (uchar) x;
}
Поднимая общие дела на самый верх.