2010-04-08 20 views
8

Python'u bazı C++ kodlarıyla genişletiyorum.Python'dan C/C++ const char sorusuna

int PyArg_ParseTupleAndKeywords(PyObject *arg, PyObject *kwdict, 
           char *format, char **kwlist, ...); 

(link: http://docs.python.org/release/1.5.2p2/ext/parseTupleAndKeywords.html)

ilgi parametre kwlist olduğunu ben kullanıyorum fonksiyonların

biri aşağıdaki imzası vardır. Yukarıdaki bağlantıda, bu işlevin nasıl kullanılacağına dair örnekler verilmiştir.

warning: deprecated conversion from string constant to ‘char*’ 

Yani, statik const char statik char * değiştirebilir *: Bu kullanarak g ++ derlerken

static char *kwlist[] = {"voltage", "state", "action", "type", NULL}; 

, ben uyarı olsun: örneklerde, kwlist benziyor. Maalesef Python kodunu değiştiremiyorum. Bu nedenle, farklı bir derleme hatası alıyorum (char ** 'yi const char **' ya dönüştürebilir). Burada okuduğum bilgilere dayanarak, uyarıyı yok saymak için derleyici bayraklarını açabilirim veya kwlist tanımındaki sabit dizelerin her birini char * 'a atabilirim. Şu anda ikincisini yapıyorum. Diğer çözümler nelerdir?

Bu soru daha önce sorulmuşsa özür dilerim. Yeniyim.

cevap

4

PyArg_ParseTupleAndKeywords(), geçirdiğiniz verileri değiştirmeyi bekliyor mu? Normal olarak, deyimsel C++ 'da, const <something> *, arayanın yalnızca okuyacağı bir nesneye işaret eder, oysa <something> *, arayanın yazabileceği bir nesneye işaret eder.

PyArg_ParseTupleAndKeywords()char *'a yazabilmeyi bekliyorsa, sorgunuzda bahsettiğinizin üzerinde ve üzerinde tamamen farklı bir sorun var demektir. PyArg_ParseTupleAndKeywords parametrelerini değiştirmek istemiyor varsayarsak

, PyArg_ParseTupleAndKeywords() ararken onun const-lik kaldırmak için const char *kwlist[] olarak kwlist beyan ve const_cast kullanmak olacaktır bu sorunla başa çıkmanın deyimsel doğru yolu hangi böyle bakmak yapacak :

PyArg_ParseTupleAndKeywords(..., ..., ..., const_cast<char **>(kwlist), ...); 
+0

Eminim PyArg_ParseTupleAndKeywords() kwlist'i değiştirmeyi beklemez. Öneriniz faydalıdır. Teşekkürler. – Eugene

0

önce yedi yıldan kabul edilen bir cevabı var, ama bu konu hâlâ alakalı gibi görünüyor, çünkü alternatif bir çözüm eklemek istiyorum.


Eğer const_cast çözüm beğenmezseniz, ayrıca dize dizinin bir yazma seçebilir sürümünü oluşturabilirsiniz.

char s_voltage[] = "voltage"; 
char s_state[] = "state"; 
char s_action[] = "action"; 
char s_type[] = "type"; 
char *kwlist[] = {s_voltage, s_state, s_action, s_type, NULL}; 

char name[] = ".." kopya yazılabilir konuma dize.

İlgili konular