возврат 2х значений одной функцией

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Опытный кот
Сообщения: 768
Зарегистрирован: Сб ноя 08, 2008 18:32:36

Сообщение vovik15 »

Здравствуйте! возникла такая проблема:

вот например если сделать так

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

a = summ (b,c); //а присвоить b+c

unsigned char summ (unsigned char x,unsigned char y,)
{
unsigned char a;
a= x+y;     //сложение
return (a); //возвратить значение 
}
то функция будет возвращать только одно значение.
а как сделать чтобы функция могла возвратить 2 значения?
Контактная информация:
Реклама
Опытный кот
Аватара пользователя
Сообщения: 736
Зарегистрирован: Пн янв 10, 2011 03:06:36
Откуда: Ростов-на-Дону

Сообщение Goldsmith »

Хорошее решение: создать для результата структурный тип и возвращать значение этого типа.

Решение похуже, но тоже в принципе рабочее: сделать функцию с побочным эффектом в виде выходных параметров.
Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет.
J. Ganssle
Контактная информация:
Реклама
Опытный кот
Сообщения: 768
Зарегистрирован: Сб ноя 08, 2008 18:32:36

Сообщение vovik15 »

скажите пожалуйсто,а как это реализовать? просто в моем случае нельзя делать переменные глобыльными
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 736
Зарегистрирован: Пн янв 10, 2011 03:06:36
Откуда: Ростов-на-Дону

Сообщение Goldsmith »

Простейший пример:

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

#include <stdio.h>
#include <stdlib.h>

typedef struct
{
  int i;
  char c;
} mytype;
       
mytype f(int i, char c)
{
  mytype ms;
  ms.i = i;
  ms.c = c;
  return ms;
}
       
int main(int argc, char *argv[])
{
  mytype m;
  m = f(5, 'c');
  printf("m = %d\t%c\n", m.i, m.c);
  system("PAUSE");	
  return 0;
}
Глобальные переменные - вселенское зло. Используйте их, когда без них уж совсем никак (то есть практически никогда).
Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет.
J. Ganssle
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Опытный кот
Аватара пользователя
Сообщения: 736
Зарегистрирован: Пн янв 10, 2011 03:06:36
Откуда: Ростов-на-Дону

Сообщение Goldsmith »

Вариант с выходным параметром:

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

#include <stdio.h>
#include <stdlib.h>

int addAndSub(int a, int b, int* sub)
{
  *sub = a - b;
  return a + b;
}
       
int main(int argc, char *argv[])
{
  int s1, s2;
  s1 = addAndSub(5, 3, &s2);
  printf("%d\t%d\n", s1, s2);
  system("PAUSE");	
  return 0;
}
Это работает, но вообще это очень плохой стиль программирования. Используйте, когда иначе уж совсем никак.
Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет.
J. Ganssle
Контактная информация:
Реклама
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср апр 16, 2008 13:22:54
Откуда: Приднестровье, Тирасполь

Сообщение Goodefine »

Goldsmith писал(а): Глобальные переменные - вселенское зло. Используйте их, когда без них уж совсем никак (то есть практически никогда).
Насчет практически никогда - если нетрудно, приведите пример, как основному циклу программы для авр, например, обмениваться данными с обработчиками прерываний.
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Реклама
Опытный кот
Аватара пользователя
Сообщения: 736
Зарегистрирован: Пн янв 10, 2011 03:06:36
Откуда: Ростов-на-Дону

Сообщение Goldsmith »

Goodefine писал(а):приведите пример, как основному циклу программы для авр, например, обмениваться данными с обработчиками прерываний.
Разумеется, только через интерфейсные функции. Данные обработчика инкапсулируются внутри модуля обработки прерываний.

Встречный вопрос: каким образом, используя глобальные переменные, доступные из любой точки программы, вы гарантированно обеспечиваете синхронизированный доступ к данным обработчиков прерываний?
Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет.
J. Ganssle
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 6321
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

Goodefine писал(а):
Goldsmith писал(а): Глобальные переменные - вселенское зло. Используйте их, когда без них уж совсем никак (то есть практически никогда).
Насчет практически никогда - если нетрудно, приведите пример, как основному циклу программы для авр, например, обмениваться данными с обработчиками прерываний.
+1
Я как не сторонник паления из пушки по воробьям ( программирования на ЯВУ для МК ) буду неодобряемо понят, но у программера, пишущего на асме, этот вопрос вообще не возник бы. И что страшного, если второй результат передан не через идентификатор функции, а через параметр, обозначенный в списке параметров вызова функции ? Жизнь остановилась, метеорит взорвался ?
"Я буду писать на 'C', потому что у меня очень объемная задача, которая еле в Мегу128 влезает, а время жмет" - это я понимаю и приветствую. Но "Я буду писать на 'C', потому что это круто, да и заморачиваться архитектурой МК не нужно - накорябал - и работает" - это мне чуждо. Пожалуйста, если тебе гирляндой помигать - бог в помочь. Но если, не приведи аллах, такое пишется для управления реактором - остановите Землю, я сойду. Или это пишет профи высокого класса, который ясно представляет, как его исходник трансформируется в конкретный код ( но такие в эху вопросов не задают ), или же скомпиленный код тщательно анализируется - а не накосячил ли компайлер, может, где-то он меня неправильно понял ? Я сильно сумняваюся в такой скрупулезности. Прогнал пару тестов - и долбись оно конем. Но как показывют теоретики, НИКАКОЙ самый тщательный тест не может утверждать, что в проге нет ошибок - он только достоверно может утверждать, что они есть. "Не бывает здоровых людей, бывают недообследованные".
"А что, в прогах на асме не бывает ошибок?" - спросят меня. Бывает, но за логику программы на асме отвечаю я полностью, а тут к ошибкам программиста добавляются даже не ошибки, а разные толкования исходного текста вполне добросовестным компайлером. У меня не идет из памяти, как я таращил глаза на результаты, выданные прогой, откомпиллированной с диагнозом "Все ОК" ( это было не на МК ), а результаты - ни в дугу, ни в Красну Армию. А оказалось, scanf ("%f",&alfa) - она переменную засовывает в alfa всегда 8-байтную ( double ), затирая рядом лежащую beta, которые обе просто real, и "%f" вообще-то небывает , а есть "%Lf", но лексический анализатор меня об этом не удосужился предупредить ни Error'ом, ни даже Warning'ом.
Ладно, просю пардону у Си-шников, что в их ветку вломился со своим мнением. Я не претендую на истину и не собираюсь продолжать полемику. Я так думаю. А подвигул меня взяться за клаву День Благовещенья и связанный с ним Мускат.
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср апр 16, 2008 13:22:54
Откуда: Приднестровье, Тирасполь

Сообщение Goodefine »

Goldsmith писал(а):Разумеется, только через интерфейсные функции. Данные обработчика инкапсулируются внутри модуля обработки прерываний.
Т.е. классический сферический конь в вакууме. Конкретнее, пожалуйста. Простой пример:

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

volatile unsigned char flag=0;

void обработчик(void)
{
flag=1;
}

void main(void)
{
 while(1)
   {
    if(flag)
       {
         bla_bla();
         flag=0;
        }
   //....
    }
}
Покажите аналог. Заодно поведайте, чем регистры контроллера отличаются от глобальных переменных, с точки зрения доступа?
Goldsmith писал(а): Встречный вопрос: каким образом, используя глобальные переменные, доступные из любой точки программы, вы гарантированно обеспечиваете синхронизированный доступ к данным обработчиков прерываний?
Логикой работы и запретом прерываний на время чтения/записи. Данные не могут использоваться в двух местах одновременно. Если используется ОС то там для таких вещей придуманы критические секции.
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Опытный кот
Аватара пользователя
Сообщения: 736
Зарегистрирован: Пн янв 10, 2011 03:06:36
Откуда: Ростов-на-Дону

Сообщение Goldsmith »

Jack_A писал(а):Прогнал пару тестов - и долбись оно конем.
Вот это как раз и есть первый признак подхода "накорябал - и работает". Профессиональный подход к программированию подразумевает несколько другое отношение к качеству. Современная технология разработки через тестирование (Test-Driven Design) просто обязывает писать сотни тестов, порой в два-три раза больше, чем текст самой программы.
Jack_A писал(а):Но как показывют теоретики, НИКАКОЙ самый тщательный тест не может утверждать, что в проге нет ошибок - он только достоверно может утверждать, что они есть.
Верно. Но если вы так уважаете теорию, то ознакомьтесь с мнением классиков по поводу глобальных переменных, побочных эффектов функций и прочих корявостей кода:
Побочные эффекты суть ложь. Ваша функция обещает делать что-то одно, но делает что-то другое, скрытое от пользователя. Иногда она вносит неожиданные изменения в переменные своего класса — скажем, присваивает им значения параметров, переданных функции, или глобальных переменных системы. В любом случае такая функция является коварной и вредоносной ложью, которая часто приводит к созданию противоестественных временных привязок и других зависимостей. (Р. Мартин, "Чистый код").
Всем известно, что дорога в ад программирования вымощена глобальными переменными.
...
Даже если применение глобальных переменных не всегда ведет к ошибкам, оно все-таки вряд ли представляет собой хороший способ программирования.
...
Используйте глобальные данные только как последнее средство.
...
Все, что вы можете сделать с глобальными данными, вы можете сделать лучше, используя методы доступа. (С. МакКоннелл, "Совершенный код").
Цитаты можно продолжать до бесконечности, ибо это самые азы программирования, они есть в любом учебнике программной инженерии. Сможете привести хотя бы одно авторитетное мнение в защиту глобальных переменных и прочих безобразий? (Вариант "сосед Вася так делал, и у него всегда все работало" просьба не предлагать).
Jack_A писал(а):за логику программы на асме отвечаю я полностью
А это напоминает старый анекдот. Учительница вызывает ученика к доске. "Построй равнобедренный треугольник. Докажи, что он равнобедренный". - "Мамой клянусь!".

За логику программы должны отвечать квалификационные тесты, составленные в соответствии с требованиями стандартов управления качеством IEEE, ISO и т.п.
Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет.
J. Ganssle
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 736
Зарегистрирован: Пн янв 10, 2011 03:06:36
Откуда: Ростов-на-Дону

Сообщение Goldsmith »

Goodefine писал(а): Т.е. классический сферический конь в вакууме. Конкретнее, пожалуйста. Простой пример:
...
Покажите аналог.
Я для простоты тоже набросаю на псевдокоде, если не возражаете.

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

// irqproc.h
extern _Bool flagIsSet(void);
extern void clearFlag(void);

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

// irqproc.c
#include "irqproc.h"

static volatile _Bool flag;

void обработчик(void)
{
  синхронизация
  flag=1;
}

_Bool flagIsSet(void)
{
  _Bool b;
  синхронизация
  b = flag;
  return b;
}

void clearFlag(void)
{
  синхронизация
  b = 0;
}
Дальше, надеюсь, очевидно. Клиент видит только пару интерфейсных функций из irqproc.h и не может напрямую взаимодействовать с флагом.

Вакуум вокруг коня заполнен или подробнее прокомментировать?
Goodefine писал(а):Заодно поведайте, чем регистры контроллера отличаются от глобальных переменных, с точки зрения доступа?
Поведаю: абсолютно ничем. Именно поэтому в многопоточном приложении доступ к периферии делается только через HAL, раз уж простейшая архитектура не имеет механизмов защиты вроде колец ядро/супервизор/пользователь и подобных.
Goodefine писал(а):Логикой работы и запретом прерываний на время чтения/записи. Данные не могут использоваться в двух местах одновременно. Если используется ОС то там для таких вещей придуманы критические секции.
Прошу прощения, но в вопросе присутствовало слово "гарантированно", а не "добровольно". Никто не мешает проигнорировать эту логику и напрямую обратиться к глобальной переменной в любой момент. Разумеется, не по злому умыслу, а просто запутавшись в тысячах строк кода, тем более если глобальная переменная не одна. Единственный способ как-то управлять этим процессом - ограничить доступ только через интерфейс. Идея очевиднейшая для разработчиков больших приложений и почему-то с таким трудом пробивающаяся в программирование МК, будто для них не нужны надежные программы.
Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет.
J. Ganssle
Контактная информация:
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср апр 16, 2008 13:22:54
Откуда: Приднестровье, Тирасполь

Сообщение Goodefine »

Goldsmith писал(а): Дальше, надеюсь, очевидно.
Да вот не совсем. Что будет обнулять функция clearFlag() не понятно... Как в основном цикле работать, пару строчек же осталось..
Насчет глобальных переменных - высказывания о них, что вы приводили выше это просто степень максимализма (не ваши высказывания, уточню), почти юношеского. Большая машина и МК это разные вещи. Многие корифеи программирования не стесняются применять глобальные переменные. Это иногда делает код намного более надежным и очевидным... Все хорошо в меру, важно понимать зачем и как делать...
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18676
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

встряну и я.
сдается мне, процитированные высказывания были из книжек, которые "агитируют" за С++ или иной ООП-язык. а для традиционного Си все это гораздо менее актуально. к тому же ориентир микроконтроллерного программирования все еще больше направлен на создание компактного и быстрого кода, а в этом контексте использовать в обработчике прерывания обращение к "интерфейсной" функции для воздействия на некий глобальный флаг из другого модуля - это, мягко говоря, ни скоростью, ни компактностью не пахнет.

