Форум программистов, компьютерный форум CyberForum.ru

Найти ошибку в функции - C++

Восстановить пароль Регистрация
 
sword7i
3 / 3 / 0
Регистрация: 25.09.2012
Сообщений: 92
22.11.2012, 00:29     Найти ошибку в функции #1
Само задание: Дан массив из М целых чисел. Если в массиве есть хотя бы одно простое число, сформировать новый массив, поместив в него из исходного массива только простые числа.
Необходимо реализовать с динамическим выделением памяти.

Программа работает правильно, но только ОДИН РАЗ! (чтобы заработало снова нужно перезапустить Visual Studio). Когда ввожу новые значения массива прога ругается и пишет о какой-то ячейки памяти. Помогите найти ошибку. Вот код:
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
using namespace std;
int* vvod(int n);
void vivod(int* mas,int& k);
int* obrabotka(int* mas,int n,int& k);
void main()
{   
    setlocale (LC_ALL, "Russian");
    char ans;
    do
    {
        int n,k=-2;
        cout<<"Введите количество элементов массива: ";
        cin>>n;
        cout<<endl;
        int* mas=vvod(n);
        int* masNew;
        cout<<endl<<endl<<"Исходный массив: "<<endl;
        vivod(mas,n);
            if (obrabotka(mas,n,k))
            {
                masNew=obrabotka(mas,n,k);
                cout<<endl<<endl<<"Новый массив из простых чисел: "<<endl;
                vivod(masNew,k);
                delete [] masNew;
                delete [] mas;
            }
            else
            {
                cout<<endl<<endl<<"Простых чисел среди элементов массива нет! Новый массив не будет создан!";
                delete [] mas;
            }
        cout<<endl<<endl<<endl<<"Повторить? (y/n): ";
        cin>>ans;
        cout<<endl<<endl;
    }
    while (ans=='y');
}
fun.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
bool isprost(int* mas,int j)
{
    for (int i=2;i*i<=mas[j];i++)
    {
        if (mas[j]%i==0)
        return 0;
    }
    return 1;
}
int* obrabotka(int* mas,int n,int& k)
{
    int prost=0;
        for (int j=0;j<n;j++)
        prost=prost+isprost(mas,j);
    if (prost)
    {
        int* masNew=new int[prost];
        for (int i=0;i<n;i++)
        {
            if (isprost(mas,i))
            {
                masNew[k]=mas[i];
                k++;
            }
        }
        return masNew;
    }
    else
        return 0;
}
vvodvivod.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;
int* vvod(int n)
{
    int* mas;
    mas=new int[n];
    for (int i=0;i<n;i++)
    {
        cout<<"Введите "<<i+1<<"-й элемент массива: ";
        cin>>mas[i];
    }
    return mas;
}
void vivod(int* masNew,int& k)
{
    for (int i=0;i<k;i++)
    {
        cout<<endl<<i+1<<"-й элемент: "<<masNew[i];
    }
}
Добавлено через 39 минут
Так и не разобрался. Видимо память не очищается после выполнения функции, хотя я использовал delete []
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.11.2012, 00:29     Найти ошибку в функции
Посмотрите здесь:

C++ Найти ошибку в функции
Найти ошибку в вызове функции. C++
C++ Программа вычисляющая значение функции. не могу найти ошибку
C++ Найти ошибку (Вычисление функции с помощью разложения в ряд)
C++ Найти ошибку в перегруженной функции
Функции (найти ошибку в коде) C++
Помогите найти ошибку в функции сортировки выбором C++
Указатели на функции, найти ошибку в коде C++
Не могу найти ошибку в функции C++
C++ Не могу найти ошибку в функции перевода строк в 16-ричную СС
C++ Помогите найти ошибку в программе вычисления значения функции
C++ Найти ошибку в коде функции поиска

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
12279 / 6966 / 784
Регистрация: 27.09.2012
Сообщений: 17,277
Записей в блоге: 2
Завершенные тесты: 1
22.11.2012, 00:37     Найти ошибку в функции #2
Во-первых, у Вас утечка памяти тут:
C++
1
2
3
            if (obrabotka(mas,n,k))
            {
                masNew=obrabotka(mas,n,k);
Во-вторых, k=-2 и при вызове функции обработки у Вас получается
C++
1
masNew[-2]=mas[i];
В-третьих, буфера наружу выдавать не хорошо.
sword7i
3 / 3 / 0
Регистрация: 25.09.2012
Сообщений: 92
22.11.2012, 01:05  [ТС]     Найти ошибку в функции #3
Croessmah, спасибо исправил. А про буфера можно поподробнее?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
12279 / 6966 / 784
Регистрация: 27.09.2012
Сообщений: 17,277
Записей в блоге: 2
Завершенные тесты: 1
22.11.2012, 01:12     Найти ошибку в функции #4
Цитата Сообщение от sword7i Посмотреть сообщение
А про буфера можно поподробнее?
В том смысле, что забота о удалении памяти должна быть на той же функции, которая эту память выделяет, ну если, конечно, же нет весомых причин выдавать указатель на эту память.
Yandex
Объявления
22.11.2012, 01:12     Найти ошибку в функции
Ответ Создать тему
Опции темы

Текущее время: 15:31. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru