C 코드를 구현하는 C++ 프로젝트에서 작업 중이며 세그먼트 오류가 발생했습니다. segfault는 C++ 코드에서 전역 변수에 액세스하려고 할 때 발생합니다. 코드의C와 C++ 코드간에 변수를 공유하려면 어떻게합니까?
개요 :이 기능은 주기적으로 다른 C 코드에 의해 호출되고 pixbuf_data 포인터 마녀 포인트를 갱신한다
#include "video_stage.h"
uint8_t* pixbuf_data = NULL; //pointer to video buffer
vp_os_mutex_t video_update_lock = PTHREAD_MUTEX_INITIALIZER;
C_RESULT output_gtk_stage_transform(void *cfg, vp_api_io_data_t *in, vp_api_io_data_t *out)
{
vp_os_mutex_lock(&video_update_lock);
/* Get a reference to the last decoded picture */
pixbuf_data = (uint8_t*)in->buffers[0];
vp_os_mutex_unlock(&video_update_lock);
return (SUCCESS);
}
:
나는 다음 코드와 video_stage.c라는 단일 C 파일이 RGB 비디오 프레임으로 변환합니다.
이 헤더 파일 video_stage.h의 :
#ifndef _IHM_STAGES_O_GTK_H
#define _IHM_STAGES_O_GTK_H
#ifdef __cplusplus
extern "C" {
#endif
#include <config.h>
#include <VP_Api/vp_api_thread_helper.h>
#include <VP_Api/vp_api.h> //hier zit vp_os_mutex in geinclude
PROTO_THREAD_ROUTINE(video_stage, data);
#ifdef __cplusplus
}
#endif
extern uint8_t* pixbuf_data;
extern vp_os_mutex_t video_update_lock;
#endif // _IHM_STAGES_O_GTK_H
헤더 파일은 pixbuf_data 포인터의 통근 선언을 포함하고 있습니다.
그리고 여기 CPP 파일 : device.cc는 :
CPP에 파일의 함수 (다른 CPP 코드에 의해)라고#include <iostream>
#include "video_stage.h"
int ardrone_update(ardrone_t *d)
{
uint8_t x;
x = pixbuf_data[0]; //no problem here, this is executed
std::cout << 5 << std::endl; //this is executed too
std::cout << x << std::endl; //segfault occures here
}
, 세그먼트 폴트는 COUT 지시를 인쇄 X에 occures.
내가 c 파일에서 버퍼의 첫 번째 요소의 printf를 수행 할 때, 나는 기대 한 것을 얻는다.
나는 그것이 c와 C++ 코드의 혼합과 관련이 있다고 확신하지만, 나의 연구에 따르면 나는 여기서 c와 C++ 코드를 모두 호환 할 수있는 재료를 만들었다. C 소스에 정의 된
C에서
"segfault를 얻지 않고 XYZ를 수행하는 방법"을 묻는 것은 의미가 없습니다. segfault를 얻으면 잘못된 프로그램을 작성했기 때문에 "어떻게 잘못하지 않고 XYZ를 수행합니까?"라고 묻는 것과 같습니다. 그리고 그것은 "XYZ를 어떻게합니까?"와 똑같습니다. –
segfault가 발생하면 실제로 '5'가 인쇄됩니까?ardrone_update 함수에 대해 생성 된 어셈블리 코드를 확인하려고 했습니까 (-S 옵션이있는 gcc/g ++을 시도해보십시오)? – Tomek