Цикл в функции. Как передать параметры цикла?

Kototor
Offline
Зарегистрирован: 22.01.2018

Добрый день.

Подскажите, пожалуйста, есть ли возможность повторить такую программу в программе для ардуины?

Конкретней - передать параметры цикла в функцию.

Искал в Googl и на форуме. В т. ч. для C++. Так и не разобрался.

Программа на Visual Basic for Applications (VBA) (excel):

Sub aaa()
    bbb 0, 3, 1
    bbb 4, 0, -2
End Sub

Function bbb(nach, konec, shag)
    For i = nach To konec Step shag
        MsgBox i
    Next i
End Function

Результат:

0 1 2 3

4 2 0

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
/**/
void func(int nach, int konec, int shag) {
  if (shag == 0)return;
  if (shag > 0)
    for (int i = nach; i >= konec; i += shag)
      Serial.println(i);
  else for (int i = nach; i <= konec; i -= shag)
      Serial.println(i);
}
//----main----------------------
void setup() {
  Serial.begin(9600);
  func(0, 3, 1);
  func(4, 0, -2);
}

void loop() {

}
/*Скетч использует 1746 байт (5%) памяти устройства. Всего доступно 30720 байт.
  Глобальные переменные используют 186 байт (9%) динамической памяти, оставляя 1862 байт для локальных переменных. Максимум: 2048 байт.
*/

 

Kototor
Offline
Зарегистрирован: 22.01.2018

Большая благодарность. )

Буду изучать.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Kototor пишет:

Подскажите, пожалуйста, есть ли возможность повторить такую программу в программе для ардуины?

Нет.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Пух, ты ничо с условиями не напутал?

04   if (shag > 0)
05     for (int i = nach; i >= konec; i += shag)
 

и в следущем

Araris
Offline
Зарегистрирован: 09.11.2012

Если shag будет отрицательным, выражение i -= shag точно будет уменьшать i ?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

DetSimen пишет:

Пух, ты ничо с условиями не напутал?

Araris пишет:

Если shag будет отрицательным, выражение i -= shag точно будет уменьшать i ?

Да, ладно, с кем не бывает - время-то 22:46!

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

думаю, не время, а вещества виноваты. 

Kototor
Offline
Зарегистрирован: 22.01.2018

qwone пишет:

  if (shag > 0)
  else for (int i = nach; i <= konec; i -= shag)

Не совсем подходит.

В этом случае записывается те же два цикла, только по другому.

А хотелось - один раз написать цикл, а потом несколько раз его прогонять с разными параметрами.

ЕвгенийП пишет:

Kototor пишет:

Подскажите, пожалуйста, есть ли возможность повторить такую программу в программе для ардуины?

Нет.

...это печально! (

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Kototor пишет:

...это печально! (

Так, ото ж!

Kototor
Offline
Зарегистрирован: 22.01.2018

Кажись, получилось! :)

void setup() {
  Serial.begin(9600);
  func(0, 3, 1);
  func(4, 0, -2); 
}

void loop() {}

void func(int nach, int konec, int shag) {
  for (int i = nach; ;i += shag)
  {
      Serial.println(i);
      if (i==konec) break;
  }
}

Спасибо за участие!

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

qwone пишет:

/**/
void func(int nach, int konec, int shag) {
  if (shag == 0)return;
  if (shag > 0)
    for (int i = nach; i >= konec; i += shag)
      Serial.println(i);
  else for (int i = nach; i <= konec; i -= shag)
      Serial.println(i);
}
//----main----------------------
void setup() {
  Serial.begin(9600);
  func(0, 3, 1);
  func(4, 0, -2);
}

void loop() {

}
/*Скетч использует 1746 байт (5%) памяти устройства. Всего доступно 30720 байт.
  Глобальные переменные используют 186 байт (9%) динамической памяти, оставляя 1862 байт для локальных переменных. Максимум: 2048 байт.
*/

 

Бляяяяяя!!!
Полтора килобайта памяти на простейшую функцию!
Убил бы разработчика компилятора, у меня драйвер для работы с любыми гибкими дискетами был 3,6 килобайта
А там анализ дискеты, выставление режима работы контроллера FDD, работа с контроллером ПДП )))

Евгений Петрович, Вы кого там выучили и на что???

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ВИНОВАТ! Заметил. Используете. Но настолько, простите, "через Альпы" :))))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ua6em пишет:

Полтора килобайта памяти на простейшую функцию!

Хрена се простейшую - с потоковым выводом!

Вы ешё в ней (хоть в одной строке) флоат задействуйте - сразу ещё пара кило подвалит.

sadman41
Offline
Зарегистрирован: 19.10.2016

ua6em пишет:

Бляяяяяя!!!

Полтора килобайта памяти на простейшую функцию!
Убил бы разработчика компилятора, у меня драйвер для работы с любыми гибкими дискетами был 3,6 килобайта
А там анализ дискеты, выставление режима работы контроллера FDD, работа с контроллером ПДП )))

Драйвер же не пользовал UART и за прерывания BIOS дергал, поди. Если от Serial и разной шелупони типа serialEvent() освободиться, то уже вот так выходит:

----------
Sketch uses 434 bytes (1%) of program storage space. Maximum is 30,720 bytes.
Global variables use 9 bytes (0%) of dynamic memory, leaving 2,039 bytes for local variables. Maximum is 2,048 bytes.
----------
 
