2015-05-29 32 views
-2

所以我試圖使用動態分配來增加我的數組中的單元格數量。如何使用動態分配增加數組中的單元格數量?

該數組是從我創建的包括x和y協調

工藝類型位置推移這種方式:

  1. 我創建相同的尺寸+ 1
  2. 的新的堆位置陣列
  3. 我使用for循環將所有以前的位置複製到新陣列中
  4. 刪除以前的指針
  5. 將前一個指針指向新的指針

我做錯了什麼?

這是代碼:

void ExtendLocArray(location** ilocPrevArray, int inNumberOfMovements) 
{ 
    // Variable definition 
    location* locNewPathArray = new location[inNumberOfMovements]; 
    int  nIndex; 

    // Code section 

    // Copies the previous locations 
    for (nIndex = inNumberOfMovements - 2; nIndex >= 0; nIndex--) 
    { 
     locNewPathArray[nIndex] = (*ilocPrevArray)[nIndex]; 
    } 

    delete[](*ilocPrevArray); 

    (*ilocPrevArray) = locNewPathArray; 
} 
+0

你爲什麼要反向循環?你爲什麼從inNumberOfMovements - 2開始,而不是inNumberOfMovements - 1? –

+0

當提問時,請說明在運行代碼時會發生什麼,以及與預期有什麼不同。像「這個代碼有什麼問題?」並不具有建設性。 –

+0

如果這不會讓你對'std :: vector v;'感到滿意,那麼這只是:'v.resize(inNumberOfMovements);',什麼都不會。 – WhozCraig

回答

0

正確的功能,可以看看下面的方式(前提是你要複製的數組的元素以相反的順序)

void ExtendLocArray(location** ilocPrevArray, size_t inNumberOfMovements) 
{ 
    // Variable definition 
    location* locNewPathArray = new location[inNumberOfMovements]; 

    // Copies the previous locations 
    for (size_t i = inNumberOfMovements - 1; i != 0; i--) 
    { 
     locNewPathArray[i-1] = (*ilocPrevArray)[i-1]; 
    } 

    delete [] *ilocPrevArray; 

    *ilocPrevArray = locNewPathArray; 
} 

你可以聲明像

void ExtendLocArray(location * &ilocPrevArray, size_t inNumberOfMovements); 

這就是你可以使用引用指針。

這是一個演示程序,我使用了typedef作爲程序可以編譯的名稱位置。

#include <iostream> 

// simplified definition of location 
typedef int location; 

void ExtendLocArray(location** ilocPrevArray, size_t inNumberOfMovements) 
{ 
    // Variable definition 
    location* locNewPathArray = new location[inNumberOfMovements]; 

    // Copies the previous locations 
    for (size_t i = inNumberOfMovements - 1; i != 0; i--) 
    { 
     locNewPathArray[i-1] = (*ilocPrevArray)[i-1]; 
    } 

    delete [] *ilocPrevArray; 

    *ilocPrevArray = locNewPathArray; 
} 

int main() 
{ 
    const size_t N = 10; 
    location *p = nullptr; 

    for (size_t i = 0; i < N; i++) 
    { 
     ExtendLocArray(&p, i + 1); 
     p[i] = i; 
    } 

    for (size_t i = 0; i < N; i++) std::cout << p[i] << ' '; 
    std::cout << std::endl; 

    delete [] p; 

    return 0; 
} 

程序輸出是

0 1 2 3 4 5 6 7 8 9 

要考慮到的,而不是自己編寫的循環中,您可以使用標準算法std::copy_backward在頭<algorithm>聲明。例如,

#include <algorithm> 

//... 
std::copy_backward(*ilocPrevArray, 
        *ilocPrevArray + inNumberOfMovements - 1, 
        locNewPathArray + inNumberOfMovements - 1);  
+0

基本上這是相同的代碼,不是嗎? –

+0

@Kesem David實際上是一樣的,但它更好。:)我更清楚 –

+0

我明白了,它仍然是如此的不起作用?在調試時,在第二次我去到這個刪除[]程序崩潰。 –