2015-06-26 2 views
-1

Написание кода c, компиляция gcc. Я использую глобальный массив в main.c и menu.c, в основном не ожидается. Но в menu.c хорошо работает. В чем разница.определение глобальных переменных, получение различных результатов в основном

Глобальные TXT_STRINGS массив, определенные в combo_strings.c

combo_strings.c

#ifndef COMBO_STRINGS_C_ 
#define COMBO_STRINGS_C_ 

//array defined here 
extern const unsigned char * TXT_STRINGS[50][3]={ 

{" KAPI SiFRESiNi GiRiN»","ENTER THE DOOR ACCESS PIN»"}, 
{"AYARLAR SiFRESi GiRiN» ","ENTER SETTINGS PASSWORD»"}, 
.... 

#endif /* COMBO_STRINGS_C_ */ 

menu.c

//extern array declare 
unsigned char * TXT_STRINGS[50][3]; 

function_x(){ 
trace_printf(TXT_STRINGS[1][0]); //printing console "AYARLAR SiFRESi GiRiN" 

} 

main.c

//extern array declare 
unsigned char * TXT_STRINGS[50][3]; 

main(){ 
trace_printf("txt_str=%x",TXT_STRINGS[1][0]); //printing console "txt_str=20001f38" 

} 
+1

Прочтите следующее: «Как использовать« extern »для обмена переменными между исходными файлами в C?» (Https://stackoverflow.com/questions/1433204/how-do-i-use-extern-to- доля-переменные-между-источник -файлы-в-C). – WhozCraig

+0

'extern type variable_name = ...' просто не имеет никакого смысла. – Lundin

+0

Вы получите *** множественную ошибку определения *** в коде, показанном в сообщении. Это связано с тем, что в одном файле вы используете 'extern const unsigned char *', а затем в другом вы используете 'unsigned char *'. Вы отказались от 'const'. Другая проблема заключается в том, что тип для строковых литералов не является 'unsigned char *', это 'char *'. Обе эти проблемы предотвратят чистую компиляцию. – ryyker

ответ

2

Действительно, самое лучшее место, чтобы создатьexternобласть видимости переменной
в файл заголовка, который по соглашению обеспечивает видимость этой внешней переменной для нескольких других исходных файлов.

Еще один момент, в вашем примере вы определяете массивы строковых литералов, которые имеют типа полукокс *, а не неподписанный символ *, то это приведет к подписанной ошибке рассогласования на ваш оператор присваивания при компиляции. Для примера ниже, я буду использовать char * ...

Пример ниже иллюстрирует концепцию:

EDIT (размеры корректируются индекс массива, чтобы соответствовать пример)

в some.h

extern const char * TXT_STRINGS[5][2];//declare extern variable 

Затем в источнике ОДИН из исходных файлов определяют extern переменная

в some.c

//define extern scoped variable in only 1 .c file 
const char * TXT_STRINGS[5][2]={{"assdf","assdf"}, 
           {"assdf","assdf"}, 
           {"assdf","assdf"}, 
           {"assdf","assdf"}, 
           {"assdf","assdf"}}; 

И в каждом исходном файле, который нуждается видимость TXT_STRINGS:

некоторые .c
#include "some.h"

another.c
#include "some.h"

yetAnother.c
#include "some.h"

+0

Я тоже попробовал :). получение множественной ошибки определения. @ryyker –

+0

@saimgokkoyun, если вы получаете ошибку _multiple definition_, у вас есть несогласованность в том, как вы определили переменную в сообщении .h *** *** и в .c *** определении ***. Убедитесь, что размеры массива одинаковы, и все типы (т.е. 'extern const char * var [3] [4] [5];' в заголовке, затем 'const char * var [3] [4] [5 ] = {...}; 'in .c) Помните, что ключевое слово *** extern *** используется только один раз для переменной, в моем примере оно используется только в .h. – ryyker

+1

@saimgokkoyun Сделайте то же, что показано в приведенном выше примере. Вам не нужно объявлять и не определять переменную в других c-файлах, которые должны ее использовать, просто включая заголовок, где проживает декларация extern. – Lundin

0

Используйте extern keywo й

extern unsigned char * TXT_STRINGS[LNG_ROWS_SIZE][LNG_CNT]; 

в main.c и menu.c и удалить его из файла заголовка, так что это не переопределены.

Как бы то ни было, он переопределяется и инициализируется 0, а также соответствующая main() подпись в этом случае - int main(void).

Кроме того, не помещайте определение в заголовочный файл, потому что если вы включите его в исходные файлы, а затем соедините файлы вместе, то ошибка с несколькими определениями предотвратит компиляцию.

+0

Я попробовал это еще один –

0

В коде

//array defined here 

является неправильное понятие.

Вы должны быть

  • использованием extern для menu.c и menu.c (TXT_STRINGS должно появиться заявление ар)
  • необходимо удалить extern из combo_strings.c. (TXT_STRINGS будет определено здесь)

Помните, что extern указывает декларацию, а не определение. Ваш корреспондент должен предупредить вас, если вы пытаетесь инициализировать переменную extern (как вы это делали в combo_strings.c).

Тем не менее, для печати TXT_STRINGS[VERSIYON][Dil], вам нужно использовать формат %s спецификатор, как

trace_printf("txt_str=%s",TXT_STRINGS[VERSIYON][Dil]); 
+0

попробовал еще одну ошибку –

+0

@saimgokkoyun, пожалуйста, просмотрите обновленный ответ. –

Смежные вопросы