И это на лживом и бесчестном Си, который постоянно миллисы щёлкает! Сияющий скрепный ASM размер даже в минус уведет, поди.
 
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sadman41 пишет:
Сияющий скрепный ASM размер даже в минус уведет, поди.
Ну, думаю, что действительная часть числа врядли ниже нуля уйдёт, а мнимая - та, да.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

sadman41 пишет:
Сияющий скрепный ASM размер даже в минус уведет, поди.
Ну, думаю, что действительная часть числа врядли ниже нуля уйдёт, а мнимая - та, да.

нихрена не понял о чём Вы но шибко плюсую, за ASM, драйвер писался даже не в асме (он у меня был версии 1.27) а DEBUG, после оптимизации (выкинул один поток) стал 1.8 килобайта.

Признаюсь честно под сериал ничего на асме не писал, так что спорить не буду, но программа разбирающая передаваемые функции параметры вроде как самое простое, плюс зацепиться за 13 прерывание и оставить себя резидентом, тоже элементарщина, любая вирусяка это делает.

Самое сложное - программирование контроллера флоппи диска ну и контроллера прямого доступа к памяти,
для нас кузнецов это не железом по железу

Понял, всё дело в сериале )))
 

b707
Offline
Зарегистрирован: 26.05.2017

ua6em - не ведите себя как типичный старпер от программирования, который пытается замаскировать свое неумение разобраться в Си якобы любовью к АСМу :)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

ua6em - не ведите себя как типичный старпер от программирования, который пытается замаскировать свое неумение разобраться в Си якобы любовью к АСМу :)

так я и АСМ не знаю ))) мы в машинных кодах в основном, сей провод туда, сей сюда
Дисплей Багдяна, журнал Радио 1978 год

sadman41
Offline
Зарегистрирован: 19.10.2016

ua6em пишет:

Признаюсь честно под сериал ничего на асме не писал, так что спорить не буду, но программа разбирающая передаваемые функции параметры вроде как самое простое, плюс зацепиться за 13 прерывание и оставить себя резидентом, тоже элементарщина, любая вирусяка это делает.

Ну, положим, если вы не будете дергать 21h, а весь I/O напишете врукопашную, то даже и не знаю, сколько драйвер займет...

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

sadman41 пишет:

ua6em пишет:

Признаюсь честно под сериал ничего на асме не писал, так что спорить не буду, но программа разбирающая передаваемые функции параметры вроде как самое простое, плюс зацепиться за 13 прерывание и оставить себя резидентом, тоже элементарщина, любая вирусяка это делает.

Ну, положим, если вы не будете дергать 21h, а весь I/O напишете врукопашную, то даже и не знаю, сколько драйвер займет...

Нет, 21 прерывание это дос, а это расширитель BIOS 13-го прерывания, 1,8 килобайта, весь I/O написан врукопашную, аналог DM800, только его тогда еще не было )))

Kototor
Offline
Зарегистрирован: 22.01.2018

ЕвгенийП пишет:

ВИНОВАТ! Заметил. Используете. Но настолько, простите, "через Альпы" :))))

Хочеться проще, но не можется! :)

Вот универсальней:

void setup() {
  Serial.begin(9600);
  func(0, 3, 1);
  func(4, 0, -2); 
}

void loop() {}

void func(int nach, int konec, int shag) {
  for (int i = nach; ;i += shag)
  {
      Serial.println(i);
      if ((shag>0)&&(i>=konec)||(shag<0)&&(i<=konec)) break;
  }
}

У меня в программе было четыре однотипных цикла. А теперь одна функция.

Было 17 546 байт

Стало 17 406 байт

------

-140 байт

+ красивее :)

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ua6em пишет:

Нет, 21 прерывание это дос, а это расширитель BIOS 13-го прерывания, 1,8 килобайта, весь I/O написан врукопашную, аналог DM800, только его тогда еще не было )))

Ничо не понял. Если int13, то это IBM PC, а на ней штатно стоял i8272 контроллером, программировался на раз-два, куды там 1.8 килобайта ушло?  Правда, ВГ93 мне нравился больше. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

ua6em пишет:

Нет, 21 прерывание это дос, а это расширитель BIOS 13-го прерывания, 1,8 килобайта, весь I/O написан врукопашную, аналог DM800, только его тогда еще не было )))

Ничо не понял. Если int13, то это IBM PC, а на ней штатно стоял i8272 контроллером, программировался на раз-два, куды там 1.8 килобайта ушло?  Правда, ВГ93 мне нравился больше. 

А сколько родной обработчик INT13 в BIOS занимал?
 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ua6em пишет:

Самое сложное - программирование контроллера флоппи диска ну и контроллера прямого доступа к памяти,

для нас кузнецов это не железом по железу

Сразу видно, что Вы EGA не программировали.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

andriano пишет:

ua6em пишет:

Самое сложное - программирование контроллера флоппи диска ну и контроллера прямого доступа к памяти,

для нас кузнецов это не железом по железу

Сразу видно, что Вы EGA не программировали.

Пробовал, расширитель 10 прерывания, и CGA и EGA, не было практической задачи, не заинтересовало, а вот
по FDD задача была, система защиты Цербер заинтересовала, а потом FDA, и перед тем и перед другим коллективом разработчиков снимаю шляпу, но у Цербера был логический косяк, позволявший сломать их систему защиты используя FDA )))