Hello,
it works in devcpp (as c project) but not working in Keil. What is my fault. output must be "12345" but it is not.
typedef union { u8 Reg8[5]; struct { u8 Select; u32 Value32; }Regs; }CreditLoadRegs_t; const char MyArray[]={"12345"}; void MyFonc(char *Buf) { CreditLoadRegs_t *fPtr = (CreditLoadRegs_t *)Buf; printf("%s",fPtr->Reg8); } int main(void) { MyFonc(MyArray); return 0; }
C strings require a terminating NUL character, "12345" doesn't fit in 5 characters, and printf() is going to malfunction if the NUL is missing.
The code as presented might work.
If you don't get "12345" *what* do you actually get, this might be far more helpful information than what is expected.
Returning for main() goes where?
If you don't provide retargeting/semihosting the printf() will likely fault due to lack of supporting code.
Thx for your reply,
"Returning for main() goes where?"
Sorry, the code is not original code, just similar. So I don't use the function in main.
This definition includes null char, MyArray has six bytes but not important. const char MyArray[]={"12345"};
because my sample code is wrong. I'm not using printf in original code, I'm using union pointer memory map. Namely as following
// BufPtr which is usart array includes 5 bytes(it is coming with gprs) so I point with // pointer of CreditLoadRegs_t // if BufPtr includes "12345", Result must be Ptr32->Select='1'; and Ptr32->Value32="5432"; // Because of union is packed
This code works in devcpp but don't work in keil.
micro is stm32f103, it can be packed as byte and union is packed.
I didn't find my fault.
void CreditProc(u8 RW, char *BufPtr) { if (RW == dREAD) { // some codes }else{ CreditLoadRegs_t *Ptr32 = (CreditLoadRegs_t *)BufPtr; // I'm using regs here Ptr32->Select &=0x03; switch(Ptr32->Select) { case dSel0: // something break; /// ... } } }