Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 23.12.2014
Сообщений: 53
1

Как можно представить цикл с изменяемым параметром итерации?

14.03.2016, 21:56. Просмотров 1028. Ответов 11
Метки нет (Все метки)

Имеется простой цикл -
C++ (Qt)
1
2
3
4
5
6
7
    function proceed()
    {
      for(int i=0; i<3;i++)
      {
        Use(MyArray[i].object)
      }
    }
Он обернут методом proceed, и вызывается по таймеру, проблема в том что объекты которые в нем итрируются, должны вызываться так же по таймеру, т.е если прошло 5 сек - вызывается метод Procceed а в нем объект под индексом 0, потом проходит еще 5 секунд и снова вызывается метод proceed, но по той схеме что я описал, i не динамичен и не изменяется, по этому вместо ожидаемого объекта под индексом 2, вызовется 1 .

Сам таймер
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
    function OnTimer(int TimerID)
    {
        int i;
        switch (TimerID)
        {
            case TIMER_init://если прошло достаточно времени таймер сработает
            proceed();
            break;
        }
    }
Из-за специфики языка, при добавлении в метод OnTimer - счетчика int Counter, Counter++, даже при срабатывании таймера третий раз, значение Counter будет равно 1, т.е первому срабатыванию.

Каким образом - не усложняя всего, можно представить динамический итиратор для объектов моего массива arr[i] ?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.03.2016, 21:56
Ответы с готовыми решениями:

Создать программу по всем 3 видам циклов...цикл с параметром,цикл с условием,цикл,и цикл с предусловием...
Найти сумму чисел 1 в квадрате до 10 c квадрате...операцию возведению в степень не использовать...

Цикл. Сколькими способами можно представить данную сумму «пятерками» и «десятками»
Дана некоторая денежная сумма А руб. Определить, сколькими способами можно представить данную сумму...

Цикл с предусловием, цикл с постусловием и цикл с параметром
Объясните пожалуйста как делать эти циклы. У меня не получается. Можете сделать как на фото, или на...

Написать в турбо паскале, Цикл с параметром, Цикл, с постусловием, и с предусловием пожалуйста

11
6 / 6 / 4
Регистрация: 29.10.2015
Сообщений: 45
14.03.2016, 22:07 2
Вместо int Counter объяви переменную так: static int Counter
0
nd2
3404 / 2785 / 1251
Регистрация: 29.01.2016
Сообщений: 9,423
14.03.2016, 22:19 3
Если правильно понял:
C++
1
2
3
4
5
6
7
8
function proceed()
{
    static int i = 0;
    Use(MyArray[i].object);
    ++i;
    if (i == 3)
          i = 0;
}
0
0 / 0 / 0
Регистрация: 23.12.2014
Сообщений: 53
14.03.2016, 23:07  [ТС] 4
все правильно только вот язык этот UnrealScript, псевдо C++, И там нету static представления, зато есть Const, но и им так легко не воспользоваться.

Это как то по другому можно сделать ?
0
nd2
3404 / 2785 / 1251
Регистрация: 29.01.2016
Сообщений: 9,423
15.03.2016, 00:10 5
Цитата Сообщение от bigbastard Посмотреть сообщение
Это как то по другому можно сделать ?
На С++, или на UnrealScript? Если на UnrealScript, так тут форум не по этому языку.
0
1350 / 989 / 313
Регистрация: 28.07.2012
Сообщений: 2,746
15.03.2016, 00:19 6
Лучший ответ Сообщение было отмечено bigbastard как решение

Решение

Цитата Сообщение от bigbastard Посмотреть сообщение
Это как то по другому можно сделать ?
Объяви переменную глобальной, расположив ее вне функций.
1
0 / 0 / 0
Регистрация: 23.12.2014
Сообщений: 53
15.03.2016, 01:25  [ТС] 7
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Объяви переменную глобальной, расположив ее вне функций.
Спасибо ! помогло, хех не думал что так просто будет.

А как быть если надо убрать 1 из элементов,
т.е предположим - такой подход
C++ (Qt)
1
2
3
4
    ++Counter;
     Use(MyArray[Counter].object)
    if (Counter == 3) //3== MyArray.length
          Counter = 0;
теперь работает, но к примеру объект под индексом 2(Внутри масива), принял нужный вид, и добавив проверку я это выловил, что тогда следует отнимать counter-1, либо MyArray.Length то есть 3-1=2, чтобы объекты которые не приняли нужный вид продолжали итрироватся ?
ибо тут получается оч не хорошая загвоздка, т.к. нельзя определить какой именно объект стоит на очереди, и удален из нее может быть не тот который принял нужный вид, а который еще должен итрироваться! как тогда быть?
0
1350 / 989 / 313
Регистрация: 28.07.2012
Сообщений: 2,746
15.03.2016, 01:42 8
Цитата Сообщение от bigbastard Посмотреть сообщение
удален из нее
Я не понял, что, откуда, когда и зачем ты хочешь удалять?
Цитата Сообщение от bigbastard Посмотреть сообщение
но к примеру объект под индексом 2(Внутри масива), принял нужный вид, и добавив проверку я это выловил, что тогда следует отнимать counter-1, либо MyArray.Length то есть 3-1=2, чтобы объекты которые не приняли нужный вид продолжали итрироватся
А вот это вообще какой-то несвязанный поток мыслей.
"Нужный" вид - это какой?
Что ты выловил проверкой?
Для каких целей ты хочешь что-то отнимать, когда выловил это что-то своей проверкой?
Как должны итерироваться объекты, которые не приняли "нужный" вид, который ты как-то вылавливаешь этой проверкой?
0
nd2
3404 / 2785 / 1251
Регистрация: 29.01.2016
Сообщений: 9,423
15.03.2016, 02:14 9
Цитата Сообщение от bigbastard Посмотреть сообщение
C++
1
2
3
4
++Counter;
Use(MyArray[Counter].object)
if (Counter == 3) //3== MyArray.length
Counter = 0;
Не там инкремент делаешь (объект по нулевому индексу пропускается), и не там проверяешь на выход за размеры массива, проверять нужно сразу после инкремента.
0
0 / 0 / 0
Регистрация: 23.12.2014
Сообщений: 53
15.03.2016, 14:52  [ТС] 10
Цитата Сообщение от nonedark2008 Посмотреть сообщение
"Нужный" вид - это какой?
Что ты выловил проверкой?
Для каких целей ты хочешь что-то отнимать, когда выловил это что-то своей проверкой?
Как должны итерироваться объекты, которые не приняли "нужный" вид, который ты как-то вылавливаешь этой проверкой?
Ну в принципе да - не добавил информации и все странно,
в общем добавлю:

Цитата Сообщение от nonedark2008 Посмотреть сообщение
А вот это вообще какой-то несвязанный поток мыслей.
"Нужный" вид - это какой?
Что ты выловил проверкой?
Для каких целей ты хочешь что-то отнимать, когда выловил это что-то своей проверкой?
Как должны итерироваться объекты, которые не приняли "нужный" вид, который ты как-то вылавливаешь этой проверкой?
Сейчас объясню немного по проше:

У меня есть HashMap массив MyArray, в него от начала до конца добавляются объекты, и каждому объекту присваивается ключ.
выглядит это так
MyArray[0].Key = "Red"
MyArray[0].Object = Object;

MyArray[1].Key = "Green"
MyArray[1].Object = Object;

MyArray[2].Key = "Yeallow"
MyArray[2].Object = Object;

Далее объекты итрируются но не через for loop, а через Counter++, и в этом основная проблема, поскольку если к примеру объект[1], с ключем Green, изменил свой флаг isDone==1, то этот объект удаляется из массива.
Но удаление не идеально, а точнее оно не сдвигает объекты в массиве, а просто уменьшает его длину и удаляет объект, в итоге итирация идет по пустому объекту Green:
MyArray[0].Red = Object;
MyArray[1].Green == NULL;,

А до третьего объекта
MyArra[2].Yeallow = Object;
Итирация уже не доходит.
как правильнее будет смешать объект идущий за удаленным ?
0
1350 / 989 / 313
Регистрация: 28.07.2012
Сообщений: 2,746
15.03.2016, 16:44 11
Цитата Сообщение от bigbastard Посмотреть сообщение
Но удаление не идеально
Происходят ли все операции в одном потоке, или твое приложение многопоточное?
Цитата Сообщение от bigbastard Посмотреть сообщение
меня есть HashMap
Цитата Сообщение от bigbastard Посмотреть сообщение
объекты в массиве
Ты уж лучше определись, массив это у тебя или хеш-таблица. Оно самодельное или все же библиотечное?
Цитата Сообщение от bigbastard Посмотреть сообщение
Но удаление не идеально, а точнее оно не сдвигает объекты в массиве, а просто уменьшает его длину и удаляет объект
Это все плохо пахнет, да и разбираться влом, так что можно чутка поговнокодить:
C++
1
2
3
4
5
6
7
int oldCounter = Counter;
// Ищем следующий по порядку нормальный объект
Counter = (Counter + 1) % Length;
for (; MyArray[Counter].object == NULL && oldCounter != Counter; Counter = (Counter + 1) % Length);
if (oldCounter == Counter) // Выходим, если нет ни одного нормального объекта
    return;
Use(MyArray[Counter].object);
Length - кол-во объектов с учетом уже удаленных.
Для нормальной работы при старте программы Counter = -1;
1
0 / 0 / 0
Регистрация: 23.12.2014
Сообщений: 53
17.03.2016, 11:36  [ТС] 12
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Counter = (Counter + 1) % Length;
Вот спасибо ! помогло
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.03.2016, 11:36

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Цикл с параметром....пожалуйста натолкните на мысль как решать...
написание прогги в паскале... задача звучит так S:= 1/3^2 + 1/5^2 + 1/7^2 +....+ 1/(2*n +1)^2 ...

Как можно представить дерево
Как можно представить дерево в с.с++?

Цикл с предусловием преобразовать в цикл с параметром
Необходимо переделать цикл с предусловием в цикл с параметром, но я не понимаю как Задание:...

Задание на цикл с параметром и цикл с постусловием
Помогите пожалуйста написать программу с этими циклами. 1. Вычислить и напечатать таблицу...


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

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

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