2014-01-13 4 views
0
uint8 *measurements[30] = {(uint8*)0x0041c620}; 

Я объявил глобальную переменную в моей программе, как описано выше, но я получаю сообщение об ошибке компоновщика, каккак решить эту ошибку c компоновщика?

LNK2005: _measurements уже определены в MAIN.obj

Я модифицируя код as

typedef unsigned char uint8; 
    uint8 *measurements[30]; 
    measurements[30]= {(uint8*)0x0041c620} 

;

то и я получаю ошибку

+0

Где вы указали свою переменную измерений? – Vladimir

+0

Если вы используете global в другом файле, используйте extern, где вы пытаетесь его использовать. –

+0

@ vladmir: Я редактировал код. Правильно ли это? – user3189297

ответ

0

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

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

0

Это определение в файле заголовка? Если это так, вы получите одно определение переменной для каждого исходного файла, который включает заголовок. Попробуйте маркировки изменения заголовка только объявить переменную, не определяет его, как так:

extern uint8_t *measurements[30]; 

, а затем определить его в одном из файлов, например main.C так:

uint8 *measurements[30] = {(uint8*)0x0041c620}; 
+0

Благодарим вас за ответ. Размер составляет 4 байта. Как я могу сделать это как 1byte ?? – user3189297

+0

uint8 - 8-битное целое число, но если я делаю, как указано выше, размер каждой переменной составляет 4 байта. – user3189297

+0

Это, скорее всего, потому, что вы объявляете массив указателей на 8-битные значения вместо массива из 8-битных значений. Попробуйте измерения uint8_t [30] = {0x11, 0x22, 0x33}; или что-то в этом роде. Угадывая ваш код, похоже, вы захотите загрузить 8-битное значение с адреса 0x0041c620. Это можно сделать так: измерения uint8_t [30] = {* (uint8_t *) 0x0041c620}; –

0

Кажется, что вы хотите массив из 30 8-битовых значений, и этот массив уже существует в какой-то конкретный адрес.

В одном исходном файле (measurements.c):

uint8 * const measurements = (uint8*)0x0041c620; 

В заголовочном файле (measurements.h):

uint8 * const measurements; 

Использование:

#include "measurements.h" 

// In some function 
measurements[29] = ... // Set last element to something 

Обратите внимание, что я добавил const, потому что я думаю вы не хотите менять массив адрес (0x0041c620).

+0

0x0041c620: Это будет начальный адрес измерения ?? – user3189297

+0

Это ** должно ** быть. Надеюсь, вы знаете, что вы делаете, когда адреса жесткого кодирования. – user694733

+0

Не могли бы вы рассказать мне, что это такое? – user3189297

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