Пользователь пока ничего не рассказал о себе

Достижения

Все достижения (3)

Наибольший вклад в теги

Все теги (51)

Лучшие ответы пользователя

Все ответы (118)
  • Литература по демонам?

    @none7
    Демон отличается от обычного консольного приложения тем, что отказывается от доступа к консоли и становиться независим от жизни и смерти процесса предка и консоли. Как бы это предложение растянуть на 600 страниц?
    Ответ написан
  • Анонимные типы в c# и их особенности?

    @none7
    Этот автор только сильно запутал Вас. Код:
    var instance = new {Name = "Alex", Age = 27}
    Эквивалентен такому коду:
    class Anonymous0001 // ссылочный тип
    {
        public string Name { get; private set; } // из других классов выглядит как read-only свойство
        public int Age { get; private set; }
        public Anonymous0001(string name, int age)
        {
            Name = name;
            Age = age;
        }
    }
    
    class Program
    {
        static void Main()
        {
            var instance = new Anonymous0001("Alex", 27);
        }
    }

    Если будет другая строка new { ... }, то компилятор сгенерирует ещё один класс. Всю остальную ересь просто забудьте. В анонимный тип нельзя добавить какую либо функциональность и от них нет никакого толку. Созданы лишь как часть синтаксического сахара, для упрощения выборки нескольких значений из linq запросов. Вроде такого:
    var a = new System.Collections.Generic.Dictionary<string, int>() { { "vasya", 0 }, { "kolya", 0 }, { "alex", 1} };
    
    int i = 0;
    var result = from item in a where item.Value == 0
        select new { Index = i++, Name = item.Key, Id = item.Value }; // создание объекта анонимного типа
    
    foreach(var res in result) {
        bool first = true;
        foreach (var prop in res.GetType().GetProperties()) {
            if (first) first = false;
            else Console.Write(", ");
            Console.Write("{0} = {1}", prop.Name, prop.GetValue(res, null));
        }
        Console.WriteLine();
    }
    Ответ написан
  • Как получить имя текущего юзера в C++?

    @none7
    Windows ведь. В заголовках фунция определена так:
    BOOL WINAPI GetUserNameW(LPWSTR  lpBuffer, LPDWORD lpnSize);
    BOOL WINAPI GetUserNameA(LPSTR  lpBuffer, LPDWORD lpnSize);
    #ifdef _UNICODE
    #define GetUserName GetUserNameW
    #else
    #define GetUserName GetUserNameA
    #endif

    Решения на выбор:
    • Убрать в настройках компиляции определение _UNICODE
    • Использовать GetUserNameA
    • Переписать с использованием TCHAR, size при этом должен быть sizeof(buffer) / sizeof(*buffer)

    И да asd111 прав буфер обязан быть размером UNLEN+1, иначе может случится переполнение буфера, хоть это и маловероятно.
    Ответ написан
  • Контрольная сумма С#?

    @none7
    Для первого набора байт подходит такой простой код:
    static byte[] crc(byte[] data) {
        ushort sum = 0;
        foreach (byte b in data)
            sum += b;
        return new byte[] {(byte)(sum & 255), (byte)(sum >> 8)};
    }

    Те есть сумма всех байтов сообщения включая код операции и длину сообщения, но без чексуммы. То есть в документации косяк чексумма считается с 0 по 4+n без -1, n длина данных для команды. Но там ведь сказано, что чексумма это «сумма байтов пакета».

    А вот собственно и полный тест:
    static ushort crc(byte[] data, ushort sum = 0) {
        foreach (byte b in data) sum += b;
        return sum;
    }
    static void Main(string[] args)
    {
        // пакеты без чексумм
        byte[] mass1 = new byte[] { 75, 0, 25, 0, 3, 48, 117, 0, 126, 37, 0, 188, 138, 169, 53, 66, 15, 52, 115, 203, 112, 103, 220, 16, 92, 237, 76, 80, 254};
        byte[] mass2 = new byte[] { 75, 0, 25, 0, 3, 64, 156, 0, 126, 37, 0, 188, 138, 169, 245, 165, 14, 52, 115, 203, 96, 64, 220, 16, 92, 237, 76, 80, 254};
        byte[] mass3 = new byte[] { 75, 0, 25, 0, 3, 80, 195, 0, 126, 37, 0, 88, 138, 169, 181, 9, 14, 52, 115, 203, 120, 60, 220, 32, 131, 237, 236, 214, 255};
        byte[] mass4 = new byte[] { 75, 0, 25, 0, 3, 112, 17, 1, 126, 37, 0, 88, 138, 169, 181, 9, 14, 52, 115, 203, 120, 60, 220, 32, 131, 237, 236, 214, 255};
        byte[] mass5 = new byte[] { 75, 0, 25, 0, 3, 60, 134, 1, 126, 37, 0, 88, 138, 169, 181, 9, 14, 52, 115, 203, 120, 60, 220, 32, 131, 237, 236, 214, 255};
    
        foreach(var mass in new byte[][] {mass1, mass2, mass3, mass4, mass5}) {
            bool first = true;
            Console.Write("{");
            foreach (var b in mass)  {
                if (!first) Console.Write(", ");
                else first = false;
    
                Console.Write(b);
            }
            var sum = BitConverter.GetBytes(crc(mass));
            // вывод чексуммы
            Console.WriteLine(", {0}, {1}}}", sum[0], sum[1]);
        }
    }
    Ответ написан
  • Как добавить путь LD_LIBRARY_PATH в коде с++?

    @none7
    Ваша программа, это не sh скрипт. И пара строк:
    std::system("export myvar=1");
    std::system("echo $myvar");

    неожиданно выведут пустую строку. Нужно либо устанавливать переменную в том же вызове system(env LD_LIBRARY_PATH=${LD_LIBRARY_PATH} path/to/app) или ручками менять переменные своей программы(getenv/setenv).
    Ответ написан