Непонятная работа подпрограмм

krazy2013
Offline
Зарегистрирован: 18.04.2016

Если не туда написал, извиняюсь. Но проблема меня одолела сильно... Не выполняет подпрограмму, как так!!!??? О_О

Имею некоторый опыт программирования (без привязки к какому-либо конкретному языку). Но это было давно. И на Си не писал, только читал. А сейчас потребовалось написать программку под Ардуину, но не хватает знания специфичных ардуинских особенностей.



Суть вопроса.

Знаю что есть setup и loop.

Создаю свою подпрограмму ShowEkran, для простоты скажем, что она рисует прямоугольник. (подключен экранчик)



Вызываю подпрограмму из setup. Прямоугольник не рисуется. 

Вызываю из loop - тоже не рисует.

Если команду рисования прямоугольника непосредственно написать в теле loop - рисует. !!!???

Вот код. Думаю от аппаратной реализации зависит слабо, иБоардПро на Меге 2560, что-ли. 

Сейчас команда рисования - в лупе, работает. Если выношу в подпрограмму - не рисует. ???!!!???

#include <UTFT.h>
#include <UTouch.h>
extern uint8_t SmallFont[];
extern uint8_t BigFont[];
extern uint8_t Dingbats1_XL[];
UTFT          myGLCD(ITDB32S,38,39,40,41);
UTouch        myTouch(6,5,48,3,2);

int KolvoKnMenu=6;
int Ekran=0;     
int KnMenuX1[6]={70,150,230,70,150,230};
int KnMenuX2[6]={140,220,300,140,220,300};
int KnMenuY1[6]={10,10,10,90,90,90};
int KnMenuY2[6]={80,80,80,170,170,170};
int i; 

void ShowEkran()   // *** ЭКРАН  *** 
{ 

} //end ShowEkran 

void setup()    // *********   SETUP   **************
{
  myGLCD.InitLCD();
  myGLCD.clrScr(); 
  myGLCD.setFont(SmallFont);

  myTouch.InitTouch();
  myTouch.setPrecision(PREC_MEDIUM);
  
  myGLCD.setBackColor(VGA_BLACK);
  myGLCD.setColor(VGA_WHITE);
  Ekran=0;    // Сначала – главное меню
  ShowEkran;       // Рисуем главное меню
} // end setup void

void loop() // ***************   LOOP   *************
{
if (Ekran==0)        // Рисуем ЭКРАН ГЛАВНОГО МЕНЮ
  for (i=0;i<KolvoKnMenu;i++)      
    myGLCD.drawRect(KnMenuX1[i],KnMenuY1[i],KnMenuX2[i],KnMenuY2[i]);   // рисуем кнопки гл.меню
} //end loop

 

 

James
Offline
Зарегистрирован: 26.02.2016

а подпрограмму Вы в луп вставляете?

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Вызов функции делается так: ShowEkran();

Logik
Offline
Зарегистрирован: 05.08.2014

Вызов так - ShowEkran(); а не так ShowEkran;  Не совсем успел )))

James
Offline
Зарегистрирован: 26.02.2016

как насчет case?

Logik
Offline
Зарегистрирован: 05.08.2014

James пишет:

как насчет case?

 

Блюсти.

krazy2013
Offline
Зарегистрирован: 18.04.2016

Да-да-да!!! СПАСИБО! Скобки надо было поставить. Нарисовались прямоугольнички. Эвона как...

Какой тогда смыл "вызывать" подпрограмму без скобок? Почему компилятор не выдал ошибку?

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

krazy2013 пишет:

Какой тогда смыл "вызывать" подпрограмму без скобок? Почему компилятор не выдал ошибку?

Без скобок - это не вызов, а взятие ее (функции) адреса. Компилятор не выдал ошибку потому, что это законная операция - может Вам её адрес нужен.

А впредь, когда есть вопрос, Вы публикуйте неработающий код тоже, а то Вы его не опубликовали и парням догадываться пришлось про скобки вместо того, чтобы сразу увидеть.

krazy2013
Offline
Зарегистрирован: 18.04.2016

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

А впредь, когда есть вопрос, Вы публикуйте неработающий код тоже, а то Вы его не опубликовали и парням догадываться пришлось про скобки вместо того, чтобы сразу увидеть.

Я так и хотел, чтобы отрисовка в подпрограмме была (т.е. неработающий код). Но когда заметил что в лупе, хотел перекопипастить, да как-то криво получилось, формы для ввода кода, навороты эти, перенавороты, решил оставить как получилось. Конечно, буду впредь внимательней. Первый блин комом хД

Про адреса-то то да, в Сиях это перенаворочено, зело дивился на фокусы эти ещё когда пытался им серьёзно заняться (да как-то тогда не дошло дело до непосредственно программирования). Понял.