2014-04-01 2 views
0
을 생산

내가 가지고있는 py_embed 스레드에 전달하기 위해이 같은 내 main_thread에 여러 번 숯불 포인터가 loop_p에게 전화를 내가 전화를 반환하는 함수 :호출 스레드는 다른 결과

SENDTOPY
HANDLE handle; 
SENDTOPY *cmd=new SENDTOPY(); 

char* msg=loop_p(ac); 
char *argv[4]={"PythonPlugIn2","bridge","test_callsign",msg}; 
cmd->argc=4; 
for(int i = 0; i < NUM_ARGUMENTS; i++) 
{ 
    cmd->argv[i] = argv[i]; 
} 

handle=(HANDLE) _beginthread(py_embed,0,(void*)cmd);} 

는 구조체이다

typedef struct{ 
    int argc; 
    char *argv[4]; 
}SENDTOPY; 

는 이런 파이썬 전송 된 메시지와 파이썬 잘 수신 :

SENDTOPY *arg=(SENDTOPY*)data; 
pArgs2=Py_BuildValue("(s)",arg->argv[4]); 
pValue2 = PyObject_CallObject(pFunc, pArgs2); 

메모리 할당 문제가 발생하지 않도록하려면 loop_p 함수를 std::string을 반환하는 함수로 수정했습니다. 나는 전후 main_thread에 TEXTFILE과 메시지에 인쇄

typedef struct{ 
    int argc; 
    char *argv[3]; 
     const char* msg; 
}SENDTOPY; 

을 :

... 

std::string msg_python=loop_p(ac); 
const char * msg2=msg_python.data(); 

char *argv[3]={"PythonPlugIn2","bridge","test_callsign"}; 
cmd->argc=3; 
cmd->msg=msg2; 
for(... 
... 

그리고 난 여기에 구조체 SENDTOPY 수정 : I는 약간의 수정으로 main_thread에 해당 문자열을 호출 변경 사항은 동일합니다. 그러나 py_embed 스레드에서 const char은 더 이상 존재하지 않으며 단지 횡설수설 무리입니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

미리 감사드립니다.

편집 : loop_p 코드 당신은 스택에 생성 된 임시 문자열 객체의 내부 용기에 대한 포인터를 저장하는 것을 그것은 나에게 나타납니다

std::string CNewDisplay::loop_p(int ac){ 

std::string res("Number of Aircrafts\nHour of simulation\n\n"); 

for (... 
        .... 
     //Route 
     textfile<<fp.GetRoute()<<endl; 
     std::string route=fp.GetRoute(); 
     std::replace(route.begin(),route.end(),' ',','); 
     res+=route; 
     res.append(",\n"); 

     res.append("\n\n"); 


     }; 

return res; 

} 
+0

루프백 코드가 포함되어 있지 않은 이유를 잘 모르겠지만 msg_python.data()를 msg_python.c_str()으로 수정하여 null로 끝나는 C 스타일 문자열을 얻고 있는지 확인해야합니다. – Steger

+0

그 함수의 끝에서 결과가 예상되기 때문에 나는'loop_p' 코드를 포함하지 않았습니다. 'msg_python.c_str()'에'msg_python.data()'를 넣고 시도해 본 결과는 –

+0

과 같습니다. 어떻게 함수를 호출하는 파이썬 문자열이 C 함수가 호출 될 때까지 데이터를 가지고 있는지, 또는 그 반대의 경우도 마찬가지입니다. – Claris

답변

1

. 정적 문자열을 만들 경우, 문자열의 내장 프로그램 실행에 걸쳐 유효합니다, 당신은 안전하게 문자열 용기에 포인터를 저장할 수

static std::string msg_python;  // survives beyond local scope 

msg_python=loop_p(ac);    // set string to loop_p return value 
const char *msg2=msg_python.c_str(); // get ptr each time since it could change 

을 또한, 당신이 당신의 C 스타일을 얻을 수 .c_str()를 사용하는지 확인 숯불 문자열 포인터 그래서 당신은 문자열이 null로 끝났다고 확신합니다. .data()를 사용한다고해서 null 종료가 보장되는 것은 아닙니다.

+0

그게 다야! 한가지,'msg2' 포인터는 언제 삭제해야합니까? 제 말은,'main_thread'가'py_embed' 쓰레드보다 먼저 끝났기 때문에,'main_thread'에서 삭제하면 오류가 발생합니다. –

+1

msg2는 삭제하면 안됩니다. 단순히 msg_python 내부를 가리키며, msg_python은 프로그램 완료시 파괴됩니다. 누설 없음. – Steger