Решение математических уравнений из текстового поля - PullRequest
0 голосов
/ 25 марта 2011

Пытаюсь повысить производительность обновления ();функция ниже.Числа внутри переменной mathNumber будут взяты из строки NSString, созданной из текстового поля.Несмотря на то, что я использую пять чисел, я хотел бы, чтобы он мог запускать любую сумму, которую пользователь вставляет в текстовое поле.Какими способами я мог бы ускорить код в update ();с C и / или Objective-C?Я также хотел бы, чтобы он работал на Mac и iPhone.

typedef struct {
    float *left;
    float *right;
    float *equals;
    int operation;
} MathVariable;

#define MULTIPLY 1
#define DIVIDE 2
#define ADD 3
#define SUBTRACT 4

MathVariable *mathVariable;
float *mathPointer;
float newNumber;

void init();
void update();
float solution(float *left, float *right, int *operation);

void init()
{
    float *mathNumber = (float *) malloc(sizeof(float) * 9);

    mathNumber[0] =-1.0;
    mathNumber[1] =-2.0;
    mathNumber[2] = 3.0;
    mathNumber[3] = 4.0;
    mathNumber[4] = 5.0;
    mathNumber[5] = 0.0;
    mathNumber[6] = 0.0;
    mathNumber[7] = 0.0;
    mathNumber[8] = 0.0;

    mathVariable = (MathVariable *) malloc(sizeof(MathVariable) * 4);

    mathVariable[0].equals = &mathPointer[5];
    mathVariable[0].left = &mathPointer[2];
    mathVariable[0].operation = MULTIPLY;
    mathVariable[0].right = &mathPointer[3];

    mathVariable[1].equals = &mathPointer[6];
    mathVariable[1].left = &mathPointer[1];
    mathVariable[1].operation = SUBTRACT;
    mathVariable[1].right = &mathPointer[5];

    mathVariable[2].equals = &mathPointer[7];
    mathVariable[2].left = &mathPointer[0];
    mathVariable[2].operation = ADD;
    mathVariable[2].right = &mathPointer[6];

    mathVariable[3].equals = &mathPointer[8];
    mathVariable[3].left = &mathPointer[7];
    mathVariable[3].operation = MULTIPLY;
    mathVariable[3].right = &mathPointer[4];

    return self;
}

// This is updated with a timer
void update()
{   
    int i;

    for (i = 0; i < 4; i++)
    {
        *mathVariable[i].equals = solution(mathVariable[i].left, mathVariable[i].right, &mathVariable[i].operation);
    }

    // Below is the equivalent of: newNumber = (-1.0 + (-2.0 - 3.0 * 4.0)) * 5.0;
    // newNumber should equal -75
    newNumber = mathPointer[8];
}

float solution(float *left, float *right, int *operation)
{
    if ((*operation) == MULTIPLY)
    {
        return (*left) * (*right);
    }
    else if ((*operation) == DIVIDE)
    {
        return (*left) / (*right);
    }
    else if ((*operation) == ADD)
    {
        return (*left) + (*right);
    }
    else if ((*operation) == SUBTRACT)
    {
        return (*left) - (*right);
    }
    else
    {
        return 0.0;
    }
}

РЕДАКТИРОВАТЬ:

Сначала я должен сказать спасибо за все ваши добрые сообщения.Это первый форум, на котором у меня есть люди, которые не говорят мне, что я полный идиот.Извините за возвращение себя;Я не осознавал, что это тоже был форум по объективному С (поэтому я и спешно использовал С).У меня есть собственный парсер, который работает медленно, но меня не волнует его скорость.Все, что я хочу, - это ускорить функцию update (), поскольку она замедляет все, и 90% объектов используют ее.Кроме того, я пытаюсь заставить его работать быстрее на устройствах iOS, так как я не могу ничего скомпилировать в текстовые поля.Если у вас есть другие советы по ускорению обновления (), я благодарю вас.

Еще раз спасибо, Джонатан

РЕДАКТИРОВАТЬ 2:

Что ж, я заставил его работать быстрее, изменивэто из:

int i;

for (i = 0; i < 4; i++)
{
*mathVariable[i].equals = solution(*mathVariable[i].left, *mathVariable[i].right, mathVariable[i].operation);
}

Кому:

*mathVariable[0].equals = solution(*mathVariable[0].left, *mathVariable[0].right, mathVariable[0].operation);
*mathVariable[1].equals = solution(*mathVariable[1].left, *mathVariable[1].right, mathVariable[1].operation);
*mathVariable[2].equals = solution(*mathVariable[2].left, *mathVariable[2].right, mathVariable[2].operation);
*mathVariable[3].equals = solution(*mathVariable[3].left, *mathVariable[3].right, mathVariable[3].operation);

Есть ли другой способ увеличить его так же быстро, как предварительно загруженные числа в массиве, как указано выше?

1 Ответ

0 голосов
/ 26 марта 2011

Ваш код представляет собой смесь стилей и содержит несколько необоснованных указателей (например, при передаче от operation до solution).Непонятно, почему вы передаете поплавки по ссылке, но, может быть, вы намереваетесь изменить эти изменения и переоценить выражение?

Ниже приведены некоторые изменения как в порядке, так и в случайном порядке - стоимость любого изэто не так много, и вы можете быть виноваты в преждевременной оптимизации.Как прокомментировал @Dave, для анализа есть библиотеки, но если вы ориентируетесь на простые математические выражения, синтаксический анализатор / оценщик, основанный на приоритетах операторов, достаточно прост для кодирования.

Предложение 1: используйте enum- очиститель:

typedef enum { MULTIPLY, DIVIDE, ADD, SUBTRACT } BinaryOp;

typedef struct
{
    float *left;
    float *right;
    float *equals;
    BinaryOp operation;
} MathVariable;

Предложение 2: используйте switch - очиститель и, вероятно, также быстрее:

float solution(float left, float right, int operation)
{
    switch(operation)
    {
        case MULTIPLY:
            return left * right;
        case DIVIDE:
            return left / right;
        case ADD:
            return left + right;
        case SUBTRACT:
            return left - right;
        default:
            return 0.0;
    }
}

Примечание. Я также удалил проходящие указатели, вызов теперь:

*mathVariable[i].equals = solution(*mathVariable[i].left,
                                   *mathVariable[i].right,
                                   mathVariable[i].operation);

Теперь сотрудник OO, вероятно, будет возражать (:-)) к switch (или if / else) и утверждать, что каждый узел (ваш MathVariable) должен быть экземпляром, которыйзнает, как выполнить собственную операцию.Специалист AC может предложить вам использовать указатели на функции в узле, чтобы они могли выполнять свои собственные операции.Все это дизайн, и вы сами должны это понять.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...