Sida 3 av 3
Postat: 2 januari 2009, 08:55:45
av thepirateboy
Nej, Tagged Initializing Format verkar han inte köpa alls tillsammans med union. Det enda som funkar är nedanstående (då får jag varning "../main.c:78: warning: missing braces around initializer")
Kod: Markera allt
union
{
T_TX_data_struct tx_data2;
unsigned char Buffer[23];
} Alla_Bytes_I_Samma_Klump = {STX,"000",';',"00",';',"000",';'," 00,0",';',"0,00",ETX};
Däremot fungerar Tagged Initializing Format bra vid "normal struct-deklarering", så det var ett bra tips. Ger ett tydligare skrivsätt.
Kod: Markera allt
T_TX_data_struct tx_data = {
.start_TX = STX,
.counter = "000",
.sep_sign_1 = ';',
.serial = "00",
.sep_sign_2 = ';',
.ad_value = "000",
.sep_sign_3 = ';',
.temperature = " 00,0",
.sep_sign_4 = ';',
.batt_volt = "0,00",
.stop_TX = ETX
};
Postat: 2 januari 2009, 09:19:47
av stekern
thepirateboy:
Kod: Markera allt
unsigned char *ptr_tx_data = (unsigned char *)&tx_data;
nrf24l01_write_tx_payload(ptr_tx_data, RF_PAYLOAD, true);
kan du skriva om till:
Kod: Markera allt
nrf24l01_write_tx_payload((unsigned char *)&tx_data, RF_PAYLOAD, true);
Postat: 2 januari 2009, 15:57:06
av speakman
thepirateboy skrev:Nej, Tagged Initializing Format verkar han inte köpa alls tillsammans med union. Det enda som funkar är nedanstående (då får jag varning "../main.c:78: warning: missing braces around initializer")
Kan du sätta in den kompletta källkoden som genererar det där felet?
Kod: Markera allt
union
{
T_TX_data_struct tx_data2;
unsigned char Buffer[23];
} Alla_Bytes_I_Samma_Klump = {STX,"000",';',"00",';',"000",';'," 00,0",';',"0,00",ETX};
Här kan man ju tycka att kompilatorn har svårt att veta var den ska stoppa in datat. Fungerar t.ex. Alla_Bytes_I_Samma_Klump.tx_data2 = {...} ?
Postat: 2 januari 2009, 16:25:15
av thepirateboy
Det går ju att ta ett mindre exempel, som nedan, som genererar "missing braces..."
Jag har försökt att googla och lista ut vad det är för "braces" den saknar utan att lyckas hitta något svar som funkar. Notera att det är en varning och inget error.
Kod: Markera allt
typedef struct
{
unsigned char SenderID;
unsigned char ReciverID;
}T_RF_Data_Struct;
union
{
T_RF_Data_Struct RF_Data;
unsigned char Buffer[2];
}U_RF_Data = {0x00,0x00};
Ändrar jag till nedanstående blir det error
"../main.c:72: error: expected '=', ',', ';', 'asm' or '__attribute__' before '.' token"
Kod: Markera allt
typedef struct
{
unsigned char SenderID;
unsigned char ReciverID;
}T_RF_Data_Struct;
union
{
T_RF_Data_Struct RF_Data;
unsigned char Buffer[2];
}U_RF_Data.RF_Data = {0x00,0x00};
Postat: 2 januari 2009, 21:14:01
av speakman
Prova:
Kod: Markera allt
typedef struct
{
unsigned char SenderID;
unsigned char ReciverID;
}T_RF_Data_Struct;
union
{
T_RF_Data_Struct RF_Data;
unsigned char Buffer[2];
}U_RF_Data = {{0x00,0x00}};
Postat: 2 januari 2009, 22:22:28
av thepirateboy
Kan nästan svära på att jag testat det förut, men fick bara error. Men nu när jag testar funkar det, hehe
Kod: Markera allt
typedef struct
{
unsigned char SenderID;
unsigned char ReciverID;
}T_RF_Data_Struct;
union
{
T_RF_Data_Struct RF_Data;
unsigned char Buffer[2];
}volatile U_RF_Data = {{'x','u'}};
Ovanstående kod genererar i AVR:en:

Postat: 2 januari 2009, 22:52:33
av TomasL
Varför krångla med initieringen samtidigt som defineringen. finns ju inget att hämta.
Blir väl sannolikt mer svårläsligt, då man ofta har defineringen i .h filen eller någon annastans.
Postat: 2 januari 2009, 23:23:46
av Icecap
Precis! Samtidig måste kompilern kasta in lite kod som kopierar från ROM till RAM, det kan fungera helt OK men jag gillar inte att ha kod med i mina projekt som inte jag har fullt koll på.
Men det är en fråga om smak och tycke.
Postat: 2 januari 2009, 23:38:56
av speakman
Det var väl ändå för demonstrering initiering och definering var i samma kod. Annars kör man naturligtvis bara initiering per instansiering. Att defineringen alltid hamnar i en headerfil gäller ju bara om den ska vara nåbar från fler moduler än bara en.

Postat: 2 januari 2009, 23:49:58
av TomasL
För läsbarhetens skull, även vid privata structar, även anonyma sådana samt tillfälliga är det dumt att ha initiering och definering på samma ställe.
Kod: Markera allt
void func ()
{
#typedef a
{
....
}
kod
a=...;
}
Tycker personligen detta är bättre.
Ännu hellre att ha dem i separat .h fil, då har man allt på samma ställe, och slipper leta efter fanskapet.
var strucken hamnar har ingen betydelse, även om det är en global .h fil så spelar det ingen roll, eftersom ingenting händer föränn den defineras.
Personligen har jag alla #typedef i samma .h fil så jag enkelt kan hitta dem, sparar mycket letande.
Postat: 3 januari 2009, 00:41:23
av sodjan
Nu är jag inte så hemma på AVR, men är av någon speciell anledning
som "U_RF_Data = {{'x','u'}}" ger "t" och "u" i Watch fönstret ?
Postat: 3 januari 2009, 09:40:07
av Icecap
TomasL: "#typedef" ???? Menar du "typedef"???
Eller är "#typedef" en speciell kommando jag inte har uppmärksammat? *nyfiken*
Postat: 3 januari 2009, 10:09:28
av thepirateboy
sodjan skrev:Nu är jag inte så hemma på AVR, men är av någon speciell anledning
som "U_RF_Data = {{'x','u'}}" ger "t" och "u" i Watch fönstret ?
Det är inget AVR-specifikt utan ett helt vanligt klipp o klistra fel.
Angående initiering så är förstås smaken som baken, det var mest intressant att se *hur* man kunde göra.