2015-05-29 30 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

我明白了,它仍然是如此的不起作用?在调试时,在第二次我去到这个删除[]程序崩溃。 –