簡體   English   中英

分配的值是XCode中的垃圾或未定義的邏輯錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM