2014-11-07 2 views
0

У меня есть ниже код в встроенной среде C, компилятор: Hightec (Big-Endian)Несовпадение в копии данных в качестве аргумента функции в вызове функции

unsigned char GlobalVar; 

Func_A() 
{ 
unsigned char var1,Retval; 
var1 = 0; 

retval = Func_B(0,&var1); 

} 


unsigned char Func_B (unsigned char val, void* ptr) 
{ 
unsigned long localvar; 

localvar = (unsigned long)GlobalVar; 
*(unsigned char*)ptr = (unsigned char)localvar; 
return (0); 
} 

Вход: GlobalVar = 1, Func_A вызывает Func_B.

ожидаемый выход: Func_B называется, Второй параметр обновляется со значением 1.

Что я вижу: Func_B называется, Второй параметр имеет значение 64 (0100 0000).

Дополнительные комментарии

1. Func_A is an application file.   
2. Func_B is part of a different software module. 

    3. Func_A reads the value from Func_B to do some action in application. 
    4. Func_B reads the value from a global variable (it is an array) and copies it into the second argument passed to it. 
    5. The second argument is a void* because Func_B can read different global variables and finally it would typecast based on parameter 1 
    (this part is not related, so i have excluded the related code) 

Что вы думаете, что здесь происходит?

EDITED

переиздан

Я сожалею, что я закрыл вопрос в спешке

Проблема я сталкиваюсь здесь

  1. var1 является локальной переменной FUNC_A
  2. Значение обновляется в адрес var1 в FUNC_B
  3. Когда FUNC_B возвращается, значение var1 еще старое значение.

Как я решил, что

  1. Я сделал переменную переменная1 глобальной.
  2. Я вижу данные

Что я подозреваю

  1. var1 это выделено в FUNC_A
  2. FUNC_A называет FUNC_B, выделенное пространство находится вне области для обновления данных до

Что вы думаете об экспертах? Я действительно хочу знать, в чем причина этого поведения?

+5

Пожалуйста, измените вопрос, чтобы включить правильный и действенный код, который не дает ошибки компилятора или предупреждение. Предпочтительно [Минимальный, Полный и Подтверждаемый пример] (http://stackoverflow.com/help/mcve). –

+1

Где retval в Func_A вы должны использовать Retval .. Это не скомпилировало – Gopi

+0

«Настоящий код» отличается от того, что вы опубликовали, или ваш компилятор имеет ошибку (возможно, прежнюю) –

ответ

0

Unsigned long is 4 byte length и unsigned char 1 байт. Вы назначили значение 1 байта на 4 байта и снова присваиваете этому значению 4 байта значение 1 байта. Может быть возможность иметь значение нежелательной почты в оставшихся 3 байтах переменной unsigned long и которая может быть назначена (на основе endianess) вашей переменной unsigned char.

+0

Я понимаю это, но разве вы не думаете, что typecast (который является unsigned char) shld возвращает LSB независимо от endianess. – DarkKnight

+0

. Я отредактировал исходный вопрос. Можете ли вы указать свои входы. – DarkKnight

0

Что вы видите: Func_B is called, Second parameter holds value 64 (0100 0000).

unsigned char Func_B (unsigned char val, void* ptr) 
{ 
    unsigned long localvar; 

    printf("val = %d\n", *(unsigned char*)ptr); 
    /*HERE : val = 0*/ 
    localvar = (unsigned long)GlobalVar; 

    *(unsigned char*)ptr = (unsigned char)localvar; 

    return (0); 
} 

Что я вижу: Из приведенной выше функции, второй параметр void *ptr. Когда я пытаюсь распечатать его содержимое, значение будет таким же, как ожидалось. val = 0.

@DarkKnight: How did you check the value of the second parameter ?

+0

@Santhosh: Я проверил значение вторая переменная в отладчике. Вы скомпилировались с платформой Big-Endian? GlobalVar обновляется со значением 1, которое копируется во второй параметр – DarkKnight

+0

С указанным выше кодом я попытался напечатать то же самое, и результат будет таким, как ожидалось. Я думаю, что с отладчиком он пытается читать 4 байта. Измените тип параметра с 'void *' на 'unsigned char' и попробуйте. Выход будет таким же –

+0

Я отредактировал оригинальный вопрос, Можете ли вы представить свои входы – DarkKnight