Не читается первая строка массива и выдает ошибку 139

При вводе массива 2x2 цикл проверяет только нижнюю строку.
Пример ввода:

Input n, m:
2 2
Input a[2][2]:
1 2 
3 4
Choose a number:
1
There is no such element

А при вводе массива 3x3 программа заканчивается досрочно с ошибкой code 139.

Input n, m:
3 3
Input a[3][3]:
1 2 3
4 5 6
7 8 9

Вот программа:

#include <iostream>
#include <conio.h>
using namespace std;

int main() {
    int n, m, i, j, b, k;
    float a[n][m];

    cout << "Input n, m:\n";
    cin >> n >> m;
    cout << "Input a[" << n << "][" << m << "]:\n";

    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            cin >> a[i][j];
        }
    }
    cout << "Choose a number:\n";
    cin >> b;

    k = -1;
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            if (a[i][j] == b) {
                k = j;
                break;
            }
        }
    }
    if (k >= 0)
        cout << "Number of a column with a number: " << j << "\n";
    else
        cout << "There is no such element" << endl;
    getch();
}

Ответы (1 шт):

Автор решения: Vladimir Ignatenko

У вас явное непомнимание как работает программа.

int n, m, i, j, b, k;
float a[n][m];

В этом блоке объявляются переменные. Но при этом они не иницализируются. Т.е. в переменных n и m может быть любой мусор. Т.е. по сути может быть 0, а может и любое другое число.

А дальше вы на основании этих переменных определяете массив. Который так же может быть любого размера.

Когда дальше пользователь вводит значение переменных n и m то это не значит, что массив a становится именно такого размера. Для него в данном случае ничего не меняется.

А дальше вы пишите, по сути, непонятно куда. И непонятно откуда читаете данные. В общем-то очень странно, что у вас программа не падает еще на уровне записи значений в массив.

Что можно сделать, и как исправить программу:

  1. Путь правильный, но возможно будет не очень простой для начинащего. Не объявлять массив в начале программы, а объявить указатель. И потом после ввода значений n и m выделять нужное количество памяти и работать с массивов по указателю. После завершения работы не забыть очистить память.

  2. Путь не очень правильный, но простой. Изначально объявить массив какого-то фиксированного размера. Например 10 на 10. float a[10][10]; Ограничить ввод значений n и m этой верхней границей. Т.е. меньше 10. Таким образом вы будете использовать выделенную память. Хоть и ее фрагмент.

И еще. В циклах у вас в обоих случаях указанно, что цикл до n

Хотя видимо имелось в виду, что должно быть

for (i=0; i<n; i++){
    for (j=0; j<m; j++){
→ Ссылка