С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
st_dent
64 / 64 / 3
Регистрация: 05.07.2010
Сообщений: 219
#1

Динамический массив. - C++

12.10.2010, 01:03. Просмотров 1204. Ответов 7
Метки нет (Все метки)

Добрый день.
Есть такая задача.
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
//Задание 5. Создайте одномерный массив (размерность вычисляется в процессе
    //выполнения программы), заполните его значениями.
    //Напишите функцию, которая «убирает» из массива дубли. 
#include <iostream>
#include <tchar.h>
#include <ctime>
 
 
#define   stop __asm nop
 
using namespace std;
 
int NoDuplicates(int *&p,int &size)//функция убирающая дубли
{
    enum {dublicate,original};//для определения повторяющихся значений
    int count=0;    //счетчик для оригинальных значений
    int *flag=new int[size];//массив флагов дубль-не дубль
    flag[0]=original;//значение с которого начинаем-единственно
 
    //сравниваем текущее значение с предыдущими, соответсвенно заполняем массив
    for (int i=0;i<size;++i)
    {
        for (int j=0;j<i;++j)
        {
            if(p[i]==p[j])
            {   
                flag[i]=dublicate;
                break;
            }
            else flag[i]=original;
        }
    }
    //считаем кол-во оригинальных значений
    for (int i=0;i<size;++i)
    {if(flag[i]==original)++count;}
    
    //создаем массив по размерам и заполняем его
    int *tmp=new int(count);
    for (int i=0,j=0;i<size;++i,++j)
    {(flag[i]==original)?tmp[j]=p[i]:--j;}
    
    //освобождаем память
    delete[]p;
    delete[]flag;
    p=tmp;
    size=count;
    return 0;
}
int _tmain()
{
    srand((unsigned)time(0));
    int N;
    N=28;
    int*p5=new int [N];
    for(int i=0;i<N;++i)
    {p5[i]=rand()%3;}
    NoDuplicates(p5,N);
    delete[]p5;
stop
 
    return 0;
}//main
Но, на 59 строке выдает ошибку.
Почему не удается освободить память?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.10.2010, 01:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Динамический массив. (C++):

Можно ли в классе создавать массив переменной длинны. Например динамический массив? - C++
Динамические массивы привлекают больше. :)

Заполнить динамический массив из файла и записать массив обратно в файл - C++
Подскажите пожалуйста функцию которая будет заполнять Динамический массив из файла и обратную которая этот массив запишет в файл=)

динамический массив (Целое число разложить на массив простых множителей) - C++
Доброго времени суток всем. Целое число необходимо разложить на массив простых множителей. Столкнулся с проблемой, мне нужно, чтобы...

Написать функцию принимающую массив и возвращающую указатель на динамический массив - C++
Написать функцию принимающую массив и возвращающую указатель на динамический массив содержащий первые n нaибольших чисел. Как сделать...

Массив: передать динамический массив в функцию и записать в каждый элемент строку из файла - C++
задача: передать динамический массив в функцию, и записать в каждый элемент строку из файла. количество строк известно вот что у меня...

Как преобразовать массив в динамический? Массив вычисляет сумму элементов каждой диагонали матрицы - C++
Ошибка : Вызвано исключение по адресу 0x00BB2F4F в Проект6.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xFDFDFE05. #...

7
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
12.10.2010, 01:08 #2
C++
1
int *tmp=new int(count);
C++
1
int *tmp=new int[count];
C++
1
p=tmp;
После удаления. И на кой?
0
st_dent
64 / 64 / 3
Регистрация: 05.07.2010
Сообщений: 219
12.10.2010, 01:13  [ТС] #3
Цитата Сообщение от Lavroff Посмотреть сообщение
После удаления. И на кой?
Освободили память и перенаправили указатель на нужный массив.
Если я правильно понял вопрос
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
12.10.2010, 01:16 #4
st_dent, Понято.
0
st_dent
64 / 64 / 3
Регистрация: 05.07.2010
Сообщений: 219
12.10.2010, 10:23  [ТС] #5
Вот этот код ошибок не выдает.



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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
    //Задание 5. Создайте одномерный массив (размерность вычисляется в процессе
    //выполнения программы), заполните его значениями.
    //Напишите функцию, которая «убирает» из массива дубли. 
#include <iostream>
#include <tchar.h>
 
#define   stop __asm nop
 
void MyClearDuble(int*& p, int& n)
{
    int count = 0;
    bool* pb = new bool[n];
    for(int i = 0; i < n; i++)
    {
        pb[i] = false;
    }
    for(int i = 0; i < (n - 1); i++)
    {
        for(int j = i + 1; j < n; j++)
        {
            if(p[i] == p[j])
            {
                pb[j] = true;
            }
        }
    }
    for(int i = 0; i < n; i++)
    {
        if(pb[i])
        { 
            count++;
        }
    }
    int* tmp = new int[n - count];
    for(int i = 0, j = 0; i < n; i++)
    {
        if(!pb[i])
        {
            tmp[j] = p[i];
            j++;
        }
    }
    delete[] p;
    p = tmp;
    n -= count;
    delete[] pb;
}
int _tmain()
{
    int K;
    std::cout << "Input K:"; 
    std::cin >> K;
    
    int* pdin = new int[K];
    for(int i = 0; i < K; i++)
    {
        pdin[i] = rand()%10;
    }
    for(int i=0;i<K;++i)
    {std::cout<<pdin[i]<<" ";}
    MyClearDuble(pdin, K);
    std::cout << "\n"; 
    for(int i=0;i<K;++i)
    {std::cout<<pdin[i]<<" ";}
    delete[] pdin;
    pdin = 0;
    stop
 
 
    return 0;
}//main

Хотя, вроде, разницы почти нет.
Ребят, гляньте, откуда ошибка в первом посте берется(Ошибка runtime на строке 59 в tmain
C++
1
delete[]p5;
0
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
12.10.2010, 10:47 #6
Если 39 строку заменить на int *tmp=new int[count];, то вроде как всё работает.
1
st_dent
64 / 64 / 3
Регистрация: 05.07.2010
Сообщений: 219
12.10.2010, 10:52  [ТС] #7
Цитата Сообщение от silent_1991 Посмотреть сообщение
Если 39 строку заменить на int *tmp=new int[count];, то вроде как всё работает.
Спасибо!

Не по теме:


мдааа, спать надо больше...

0
silent_1991
12.10.2010, 10:53     Динамический массив.
  #8

Не по теме:

st_dent,
Я говорю себе это каждое утро... Только почему-то никогда себя не слушаю

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.10.2010, 10:53
Привет! Вот еще темы с ответами:

Создать динамический массив (Если чётных чисел больше, то массив должен быть укорочен на 2 элемента) - C++
Создать динамический массив из 8 случайных целых чисел из отрезка и вывести его на экран . Если в массиве чётных чисел оказалось...

Двумерный массив (поменять статический массив на динамический) - C++
Нужно поменять статический массив на динамический с выделением памяти #include &lt;iostream&gt; #include &lt;iomanip&gt; #include &lt;cstdlib&gt; ...

Массив и память. Как создать динамический массив? - C++
не могу исправить ошибки. И нужен динамический массив я что-то попробовала для его создания но ничего не вышло #include &quot;stdafx.h&quot; ...

Переделать динамический массив на статический массив - C++
#include &lt;iostream&gt; #include &lt;cstdlib&gt; using namespace std; int main() { int dim, counter_1 = 1, counter_2 =...


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

Или воспользуйтесь поиском по форуму:
8
12.10.2010, 10:53
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.