думаю, что прививать в МК-программировании ВСЕ безусловно полезные рекомендации из "большого" программирования так же нелепо, как использовать ассемблерные вставки в программе. обрабатывающей базы данных на ПК. на мой взгляд куда важнее прививать стиль написания, нежели стращать "дорогой в ад через глобальные переменные". вы еще про goto расскажите :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср апр 16, 2008 13:22:54
Откуда: Приднестровье, Тирасполь

Сообщение Goodefine »

ARV писал(а):...думаю, что прививать в МК-программировании ВСЕ безусловно полезные рекомендации из "большого" программирования так же нелепо..
Абсолютно верно. И пример выше это покажет, думаю. Инкапсулирование данных полезно, когда нужно ПРАВИЛЬНОЕ ИЗМЕНЕНИЕ данных - та же помянутая БД. Если вручную заполнять поля получим крах почти гарантированно. Инкапсуляция рулит, раз написали и забыли, дальше интерфейсные функции. НО, в примере выше (который сплошь и рядом встречается), важно не столько изменение (правильное, неправильное - все равно), а сам факт изменения (который упирается в однократность выполнения). Т.е. нам нужно прочитать, выполнить один раз, сбросить флаг и все. Как бы мы сейчас ни изголялись с инкапсуляцией этого бедного флага, придем к тому все равно, что в любом месте программы мы сможем его сбросить, а значит допустим возможность НЕвыполнения нужного участка кода. Да, мы не сможем его установить, чтобы выполнить лишний раз, но иногда пропуск еще хуже. Т.е. получим кучу лишних оберток без реальной пользы, которые уверят нас в ложной безопасности... Я уже не говорю о том, что обработчик в общем случае нельзя безболезненно разместить в файле с интерфейсными функциями, ведь в нем могут исрользоваться данные также из других модулей.

Понятно, что убедить друг друга мы не сможем - у каждого сложившиеся субъективные взгляды, ну а у кого нет - тот почитает и сам сделает выводы...
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Опытный кот
Аватара пользователя
Сообщения: 736
Зарегистрирован: Пн янв 10, 2011 03:06:36
Откуда: Ростов-на-Дону

Сообщение Goldsmith »

Goodefine писал(а):Да вот не совсем. Что будет обнулять функция clearFlag() не понятно...
Прошу прощения, второпях ерунду написал. Конечно же, следует читать:

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

void clearFlag(void)
{
  синхронизация
  flag = 0;
}
То есть единственный способ обратиться к флагу - через функцию, которая осуществляет заведомо синхронизированныхй доступ.
Goodefine писал(а):Как в основном цикле работать, пару строчек же осталось..
В основном цикле вместо

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

if(flag)
вызываем

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

if (flagIsSet())
, вместо -

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

clearFlag(void);
. Те же действия, только гарантированно синхронизированные, без возможности прямого доступа к флагу.

Конечно, данный пример вырожденный, поскольку доступ к однобайтной переменной и так атомарный. Замените его, скажем, на чтение 16-разрядных данных из АЦП, и необходимость в синхронизации станет гораздо очевиднее.
Goodefine писал(а):Насчет глобальных переменных - высказывания о них, что вы приводили выше это просто степень максимализма (не ваши высказывания, уточню), почти юношеского.
Вообще-то эти "юноши" уже давно седы, и именно они превращают программирование из шаманства в инженерную дисциплину. Но их книги лучше критиковать после прочтения, а не вместо.
Goodefine писал(а):Большая машина и МК это разные вещи.
Не настолько, чтобы программировать их принципиально по-разному. Если есть желание - сравните свежий ARM и "большую" ЭВМ недавнего прошлого.
Goodefine писал(а):Многие корифеи программирования не стесняются применять глобальные переменные. Это иногда делает код намного более надежным и очевидным...
Если многие, процитируйте двоих-троих, пожалуйста. Желательно, конечно, не кулибиных местного разлива, а оставивших заметный след в информатике в виде книг и публикаций (прошивки мигалок в "Радио" и т.п. не в счет, само собой).
Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет.
J. Ganssle
Контактная информация:
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср апр 16, 2008 13:22:54
Откуда: Приднестровье, Тирасполь

Сообщение Goodefine »

дубль
Последний раз редактировалось Goodefine Чт апр 07, 2011 19:17:24, всего редактировалось 1 раз.
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср апр 16, 2008 13:22:54
Откуда: Приднестровье, Тирасполь

Сообщение Goodefine »

