Мне удалось выяснить, как это сделать.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <time.h>
int int_pow(int n, int exp){
int sum = n;
for (int i = 1; i < exp; i++){
sum = sum * n;
}
return sum;
}
int main()
{
int random = 0;
pid_t fpid;
int p[2]; // 0 = read, 1 = write
if (pipe(p) < 0){
exit(1);
}
fpid = fork();
if (fpid == 0){
printf("\n(Child) Hello from child. \n");
read(p[0], &random, sizeof(random));
printf("(Child) Recieved from parent: %d \n", random);
random = int_pow(random, 2);
printf("(Child) Sent from child: %d \n", random);
write(p[1], &random, sizeof(random));
close(p[0]);//close child read.
close(p[1]);//close child write.
exit(0);
} else {
//wait(NULL);
printf("(Parent) Hello from parent. \n");
random = rand()%100+1;
printf("(Parent) Sent from parent: %d \n", random);
write(p[1], &random, sizeof(random));
sleep(1);
int wait = read(p[0], &random, sizeof(random));
close(p[0]);//close parent read.
close(p[1]);//close parent write.
printf("(Parent) Recieved from Child: %d \n", random);
exit(0);
}
return 0;
}
Перечисление. GetValues (), кажется, возвращает значения в порядке, таким образом, можно сделать что-то вроде этого:
// given this enum:
public enum Foo
{
Fizz = 3,
Bar = 1,
Bang = 2
}
// this gets Fizz
var lastFoo = Enum.GetValues(typeof(Foo)).Cast<Foo>().Last();
Редактирование
Для не готовых прочитывать комментарии: можно также сделать это этот путь:
var lastFoo = Enum.GetValues(typeof(Foo)).Cast<Foo>().Max();
..., который будет работать, когда некоторые Ваши перечислимые значения будут отрицательны.
Это немного nitpicky, но фактическое максимальное значение любого перечисления является Int32. MaxValue (принимающий это - перечисление, полученное из интервала). Совершенно законно бросить любое значение Int32 к любому перечислению независимо от того, объявило ли это на самом деле участника с тем значением.
Законный:
enum SomeEnum
{
Fizz = 42
}
public static void SomeFunc()
{
SomeEnum e = (SomeEnum)5;
}
Я использовал следующее, когда мне требовались минуту и макс. значения моего перечисления. Я просто установил минуту, равную самому низкому значению перечисления и макс. равного самому высокому значению в перечислении как сами перечислимые значения.
public enum ChannelMessageTypes : byte
{
Min = 0x80, // Or could be: Min = NoteOff
NoteOff = 0x80,
NoteOn = 0x90,
PolyKeyPressure = 0xA0,
ControlChange = 0xB0,
ProgramChange = 0xC0,
ChannelAfterTouch = 0xD0,
PitchBend = 0xE0,
Max = 0xE0 // Or could be: Max = PitchBend
}
// I use it like this to check if a ... is a channel message.
if(... >= ChannelMessageTypes.Min || ... <= ChannelMessages.Max)
{
Console.WriteLine("Channel message received!");
}
Согласно ответу Мэтта Гамильтона, я думал о создании для него метода расширения.
Начиная с ValueType
не принимается в качестве ограничения параметра универсального типа, я не нашел лучшего способа ограничить T
до Enum
, но следующим образом.
Любые идеи будут очень оценил.
PS. пожалуйста, не обращайте внимания на мою имплицитность VB, я люблю использовать VB таким образом, в этом сила VB, и поэтому я люблю VB.
Howeva, вот она:
static void Main(string[] args)
{
MyEnum x = GetMaxValue<MyEnum>();
}
public static TEnum GetMaxValue<TEnum>()
where TEnum : IComparable, IConvertible, IFormattable
//In C#>=7.3 substitute with 'where TEnum : Enum', and remove the following check:
{
Type type = typeof(TEnum);
if (!type.IsSubclassOf(typeof(Enum)))
throw new
InvalidCastException
("Cannot cast '" + type.FullName + "' to System.Enum.");
return (TEnum)Enum.ToObject(type, Enum.GetValues(type).Cast<int>().Last());
}
enum MyEnum
{
ValueOne,
ValueTwo
}
Public Function GetMaxValue _
(Of TEnum As {IComparable, IConvertible, IFormattable})() As TEnum
Dim type = GetType(TEnum)
If Not type.IsSubclassOf(GetType([Enum])) Then _
Throw New InvalidCastException _
("Cannot cast '" & type.FullName & "' to System.Enum.")
Return [Enum].ToObject(type, [Enum].GetValues(type) _
.Cast(Of Integer).Last)
End Function
Существуют методы для получения информации о перечисляемых типах в System.Enum.
Итак, в проекте VB.Net в Visual Studio я могу набрать «System.Enum». и intellisense вызывает все виды добра.
В частности, одним из методов является System.Enum.GetValues (), который возвращает массив перечисленных значений. Когда у вас есть массив, вы сможете делать все, что подходит для ваших конкретных обстоятельств.
В моем случае мои перечисляемые значения начинались с нуля и не пропускали никаких чисел, поэтому для получения максимального значения для моего перечисления я просто нужно знать, сколько элементов было в массиве.
Фрагменты кода VB.Net:
'''''''
Enum MattType
zerothValue = 0
firstValue = 1
secondValue = 2
thirdValue = 3
End Enum
'''''''
Dim iMax As Integer
iMax = System.Enum.GetValues(GetType(MattType)).GetUpperBound(0)
MessageBox.Show(iMax.ToString, "Max MattType Enum Value")
'''''''
Используйте функцию Last, не удалось получить максимальное значение. Использовать функцию «макс» можно. Например:
class Program
{
enum enum1 { one, two, second, third };
enum enum2 { s1 = 10, s2 = 8, s3, s4 };
enum enum3 { f1 = -1, f2 = 3, f3 = -3, f4 };
static void Main(string[] args)
{
TestMaxEnumValue(typeof(enum1));
TestMaxEnumValue(typeof(enum2));
TestMaxEnumValue(typeof(enum3));
}
static void TestMaxEnumValue(Type enumType)
{
Enum.GetValues(enumType).Cast<Int32>().ToList().ForEach(item =>
Console.WriteLine(item.ToString()));
int maxValue = Enum.GetValues(enumType).Cast<int>().Max();
Console.WriteLine("The max value of {0} is {1}", enumType.Name, maxValue);
}
}
After tried another time, I got this extension method:
public static class EnumExtension
{
public static int Max(this Enum enumType)
{
return Enum.GetValues(enumType.GetType()).Cast<int>().Max();
}
}
class Program
{
enum enum1 { one, two, second, third };
enum enum2 { s1 = 10, s2 = 8, s3, s4 };
enum enum3 { f1 = -1, f2 = 3, f3 = -3, f4 };
static void Main(string[] args)
{
Console.WriteLine(enum1.one.Max());
}
}
В согласии с Мэтью Дж. Салливаном, для C #:
Enum.GetValues(typeof(MyEnum)).GetUpperBound(0);
Я действительно не уверен, почему кто-то захочет использовать:
Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().Last();
... Дословно, семантически говоря, это не имеет большого смысла? (Всегда хорошо иметь разные способы, но я не вижу в последнем пользы.)