2012-03-11 4 views
3

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에서
+4

"segfault를 얻지 않고 XYZ를 수행하는 방법"을 묻는 것은 의미가 없습니다. segfault를 얻으면 잘못된 프로그램을 작성했기 때문에 "어떻게 잘못하지 않고 XYZ를 수행합니까?"라고 묻는 것과 같습니다. 그리고 그것은 "XYZ를 어떻게합니까?"와 똑같습니다. –

+0

segfault가 발생하면 실제로 '5'가 인쇄됩니까?ardrone_update 함수에 대해 생성 된 어셈블리 코드를 확인하려고 했습니까 (-S 옵션이있는 gcc/g ++을 시도해보십시오)? – Tomek

답변

2

++ 코드 pixbuf_data는 C 결합으로 선언해야합니다 : C++ 연계와 pixbuf_data의 또 다른 (중복) 정의가없는 한 C++ 코드가 연결 안

extern "C" uint8_t* pixbuf_data; 

extern "C"없이.

+0

'extern "C"'는 함수에 대해서만 차이를 만들 것이라고 생각했습니다. C++은 변수의 이름을 바꿀 것인가? –

+2

C++은 정적 변수에 대한 변수 이름 공간 이름 또는 클래스 이름을 혼합해야하기 때문에 변수 이름도 변경합니다. –

+3

흠, 내 컴파일러 (gcc)는 내가 확인한 전역 범위의 이름이 아닙니다. 그리고 내가 이해하는 한, OP는 완전히 연결된 프로그램을 가지고 있기 때문에 이것은 문제가 될 수 없으며 질문에 대답하지 않습니다. –

1

자신을 디버거로 만들고 프로그램을 실행하십시오. 추적 코드는 segfault가 나타나는 위치를 알려주지 않습니다. IO는 느립니다.

우리가 보여주는 코드에서 pixbuf_data에 대한 메모리를 할당하지 않는 것 같습니다. 유효한 포인터를 지정하지 않고 액세스하면 아무 일도 발생할 수 없습니다.

+0

Wel 나는 해결책을 준다고 생각합니다. Pixbuf가 가리킬 수있는 유효한 위치를 가졌지 만 그 위치는 잠시 후에 만 ​​유효합니다 : 프로그램 시작시 output_gtk_stage_transform (다중 스레드 프로그램) 전에 ardrone_update 함수가 호출되었습니다. 문제는 지금 해결됩니다 :) – martin

0

C 프로젝트와 C++ 프로젝트간에 변수를 공유하려고합니다. 난 내 솔루션을 빌드 할 때하지만 난 "오류 LNK2001 : 확인되지 않은 외부 기호"있어요. 구조체 구성 g_conf을 "이 내가 무슨 짓을했는지 : C 프로젝트 ==에서

====이

난에 헤더 파일을 생성 그것은 내가 내 구조체

typedef struct{ int maxUser; }Configuration; 
extern Configuration conf; 

====를 만들 C++ 프로젝트 =======에서 주 파일에서

:

#include "../ProjectC/header.h" 

int main(){ conf.maxUser = 10; } 
관련 문제