[英]Assigned value is garbage or undefined logic error in XCode
我正在將iPhone應用程序更新為iOs4,我在代碼中遇到“未定義函數調用的傳遞參數”問題
for (i = 0; i < self.numberOfSegments; i++) {
[self setWidth:round(width[i]) forSegmentAtIndex:i];
}
公平地說,width [i]尚未初始化。 但是更新代碼(如下)會給我這個新錯誤,“分配的值是垃圾或未定義”。 仔細閱讀后,我認為segWidth保留其值作為垃圾-正確嗎?如果可以,我如何清除它?
for (i = 0; i < self.numberOfSegments; i++) {
float segWidth = (float)width[i];
[self setWidth:round(segWidth) forSegmentAtIndex:i];
}
-------------編輯------------------
謝謝你們的答復。 更多信息如下;
該方法的通用版本顯示為someFunction。 我已經刪除了丑陋的演員表,但仍然看到“ segWidth = width[i];
”行出現“分配的值是垃圾或未定義”邏輯錯誤segWidth = width[i];
我同意它的值width [i]似乎沒有明確的初始化,我不確定這是否是我對基本的Obj-c浮點類型缺乏理解,或者我的賦值語法是否存在邏輯缺陷?
- (void)someFunction
{
unsigned int n = self.numberOfSegments;
float width[n];
for (i = 0; i < n; i++) {
width[i] = someFloatValue;
}
...
for (i = 0; i < self.numberOfSegments; i++) {
float segWidth = 0.0;
segWidth = width[i];
[self setWidth:round(segWidth) forSegmentAtIndex:i];
}
}
setWidth的定義是:
- (void)setWidth:(CGFloat)width forSegmentAtIndex:(NSUInteger)segment; // set to 0.0 width to autosize. default is 0.0
我假設您正在打電話:
- (void)setWidth:(CGFloat)width forSegmentAtIndex:(NSUInteger)segment
而且在執行“構建和分析”時,函數調用中的傳遞參數未定義實際上是LLVM靜態分析器錯誤。 (兩個非常重要的數據點-准確地傳遞您正在做的事情以及准確地傳遞輸出是很有幫助的)。
而且您說width[i]
尚未初始化。
您添加float segWidth = (float)width[i]
的方法將導致分析器抱怨**分配的值是垃圾或未定義**。 您實際上尚未將width[i]
設置為任何值。 不過,我建議針對靜態分析器提交一個錯誤,因為該第一條錯誤消息確實非常隱晦。
正如約書亞所說,那位演員真的也很奇怪。 通常,在Objective-C中,您應該很少需要使用類型轉換,而幾乎不要在標量類型上使用它。
考慮兩個循環計數:
for (i = 0; i < n; i++) {
...
}
for (i = 0; i < self.numberOfSegments; i++) {
...
}
靜態分析器不知道n == self.numberOfSegments
,因此必須假定第二個循環的循環時間可能比第一個循環的時間長。 現在,您可能會說:“但是我在上面分配了n = self.numberOfSegments
嗎?!”
您確實做了,但是該值可能在第一次調用和第二次調用之間發生了變化,因此,分析器已正確識別出您可能正在使用未初始化的值。
(實際上,應該說您可能會耗盡數組的末尾,因為這是真正的風險)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.