2011-09-20 38 views
5

Tôi có một mảng không gian một chiều 49 được khai báo là int boardArray [49]; và tôi cũng có mảng hai chiều 7x7 được khai báo là int boardArrayTwo [7][7]' Tôi đang cố gắng sử dụng lồng nhau cho các vòng để ném mảng một chiều vào mảng hai chiều ở đây là mã tôi đang sử dụng để kiểm tra nó.Chuyển đổi một chiều sang hai chiều trong 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; 
     } 

    } 
} 

Tôi đã thử chạy điều này nhưng không có gì xảy ra. Tôi có làm sai không?

+1

Các vòng do cho (int n = 0; n> = 49; ++ n) và cho (int x = 0; x> = 7; ++ x) sẽ chạy chính xác 0 lần. Đó là lý do tại sao không có gì xảy ra. –

Trả lời

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

điều này là sai. x và k nên < 7 (và chu kỳ thứ ba không nên được sử dụng):

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

EDIT:

như @Fabio Ceconello làm cho tôi thông báo trong comment của mình, ngay cả những vòng đầu tiên là sai vì của kiểm tra tình trạng đảo ngược, cần được sửa đổi theo cách này:

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

Không chỉ vậy, tất cả các điều kiện trong các vòng lặp có logic nghịch đảo. –

+0

@Fabio Ý bạn là gì? – Ziggy

+0

có vấn đề gì? Tôi không hiểu sự phản đối. cả hai bạn có thể làm rõ cho tôi không? – Heisenbug

4

Bạn đã sử dụng i > 50 trong vòng lặp for. Nó phải là i < 49 và giống với tất cả các vòng lặp khác.

Ngoài ra, tính năng này sẽ không hoạt động. Bạn đang thiết tất cả các boardArrayTwo[][] giá trị cho boardArray[49] thay vì bạn phải làm một cái gì đó như thế này:

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

hoặc

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, phải. Đã chỉnh sửa. – quasiverse

0

Note

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

nếu i được khởi tạo bằng 0, nó sẽ không lớn hơn 50 và do đó nó sẽ không bao giờ đi vào vòng lặp.

0

trong mỗi vòng của bạn, bạn sử dụng lớn hơn hoặc bằng (>) để chứ không phải ít hơn (<) hoặc bằng. Bạn cũng nên lưu ý rằng, như Fabio đã chỉ ra ở trên, vòng lặp lồng nhau thứ ba được thiết lập boardArrayTwo[x][k] thành 0-49 lặp đi lặp lại, 49 lần. Bạn sẽ cần phải sử dụng số học để thao tác x và k sao cho chúng sẽ là một chỉ mục trong boardArray, và sau đó gán chỉ mục đó cho boardArrayTwo[x][k].

Điều quan trọng là bạn đang sử dụng 0..7 bao gồm, đó thực sự là 8 vị trí. Mảng của bạn chỉ có chiều dài 7 nên bạn thực sự kết thúc với một số giá trị rác trong đó.

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

} 

Với bất kỳ may mắn nào (trừ khi bản thân tôi xấu hổ), điều này sẽ thực hiện thủ thuật!

CHỈNH SỬA: Đặc biệt cảm ơn Fabio!

+0

Nó sẽ không hoạt động tốt. Ngay cả với các toán tử đảo ngược, anh ta vẫn thiết lập tất cả các giá trị 'boardArrayTwo [x] [k]' cho boardArray [49]. – quasiverse

5

Ngoài logic nghịch đảo trong các vòng lặp (mà những người khác đã đề cập), không cần vòng lặp bên trong thứ ba. Chỉ cần đặt ghi trong vòng lặp bên thứ hai:

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

EDIT: Tôi cũng nên đề cập đến rằng tất cả những chữ không phải là thói quen tốt, và tôi đã thêm một người nữa (7) ở trên.Tôi muốn viết lại mã như sau:

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

báo trước: nếu mảng không được khai báo ở đây (được chuyển thành tham số), arrlen() sẽ không hoạt động. Nhưng đó là một câu chuyện dài khác ...

+0

Tôi vừa mới nhận thấy điều đó! – Ziggy

+0

+1: câu trả lời chính xác và tổng hợp – Heisenbug

+0

Hey nhưng cũng có vấn đề hơn 0 <= 7 cho anh ta 8 giá trị. Đó là quá nhiều cho các mảng nhỏ xíu của anh ấy! – Ziggy

1

Trước hết, thuật ngữ thứ hai trong vòng lặp for cho biết vòng lặp for sẽ chạy trong khi điều kiện đó là đúng. Vì vậy, bạn nên sử dụng < thay vì >= cho tất cả các vòng của bạn.

Thứ hai, vòng lặp trên n là phụ và không nên ở đó. Những gì bạn cần là xem qua xk, sau đó sao chép phần tử tương ứng từ boardArray đến boardArrayTwo.

Bạn có thể làm một trong những:

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

hoặc sử dụng một công thức để tính toán thích hợp n:

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

tôi đã viết x*7+k vì nó có vẻ như x được lặp lại trên các hàng của mảng, mỗi hàng có 7 phần tử, nói rằng yếu tố thứ x*7+k của boardArray đại diện cho vị trí [x][k] của boardArrayTwo/

+0

Đây là câu trả lời. – Ziggy

5

Dường như mảng đích của bạn nằm trong thứ tự hàng lớn. Bạn chỉ có thể blast mảng nguồn trực tiếp vào vị trí.

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

hoặc nếu bạn thích một cái gì đó trong nhiều thành ngữ C++:

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

+1 vì bạn đã dạy tôi điều gì đó! – Ziggy

+0

Tôi ghét phôi. Làm thế nào về 'std :: copy (& boardArray [0], & boardArray [49], & boardArrayTwo [0] [0]);' –

+0

@Rob, cũng vậy. Tôi không nhớ C++ mới quá nhiều. Chúng nổi bật trong mã để bạn có thể tìm thấy chúng và chúng cung cấp cho trình biên dịch một cơ hội để nắm bắt một số lạm dụng. – 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++;} 
     } 

bên cạnh các lỗi khác, vòng thứ ba là làm cho mã của bạn sai

Các vấn đề liên quan