2011-09-20 18 views
5

Tengo una matriz unidimensional de 49 espacios declarada como int boardArray [49]; y también tengo una matriz bidimensional de 7x7 declarada como int boardArrayTwo [7][7]' Estoy tratando de usar ciclos anidados para lanzar la matriz unidimensional a el conjunto de dos dimensiones aquí es el código que estoy usando para probarlo.Convertir un Arrary de una dimensión en dos dimensiones en C++

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

    } 
} 

He intentado ejecutar esto pero no pasa nada. ¿Lo estoy haciendo mal?

+1

Los bucles encabezada por el de (int n = 0; n> = 49; ++ n) y para (int x = 0; x> = 7; ++ x) se ejecutarán exactamente 0 veces. Es por eso que nada sucederá. –

Respuesta

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

esto está mal. x y k debe ser < 7 (y el tercer ciclo no debe utilizarse):

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

EDIT:

como @Fabio Ceconello me hace noto en su comentario, incluso el primer bucle está mal porque de la condición controles invertidos, debe ser modificado de esta manera:

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

No solo eso, todos los condicionales en los bucles tienen lógica invertida. –

+0

@Fabio ¿Qué quieres decir? – Ziggy

+0

¿Qué pasa? No estoy entendiendo las objeciones. Podrían ambos aclararme? – Heisenbug

4

Has utilizado i > 50 en tu bucle for. Debe ser i < 49 y lo mismo para todos los otros bucles.

Además, esto no funcionará. Estás configurar todos los valores a boardArrayTwo[][]boardArray[49] su lugar, debe hacer algo como esto:

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

o

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

Ah, a la derecha. Editado – quasiverse

0

Nota

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

si i se inicializa a 0, no será mayor que 50 y, por lo tanto, nunca ingresará al ciclo.

0

En cada uno de los bucles que utilizó igual o mayor que (>) para en lugar de menos de (<) o igual a. También debe observar que, como señala Fabio arriba, el tercer bucle anidado establece boardArrayTwo[x][k] en 0-49 una y otra vez, 49 veces. Tendrá que usar aritmética para manipular x y k para que sean un índice en boardArray, y luego asigne ese índice al boardArrayTwo[x][k].

También es importante que esté usando 0..7 inclusive, que en realidad son 8 posiciones. Su matriz solo tiene una longitud de 7, por lo que está terminando con algunos valores de basura allí.

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

} 

Con un poco de suerte (a menos que me avergüence) esto debería hacer el truco!

EDIT: gracias especiales a Fabio!

+0

No va a funcionar bien. Incluso con operadores revertidos, sigue configurando todos los valores 'boardArrayTwo [x] [k]' en boardArray [49]. – quasiverse

5

Además de la lógica invertida en los bucles (que los otros mencionaron), no hay necesidad del tercer bucle interno. Sólo hay que poner la atribución en el segundo bucle interno:

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

EDIT: También debería mencionar que todas estas literales no son buenas prácticas, y añaden uno más (7) anterior.Me reescribir el código de la siguiente manera:

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

advertencia: si los arreglos no se declaran aquí (se hicieron pasar como parámetros), arrlen() no funcionará. Pero esa es otra larga historia ...

+0

¡Me di cuenta de eso! – Ziggy

+0

+1: respuesta correcta y sintética – Heisenbug

+0

Oye, pero también está la cuestión de que 0 <= 7 le da 8 valores. ¡Eso es demasiado para sus pequeñas y diminutas matrices! – Ziggy

1

En primer lugar, el segundo término en el ciclo for dice que el bucle for se ejecutará mientras que esa condición sea verdadera. Por lo tanto, debe usar < en lugar de >= para todos sus bucles.

En segundo lugar, el ciclo sobre n es adicional y no debería estar allí. Lo que necesita es pasar por x y k, luego copie el elemento correspondiente de boardArray a boardArrayTwo.

Usted podría hacer uno de estos:

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

o utilizar una fórmula para calcular el correcto n:

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

escribí x*7+k porque parece que x está interactuando sobre las filas de la matriz, cada fila que tiene 7 elementos, dice que x*7+k th elemento de la placaArray representa la posición [x][k] de boardArrayTwo/

+0

Esta es la respuesta. – Ziggy

5

Parece que su matriz de destino está ordenada por filas. Podrías disparar la matriz fuente directamente en su lugar.

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

o si prefiere algo en C más idiomática ++:

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

+1 porque me enseñaste algo – Ziggy

+0

Odio los moldes. ¿Qué tal 'std :: copy (& boardArray [0], & boardArray [49], & boardArrayTwo [0] [0]);' –

+0

@Rob, eso también funciona. No me importa mucho el nuevo C++. Se destacan en el código para que pueda encontrarlos y le dan al compilador la oportunidad de detectar algún uso indebido. – Blastfurnace

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

lado de otros errores, tercer bucle es hacer que su código incorrecto

Cuestiones relacionadas