Важная информация
Показано с 1 по 3 из 3

Тема: Ошибки при вводе массива

  1. #1 Ошибки при вводе массива 
    Новичок
    Регистрация
    12.03.2018
    Сообщений
    1
    Сказал(а) спасибо
    0
    Поблагодарили 1 раз в 1 сообщении
    вот собственно функция, которая не хочет вводить массив в память
    помогите конкретно по коду

    Код:


    C++ Code:
    1. int input(int *z, int **&arr, int *N, int *M) {
    2. *z = 1;
    3. char input_perem[256], button_key_ran;
    4. int k, i, j;
    5. cout << "1. С клавиатуры" << endl;
    6. cout << "2. Генератором случайных чисел" << endl;
    7. button_key_ran = '0';
    8. while (button_key_ran != '1' && button_key_ran != '2')
    9. {
    10. button_key_ran = _getch();
    11. }
    12. if (button_key_ran == '1') {
    13. while (N == 0) {
    14. k = 0;
    15. cout << "Введите кол-во вещественных строк квадратной матрицы (1>...>100): ";
    16. cin >> input_perem;
    17. for (i = 0; i < strlen(input_perem); i++) {
    18. if (input_perem[i] < '0' || input_perem[i] > '9') {
    19. k++;
    20. }
    21. }
    22. if (k == 0 && atoi(input_perem) < 100 && atoi(input_perem) > 1) {
    23. *N = atoi(input_perem);
    24. }
    25. }
    26. while (M == 0) {
    27. k = 0;
    28. cout << "Введите кол-во столбцов квадратной матрицы (1>...>100): ";
    29. cin >> input_perem;
    30. for (i = 0; i < strlen(input_perem); i++) {
    31. if (input_perem[i] < '0' || input_perem[i] > '9') {
    32. k++;
    33. }
    34. }
    35. if (k == 0 && atoi(input_perem) < 100 && atoi(input_perem) > 1) {
    36. *M = atoi(input_perem);
    37. }
    38. }
    39. cout << "Введите элементы массива" << endl;
    40. *arr = new int[*N];
    41. for (i = 0; i<*N; i++) {
    42. arr[i] = new int[*M];
    43. }
    44. //ввод с клавиатуры
    45. for (i = 0; i<*N; i++) {
    46. for (j = 0; j <*M; j++) {
    47. arr[i][j] = 0;
    48. while (arr[i][j] == 0) {
    49. k = 0;
    50. cout << "A[" << i + 1 << "][" << j + 1 << "]: ";
    51. cin >> input_perem;
    52. for (int x = 0; x < strlen(input_perem); x++) {
    53. if (x == 0 && input_perem[x] == '-') {
    54. k--;
    55. }
    56. if (input_perem[x] < '0' || input_perem[x] > '9') {
    57. k++;
    58. }
    59. }
    60. if (k == 0 && atoi(input_perem) < 2e3 && atoi(input_perem) > -2e3) {
    61. arr[i][j] = 1;
    62. }
    63. }
    64. arr[i][j] = atoi(input_perem);
    65. }
    66. }
    67. return **arr;
    68. }
    69. if (button_key_ran == '2') {
    70. //ввод рандомно
    71. while (N == 0) {
    72. k = 0;
    73. cout << "Введите кол-во вещественных строк квадратной матрицы (1>...>100): ";
    74. cin >> input_perem;
    75. for (i = 0; i < strlen(input_perem); i++) {
    76. if (input_perem[i] < '0' || input_perem[i] > '9') {
    77. k++;
    78. }
    79. }
    80. if (k == 0 && atoi(input_perem)<100 && atoi(input_perem)>1) {
    81. *N = atoi(input_perem);
    82. }
    83. }
    84. while (M == 0) {
    85. k = 0;
    86. cout << "Введите кол-во вещественных столбцов квадратной матрицы (1>...>100): ";
    87. cin >> input_perem;
    88. for (i = 0; i < strlen(input_perem); i++) {
    89. if (input_perem[i] < '0' || input_perem[i] > '9') {
    90. k++;
    91. }
    92. }
    93. if (k == 0 && atoi(input_perem)<100 && atoi(input_perem)>1) {
    94. *M = atoi(input_perem);
    95. }
    96. }
    97.  
    98. int** arr = new int *[*N];
    99. for (i = 0; i<*N; i++) {
    100. arr[i] = new int[*M];
    101. }
    102.  
    103. for (i = 0; i <*N; i++) {
    104. for (j = 0; j <*N; j++) {
    105. arr[i][j] = rnd(-100, 100);
    106. }
    107. }
    108. }
    109. return 0;
    110. }
    Ответить с цитированием  
     

  2. Пользователь сказал cпасибо:

    Free Admin (13.03.2018)

  3. #2  
    Профи Аватар для rrrFer
    Регистрация
    01.08.2013
    Сообщений
    493
    Сказал(а) спасибо
    26
    Поблагодарили 166 раз(а) в 118 сообщениях
    Что должна делать функция?
    [Ссылки могут видеть только зарегистрированные пользователи. ] // программирование на Prolog, Erlang, C++
    [Ссылки могут видеть только зарегистрированные пользователи. ]
    Ответить с цитированием  
     

  4. #3  
    Профи Аватар для rrrFer
    Регистрация
    01.08.2013
    Сообщений
    493
    Сказал(а) спасибо
    26
    Поблагодарили 166 раз(а) в 118 сообщениях
    Код весь неправильный (вне зависимости от того, что вы хотели тут изобразить). Откройте учебник какой-нибудь. Прочитайте про [Ссылки могут видеть только зарегистрированные пользователи. ].

    C++ Code:
    1. int input(int *z, int **&arr, int *N, int *M) {


    По такому описанию совершенно не понятно что передавать в функцию. Судя по тому, что вы используете ссылку - вы пишите на С++, а не на Си. Но с какой целью тогда передаете указатель, а не ссылку на N и M - не понятно. Если это что-то типа размеров матрицы, которую надо ввести - то юзер туда может передать NULL и надо быть готовым к этому. Что такое z - загадка. Что должна вернуть функция (int) - не понятно.

    C++ Code:
    1. *z = 1;

    Если вместо z передать NULL - то что случится?

    C++ Code:
    1. while (N == 0) {

    Это ведь NULL, а не (*N == 0).
    Если в функцию передан NULL, то корректно сработает это:
    C++ Code:
    1. *N = atoi(input_perem);

    Уже поэтому программа работает некорректно и непредсказуемо.

    Смотрим дальше:
    C++ Code:
    1. cout << "Введите кол-во столбцов квадратной матрицы (1>...>100): ";
    2. cin >> input_perem;
    3. for (i = 0; i < strlen(input_perem); i++) {
    4.    if (input_perem[i] < '0' || input_perem[i] > '9') {
    5.     k++;
    6.    }
    7. }


    Если тут пытались сделать "защиту от дурака" (чтобы корректно работало если юзер ввел не числа, а произвольную строку) - то это стоит вынести в отдельную функцию. Потому что у вас этот страшный кусок несколько раз встречается (как минимум 5 раз). Включая эти дикие проверки для отрицательных чисел. И не понятно почему "вещественны строк" - где тут float/double?

    k тут хранит количество "неправильных символов". Почему бы не хранить вместо количество флажок (bool)? - вы все равно дальше только с нулем сравниваете k.

    C++ Code:
    1. *arr = new int[*N];

    Это ошибка. Должно быть
    C++ Code:
    1. arr = new int[*N];

    *arr - вы разыменовываете указатель, но память то по мену вы еще не выделили...

    C++ Code:
    1. for (int x = 0; x < strlen(input_perem); x++) {
    2.    if (x == 0 && input_perem[x] == '-') {
    3.     k--;
    4.    }
    5.    if (input_perem[x] < '0' || input_perem[x] > '9') {
    6.     k++;
    7.    }
    8. }

    Ужасная логика. Замените k-- на continue хотя бы. Ну а лучше вообще вместо k++ делать
    C++ Code:
    1. k = true;
    2. break;


    C++ Code:
    1. return **arr;

    Функция вернет значение первого элемента массива. Странно это...

    C++ Code:
    1. if (button_key_ran == '2') {

    Вынести это в отдельную функцию.

    C++ Code:
    1. int** arr = new int *[*N];


    Еще более неправильный код.

    А вообще проблема в говнокоде. В нем хрен разберешься и ошибку тоже не найдешь. Вот у тебя всего 110 строк, но среди них 5 раз повторяется код ввода целого числа с защитой от дурака. Это примерно 10 строку у тебя. Дак получается, что ты половину кода занимаешься этим.

    Не понятно что делает функция, зачем аргумент z и что она возвращает. Не понятно зачем такая странная логика, что при вводе вручную я не могу туда внести нулевые элементы, а при заполнении случайным образом - могу.

    Неправильно выделяешь память. Неправильно работаешь с указателями и вообще непонятно зачем (ссылки же есть).
    [Ссылки могут видеть только зарегистрированные пользователи. ] // программирование на Prolog, Erlang, C++
    [Ссылки могут видеть только зарегистрированные пользователи. ]
    Ответить с цитированием  
     

  5. Пользователь сказал cпасибо:

    Free Admin (22.03.2018)

Информация о теме
Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. непонятна причина ошибки
    от belmondo в разделе Assembler
    Ответов: 0
    Последнее сообщение: 17.09.2017, 14:05
  2. Ошибки на форуме
    от Абадябер в разделе Архив
    Ответов: 77
    Последнее сообщение: 18.02.2016, 21:01
  3. JS Ошибки в компоненте WebBrowser
    от vb_coder в разделе Visual Basic
    Ответов: 0
    Последнее сообщение: 15.02.2014, 21:19
  4. На 2-х КД 2003 и 2008 оба ГК постоянные ошибки ДНС
    от Andrew Golubev в разделе Операционные системы
    Ответов: 0
    Последнее сообщение: 06.06.2013, 18:21
  5. Ошибки индексации
    от Konstantin Shcherba в разделе Индексация сайта
    Ответов: 0
    Последнее сообщение: 12.12.2012, 21:11
Ваши права
  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •