Безопасный (в смысле C #) способ реализовать что-либо с помощью указателей - PullRequest
5 голосов
/ 13 февраля 2011
            ...
            {
                int *r1, *r2;
                r1 = GetCorrectRegister(first);
                r2 = GetCorrectRegister(second);
                switch ((OpCode)current.opcode)
                {
                    case OpCode.ADDR:
                        r2 = r1 + r2;
                        break;
                }
            }
            ...

Это очевидный, самый простой способ решения этой проблемы.Тем не менее, я бы предпочел не использовать небезопасный метод, если я могу избежать его.По сути, у меня есть целые числа, которые представляют регистры.Существуют инструкции по сборке, которые принимают в качестве аргументов мнемонику регистра.Я бы предпочел не иметь логику, чтобы определять, какую переменную назначать в каждой ветви оператора switch, или создавать какие-то функции Kludgey GetRegisterValue (мнемоника) и SetRegisterValue (мнемоника).Есть ли какой-нибудь C # y способ сделать что-то подобное?

Ответы [ 2 ]

5 голосов
/ 13 февраля 2011

У меня есть набор целых чисел, которые представляют регистры

Очевидная вещь здесь - не иметь набор целых чисел.Создайте массив

 int[] registers = new int[NUMBER_OF_REGISTERS];

Ваш код выше превращается в

    {
            int r1Index, r2Index;
            r1Index = GetCorrectRegisterIndex(first);
            r2Index = GetCorrectRegisterIndex(second);
            switch ((OpCode)current.opcode)
            {
                case OpCode.ADDR:
                    registers[r1Index] = registers[r1Index] + registers[r2Index];
                    break;
            }


     }

Кроме того, используйте enum для создания символических имен для имен ваших регистров, где каждое имя дает правильный индекс.

1 голос
/ 13 февраля 2011

Как насчет использования параметров класса и ref?

class Registers
{
    public int EAX;
    public int EBX;
    //...

    public void ExecuteBinaryOperation(int opCode, ref int r1, ref int r2)
    {
        // ...
        // binary operation ADD.
        r2 = r1 + r2;
        //...
    }
}

и в коде:

registers.ExecuteBinaryOperation(0, ref registers.EAX, ref registers.EBX);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...