From bd094056e61c758cd3187aeb471ab24edbfe0ce1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Wed, 22 Feb 2017 09:44:55 +0100 Subject: [PATCH] [apps/graph] Avoid storing weird x values in the local context Change-Id: Iee751da03fb9c6cda2e77d2570e8af2aef5ed5da --- apps/graph/app.h | 4 ++++ apps/shared/function.cpp | 5 +++-- poincare/src/variable_context.cpp | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/apps/graph/app.h b/apps/graph/app.h index 4d214d542..ebbb14ea8 100644 --- a/apps/graph/app.h +++ b/apps/graph/app.h @@ -15,6 +15,10 @@ class App : public Shared::TextFieldDelegateApp { public: App(Container * container, Poincare::Context * context); InputViewController * inputViewController(); + /* This local context can parse x. However, it always stores NAN + * as x value. When we need to evaluate expression with a specific x value, we + * use a temporary local context (on the stack). That way, we avoid keeping + * weird x values after drawing curves or displaying the value table. */ Poincare::Context * localContext() override; private: CartesianFunctionStore m_functionStore; diff --git a/apps/shared/function.cpp b/apps/shared/function.cpp index f4e0d4cba..b9f379ede 100644 --- a/apps/shared/function.cpp +++ b/apps/shared/function.cpp @@ -75,10 +75,11 @@ void Function::setActive(bool active) { } float Function::evaluateAtAbscissa(float x, Poincare::Context * context) const { + Poincare::VariableContext variableContext = Poincare::VariableContext(symbol(), context); Poincare::Symbol xSymbol = Poincare::Symbol(symbol()); Poincare::Complex e = Poincare::Complex::Float(x); - context->setExpressionForSymbolName(&e, &xSymbol); - return m_expression->approximate(*context); + variableContext.setExpressionForSymbolName(&e, &xSymbol); + return m_expression->approximate(variableContext); } } diff --git a/poincare/src/variable_context.cpp b/poincare/src/variable_context.cpp index 5c6df6ac5..d8a0bc9ed 100644 --- a/poincare/src/variable_context.cpp +++ b/poincare/src/variable_context.cpp @@ -6,7 +6,7 @@ namespace Poincare { VariableContext::VariableContext(char name, Context * parentContext) : m_name(name), - m_value(Complex::Float(0.0f)), + m_value(Complex::Float(NAN)), m_parentContext(parentContext) { }