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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.89
petrovich1
0 / 0 / 0
Регистрация: 22.09.2007
Сообщений: 314
#1

Массив булевых элементов по входящему значению - C++

11.11.2011, 01:28. Просмотров 2674. Ответов 17
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
void mufunc(int range)
{
      bool M[???range???];
 
      for(int i = 0; i < range; i++)
           M[i] = false;
}
Надо объявить массив (динамический?) таким образом,
что-бы можно было задавать его размер по входящему в функцию значению.
По стандару нельзя объявлять размер массива (статического) значением, которое на момент компиляции не определено. Что делать? Голову сломал. Размер этого массива зависит именно от переменной range, делать его заведомо большим - некрасиво, к тому же есть ситуации, когда его все равно не хватит, то есть даже M[2000] - может не хватить в отдельных случаях. а иногда хватит и M[1].

Подскажите пожалуйста...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.11.2011, 01:28
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Массив булевых элементов по входящему значению (C++):

Сформировать массив B из максимальных по значению элементов каждой строки исходной матрицы A(MxN) - C++
Сформировать массив B из максимальных по значению элементов каждой строки исходной матрицы A(MxN) вот пытался но что-то пошло не так:(...

Сформировать массив С, каждый элемент которого равен максимальному значению соответствующих элементов массивов А и В - C++
1) Даны два массива А и В одинаковой размерности. Сформировать массив С, каждый элемент которого равен максимальному значению...

Ввести одномерный массив E(10), найти сумму элементов массива, индекс которых равен их значению - C++
Ввести одномерный массив E(10), найти сумму элементов массива, индекс которых равен их значению. Помогите, пожалуйста, не знаю как найти...

Сформировать массив С, каждый элемент которого равен максимальному значению соответствующих элементов массивов А и В - C++
Даны два массива А и В одинаковой размерности. Сформировать массив С, каждый элемент которого равен максимальному значению соответствующих...

Массив: Заменить последний из отрицательных элементов в массиве на три элемента, равных заданному значению. - C++
Вставка в вектор новых элементов 1)Заменить последний из отрицательных элементов в массиве на три эле¬мента, равных заданному значению....

Даны двСформировать массив С, каждый элемент которого равен максимальному значению соответствующих элементов массивов А и В - C++
Даны два массива А и В одинаковой размерности. Сформировать массив С, каждый элемент которого равен максимальному значению соответствующих...

17
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
11.11.2011, 02:22 #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
void mufunc(int range)
{
    bool* pM;
    
    pM = new bool[range];
    for(int i = 0; i < range; i++)
    {
        pM[i] = false;
    }
    
    delete[] pM;
}
Удачи, Владимир
0
petrovich1
0 / 0 / 0
Регистрация: 22.09.2007
Сообщений: 314
15.11.2011, 12:14  [ТС] #3
С-П-А-С-И-Б-О!
p.s. Что-то форум перестал на мыло автоматически скидываться
0
petrovich1
0 / 0 / 0
Регистрация: 22.09.2007
Сообщений: 314
16.11.2011, 23:34  [ТС] #4
Во-первых он вдруг (посде очередного ребилда) стал выдавать такое окно.
Во-вторых все-равно виснет. То есть память-то он выделяет, но при range > 10
на пятом вызове процесс падает! Я отслеживал через task manager, на каждом вызове (т.е. при каждом вызове ф-ии Сcurve) этот процесс памяти жрет все больше и больше. Почему??? Ведь delete же!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void Сcurve(int range)
{
    int q = 0;
 
    for(int i = 0; i < range; i++)
        q = (q * 2) + 1;
 
    bool* pM = new bool[q];
    int n = 0;
 
    for(int i = 0; i < range; i++)
    {   
        pM[n] = true;
        n = (n * 2) + 1;
        for(int j = (n/2)+1, k = (n/2)-1; j < n; j++, k--)  
            pM[j] = !pM[k];
    }
 
        // использование pM[]
 
    delete [] pM;
}
0
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
17.11.2011, 02:23 #5
Хм... при range = 11 работает нормально выделяет массив bool переменных размером 2047, удаление тоже проходит на ура, при выходе в Debug режиме не пишет никаких ошибок. VC++ входящий в состав VS.NET 2002/2003/2005 при выходе из Debug режима автоматически отлавливает все memory leaks и выдает отчет о всех в Output окне.

Приведенный кусок программы работает без утечек памяти. Так что, либо ошибка/утечки в неприведенном куске кода (// использование pM[]), либо проблемы с компилятором/опциями компилятора.

С уважением,
Владимир

P.S. Использую VS.NET 2003 и VS.NET 2005 Beta 2 с указанной вами проблемой еще пока ни разу не сталкивался.
0
vagabond
0 / 0 / 0
Регистрация: 13.11.2011
Сообщений: 6
17.11.2011, 10:18 #6
Привет.
Попробуй использовать std::vector<bool>:
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
#include <vector>
void Ccurve(int range)
{
       int q = 0;
 
       for(int i = 0; i < range; i++)
              q = (q * 2) + 1;
 
       //bool* pM = new bool[q];
       std::vector<bool> pM(range);
 
       int n = 0;
 
       for(int i = 0; i < range; i++)
       {
              pM[n] = true;
              n = (n * 2) + 1;
              for(int j = (n/2)+1, k = (n/2)-1; j < n; j++, k--)
                     pM[j] = !pM[k];
       }
 
// использование pM[]
 
       //delete [] pM;
}
Удачи.
0
petrovich1
0 / 0 / 0
Регистрация: 22.09.2007
Сообщений: 314
17.11.2011, 12:03  [ТС] #7
Цитата Сообщение от boombastik
Хм... при range = 11 работает нормально выделяет массив bool переменных размером 2047, удаление тоже проходит на ура, при выходе в Debug режиме не пишет никаких ошибок. VC++ входящий в состав VS.NET 2002/2003/2005 при выходе из Debug режима автоматически отлавливает все memory leaks и выдает отчет о всех в Output окне
при первом вызове Ccurve все хорошо. Но если например она вызывается при каждом клике правой кнопкой мышки в методе OnLButtonDown раз 5-6 подряд (даже с небольшими перерывами в 10 секунд) то падает!
0
petrovich1
0 / 0 / 0
Регистрация: 22.09.2007
Сообщений: 314
17.11.2011, 12:07  [ТС] #8
то M.S.N.
Спасибо, надо попробовать
0
Kovalsky2
0 / 0 / 0
Регистрация: 05.08.2009
Сообщений: 96
17.11.2011, 14:01 #9
Цитата Сообщение от petrovich1
при первом вызове Ccurve все хорошо. Но если например она вызывается при каждом клике правой кнопкой мышки в методе OnLButtonDown раз 5-6 подряд (даже с небольшими перерывами в 10 секунд) то падает!
Увеличиваеться ли range при каждом вызове Ccurve?
К примеру если range==30,то это уже приблезительно 1 Гиг мозгов которые хотим
зарезервировать,и комп естественно засопративляеться.

функция void Сcurve(int range) правильная,тоько можно
добавить перед bool* pM = new bool[q]; проверку q на мега большое число,
и после bool* pM = new bool[q]; проверку pM на не равенcтво NULL.
0
petrovich1
0 / 0 / 0
Регистрация: 22.09.2007
Сообщений: 314
17.11.2011, 14:26  [ТС] #10
Цитата Сообщение от Kovalsky2
Увеличиваеться ли range при каждом вызове Ccurve?
К примеру если range==30,то это уже приблезительно 1 Гиг мозгов которые хотим
зарезервировать,и комп естественно засопративляеться.
в том-то и дело что нет! Не увеличивается. Оно одинаковое при каждом вызове.
Статистика памяти примерно такая:
при первом вызове: процесс ест 35% памяти
при втором: 65%
при третьем: 85%
при четвертом: 99%
при пятом вызове функции процесс падает
0
Kovalsky2
0 / 0 / 0
Регистрация: 05.08.2009
Сообщений: 96
17.11.2011, 15:23 #11
На чём конкретно вылетает после 5 вызова?
0
petrovich1
0 / 0 / 0
Регистрация: 22.09.2007
Сообщений: 314
17.11.2011, 15:39  [ТС] #12
Сорри, под памятью я имел ввиду процессорное время (ну эти проценты в task manager). Я запускал в режиме without debuging, на пятом вызове приложение выдает окно "программа выполнила недопустимую операцию...", стандартное окно в XP. Как посмотреть конкретно на чем вылетает не знаю.
0
petrovich1
0 / 0 / 0
Регистрация: 22.09.2007
Сообщений: 314
17.11.2011, 15:41  [ТС] #13
а может экономичнее использовать массив int? Я все равно его как массив семафоров использую.
0
Kovalsky2
0 / 0 / 0
Регистрация: 05.08.2009
Сообщений: 96
17.11.2011, 15:49 #14
2petrovich1
Поставте пару Breakpoints и пошагово пройдитесь по функции,и прикинте где вылетает.

А параллельные потоки в проге используете?
0
inserter
0 / 0 / 0
Регистрация: 13.08.2011
Сообщений: 5
17.11.2011, 16:08 #15
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void mufunc(int range)
{
      bool M[???range???];
 
      for(int i = 0; i < range; i++)
           M[i] = false;
}
 
Я бы сделал так:
void mufunc(int range) {
   bool *M;
   M = malloc(range*sizeof(bool));
   memset(M, 0, range*sizeof(bool));
}
Не забыть только потом free(M) сделать...
Но это если использовать C, идеология C++ может отличаться (не силен в этом вопросе).
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.11.2011, 16:08
Привет! Вот еще темы с ответами:

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

Одномерные массивы. Вывести на экран массив, составленный из номеров элементов исходного массива, которые равны заданному значению. - C++
Надоела уже наверное...ноо..выручайте( с++ Задан массив целых чисел. Вывести на экран массив, составленный из номеров элементов...

Найти количество элементов массива, каждый из которых меньше по значению чем среднее среди элементов - C++
Для заданного массива действительных чисел найти количество элементов каждый из которых меньше по значению чем среднее среди...

Найти количество элементов массива, каждый из которых меньше по значению, чем среднее среди элементов - C++
Для заданного массива натуральных чисел найти количество элементов каждый из которых меньше по значению чем среднее среди элементов


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
17.11.2011, 16:08
Ответ Создать тему
Опции темы

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