+ Ответить в теме
Показано с 1 по 6 из 6

Тема: Помогите найти ошибку! С

  1. #1
    Logrus is on a distinguished road
    Регистрация
    01.04.2018
    Сообщений
    2
    Вес репутации
    0

    Question Помогите найти ошибку! С

    Есть задача:
    Из элементов массива А из n элементов, стоящих на нечетных местах и расположенных правее минимального элемента данной последовательности, сформировать новый массив C. Для формирования массива С напишите функцию с использованием указателей.

    Не могу понять почему в нулевой эллемент массива попадает мусор, а не то что нужно... Помогите разобраться.
    Код cpp:
    1. void fillMas(int *, int);                  
    2. void printMas(int *, int);
    3. int *created_mas(int*, int, int*, int);
    4. void main() {
    5.     srand(time(NULL));
    6.     int size, size2 = 0, index_min = 0;
    7.     cin >> size;
    8.     int *arr = new int[size];
    9.     fillMas(arr, size);
    10.     printMas(arr, size);
    11.  
    12.     for (int i = 1; i < size; i++)
    13.         if (arr[index_min] > arr[i])
    14.             index_min = i;
    15.     for (int i = index_min + 1; i < size; i++)
    16.         if (i % 2 != 0)
    17.             size2++;
    18.     int *result_arr = new int[size2];
    19.     *result_arr = *created_mas(arr, size, result_arr, index_min);
    20.     printMas(result_arr, size2);
    21.  
    22.     delete[] arr;
    23.     delete[] result_arr;
    24.     arr = nullptr;
    25.     result_arr = nullptr;
    26. }
    27.  
    28. void fillMas(int *mas, int size) {
    29.     for (int i = 0; i < size; i++)
    30.         *(mas + i) = rand() % 90 + 10;
    31. }
    32. void printMas(int *mas, int size) {
    33.     for (int i = 0; i < size; i++)
    34.         cout << *mas++ << " ";
    35.     cout << endl;
    36. }
    37. int *created_mas(int* a, int size, int* b, int min) {
    38.     for (int i = min + 1; i < size; i++)
    39.         if (i % 2 != 0) {
    40.             *b++ = *(a + i);
    41.         }
    42.     return b;
    43. }
    Вывод такой:
    Без имени.jpg
    Последний раз редактировалось Romeo; 01.04.2018 в 22:51. Причина: [code=cpp][/code]

  2. По умолчанию

     
    Хотите избавиться от рекламы? Зарегистрируйтесь
  3. #2
    Moderator Куратор
    system architect
    Romeo is on a distinguished road Аватар для Romeo
    Регистрация
    02.03.2004
    Адрес
    Крым, Севастополь
    Возраст
    36
    Сообщений
    3,091
    Вес репутации
    21

    По умолчанию Re: Помогите найти ошибку! С

    А дебажить не пробовал? В два счёта ведь находится, что не так, если прошагать по коду.

    Убирай к чёрту возвращаемое значение created_mas, и тот ужас, который ты делаешь с этим возвращаемым значением в месте вызова упомянутой функции. Подозреваю, что это были попытки побороть непонятную ошибку.

    А сама ошибка крылась в невинной строке:
    Код cpp:
    1. *b++ = *(a + i);

    Правильно будет вот так:
    Код cpp:
    1. *(b++) = *(a + i);

    Надеюсь, объяснения почему это была ошибка и почему скобки нужны излишни.
    Последний раз редактировалось Romeo; 02.04.2018 в 00:08.
    Entites should not be multiplied beyond necessity @ William Occam
    ---
    Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
    ---
    Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.

  4. #3
    Logrus is on a distinguished road
    Регистрация
    01.04.2018
    Сообщений
    2
    Вес репутации
    0

    По умолчанию Re: Помогите найти ошибку! С

    Спасибо, огромное ! Долго голову ломал... Вот что значит нужно внимательно все читать)

  5. #4
    Moderator Куратор
    system architect
    Romeo is on a distinguished road Аватар для Romeo
    Регистрация
    02.03.2004
    Адрес
    Крым, Севастополь
    Возраст
    36
    Сообщений
    3,091
    Вес репутации
    21

    По умолчанию Re: Помогите найти ошибку! С

    Да тут не в чтении дело. Дебагер сразу показывает, в чём проблема. Учись отлаживаться.
    Entites should not be multiplied beyond necessity @ William Occam
    ---
    Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
    ---
    Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.

  6. #5
    programmer Skwoogey is on a distinguished road
    Регистрация
    11.01.2016
    Сообщений
    63
    Вес репутации
    3

    По умолчанию Re: Помогите найти ошибку! С

    Такой вопрос: у нас на современных системах int будет 4-8 байт. Почему надо делать, как выше указано, а не так:

    Код cpp:
    1. *(b) = *(a + i*sizeof(int));
    2. b+= sizeof(int);

    Это компилятор умный, что сам инкрементирует соответственно размеру переменной, или я что-то не понимаю? Если первое, то будет ли компилятор так делать только с базовыми типами или с любой единицой информации (Объекты классов)?

  7. #6
    Moderator Куратор
    system architect
    Absurd is on a distinguished road
    Регистрация
    26.02.2004
    Адрес
    Pietari, Venäjä
    Возраст
    38
    Сообщений
    1,213
    Вес репутации
    17

    По умолчанию Re: Помогите найти ошибку! С

    Цитата Сообщение от Skwoogey Посмотреть сообщение
    Такой вопрос: у нас на современных системах int будет 4-8 байт. Почему надо делать, как выше указано, а не так:

    Код cpp:
    1. *(b) = *(a + i*sizeof(int));
    2. b+= sizeof(int);

    Это компилятор умный, что сам инкрементирует соответственно размеру переменной, или я что-то не понимаю? Если первое, то будет ли компилятор так делать только с базовыми типами или с любой единицой информации (Объекты классов)?
    Указатели инкрементируются и декрементируются не на один байт, а на размер типа на который они указывают. Соответственно, void* инкрементировать нельзя. По второму вопросу - да, это работает со всеми типами, в т.ч c инстансами шаблонов.
    2B OR NOT(2B) = FF

+ Ответить в теме

Похожие темы

  1. Чат на С++. Помогите найти ошибку
    Мне нужно написать чат, в Visual Studio 2008 на C++ В общем по порядку: Пишу сервер Создала проект MFC AppWizard(exe) добавила несколько...
    от Merzaffkia в разделе C и C++
  2. Помогите найти ошибку
    Хотел написать скрипт для вычисления площади треугольника по формуле Герона но скрипт не работает(нажимаю на клавиши и ничего не происходит)....
    от bead900 в разделе JScript, VBScript, DHTML...
  3. ПОМОГИТЕ НАЙТИ ОШИБКУ
    Задача : Заданы две матрицы А и Б порядка 3*3. Проверить будет ли произведение этих матриц коммутативным т.э. АБ=БА. Если Да - напечатать "АБ=БА",...
    от Trill в разделе Delphi и Pascal
  4. Помогите найти ошибку
    Это та старая задача, про Transform. Но это не важно, главное то, что программа не правильно находит максимальное и минимальное значения. (или я не...
    от Колядин Максим в разделе Delphi и Pascal
  5. помогите найти ошибку
    Когда я ввожу N от 1 и приблизительно до 150, далее либо прога вылетает, либо вместе с вылетом выдаёт ошибку: "Процессор обнаружил недопустимую...
    от Тузякин в разделе Delphi и Pascal

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения