Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 7385
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение uldemir »

Что-то я затупил... есть конструкция do{.....} while(0); если внутри конструкции выполняется continue - цикл повторится или как? у меня он не повторяется почему-то

Код: Выделить всё

    do {
        update_coordinate(&possible_destination, possible_bearing);
        possible_walls = maze[possible_destination.north*maxX + possible_destination.east];
        if ((possible_walls & 0x0f) != ((possible_walls & 0xf0)>>4)) return 0;   // мы в этой ячейке еще точно не были - надо посетить
        if ((possible_walls == 0xaa) || (possible_walls == 0x55)) continue; // если попали в "туннель" повторяем движение.
    } while(0);
В отладчике вижу, что possible_walls имеет значение 0x000000AA и последний if даёт 1, но следущим шагом я оказываюсь вне цикла. что я не понимаю?
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Реклама
Собутыльник Кота
Сообщения: 2905
Зарегистрирован: Ср ноя 29, 2017 06:58:50

Сообщение BlackKilkennyCat »

continue перепрыгивает в начало цикла, проверки условия для новой итерации, а там 0, значит, условие не выполняется, выход из цикла.

Код: Выделить всё

do {
        update_coordinate(&possible_destination, possible_bearing);
        possible_walls = maze[possible_destination.north*maxX + possible_destination.east];
    } while (!((possible_walls & 0x0f) != ((possible_walls & 0xf0)>>4)));
 return 0; 
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7385
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение uldemir »

Хм, я надеялся, что условие цикла проверяться не будет... ну ладно, напишем иначе.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18809
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

a5021 писал(а):Вполне годно получалось.
если требуется случайное число для "бытовых" целей, то и штатный rand с предустановкой по моему методу вполне приемлем. у вас, очевидно, цели были совсем иные...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

Угу. К - конспирология.
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18809
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

a5021 писал(а):К - конспирология
может быть, П - паранойя? ;) :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Опытный кот
Аватара пользователя
Сообщения: 867
Зарегистрирован: Пт фев 27, 2015 12:00:53
Откуда: Рязанская область

Сообщение Serzh2000 »

чтобы rand() не работал при каждом включении одинаково я понял, Спасибо!!! :beer:

у меня еще вопрос в котором запутался и увяз по уши ... :facepalm:

есть в мигалки эффекты, чтобы они случайным образом выбирались применил rand()%29 8)
ВОПРОС: как сделать чтобы все 29 эффектов от мигали в случайном порядке НЕ повторяясь.
может флаги наделать или перемешивать их как то ... :facepalm:
Спойлерwhile (1) {
switch(rand()%29)
{
case 0:
view_flasher_0();
break;
case 1:
view_flasher_1();
break;
case 2:
view_flasher_2();
break;
case 3:
view_flasher_3();
break;
...
case 28:
view_flasher_28();
break;
}
Последний раз редактировалось Serzh2000 Вт янв 19, 2021 07:30:27, всего редактировалось 2 раза.
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

Serzh2000, именно. Только или флагами отмечать, что эффект уже "был" или же создать массив и перемешать его в произвольном порядке.
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Для справочки.

[uquote="Serzh2000",url="/forum/viewtopic.php?p=3962486#p3962486"]switch(rand()%28)
{

case 28:
view_flasher_28();
break;

}[/uquote]
case 28: не выполнится никогда. Выражение %28 никогда не даст результат 28.
Опытный кот
Аватара пользователя
Сообщения: 867
Зарегистрирован: Пт фев 27, 2015 12:00:53
Откуда: Рязанская область

Сообщение Serzh2000 »

если флагами то наверно когда будет оставаться один или два не отмеченных эффекта то их порядковый номер можно долго ждать пока выпадет случайно... а как массивом у меня не получается
case 28: не выполнится никогда. Выражение %28 никогда не даст результат 28.
точно, спасибо упустил из виду :beer:
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

Serzh2000,

Код: Выделить всё

#include <stdlib.h>

#define MAX 29
uint8_t arr[MAX] = {1, 2, 3, ... };


/* Arrange the N elements of ARRAY in random order.
   Only effective if N is much smaller than RAND_MAX;
   if this may not be the case, use a better random
   number generator. */
void shuffle(uint8_t *array, size_t n)
{
    if (n > 1) 
    {
        size_t i;
        for (i = 0; i < n - 1; i++) 
        {
          size_t j = i + rand() / (RAND_MAX / (n - i) + 1);
          uint8_t t = array[j];
          array[j] = array[i];
          array[i] = t;
        }
    }
}

...

while(1) {
  srand(...);
  shuffle(&arr, sizeof(arr));
  for(uint8_t i = 0, i++, i <= MAX {
    effect(arr[i]);
  }
}
Сначала думал написать быстренько простенькую перемешку самостоятельно, но потом решил загуглить: https://stackoverflow.com/questions/612 ... array-in-c
Ну или вот вариант 2, который без malloc() только: http://rosettacode.org/wiki/Knuth_shuffle#C
Последний раз редактировалось NStorm Пн янв 18, 2021 19:52:48, всего редактировалось 1 раз.
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

[uquote="Serzh2000",url="/forum/viewtopic.php?p=3962516#p3962516"]а как массивом у меня не получается[/uquote]

Код: Выделить всё


uint8_t   rnd_arr[29];

for(int i=0; i<29; i++){
	rnd_arr[i]=i;
}

for(int i=0; i<100; i++){
	uint8_t     a = rand()%29;
	uint8_t     b = rand()%29;
	swap(&rnd_arr[a], &rnd_arr[b]);
}

Как то примерно так :roll:

Только, в Вашем случае, нужно создавать массив указателей на функции и его перемешивать.
Опытный кот
Аватара пользователя
Сообщения: 867
Зарегистрирован: Пт фев 27, 2015 12:00:53
Откуда: Рязанская область

Сообщение Serzh2000 »

:beer: спасибо. попробую переварить информацию :beer:
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Спойлер

Код: Выделить всё

void view_flasher_0(){
}
void view_flasher_1(){
}
void view_flasher_2(){
}
void view_flasher_3(){
}
void view_flasher_4(){
}
void view_flasher_5(){
}


typedef void (*pfun_t)(void);


pfun_t   rnd_arr[] = {
	view_flasher_0,
	view_flasher_1,
	view_flasher_2,
	view_flasher_3,
	view_flasher_4,
	view_flasher_5,

};

#define MAX_EFFECTS     (sizeof(rnd_arr)/sizeof(rnd_arr[0]))


void swap(pfun_t *val1, pfun_t *val2){
	pfun_t t = *val1;
	*val1 = *val2;
	*val2 = t;
}

...........................

for(int i=0; i<100; i++){                   // Перемешиваем
	uint8_t     a = rand()%MAX_EFFECTS;
	uint8_t     b = rand()%MAX_EFFECTS;
	swap(&rnd_arr[a], &rnd_arr[b]);
}


for(uint8_t i=0; i<MAX_EFFECTS; i++){      // Вывод эффектов
	rnd_arr[i]();
}


Опытный кот
Аватара пользователя
Сообщения: 867
Зарегистрирован: Пт фев 27, 2015 12:00:53
Откуда: Рязанская область

Сообщение Serzh2000 »

не получается :o
Спойлер#include <mega8.h>

#include <delay.h>
#include <stdlib.h>
#define MAX 5

uint8_t arr[MAX] = {1, 2, 3, 4, 5 };


void view_flasher_1(void) {
}

void view_flasher_2(void) {
}

void view_flasher_3(void) {

}

void view_flasher_4(void) {

}

void view_flasher_5(void) {

}



void shuffle(uint8_t *array, size_t n)
{
if (n > 1)
{
size_t i;
for (i = 0; i < n - 1; i++)
{
size_t j = i + rand() / (RAND_MAX / (n - i) + 1);
uint8_t t = array[j];
array[j] = array;
array = t;
}
}
}

//=================== main ==========

//основаня функция
void main(void){


//настройка портов
PORTB=0b00000000;
DDRB=0b00000000;
PORTC=0b00000000; //порт С 4 первые по умолчанию 1
DDRC=0b00011111; //порт С 4 первые ноги на вывод
PORTD=0b00000000; //порт D по умолчанию все ноги на 0
DDRD=0b00001111; //порт D все ноги на вывод



// -------------------------------- рабочая часть ------------------------------------------


while(1) {

shuffle(&arr, sizeof(arr));
for(uint8_t i = 0, i++, i <= MAX {
view_flasher(arr);
}
}



ругается CodeVisionAVR. на строчку uint8_t arr[MAX] = {1, 2, 3, 4, 5 }; чтобы я в скобках не писал
может в CodeVisionAVR библиотеки какой не хватает :shock:
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

#include <stdint.h>
Опытный кот
Аватара пользователя
Сообщения: 867
Зарегистрирован: Пт фев 27, 2015 12:00:53
Откуда: Рязанская область

Сообщение Serzh2000 »


void shuffle(int *array, size_t n)
ругается на shuffle
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Покажите ругань компилятора.
Опытный кот
Аватара пользователя
Сообщения: 867
Зарегистрирован: Пт фев 27, 2015 12:00:53
Откуда: Рязанская область

Сообщение Serzh2000 »

вот, посмотрите пожалуйста.
Изображение
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Он не понимает, что такое uint8_t. Замените на unsigned char.
Или добавьте, где-нибудь сверху:

Код: Выделить всё

typedef unsigned char    uint8_t;
Ответить

Вернуться в «Разные вопросы по МК»