2014-11-04 2 views
-1
//Variable Description 
int H,W; 
int map[H][W]; 


//Input 
cin>>W>>H; 

for(int i=0; i<H; i++) 
{ 
    for (int j=0; j<W; j++) 
    { 
     cin>>map[i][j]; 
    } 

} 

cout<<endl; 
//Print 
for(int i=0; i<H; i++) 
{ 
    for (int j=0; j<W; j++) 
    { 
     cout<<map[i][j]; 
    } 

} 
cout<<endl; 
return 0; 

`2D массив C++ (ввод и печать)

Мой вывод:

3 3 
1 2 3 
4 5 6 
7 8 9 

789789789 

Почему я не получаю все номера в моем выходе? Почему только последняя строка?

ответ

1

Вы инициализируете размеры массива после объявления его !!!

Вы не можете использовать массивы переменной длины в C++. Прочитайте this ответ для получения дополнительной информации.

так, вы должны использовать std::vector, как это:

#include <iostream> 
#include <vector> 

using namespace std; 

int main() { 
    int H, W; 
    cin >> W >> H; 
    std::vector< std::vector<int> > map; 
    map.resize(H); // H rows 
    for(int i = 0; i < H; ++i) 
    map[i].resize(W); // in every row, create W columns 
    // thus this is equivalent to a HxD array 

    for (int i = 0; i < H; i++) { 
    for (int j = 0; j < W; j++) { 
     cin >> map[i][j]; 
    } 

    } 

    cout << endl; 
    //Print 
    for (int i = 0; i < H; i++) { 
    for (int j = 0; j < W; j++) { 
     cout << map[i][j] << " "; 
    } 

    } 
    cout << endl; 
    return 0; 
} 

Вы можете сделать это с массивом, но вы должны использовать динамическое выделение памяти, которое требует, чтобы отменить выделение памяти, когда вы сделано. Вот как это должно пойти:

#include <iostream> 
#include <vector> 

using namespace std; 

int main() { 
    int H, W; 
    cin >> H >> W; 

    int** map = new int*[H]; 
    for(int i = 0; i < H; ++i) 
    map[i] = new int[W]; 

    for (int i = 0; i < H; i++) { 
    for (int j = 0; j < W; j++) { 
     cin >> map[i][j]; 
    } 

    } 

    cout << endl; 
    //Print 
    for (int i = 0; i < H; i++) { 
    for (int j = 0; j < W; j++) { 
     cout << map[i][j] << " "; 
    } 

    } 
    cout << endl; 


    // DON'T FORGET TO FREE 
    for(int i = 0; i < H; ++i) { 
    delete [] map[i]; 
    } 
    delete [] map; 
    return 0; 
} 
+0

Я хочу, чтобы пользователь вводил размер массива, а затем вводил массив, а затем печатал – coolest111

+0

@ coolest111, обновленный, разве это не то, что вы хотите? – gsamaras

+0

спасибо, что это сработало .... ok нашел мою ошибку ... инициализирован до ввода переменных H, K – coolest111

1

Ваше заявление int map[H][W]; намерен очистить достаточно места для хранения всех цифр. Но он не знает, сколько места еще (W и H не определены в точке, где вы объявляете map). Таким образом, он очистит некоторое случайное (возможно, нулевое, возможно, смехотворное) количество пространства, в зависимости от того, что содержат слоты памяти, занятые H и W. Чтобы динамически распределять память, вам нужно будет это сделать (a) после H и W известны и (b) с использованием ключевого слова new (посмотрите его с помощью поискового термина, такого как «распределение динамической памяти в C++», и пока вы там, узнайте, почему это важно и для delete [] map, когда вы закончили с ним).

+0

Единственный способ избежать динамического выделения - объявить массив, который ** известен ** a-priori, по крайней мере такой же большой, сколько потребуется, а затем проверить, что вход пользователя для H и W не превышает этого , (На самом деле, вам нужно будет проверить работоспособность H и W в любом случае.) – jez

+0

Jez вы были правы, извините! Возьмите мой +1 как извинение (и потому, что вы были правы). :) – gsamaras

+0

Err, хорошо, чтобы не начать странную войну с реверсивным пламенем, но я думал, что вы были правы. Сначала я * думал, что вы ошибаетесь, потому что я думал, что вы не можете инициализировать массив статически от непостоянного H и W. Но потом, заинтригованный, я попытался скомпилировать ваш пример в g ++ (Apple LLVM v. 6.0), и оказалось работать. Таким образом, вы были правы. (Но: это может быть функция *, который * C++ стандарт вы следуете --- C++ 98 или C++ 11. Это, конечно, не будет работать на простом C.) :) – jez

Смежные вопросы