Goldsmith писал(а): Те же действия, только гарантированно синхронизированные, без возможности прямого доступа к флагу.
И что мешает написать clearFlag(void); где угодно сорвав выполнение нужного кода?
Goldsmith писал(а): Конечно, данный пример вырожденный, поскольку доступ к однобайтной переменной и так атомарный.
Нифига себе вырожденный. Преременная именно однобайтный флаг, или вам, с огромным опытом, еще не доводилось испытывать необходимость работать именно с таким типом данных и именно в таком контексте? Да причем тут атомарность? Речь об изменении там где не надо. Атомарность это совсем другая опера, не имеющая к глобальным переменным прямого отношения, лишь затрагивающая одну из проблем...
Если многие, процитируйте двоих-троих, пожалуйста.
Да куда им супротив Макконела..
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Опытный кот
Аватара пользователя
Сообщения: 736
Зарегистрирован: Пн янв 10, 2011 03:06:36
Откуда: Ростов-на-Дону

Сообщение Goldsmith »

ARV писал(а):использовать в обработчике прерывания обращение к "интерфейсной" функции для воздействия на некий глобальный флаг из другого модуля - это, мягко говоря, ни скоростью, ни компактностью не пахнет.
Во-первых, в обработчике прерывания интерфейсные функции не используются, посмотрите внимательнее. Интерфейс нужен для доступа клиента к модулю.

Насчет скорости и компактности - попалась мне недавно любопытная статья. Не удержался, сделал перевод и опубликовал: http://club.shelek.ru/viewart.php?id=342

Собственно, я и раньше думал так же точно, но всегда приятно получить подтверждение от корифея.
ARV писал(а):на мой взгляд куда важнее прививать стиль написания, нежели стращать "дорогой в ад через глобальные переменные". вы еще про goto расскажите :)))
Правильно, но ведь именно это и есть стиль проектирования программ, а вовсе не исходный код с отступами лесенкой. А глобальные переменные от goto вовсе не так далеко ушли: в первом случае обращаюсь куда хочу, во втором - прыгаю где вздумается.
Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет.
J. Ganssle
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 736
Зарегистрирован: Пн янв 10, 2011 03:06:36
Откуда: Ростов-на-Дону

Сообщение Goldsmith »

Goodefine писал(а):И что мешает написать clearFlag(void); где угодно сорвав выполнение нужного кода?
В данном случае ничто не мешает. Мне был задан вопрос, каким образом можно обойтись без глобальных переменных. Я ответил конкретно на него. Безопасное использование флага - это другой вопрос, на который, соответственно, и ответ будет другим.
Goodefine писал(а):или вам, с огромным опытом, еще не доводилось испытывать необходимость работать именно с таким типом данных и именно в таком контексте?
Давайте попробуем ограничиться обсуждением существа вопроса, а не моего огромного опыта (и прочих атрибутов, огромных и не очень). Диалог с переходом на личности гораздо охотнее поддержат работники ближайшего рынка, у них это обычно куда лучше получается, чем у меня.
Goodefine писал(а):Да куда им супротив Макконела..
Понял, вопросов больше нет.
Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет.
J. Ganssle
Контактная информация:
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср апр 16, 2008 13:22:54
Откуда: Приднестровье, Тирасполь

Сообщение Goodefine »

Goldsmith писал(а):Мне был задан вопрос, каким образом можно обойтись без глобальных переменных. Я ответил конкретно на него. Безопасное использование флага - это другой вопрос, на который, соответственно, и ответ будет другим.
Я, конечно не обладаю абсолютной ясностью изложения, но понять вроде можно было, что меня интересует не замена глобальной переменной на функцию, способную ее изменить, а понять, чем же так плох глобальный флаг, именно в таком контексте. Ведь так и в ад недалеко, если верить умным книжкам... И как правильно это сделать. Но ответа, разумеется, не последовало..
Goldsmith писал(а):...Давайте попробуем ограничиться обсуждением существа вопроса, а не моего огромного опыта
Простите конечно, не понял только почему вас тогда интересует только опыт "корифеев" в информатике-математике, и пр. пр. Вопрос был вполне адеватный, если слово "огромный" вас каким то образом задевает, давайте его опустим. Тогда вопрос по существу проступит со всей ясностью: чем плохо данное конкретное применение (не коня в вакууме) глобальной переменной и как сделать намного лучше, с точки зрения инкапсуляции? Надеюсь, теперь немного понятней, что я имел ввиду?
Goldsmith писал(а):Понял, вопросов больше нет.
И вам не хворать :beer:
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»