2012-03-25 43 views
-2

我試圖炭的最小值分配給類型char數組的這樣分配最小值爲char C++

char charchar_value[MAX_VARCHAR_LENGTH + 1]= CHAR_MIN; 

它給我這個錯誤變量「不兼容的類型中的‘字符’的分配到「字符[513]」」

+1

不必char類型的變量;你有一系列的字符。 – Mat 2012-03-25 21:29:45

+2

這不是'char'變量,那是一個'char' **數組**變量。 – 2012-03-25 21:30:05

+1

你想做什麼?就像現在這樣,你正在創建一個數組並試圖用'char'來初始化它。 – 2012-03-25 21:30:26

回答

1

陣列對象的初始化需要使用支架初始化列表,即沿

char charchar_value[MAX_VARCHAR_LENGTH + 1] = { val_0, val_1, /*...*/ val_n }; 

線的東西這將初始化第一n值到它們各自的值,並且所有其他人都歸零。這不是你想要的。設置數組中值的唯一方法是在初始化之後使用例如std::fill()

std::fill(std::begin(charchar_value), std::end(charchar_value), 
      std::numeric_limits<char>::min()); 

由於存在另一個建議的使用基本上是C的方法建議:

  • 採用memset()僅限於類型沒有任何C++的特徵(如,着實爲char的情況下)當將值設置爲0以外的值時,它幾乎侷限於char(是的,我意識到有些情況下它仍然可以工作)。 std::fill()另一方面,可以使用任何類型的CopyAssignable和任何賦予相應類型的對象的值。
  • 儘管在這種情況下sizeof()的使用起作用,但在大小變爲動態時編譯器仍然樂於接受代碼時,它將不起作用。獲取指針的std::begin()std::end()將失敗。
  • 在類型不完全知道的情況下,例如,當它是一個typedef或模板內時,std::numeric_limits<T>::min()有更好的工作機會。由於沒有定義min(),所以它仍然不適用於許多類型,但範圍更大。

所有這一切說,我只想用一個合適的類,而不是直接做初始化,即

std::vector<char> charchar_value(MAX_VARCHAR_LENGTH + 1, 
           std::numeric_limits<char>::min()); 

此動態分配的內存,雖然,即它並不完全等同。但是,除非有充分的理由否則,否則我會使用簡單的方法,只在必要時進行優化。

1

如果你只是想設置爲CHAR_MIN的第一個元素那麼這將是:

char charchar_value[MAX_VARCHAR_LENGTH + 1] = { CHAR_MIN }; 

如果你想初始化整個數組CHAR_MIN那麼這將是:

char charchar_value[MAX_VARCHAR_LENGTH + 1]; 

memset(charchar_value, CHAR_MIN, sizeof(charchar_value)); 
+2

Yikes! 'memset的()'?當然,你的意思是'std :: fill(std :: begin(charchar_value),std :: end(charchar_value),std :: numeric_limits);' – 2012-03-25 22:17:14

+3

請告訴我你的舌頭藏在你的臉頰?您可能不喜歡這種風格,但是使用memset,CHAR_MIN或sizeof()並不存在任何內在錯誤或不安全因素。有些人喜歡更爲簡潔的語法會看到你的「更現代」的交叉例子,並且對你的保羅也有同樣的厭惡。 – phonetagger 2012-03-26 00:16:33

+0

@phonetagger:不,我的意思是!如果可以採用更一般和安全的方法,爲什麼要教給任何人相當有限的方法(請參閱我的回答以供參考)。 – 2012-03-26 22:23:37

-1

確定最小值和最大值在C以下數據類型++:

g) char 
h) int 
i) float 
j) double