2016-04-07 40 views
2

Sempatik bir mantıksal ifadeden eşdeğer C kodunu almak istiyorum. İlk olarak, and ve or gibi yerel mantıksal operatörleri kullanamayacağınızı fark ettim çünkü semptom bir şekilde onları kesiyor. Yeterince adil, & and friends var. BenSympy: Mantıksal ifadeden C kodu

TypeError: The first argument must be a sympy expression.

Herhangi ipuçları alıyorum,

from sympy import * 
from sympy.utilities.codegen import codegen 

x = Symbol('x') 
is_valid = Symbol('is_valid') 

# f = x > 0 and is_valid # TypeError: cannot determine truth value of 
f = (x > 0) & is_valid # And(is_valid, x > 0) 

# TypeError: The first argument must be a sympy expression. 
[(c_name, c_code), (h_name, c_header)] = codegen(("f", f), "C") 

ama nedense

çalıştı?

+1

Sympy 've' ve 'veya' off'ını çıkarmaz. Bu operatörler Python'da “kodlanmış” ve türlere göre aşırı yüklenemezler, bu yüzden Python bunları çalıştırmaya çalışır ve bu da başarısız olur veya istediğiniz sonucu vermez. – BlackJack

+1

@Nico - Cevabımı silmek istiyorum. Lütfen bunu doğru olarak işaretleyebilir misiniz? –

cevap

2

Hata iletisi, kodlanmış bir onaylama kontrolüne dayanmaktadır. o kaldırılırsa, ben is_valid çift olarak ayarlanmış olduğundan bu, ne istediğinizi muhtemelen hala olmadığını ancak

#include "f.h" 
#include <math.h> 

double f(double is_valid, double x) { 

    double f_result; 
    f_result = is_valid && x > 0; 
    return f_result; 

} 

Not almak ve muhtemelen bir int (veya C99 bool) olmak istiyorum.

Öneri: doğrudan ifade üzerinde ccode kullanın ve işlev sarıcısını el ile yazın. Daha ölçeklenebilir bir şeye ihtiyacınız varsa pycodeexport'u da kullanabilirsiniz.

+0

Cevabınız daha doğru olduğundan, silmeyi denedim (SO izin vermeme-). Görüyorum ki sen de semptomun başı senmişsin. Bu konuda bir planın var mı? –

+2

@RuHasha yep, kod oluşumunu semptomda iyileştirmek için planlar var. – asmeurer