0

我是 C++ 新手,非常感谢您对以下问题的帮助:

我通过以下方式为 N 行和两列的 2d int 数组动态分配了空间:

int **input;   
input = new int *[N];     
for (int count = 0; count < N; count++)   
      input[count] = new int[2];

当我在我“填充”数组的while循环中打印其内容时,实际内容被打印:

while (!myfileafter.eof())
{
     int temp1,temp2;    
     int i=0; 
     int j=0;

     myfileafter >> temp1>>temp2;  

     input[i][j]=temp1;      
     input [i][j+1] = temp2;

     i++;
     j=0;

     cout<<input[i-1][j]<<" "<<input[i-1][j+1]<<endl;
}
     // for (int p=0;p<N;p++)
     // cout<<input[p][0]<<" "<<input[p][1]<<endl;

但是,如果我在 while 循环之后使用两个注释掉的行,则数组似乎包含与之前打印的正确内容完全不同的内容,这是程序其余部分出现许多问题的原因。知道如何解决吗?

4

4 回答 4

0

好的,这里还有其他答案可以具体解释您的代码有什么问题,但我还将添加一些其他信息,说明您如何处理数组分配本身。

通常来说,一个数组(除非它是一些 STL 或其他智能/类数组)是一块连续的内存。然后一个额外的数组指向它。换句话说,对于 foo[X][Y],您首先创建 foo[X] 然后在事后单独添加 [Y] 组件,而不是创建一个连续的 [X*Y] 内存然后让每个foo[X] 元素指向每个 [Y] 的第一个元素。从视觉上看,你正在这样做:

foo -|
     |
     |
     | [...]

然后每个 int 单独喜欢

foo -| -- _
         |_
     | -- _
         |_
     | -- _
         |_
     | [...]

当您应该将整个 int 块分配为一个整体时,因为 1)如果您执行大量这样的小分配,它往往会降低性能(我认为在这里对您来说并不重要)和 b)指针算术实际上会如果正确创建了数组,则可以工作。

假设您有以下块: foo是一个从 ADDRESS_X 开始的数组,int*长度为 4 个元素。对于您的示例,您总共需要 4 个元素 * 2 列 = 8int秒。因此,您创建了一个连续的 8int长数组,该数组从ADDRESS_Y. 然后你会想要这样做(这里是伪代码):

int **foo = new int *[SIZE_OF_X]; // an array of 4 pointers
int *bar = new int[SIZE_OF_X * NUMBER_OF_COLUMNS]; // in other words, 8 ints

for (i = 0; i < SIZE_OF_X; i++) {
    foo[i] = &bar + (i * SIZE_OF_X);
}

酒吧在哪里:

    ADDRESS_Y + 0: 10
    ADDRESS_Y + 1: 20
    ADDRESS_Y + 2: 30
    ...

而 foo 是:

    ADDRESS_X + 0: ADDRESS_Y
    ADDRESS_X + 1: ADDRESS_Y + 2
    ...

所以 foo[1][0] == 30。

于 2013-11-04T22:12:25.340 回答
0

文件的内容似乎与数组的长度不匹配。

尝试这个:

int temp1,temp2;
int i=0; 
int j=0;
while ( i < N && myfileafter >> temp1>> temp2 )
{    

  input[i][j]=temp1;      
  input[i][j+1] = temp2;
  i++;
  j=0;
  cout<<input[i-1][j]<<" "<<input[i-1][j+1]<<endl;
}
// Note the termination condition. It is uncertain whether all N locations have been filled.
for (int p=0;p<i;p++) 
  cout<<input[p][0]<<" "<<input[p][1]<<endl;

编辑:我建议您不要使用 2D Nx2 阵列,而是使用 2 个 1D 阵列来避免可能的错误和代码清晰。或者更好的是,使用两个一维向量。

使用指针,您必须注意删除分配的内存。

于 2013-11-04T17:42:46.810 回答
0

在循环开始时,您将 i 设置为零,因此您总是在读取 input[0]。

最好使用实际读数作为条件:

int i = 0;
while ( my_file_after >> input[i][0] >> input[i][1] ) ++i;
于 2013-11-04T17:56:23.197 回答
0

我建议的第一件事是更一致地练习格式化代码。有一些公认的约定可以使您的代码更具可读性。只改变格式,我推荐这样的东西:

while (!myfileafter.eof())
{
    int temp1,temp2;    
    int i=0; 
    int j=0;

    myfileafter >> temp1 >> temp2;      
    input[i][j] = temp1;      
    input [i][j+1] = temp2;
    i++;
    j=0;

    cout << input[i-1][j] << " " << input[i-1][j+1] << endl;
}
//for (int p=0; p < N; p++)
//{
//    cout << input[p][0] << " " << input[p][1] << endl;
//}

我敢肯定,您也有可能正确格式化它,但当您在此处输入时它只是搞砸了,但正确的格式化可以让世界变得不同。

继续……啊!Carl 打败了我:你每次都在覆盖 input[0] 。

我唯一要补充的是循环中的 cout 有点欺骗性,因为它会打印出您期望的内容,但它会从 input[0][0] 和 input[0][1] 中打印出来时间。

于 2013-11-04T18:01:45.990 回答