在C ++中将一维数组转换为二维数组

时间:2011-09-20 23:06:05

标签: c++ arrays int dimensional

我有一个49空间一维数组声明为int boardArray [49];我还有一个二维7x7数组声明为int boardArrayTwo [7][7]'我试图使用嵌套for循环将一维数组投入到这里的二维数组是我用来测试它的代码。

for (int i = 0; i > 50; ++i)
{
    boardArray[i] = i; //fills the array with ints 0 - 48 to test
}
for (int x = 0; x >= 7; ++x)
{
    for (int k = 0; k >= 7; ++k)
    {
        for (int n = 0; n >= 49; ++n)
        {
            boardArrayTwo[x][k] = boardArray[n];
            cout << boardArrayTwo[x][k] << " " << endl;
        }

    }
}

我尝试过这个,但没有任何反应。我做错了吗?

8 个答案:

答案 0 :(得分:6)

for (int x = 0; x >= 7; ++x)
{
    for (int k = 0; k >= 7; ++k){
         for (int n = 0; n >= 49; ++n)
    {
这是错的。 x和k应该是&lt; 7(不应使用第三个周期):

for (int x = 0; x < 7; ++x)
{
    for (int k = 0; k < 7; ++k){
        boardArrayTwo[x][k] = boardArray[7*x + k];

编辑:

像@Fabio一样Ceconello在他的评论中让我注意到,即使第一个循环是错误的,因为反转条件检查,它应该这样修改:

for (int i = 0; i < 49; ++i)
{
    boardArray[i] = i; //fills the array with ints 0 - 48 to test
}

答案 1 :(得分:5)

除了循环中的反转逻辑(其他人提到),不需要第三个内循环。只需将归因放在第二个内循环中:

boardArrayTwo[x][k] = boardArray[x * 7 + k];

编辑: 我还应该提到所有这些文字都不是好的做法,我在上面添加了一个(7)。我按如下方式重写代码:

#define arrlen(x) (sizeof(x)/sizeof((x)[0]))

for (int i = 0; i < arrlen(boardArray); ++i)
{
    boardArray[i] = i; 
}
int stride = arrlen(boardArrayTwo[0]);
for (int x = 0; x < arrlen(boardArrayTwo); ++x)
{
    for (int k = 0; k < stride; ++k)
    {
        boardArrayTwo[x][k] = boardArray[stride * x + k];
        cout << boardArrayTwo[x][k] << " " << endl;
    }
}

警告:如果未在此处声明数组(作为参数传递),则arrlen()将无法工作。但这是另一个长篇故事...

答案 2 :(得分:5)

您的目标数组看起来像行主要顺序。您可以将源阵列直接爆炸到位。

memcpy(boardArrayTwo, boardArray, 49 * sizeof(int));

或者如果你更喜欢更惯用的C ++中的东西:

std::copy(boardArray, boardArray + 49, reinterpret_cast<int*>(boardArrayTwo));

答案 3 :(得分:4)

您在for循环中使用了i > 50。对于所有其他循环,它应该是i < 49并且相同。

此外,这不起作用。您将所有boardArrayTwo[][]值设置为boardArray[49]您应该执行以下操作:

for (int x = 0; x < 7; ++x)
{
    for (int k = 0; k < 7; ++k)
    {
        boardArrayTwo[x][k] = boardArray[7*x + k];
        cout << boardArrayTwo[x][k] << " " << endl;
    }
}

int count = 0;

for (int x = 0; x < 7; ++x)
{
    for (int k = 0; k < 7; ++k)
    {
        boardArrayTwo[x][k] = boardArray[count];
        cout << boardArrayTwo[x][k] << " " << endl;
        count++;
    }
}

答案 4 :(得分:1)

首先,for循环中的第二个术语表示for循环将在该条件为真时运行。因此,对于所有循环,您应该使用<而不是>=

其次,n上的循环是额外的,不应该存在。您需要的是浏览xk,然后将相应的元素从boardArray复制到boardArrayTwo

您可以执行以下操作之一:

int n = 0;
for (int x = 0; x < 7; ++x)
    for (int k = 0; k < 7; ++k)
    {
        boardArrayTwo[x][k] = boardArray[n];
        ++n;
    }

或使用公式计算正确的n

for (int x = 0; x < 7; ++x)
    for (int k = 0; k < 7; ++k)
        boardArrayTwo[x][k] = boardArray[x*7+k];

我写了x*7+k,因为似乎x遍历数组的行,每行有7个元素,表示boardArray的x*7+k元素表示位置{{ 1}} of boardArrayTwo /

答案 5 :(得分:0)

请注意

for (int i = 0; i > 50; ++i)

如果i初始化为0,则不会大于50,因此它永远不会进入循环。

答案 6 :(得分:0)

在每个循环中,您使用大于或等于(&gt;)而不是小于(&lt;)或等于。您还应该注意到,正如Fabio指出的那样,第三个嵌套循环将boardArrayTwo[x][k]一遍又一遍地设置为0-49,共49次。您将需要使用算术来操作x和k,以便它们将成为boardArray的索引,然后将该索引分配给boardArrayTwo[x][k]

使用0..7(包括0和7)也很重要,实际上是8个位置。你的数组只有7长,所以你实际上最终得到了一些垃圾值。

#include <iostream>
using std::cout;
using std::endl;

int main () {

    int boardArray[49];
    int boardArrayTwo[7][7];

for (int i = 0; i < 50; ++i)
{
    boardArray[i] = i; //fills the array with ints 0 - 48 to test
}
for (int x = 0; x < 7; ++x)
{
    for (int k = 0; k < 7; ++k)
    {
            boardArrayTwo[x][k] = boardArray[x*7 + k];
            cout << boardArrayTwo[x][k] << " " << endl;
    }
}

}

运气好的话(除非我自己很尴尬),这应该可以解决问题!

编辑:特别感谢Fabio!

答案 7 :(得分:0)

for(int i=0; i<49; i++)
b[i]=(i+1);

int p=0;
for(int i=0;i<7;i++){
        for(int j=0;j<7;j++)
        {a[i][j]=b[p];
        p++;}
        }
  

除了其他错误,第三个循环使您的代码错误