/* Reverse Polish calculator */ int main() { int op_type, i = 0, var = 0; double op2; char operand[kMaxOp]; double variable[kVarNum]; // variable v to store the value printed recently. double v; Stack stack; StackInit(&stack, kStackInitSize); for (i = 0; i < kVarNum; i++) { variable[i] = 0.0; } while ((op_type = GetOpt(operand)) != EOF) { switch (op_type) { double op; case NUMBER: op = atof(operand); Push(&stack, &op); break; case FUNCTION: MathFunc(&stack, operand); break; case '=': Pop(&stack, &op); if (var >= 'A' && var <= 'Z') { variable[var - 'A'] = op; } else { printf("Error: not valid variable name\n"); exit(1); } break; case '+': Pop(&stack, &op); Pop(&stack, &op2); op = op + op2; Push(&stack, &op); break; case '-': Pop(&stack, &op); Pop(&stack, &op2); op = op2 - op; Push(&stack, &op); break; case '*': Pop(&stack, &op); Pop(&stack, &op2); op = op2 * op; Push(&stack, &op); break; case '/': Pop(&stack, &op); Pop(&stack, &op2); if (op != 0.0) { op = op2 / op; Push(&stack, &op); } else { printf("Error: zero divisor\n"); exit(1); } break; case '%': Pop(&stack, &op); Pop(&stack, &op2); if (op != 0.0) { op = fmod(op2, op); Push(&stack, &op); } else { printf("Error: zero divisor\n"); exit(1); } break; case '\n': Pop(&stack, &op); v = op; printf("%.8f\n", op); break; case '?': /* Prints top element of the stack */ Pop(&stack, &op); printf("%.8f\n", op); Pop(&stack, &op); break; case 'c': /* Clear the stack */ StackClear(&stack); break; case 'd': /* Duplicates tope elements of the stack */ Pop(&stack, &op); Push(&stack, &op); Push(&stack, &op); break; case 's': /* Swaps the top two elements */ Pop(&stack, &op); Pop(&stack, &op2); Push(&stack, &op); Push(&stack, &op2); break; case 'v': Push(&stack, &v); break; default: if (op_type >= 'A' && op_type <= 'Z') { var = op_type; Push(&stack, variable + op_type - 'A'); } else { printf("Error: unknown command \n"); exit(1); } break; } } return 0; }
void AddNode::inputsUpdated( qint64 pTimeStamp ) { NodeControlBase::inputsUpdated( pTimeStamp ); QList<fugio::PinVariantIterator> ItrLst; int ItrMax = 0; QMetaType::Type OutTyp = QMetaType::UnknownType; for( QSharedPointer<fugio::PinInterface> P : mNode->enumInputPins() ) { ItrLst << fugio::PinVariantIterator( P ); ItrMax = std::max( ItrMax, ItrLst.last().count() ); if( OutTyp == QMetaType::UnknownType ) { OutTyp = ItrLst.last().type(); } } if( !ItrMax || OutTyp == QMetaType::UnknownType ) { return; } mValOutputArray->setVariantType( OutTyp ); mValOutputArray->setVariantCount( ItrMax ); switch( OutTyp ) { case QMetaType::Double: Operator::add<double>( ItrLst, mValOutputArray, ItrMax ); break; case QMetaType::Float: Operator::add<float>( ItrLst, mValOutputArray, ItrMax ); break; case QMetaType::QPoint: Operator::add<QPoint>( ItrLst, mValOutputArray, ItrMax ); break; case QMetaType::QPointF: Operator::add<QPointF>( ItrLst, mValOutputArray, ItrMax ); break; case QMetaType::QSize: Operator::add<QSize>( ItrLst, mValOutputArray, ItrMax ); break; case QMetaType::QSizeF: Operator::add<QSizeF>( ItrLst, mValOutputArray, ItrMax ); break; case QMetaType::Int: Operator::add<int>( ItrLst, mValOutputArray, ItrMax ); break; case QMetaType::QString: Operator::add<QString>( ItrLst, mValOutputArray, ItrMax ); break; case QMetaType::QVector2D: Operator::add<QVector2D>( ItrLst, mValOutputArray, ItrMax ); break; case QMetaType::QVector3D: Operator::add<QVector3D>( ItrLst, mValOutputArray, ItrMax ); break; case QMetaType::QVector4D: Operator::add<QVector4D>( ItrLst, mValOutputArray, ItrMax ); break; case QMetaType::QQuaternion: Operator::add<QQuaternion>( ItrLst, mValOutputArray, ItrMax ); break; case QMetaType::QMatrix4x4: Operator::add<QMatrix4x4>( ItrLst, mValOutputArray, ItrMax ); break; default: { fugio::MathInterface::MathOperatorFunction MathFunc = MathPlugin::instance()->findMetaTypeMathOperator( OutTyp, fugio::MathInterface::OP_ADD ); if( !MathFunc ) { return; } MathFunc( ItrLst, mValOutputArray, ItrMax ); } break; } pinUpdated( mPinOutput ); }