5

我有一个 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;
        }

    }
}

我尝试运行它,但没有任何反应。我做错了吗?

4

8 回答 8

7
for (int x = 0; x >= 7; ++x)
{
    for (int k = 0; k >= 7; ++k){
         for (int n = 0; n >= 49; ++n)
    {

这是错误的。x 和 k 应 < 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
}
于 2011-09-20T23:08:39.360 回答
5

看起来您的目标数组是按行优先顺序排列的。您可以直接将源阵列爆破到位。

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

或者,如果您更喜欢更惯用的 C++ 语言:

std::copy(boardArray, boardArray + 49, reinterpret_cast<int*>(boardArrayTwo));
于 2011-09-20T23:20:04.247 回答
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() 将不起作用。但那是另一个长篇故事了……

于 2011-09-20T23:12:32.137 回答
4

i > 50在 for 循环中使用过。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++;
    }
}
于 2011-09-20T23:07:53.870 回答
1

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

其次,循环n是额外的,不应该存在。您需要的是通过xand k,然后将相应的元素从boardArrayto复制到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 个元素,表示x*7+kboardArray 的第一个元素代表[x][k]boardArrayTwo/的位置

于 2011-09-20T23:15:18.503 回答
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++;}
        }

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

于 2013-09-23T12:58:37.637 回答
0

笔记

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

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

于 2011-09-20T23:08:37.987 回答
0

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

使用 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;
    }
}

}

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

编辑:特别感谢法比奥!

于 2011-09-20T23:11:16.833 回答