Преобразование одномерного массива в двумерный в C ++ - PullRequest
5 голосов
/ 21 сентября 2011

У меня есть одномерный массив из 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 ]

6 голосов
/ 21 сентября 2011
for (int x = 0; x >= 7; ++x)
{
    for (int k = 0; k >= 7; ++k){
         for (int n = 0; n >= 49; ++n)
    {

это неправильно.x и k должны быть <7 (и третий цикл не должен использоваться): </p>

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
}
5 голосов
/ 21 сентября 2011

Похоже, что ваш целевой массив находится в главном порядке строк. Вы можете просто взорвать исходный массив прямо на место.

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

или если вы предпочитаете что-то более идиоматическое C ++:

std::copy(boardArray, boardArray + 49, reinterpret_cast<int*>(boardArrayTwo));
5 голосов
/ 21 сентября 2011

Помимо перевернутой логики в циклах (которые упоминали другие), нет необходимости в третьем внутреннем цикле.Просто поместите атрибуцию во второй внутренний цикл:

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

caveat: если массивы здесь не объявлены (были переданы как параметры), arrlen () не будет работать.Но это еще одна длинная история ...

4 голосов
/ 21 сентября 2011

Вы использовали 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++;
    }
}
1 голос
/ 21 сентября 2011

Во-первых, второе слагаемое в цикле for говорит о том, что цикл for будет выполняться, пока выполняется это условие.Таким образом, вы должны использовать < вместо >= для всех ваших циклов.

Во-вторых, цикл над n является дополнительным и не должен быть там.Вам нужно пройти через x и k, а затем скопировать соответствующий элемент из 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 элементов, говоритx*7+k элемент boardArray представляет позицию [x][k] boardArrayTwo /

0 голосов
/ 23 сентября 2013
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++;}
        }

помимо других ошибок, третий цикл делает ваш код неправильным

0 голосов
/ 21 сентября 2011

В каждом из ваших циклов вы использовали больше или равно (>), а не меньше (<) или равно.Вы также должны заметить, что, как указывает Фабио выше, третий вложенный цикл устанавливает <code>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;
    }
}

}

При любой удаче (если я не смущаюсь) это должно сработать!

РЕДАКТИРОВАТЬ: Отдельное спасибо Фабио!

0 голосов
/ 21 сентября 2011

Примечание

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

Если i инициализируется в 0, оно не будет больше 50 и, следовательно, никогда не войдет в цикл.

...