2015-04-07 89 views
-2

嘿,夥計們,所以我希望在一個順序訪問特定的索引在列C

int get_value_from_array(char* buffer, int byte1, int byte2) { 
    int i; 
    int *j; 
    j = malloc(sizeof(int)); 
    *j= 0; 

    for(i = 0; i < byte2 - byte1; i++) { 
     *j += (buffer[byte1+i] << (i*8));  
    } 

    return j; 
} 

我希望得到從點1一定的參考價值點2點1,從開始到訪問數組。每個都是8個字節,所以我移動了8個。然後我將它添加到j並用j返回。我得到這個數組的方法是使用mmap並讀取一些fat.dat文件。首先,我越來越狂野......我不明白。我通過將其值設置爲0並將值添加到j之後解除引用j

我也一直關注這個example。我不允許使用malloc來解決這個問題,但後來我更加困惑。我試圖使用這個沒有指針,但然後我會得到浮點異常。

你能幫我解決這個問題嗎?

==========編輯=====================
好吧,也許我的問題不夠清楚= [

int get_value_from_array(char* buffer, int byte1, int byte2) { 
    int i; 
    int j = 0; 

    for(i = 0; i < byte2 - byte1; i++) { 
     j += (buffer[byte1+i] << (i*8));   
    } 

    return j; 
} 

這是我第一次嘗試得到這個東西的工作,但我不斷得到浮點異常。我搜索了一些東西,發現另一種方法是將值轉換爲指針並取消它的取值。我做了一些嘗試,但效果並不好(或者至少返回最隨機的值+有時候是seg故障)。我希望這能澄清我想做的事情。

+0

目前尚不清楚你想要做什麼,而是'的malloc(的sizeof(int)的)'看起來並不像它足夠的空間。 –

+1

您能否提供緩衝區,字節1,字節2和預期j的樣本數據?另外,j是一個指向int的指針,你想要返回j的值嗎?對於這個問題,你爲什麼動態分配j? – dsolimano

+0

@iharob tbh我剛剛按照鏈接上的例子。 –

回答

3

這可能是你在追求什麼。

int get_value_from_array(char* buffer, int byte1, int byte2) 
{ 
    int j = 0; 
    assert(buffer != 0); 
    assert(byte1 >= 0 && byte2 >= byte1 && (size_t)(byte2 - byte1) < sizeof(int)); 

    for (int i = 0; i < byte2 - byte1; i++) 
     j += (unsigned char)buffer[byte1+i] << (i*8); 

    return j; 
} 

正如我的評論所指出的,你真的不希望分配int *j出於多種原因,包括「你是不是允許使用malloc()」和「當在你的問題誤用它泄漏內存」。


而且,老實說,在我看到您的問題更新之前,我寫了這段代碼! assert()(unsigned char)轉換是您的原始代碼和此代碼之間的唯一區別。我不確定你如何得到浮點異常。如果你除以零,你可以得到其中的一個,但是在你的代碼中沒有明顯的分割,更不用說被零除。

您應該回到原始代碼並在運行時打印所有信息。或者使用調試器來完成它。

int get_value_from_array(char* buffer, int byte1, int byte2) 
{ 
    int j = 0; 
    printf("-->> %s: %p (%d..%d)\n", __func__, buffer, byte1, byte2); 
    assert(buffer != 0); 
    assert(byte1 >= 0 && byte2 >= byte1 && (size_t)(byte2 - byte1) < sizeof(int)); 

    for (int i = 0; i < byte2 - byte1; i++) 
    { 
     printf("j0 = 0x%.8X, i = %d, byte = 0x%.2X, " 
       "add = 0x%.8X, j1 = 0x%.8X\n", 
       j, i, (unsigned char)buffer[byte1+i], 
       (unsigned char)buffer[byte1+i] << (i*8), 
       j + (unsigned char)buffer[byte1+i] << (i*8)); 
     j += (unsigned char)buffer[byte1+i] << (i*8); 
    } 

    printf("<<-- %s: 0x%.8X\n", __func__, j); 
    return j; 
} 

請注意,打印以換行符結束。在C99中,__func__是該函數的名稱;如果您有C89/C90,則省略,然後刪除%s —或用您的函數名稱替換%s(或用您的函數名稱替換爲__func__作爲字符串文字:"get_value_from_array")。

調試代碼寫在C89/C90:

int get_value_from_array(char* buffer, int byte1, int byte2) 
{ 
    static const char func[] = "get_value_from_array"; 
    int i; 
    int j = 0; 
    printf("-->> %s: %p (%d..%d)\n", func, buffer, byte1, byte2); 
    assert(buffer != 0); 
    assert(byte1 >= 0 && byte2 >= byte1 && (size_t)(byte2 - byte1) < sizeof(int)); 

    for (i = 0; i < byte2 - byte1; i++) 
    { 
     printf("j0 = 0x%.8X, i = %d, byte = 0x%.2X, " 
       "add = 0x%.8X, j1 = 0x%.8X\n", 
       j, i, (unsigned char)buffer[byte1+i], 
       (unsigned char)buffer[byte1+i] << (i*8), 
       j + (unsigned char)buffer[byte1+i] << (i*8)); 
     j += (unsigned char)buffer[byte1+i] << (i*8); 
    } 

    printf("<<-- %s: 0x%.8X\n", func, j); 
    return j; 
} 
+0

(循環初始聲明只允許在C99模式下) 這就是爲什麼我在int聲明之外的for循環。至於聲明,它不會識別該函數。而且我仍然得到了浮點異常,正如我在編輯問題中指出的那樣。 –

+0

好的;有時間得到更好的編譯器(支持15年前的標準甚至4年前的標準,而不是25年前的標準)。好;如果你堅持微軟給你的東西,我爲你感到抱歉。您也必須對調試代碼進行一些小的更改。或者指定C99模式('-std = c99',或者如果您使用的是GCC,則可以更好地使用'-std = c11',您可能會得到該消息;您應該學習現代C,而不是古老的東西)。如果你使用GCC或者clang,至少用'-Wall -Werror'編譯;最好加上'-Wextra'。 –

+0

我不允許改變我的編譯器= [這是你的[debug](http://i.imgur.com/Fiwqq4o.png)的輸出。 11和12分別保存00 02的十六進制值,但在你的調試j上仍然是0 = [。感謝您的時間! –