2013-10-15 4 views
0

ЦелиИспользуя глобальный массив как указатель, C

У меня есть глобальный массив TX и функция CRC, который должен прогрессировать через этот массив. Функция CRC не должна обрабатывать первый байт. Чтобы этого избежать, я пытаюсь увеличить массив, выполнив TX ++. Это вызывает проблемы.

Проблема

Пожалуйста, бросим быстрый взгляд на код ниже:

void Send_To_Manager(void) 
{ 
    TX[0] = 0x55; 
    TX[1] = 0x00; 
    TX[2] = 0x01; 
    TX[3] = 0x00; 
    TX[4] = COMMON_COMMAND;  
    TX++; 
    TX[5] = CRC8(TX,4); 
    TX[6] = CO_RD_VERSION; 
    TX += 5; 
    TX[7] = CRC8(TX,1); 
    TX -= 6; 
    UART_TX(8);  
} 

Я хотел бы ослепить функцию CRC8 первого байта в массиве TX. Выполняя TX ++, я ожидаю, что TX [0] будет 0x00. Однако я получаю сообщение об ошибке:

ошибка: неверный аргумент типа для увеличения

Я также получаю ошибки для TX + = 5; и TX - = 6, как:

ошибка: несовместимые типы в присвоении

Я играл вокруг с этим, так что вместо того, чтобы, если функция имеет массив, такие как:

void Send_To_Manager(unsigned char data[100]) 
{ 
    data++; 
} 

Вышеприведенные работы как предполагалось.

Вопросы

  • Почему я могу сделать это для массивов на основе функций, а не глобальные массивы?
  • Если я действительно хочу сделать это для глобальных массивов, как я могу это сделать?
  • Как вы предпочитаете достижение вышеуказанной цели?

Благодарим вас за ваше время.

ответ

4

Why can I do this for Function based arrays and not Global arrays?

Массивы в качестве параметров функции, заглох на указатели, data в вашем примере это просто локальная переменная с типом unsigned char*, вы можете изменить его, как вы хотите. TX, однако, является (я полагаю) статическим массивом, а не изменяемым указателем.

If I do wish to do this for global arrays how can I do it?

Во-первых, убедитесь, что это действительно то, что вы хотите сделать. Изменение значения TX не только повлияет на вызов CRC8, но и все следующие инструкции, которые разыменовывают значение TX.

В качестве примера, TX++; TX[5] = CRC8(TX,4); эквивалентен TX[6] = CRC8(TX+1,4); TX++;.

Если вы не хотите этого побочного эффекта, не изменяйте значение TX, просто используйте CRC8(TX+1,4) и CRC8(TX+5,4).

Однако, если это действительно то, что вы хотите, то вы должны будете использовать временный указатель:

void Send_To_Manager(void) 
{ 
    char* myTX = TX; 
    myTX[0] = 0x55; 
    myTX[1] = 0x00; 
    myTX[2] = 0x01; 
    myTX[3] = 0x00; 
    myTX[4] = COMMON_COMMAND;  
    myTX++; 
    myTX[5] = CRC8(myTX,4); 
    myTX[6] = CO_RD_VERSION; 
    myTX += 5; 
    myTX[7] = CRC8(myTX,1); 
    myTX -= 6; 
    UART_TX(8);  
} 

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

How would you prefer to achieve the above objective?

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

char* Send_To_Manager(char* currentTX) 
{ 
    currentTX[0] = 0x55; 
    ... 
    currentTX[4] = COMMON_COMMAND;  
    currentTX++; 
    ... 
    return currentTX; 
} 
+0

Я заметил дополнительную ошибку на то, что я пытался сделать. вместо TX [5] = CRC8 (TX, 4); это должно быть TX ++; temp = CRC8 (TX, 4); TX--; TX [5] = temp; –

+0

@ Volcano В этом случае вам вообще не нужно изменять 'TX', просто вызовите' CRC8 (TX + 1, 4) '. – zakinster

1

Вместо того, чтобы пытаться изменить саму ссылку на массив, почему не:

TX[5] = CRC8(TX+1,4); 
TX[7] = CRC8(TX+6,1); 
+1

Не будет ли это 'TX [6] = CRC8 (TX + 1,4)' и 'TX [13] = CRC8 (TX + 6,1)', чтобы отразить изменения значения 'TX'? – zakinster

+0

Спасибо @ThomSmith –

+0

Вы правы, zakinster, и такое замешательство именно поэтому это плохая идея, чтобы возиться со ссылками на ваш массив. –

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