2017-01-30 106 views
1

我有2個定義,其中一個帶有一個字符串,另一個帶有一個數字。如何從字符串和數字定義一個常量數組。這個數組中還有一些額外的常量。C字符串到陣列

我該如何編寫這段代碼,使之在數組foobar中具有0x22,0x41,0x42,0x42,0x21,來自定義的FOO和BAR?

#define FOO "AB" 
#define BAR 33 

extern int rs232_write(const unsigned char *data, unsigned char count); 

const unsigned char foobar[] = 
{ 
    0x22, 
    FOO[0], /*what must i put here, this do not work*/ 
    FOO[1], 
    0x42, 
    BAR, 
}; 


int main(void) 
{ 
    rs232_write(foobar,sizeof(foobar)); 
    return 1; 
} 

在GCC,例如,我得到的錯誤:

./001.c:9:5: error: initializer element is not constant 
    FOO[0], /*what must i put here*/ 
    ^

絃樂總是具有相同的長度。 我也試着在其他的方式:我也得到一個錯誤

#define FOO "AB" 
#define BAR 33 

extern int rs232_write(const unsigned char *data, unsigned char count); 

const char foobar[] = \ 
    "\x22" \ 
    FOO \ 
    "\x42" \ 
    BAR /*what must i put here, this also not work*/ 


int main(void) 
{ 
    rs232_write(foobar,sizeof(foobar)); 
    return 1; 
} 

這裏,例如GCC打印:

./002.c:2:13: error: expected ‘,’ or ‘;’ before numeric constant 
#define BAR 33 
      ^

我就沒有太大的空間,微控制器的工作,所以我會喜歡避免在運行時創建數組,我的編譯器只支持C89。

+0

有什麼不對你告訴我們的代碼? –

+0

查看評論,編譯器不接受它(也試用gcc),「錯誤:初始化器元素不是常量」和「錯誤:預計','或';'數字常量之前」 – 12431234123412341234123

+0

當發佈關於構建錯誤的問題時,在問題的正文中始終包含確切的錯誤(未編輯和未修改,最重要的*完整*表格)。最好是完整版本日誌的直接複製粘貼。 –

回答

1

最簡單的,使用memcpy

#include <stdio.h> 
#include <string.h> 

#define FOO "AB" 
#define BAR 33 

extern int rs232_write(const unsigned char *data, unsigned char count); 

unsigned char _foobar[] = 
{ 
    0x22, 
    0, 0, 
    0x42, 
    BAR, 
}; 
const unsigned char *foobar; 

int main(void) 
{ 
    foobar = (const unsigned char *)memcpy(_foobar + 1, FOO, 2) - 1; 
    rs232_write(foobar,sizeof(foobar)); 
    return 0; 
} 

醜,使用X Macrocompound literal

這樣你可以使用前兩位數字:

const unsigned char foobar[] = 
{ 
    0x22, 
    'A', 'B', 
    0x42, 
    33, 
}; 

或滿弦"AB"

#include <stdio.h> 

#define FOO X('A', 'B', '\0') 
#define BAR 33 

extern int rs232_write(const unsigned char *data, unsigned char count); 

const unsigned char foobar[] = 
{ 
    0x22, 
    #define X(a, b, c) a, b 
    FOO, 
    #undef X 
    #define X(a, b, c) ((char []){a, b, c}) 
    0x42, 
    BAR, 
}; 

int main(void) 
{ 
// rs232_write(foobar,sizeof(foobar)); 
    printf("%s\n", FOO); 
    return 0; 
} 

輸出:

AB 
+0

memcpy(),或者在我的情況下,簡單寫兩個值,就是我試圖避免的。但X宏將工作。我不知道你可以創建一個數組並同時進行函數調用。 – 12431234123412341234123

+0

是不是一個函數調用,看看鏈接:_這些功能是,宏可以調用其他宏,宏可以重新定義,並且嵌套的宏調用不會擴展,直到調用它的宏在其中一個它的調用._ –

+0

不,我討論'strcpy(buffer,((char []){0x44,0x61,0}))',我可以用一個我以前沒有創建的數組調用strcpy()沒有字符串,而不是宏。 – 12431234123412341234123

1

這應該工作:

#include<stdio.h> 

#define FOO 'A','B' 
#define BAR 33 

const char foobar[] = { 
    0x22, 
    FOO, 
    0x42, 
    BAR, 
    '\0' 
}; 

int main(void) 
{ 
    printf("%s\n", foobar); 
    return 0; 
} 

BTW這是非常不好的給init陣列方式,也許可以更好地解釋你的目的。

+0

但我仍然需要FOO作爲字符串在其他地方,所以有可能從這個定義創建一個常量字符串? – 12431234123412341234123

+0

它基於一個二進制rs232協議,我無法更改,我需要在一個軟件包(幀組)中發送軟件名稱和版本。 – 12431234123412341234123

0

問題是編譯器在編譯時不知道字符串文字"AB"將放在內存中的位置。它的位置將在程序鏈接或可能被載入內存時決定。

因此,使用它不會導致foobar陣列初始化所需的編譯時常量。

在這種情況下,您真的別無選擇,只能在運行時使用設置foobar[1]foobar[2]一次。但是,即使在極小的嵌入式系統上,這在內存或時間上也不會產生太多的開銷。如果程序運行超過幾秒鐘,它甚至不可能被測量。

+0

我不在乎時間,但我的程序的內存使用情況已經成爲問題,我嘗試將其減少到無需啓用任何優化。 20字節的RAM可能聽起來非常小,但您會注意到它只有1KiB – 12431234123412341234123

+0

@ 12431234123412341234123添加運行時初始化將增加約兩條指令。如果你只有這個單個數組,那麼它不可能導致問題。如果你有很多這樣的數組,你可以考慮只使用一個,然後在運行時初始化所有數組。代碼(通常)比數據小。你爲什麼不想啓用優化?您是否嘗試過使用'-Os'?它有什麼區別? –

+0

@ 12431234123412341234123哦,你應該已經添加了所有的限制和目標平臺到你的問題,這是非常相關的信息。 –

1
#include <stdio.h> 
#include <stdlib.h> 

#define FOO   "ab" 
#define BAR   33 

#define STRINGIFY(x) STRINGIFY2(x) 
#define STRINGIFY2(x) #x 

const char foobar[] = "\x22" FOO "\x42" STRINGIFY(BAR); 

int main(void) 
{ 
    printf("foobar = |%s| (%ld+1 characters)\n", 
    foobar, (long) sizeof(foobar) - 1); 
    return EXIT_SUCCESS; 
} 

運行這個程序。OUPUTS:

foobar = |"abB33| (6+1 characters) 
+0

我確實想要字節33,或者在這種情況下字符'!'在數組中,不是字節51(0x33)或字符「3」。所以它應該打印「abB!」 – 12431234123412341234123

+0

@ 12431234123412341234123:那爲什麼不簡單地'#define BAR「\ x21」'或'#define BAR「!」'? – AlexP

+0

我需要BAR作爲其他地方的整數。但也許我可以#定義_BAR「!」和#define BAR _BAR [0] – 12431234123412341234123