Вы рассмотрели просто Систему использования. Рисование пространства имен? Например:
System.Drawing.Color color = System.Drawing.Color.FromArgb(red, green, blue);
float hue = color.GetHue();
float saturation = color.GetSaturation();
float lightness = color.GetBrightness();
Примечание, что это не точно, что Вы попросили (см. , различия между HSL и HSV и Цветным классом не имеют преобразования назад из HSL/HSV, но последний обоснованно легок добавить .
Допустима ли такая операция?
Она называется массивом переменной длины.
VLA разрешены в ANSI C99 и в качестве расширения некоторых компиляторов до C99. GCC поддерживает его как строгий C99 и как расширение кода, отличного от C99. Это также законно в C ++ 0x.
Если нет, то почему компилятор не выдает никаких предупреждений или ошибок?
С gcc:
$ gcc -std=c89 src/vla.c -Wall -ansi -pedantic
src/vla.c: In function ‘function’:, not dynamic array.
src/vla.c:17: warning: ISO C90 forbids variable length array ‘a’
src/vla.c:21: warning: ISO C90 forbids mixed declarations and code
Наличие 'conio.h' из MSDOS указывает на то, что вы, вероятно, используете компилятор Microsoft Visual C ++, поэтому не не волнуйся об этом. MS работала над тем, чтобы сделать свой компилятор более совместимым со стандартом C ++ 0x, но не заявляет о том, насколько стандартен его режим компилятора C. Вы спрашиваете, почему слова испанского диалекта отсутствуют во французском словаре.
Где будет размещена эта память: стек или куча?
Это автоматический объект, поэтому большинство реализаций C будут помещены в стек из соображений эффективности.
Почему ANSI C / GCC позволяет это
Это полезно для создания временных массивов переменного размера во время выполнения, время жизни которых не выходит за рамки вызова функции.
Массивы переменной длины недопустимы в ANSI C (C89). Попробуйте повысить уровень предупреждений вашего компилятора, и я уверен, что вы получите предупреждение / ошибку.
Код действителен, но при использовании массивов переменной длины следует помнить об одном:
void function(int i)
{
int a[i];
.
.
}
Здесь нет проверки ошибок. Этот код может завершиться ошибкой, если i
слишком велик.
Это допустимо, но не все компиляторы поддерживают его. По крайней мере, Visual Studio <= 2003 afaik не поддерживает его.
Я бы предположил, что это не Ansi C ++, попробуйте gcc -ansi -pedantic.
Динамическое выделение памяти на стеке:
Существует библиотечный вызов _malloca, который динамически выделяет память на стеке программы (очень похоже на то, что malloc делает на Heap)
Ссылка: _malloca