Олар зұлымдық ма? Мүмкін. Глобальды проблема кез-келген уақытта кез-келген нүктеде кез-келген функциямен немесе код бөлігімен шектеусіз қол жеткізуге және өзгертуге болады. Бұл жағдайды тудыруы мүмкін, айталық, артта және түсіндіру қиын. Мүмкіндігінше, бұл соманы нөлге дейін жеткізе отырып, жаһандық соманы азайту қажет.
Олардан аулақ бола аласың ба? Барлығына дерлік иә. Arduino проблемасы сізді setup()
деп қабылдайтын және сіз loop()
деп қабылдайтын сізді осы екі функционалдық тәсілге мәжбүрлейді. Бұл жағдайда сізде осы екі функцияның қоңырау шалу функциясының ауқымы (мүмкін, main()
)) болмайды. Егер сізде болсаңыз, сіз барлық глобалдіктерден құтылуға және орнына жергілікті тұрғындарға қолдана аласыз.
Төмендегі суретті қараңыз:
int main() {
setup();
while (true) {
loop();
}
return 0;
}
Бұл, әрине, Arduino бағдарламасының басты функциясының неге ұқсайтыны. setup()
және loop()
функциясындағы қажет айнымалылар, одан кейін main()
функциясының аумағында жарияланатын болады ғаламдық ауқаттан гөрі емес. Одан кейін оларды басқа екі функцияға дәлел ретінде беру арқылы (қажет болғанда көрсеткіштерді қолданумен) қол жеткізуге болады.
Мысалға:
int main() {
int myVariable = 0;
setup(&myVariable);
while (true) {
loop(&myVariable);
}
return 0;
}
Бұл жағдайда екі функцияның қолтаңбасын да өзгерту қажет.
Бұл мүмкін болмауы мүмкін, себебі мен бағдарламаның құрылымына мәжбүрлеп өзгертместен Arduino бағдарламасынан көптеген жаһандықтарды жоюдың бір ғана әдісін көремін.
Егер дұрыс есімде болсаңыз, сіз C ++ бағдарламасын C бағдарламасына бағдарламалау кезінде қолдана алсаңыз, C-ға емес, сіз OOP (Object Oriented Programming) немесе C ++, кейбіреулерге үйреніп, кейбір оқуды қажет етуі мүмкін.
Менің ұсынысым Бағдарлама сыныбын құру және осы сыныптың бірыңғай жаһандық данасын жасау еді. Класс нысандар үшін сызба ретінде қарастырылуы керек.
Төмендегі мысал бағдарламасын қарастырыңыз:
class Program {
public:
Program();
void setup();
void loop();
private:
int myFirstSampleVariable;
int mySecondSampleVariable;
};
Program::Program() :
myFirstSampleVariable(0),
mySecondSampleVariable(0)
{
}
void Program::setup() {
//your setup code goes here
}
void Program::loop() {
//your loop code goes here
}
Program program;//your single global
void setup() {
program.setup();
}
void loop() {
program.loop();
}
Воля, біз барлық глобалдіктерден құтылдық. Бағдарлама логикасын қосуды бастайтын функциялар Program :: setup()
және Program :: loop()
функциялары болады. Бұл функциялардың мысалы, myFirstSampleVariable
және mySecondSampleVariable
сияқты дәстүрлі setup()
және loop()
Бұл функциялар айнымалы сыныптар жеке сынып ретінде белгіленбегендіктен, функциялары жоқ. Бұл ұғым деректерді инкапсуляциялау немесе деректерді жасыру деп аталады.
Сізге OOP және/немесе C ++ үйрету бұл сұрақтың жауабынан аздап, осында тоқтаймын.
Қорытындылай келе, жаһандықты болдырмау керек және бұл жаһандық ауқымды түбегейлі түрде әрдайым азайтуға болады. Сондай-ақ, Arduino бағдарламалау кезінде.
Ең бастысы менің жауапым сізге пайдалы болады деп үміттенемін :)