Котуинко

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15562
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Котуинко

Сообщение BOB51 »

Ладныть...
объекты
Класса и структуры - типы данных "контейнерного вида"...
Это в принципе не слишком уж и сложно.
Относительно extern...
верно ли я понимаю:
объявляется к данным в заголовочнике "родительского комплекта (*.h &*.cpp)"
видна всем комплектам файлов текущего проекта без дополнительных объявлений в местах применения.
:roll:
Наиболее сложно воспринималось для случая, когда "родительский комплект" это заголовочник для main (*.ino)
поскольку объявленные там переменные и так "общие для всех"... одначе в случае с последующей "выкусью"...
Возможно таки extern и имеет смысл... надо попробовать...
:roll:
В ассемблере несколько по иному -
в "родительском комплекте" заявляется как global,
а по месту применения снова заявляем как extrn...
Бум тренироваться...
:write:
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Котуинко

Сообщение ARV »

extern в Си (как в С++ не знаю, но должно быть похоже) просто говорит компилятору: "узбагойзя, это существует на самом деле". Но вот обеспечить реальное существование " этого" должен программист, иначе потом линкер возмутился: "ты же говорил, что существует, а я не нашёл!"
Поскольку extern ничего не объявляет, после него вполне может быть объявление того самого, и это не только не будет ошибкой, но даже будет именно то, что надо.

Добавлено after 2 minutes 14 seconds:
По умолчанию global все, что не static, но его не видно из других мест. Поэтому и надо в других местах использовать extern: суслика не видно, но он есть.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
arkhnchul
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Re: Котуинко

Сообщение arkhnchul »

[uquote="BOB51",url="/forum/viewtopic.php?p=3700289#p3700289"]объявляется к данным в заголовочнике "родительского комплекта (*.h &*.cpp)"[/uquote]не обязательно
[uquote="BOB51",url="/forum/viewtopic.php?p=3700289#p3700289"]видна всем комплектам файлов текущего проекта без дополнительных объявлений в местах применения.[/uquote]тут все как обычно - если описание переменной есть где-то в тексте текущего исходника (или в заголовочнике - после include он как раз "где-то в тексте"), то компилятор о ней знает и может использовать.
[uquote="BOB51",url="/forum/viewtopic.php?p=3700289#p3700289"]Наиболее сложно воспринималось для случая, когда "родительский комплект" это заголовочник для main (*.ino)
поскольку объявленные там переменные и так "общие для всех"...[/uquote]с чего бы?
[uquote="BOB51",url="/forum/viewtopic.php?p=3700289#p3700289"]В ассемблере несколько по иному -
в "родительском комплекте" заявляется как global,
а по месту применения снова заявляем как extrn...[/uquote]тут ровно так же, только без global. extern пишется как раз по месту применения.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15562
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Котуинко

Сообщение BOB51 »

[uquote="arkhnchul",url="/forum/viewtopic.php?p=3700493#p3700493"]...
[uquote="BOB51",url="/forum/viewtopic.php?p=3700289#p3700289"]В ассемблере несколько по иному -
в "родительском комплекте" заявляется как global,
а по месту применения снова заявляем как extrn...[/uquote]тут ровно так же, только без global. extern пишется как раз по месту применения.[/uquote]
Так если переменная объявлена в своем комплекте файлов как extern, а тот комплект входит в состав проекта...
Объявлять ее еще в тех местах, где будет использоваться? (т.е. допустим в *.h заголовочника главного проекта и/или в тех комплектах, что вторично ею пользоваться могут)...
Это уже "двойное определение" от компилятора можно заполучить...
:dont_know:
Технически объявление только в одном комплекте должно иметь место.
Посикоку в примерах мне попадался extern только во "внешних комплектах", а в основном файле при применении никаких излишних "лобавок"... вот и получается, что объявление переменной extern производится по месту "зародыша", а не по месту применения...?
:dont_know:
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Котуинко

Сообщение ARV »

Я ж вам говорил, что extern ничего не объявляет, и компилятор не будет ругаться.

Писать его надо обязательно "по месту применения", а " по месту определения" можно писать, а можно и обойтись. То есть заголовок с extern по месту определения не повредит, а по месту применения необходим.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
arkhnchul
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Re: Котуинко

Сообщение arkhnchul »

[uquote="BOB51",url="/forum/viewtopic.php?p=3700835#p3700835"]Так если переменная объявлена в своем комплекте файлов как extern, а тот комплект входит в состав проекта...
Объявлять ее еще в тех местах, где будет использоваться?[/uquote]эээ... вы точно знаете, что делает include?
Реклама
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15562
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Котуинко

Сообщение BOB51 »

Как-то вот так получается:
Место и назначение extren и «склеивающих» заголовочников в многофайловом проекте.
Стандартный многофайловик включает в себя главный комплект файлов
ino_main.h
ino_main.cpp (ino_main.c)
и несколько дополняющих комплектов файлов...
К примеру:
библиотека 1 – общая, но входит в состав компилятора «по умолчанию»
std_lib_ext.h
std_lib_ext.cpp
библиотека2 — полная самоделка
my_lib_ext.h
my_lib_ext.cpp
обнаружившийся обобщенный фрагмент, который пришлось вынести(«выкусь»)
my_kus.h
my_cus.cpp
Помимо прочего, относительно этих файлов имеются стандартные заголовочники комплектных библиотек компилятора.
Однако в случае с ардуино дело несколько похитрее — там набор «по умолчанию» в заголовочнике главного комплекта НЕ УКАЗЫВАЕТСЯ (уже где-то авторами IDE прописан и спрятан). А вот для дополнительных комплектов файлов выглядит как
//------------------------------------------------------------------------
// обязательная "магическая добавка" (начало)
#if ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
// обязательная "магическая добавка" (конец)
//------------------------------------------------------------------------
или в более современном варианте
#include "Arduino.h"
а уже в этом ( Arduino.h) заголовочнике проставлено все, что входит в состав референса «по умолчанию».
Как пример минимального обобщения — подключение заголовочников дополнительных комплектов файлов в заголовочнике главного комплекта
файл ino_main.h в нашем примере относительно ардуино должен содержать:
#include “my_lib_ext.h»
#include “my_kus.h»
файл подключения библиотек по умолчанию там уже есть (в отличии от «чистого Си, где их надо самому прописывать).
Для того, чтобы нормально работали самодельные внешние комплекты в каждом из них надо обязательно добавить «магическую добавку».
В принципе... Ежли бы дело касалось простых самодельных библиотек тем бы и ограничилось. Так как заголовочники внешних комплектов входят в состав заголовочника ino_main.h то все, что объявлено в их заголовочниках будет общим для содержимого в ino_main.cpp (ino_main.c).
Однако уже тут, на ранней стадии распределения объявлений могут получиться накладки.
Если имеется пара внешних комплектов файлов, имеющих общую часть.
Допустим та же кодовая таблица символов семисегментного индикатора.
Она общая и для драйвера дисплея и для главного комплекта и для «третьей стороны»...
В таком случае появляется внешний «объединяющий заголовочник» (можно и «мостом» назвать — кому как приятнее).
В том заголовочнике прописываются общие объявления констант и типов, применимо к соответствующим файлам комполектов. В моих последних проектах-примерах это dhsct.h
Соответственно он будет подключаться во всех заголовочниках
файл ino_main.h в нашем примере относительно ардуино должен содержать:
#include “my_lib_ext.h»
#include “my_kus.h»
#include “dhsct.h”
файл my_lib_ext.h будет содержать
#include "Arduino.h"
#include “dhsct.h”
а файл my_kus.h
#include "Arduino.h"
#include “dhsct.h”
При простом общем содержимом в виде дефайнов констант, типов этого достаточно.
Хуже, если появляется необходимость использования переменных, функций, объектов которые объявляются и инициализируются в одном комплекте файлов, а использоваться будут в разных комплектах за пределами «родительского» комплекта.
Пока использование внешне объявленных переменных касается только пределов главного комплекта файлов особо вопросов не возникает — там заголовочник библиотеки подключен в заголовочник главного комплекта «по умолчанию».
Но вот возникает необходимость выноса части текста исходника за его пределы...
И понеслось...
my_lib_ext.h УЖЕ является частью ino_main.h
Даже ежли мы его подключим в my_kus.h это решит лишь вопрос по константам да некоторым типам....
А ведь в самой «выкуси» наверняка полно перекрестных ссылок, в том числе и на компоненты «внешних комплектов». Причем в состав тех компонентов входят и данные и объекты и функции...
Вот тут и всплывает extern...
А описания по ее применению таки совсем маловато... Относительно простых для восприятия...
По своей специфике extern таки лучше объявлять в отдельном *.h файлике, входящем в состав тех заголовочников, в которых имеется описание или применение того, что мы как extern объявили.
Причем описание (и инициализация) должна быть только в одном из комплектов файлов, а применение разрешено во всех, где подключен заголовочник с объявлением.
Как пример:
функция func(); описана в комплекте my_lib_ext, а применение ее будет происходить как в комплекте ino_main, так и в комплекте my_kus
создаем most.h в котором указываем
extern void func();
в файлах, где рассматривается применение func(); и ее описание(определение) в заголовочниках добавляем
#include “ most.h”
Хотя... как вариант:
объявление и описание находятся в комплекте файлов my_lib_ext
а уже заголовочник my_lib_ext.h подключаясь и в ino_main.h и в my_kus.h автоматически делает func(); доступной в пределах этих комплектов файлов.
(Так сделана библиотечка dscrc в inc_test2 варианте).

И в дополнение:
Не забываем в каждом из собственнолапных *.h файлов ставить защиту от переопределения:
// защита от переоперделения с заключительным
// #endif в конце файла
#ifndef NAME_H // на кириллице это ТЬФУ — имя нашего *.h файлика
#define NAME_H
далее содержимое
и завершается
#endif

:roll:

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

Re: Котуинко

Сообщение ARV »

какой-то поток сознания, в конце первой трети терпение читать кончилось.
все элементарно:

1.каждый исходник сопровождается собственным заголовком, в котором перечислены все сущности, доступные из этого исходника. само собой, внутри этого исходника этот же заголовок тоже подключается.

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

3. все, точка.

например:
имеем три исходника 1.с, 2.с и 3.с. соответственно имеем 1.h, 2.h и 3.h.
если в 2.с требуется использовать что-то из исходника 1.с, внутри 2.с мы подключаем 1.h. и так аналогично для остальных
если заголовки оформлены правильно (с "защитными" макросами), то никакой проблемы не будет, если в 1.h окажется добавлен 2.h.

не надо больше ничего додумывать и мудрить - вышенаписанного достаточно на все случаи жизни.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15562
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Котуинко

Сообщение BOB51 »

Не совсем так...
Допустим для того же семисегментника.
Драйвер вывода содержит только информацию о сегментах, да "урезанный знакогенератор" 0-F.
Больше ему и не требуется.
А основной проект применяет расширенный вариант -"кодовую страницу" кракозябровых символов, построенную на основе привязки к номерам, определенным в драйвере дисплея (для всяческих псевдосимвольных извратов).
Кодовая страница размещена в *.h файле основного проекта (или в заголовочнике драйвера - что менее удобно - в случае с "выкусью" придется ссылаться на "внешний объект" ежли в виде класса библиотека выполнена...).
все хорошо, пока программа описывается в пределах основного проекта.
А вот когда выделяем из основного исходника фрагмент "выкуси" где задействованы константы из "кодовой страницы", но не используется драйвер дисплея - внесение изменений в буфер видеопамяти (оный может быть как в рамках драйвера дисплея, так и в рамках основного файла проекта) нам или заголовочник драйвера подключать в "выкусь" или общий фрагмент заголовочника, содержащий объявление констант той кодовой страницы.
Поскольку десяток раз писать оную под каждый вариант нумерации сегментов влом... Да и при нескольких аналогичных по раскладек дисплейчиках так удобнее...
:dont_know:
То уже зависит от конкретики реализации прожки, да от ленивого нежелания по разным файлам лазить в плане переопределения аппаратных ресурсов. Или тыкаемся по каждому заголовочнику или в одном все "больные точки" складываем.
Результат в принципе одинаков.
:roll:

Писатель-теоретик из мя не ососбо... Посему буду готовить практическую сторону для примера (по мере возникновения прикладного интересу)...
:solder: :write:
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Котуинко

Сообщение ARV »

в заголовках при нормальном стиле программирования НЕ ДОЛЖНО БЫТЬ реализаций никаких "кодовых таблиц"!
то есть недопустимо писать

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

char codetable[TABLE_SIZE] = {1,2,3,4,5,6,7,8};
категорически недопустимо!
вместо этого такую строку надо помещать внутрь исходника, а в заголовке писать только декларацию

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

extern char codetable[TABLE_SIZE];
соответственно и с остальными вещами в виде переменных, массивов и т.п.

Добавлено after 4 minutes 49 seconds:
заголовок - это "каталог" доступных сущностей, а сами сущности рассованы по исходникам. вы же в библиотеке каталогом пользовались? в нем нет СОДЕРЖИМОГО книжек, а только ССЫЛКА на них с кратким ОПИСАНИЕМ содержимого.

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

Мой уютный бложик... заходите!
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15562
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Котуинко

Сообщение BOB51 »

Стоп...
Имелось ввиду вот такое:
Спойлер

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

// набор MAX7219 8-позиционник

#define s_A 6 // значение номера сегмента A
#define s_B 5 // значение номера сегмента B
#define s_C 4 // значение номера сегмента C
#define s_D 3 // значение номера сегмента D
#define s_E 2 // значение номера сегмента E
#define s_F 1 // значение номера сегмента F
#define s_G 0 // значение номера сегмента G
#define s_H 7 // значение номера сегмента H
и далее сама таблица констант, создаваемая препроцессором на основе произвольных номеров, приведенных выше:
Спойлер

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

/* "кодовая страница кракозябр 7-сегментных"
 раскладка сегментов по символам определяется стандартной разметкой A-H
 по условию, что активный уровень(сегмент астивен/светится) принят за 1 */

 #define fnt_bl 0
 #define fnt_0 (1<<s_A | 1<<s_B | 1<<s_C | 1<<s_D | 1<<s_E | 1<<s_F) // цмфра 0 или символ "О"
 #define fnt_1 (1<<s_B | 1<<s_C)
 #define fnt_2 (1<<s_A | 1<<s_B | 1<<s_D | 1<<s_E | 1<<s_G)
 #define fnt_3 (1<<s_A | 1<<s_B | 1<<s_C | 1<<s_D | 1<<s_G) // цифра 3 или символ "З"
 #define fnt_4 (1<<s_B | 1<<s_C | 1<<s_F | 1<<s_G) // цифра 4 или символ "Ч"
 #define fnt_5 (1<<s_A | 1<<s_C | 1<<s_D | 1<<s_F | 1<<s_G) // цифра 5 или символ "S"
 #define fnt_6 (1<<s_A | 1<<s_C | 1<<s_D | 1<<s_E | 1<<s_F | 1<<s_G)
 #define fnt_7 (1<<s_A | 1<<s_B | 1<<s_C)
 #define fnt_8 (1<<s_A | 1<<s_B | 1<<s_C | 1<<s_D | 1<<s_E | 1<<s_F | 1<<s_G)
 #define fnt_9 (1<<s_A | 1<<s_B | 1<<s_C | 1<<s_D | 1<<s_F | 1<<s_G)
 #define fnt_A (1<<s_A | 1<<s_B | 1<<s_C | 1<<s_E | 1<<s_F | 1<<s_G) // символ "A"
 #define fnt_b (1<<s_C | 1<<s_D | 1<<s_E | 1<<s_F | 1<<s_G) // символ "b"
 #define fnt_C (1<<s_A | 1<<s_D | 1<<s_E | 1<<s_F) // символ "C"
 #define fnt_d (1<<s_B | 1<<s_C | 1<<s_D | 1<<s_E | 1<<s_G) // символ "d"
 #define fnt_E (1<<s_A | 1<<s_D | 1<<s_E | 1<<s_F | 1<<s_G) // символ "E"
 #define fnt_F (1<<s_A | 1<<s_E | 1<<s_F | 1<<s_G) // символ "F"
 #define fnt_P (1<<s_A | 1<<s_E | 1<<s_F | 1<<s_G | 1<<s_B) // символ "P"
 #define fnt_L (1<<s_E | 1<<s_F | 1<<s_D) // символ "L"
 #define fnt_H (1<<s_B | 1<<s_C | 1<<s_E | 1<<s_F | 1<<s_G) // символ "H"
 #define fnt_U (1<<s_B | 1<<s_C | 1<<s_E | 1<<s_F | 1<<s_D) // символ "U"
 #define fnt_I (1<<s_E | 1<<s_F) // левая 1 или латинская I
 #define fnt_S (1<<s_A | 1<<s_C | 1<<s_D | 1<<s_F | 1<<s_G) // аналог цифры 5
 #define fnt_J (1<<s_A | 1<<s_B | 1<<s_C | 1<<s_D | 1<<s_E) // символ "J"
 #define fnt_r (1<<s_G | 1<<s_E) // символ "r"
 #define fnt_n (1<<s_G | 1<<s_E | 1<<s_C) // символ "п"
 #define fnt_c (1<<s_G | 1<<s_E | 1<<s_D) // символ "с"
 #define fnt_o (1<<s_G | 1<<s_E | 1<<s_D | 1<<s_C) // нижний кружок "о"
 #define fnt_u (1<<s_C | 1<<s_E | 1<<s_D) // символ "u"
 #define fnt_h (1<<s_C | 1<<s_E | 1<<s_F | 1<<s_G) // символ "h"
 #define fnt_rusg (1<<s_A | 1<<s_E | 1<<s_F) // символ "Г"
 #define fnt_rusP (1<<s_A | 1<<s_E | 1<<s_F | 1<<s_B | 1<<s_C) // символ "П"
 #define fnt_rus_iE (1<<s_A | 1<<s_B | 1<<s_C | 1<<s_D | 1<<s_G) // символ Э (инверсное Е)
 #define fnt_rusY (1<<s_F | 1<<s_G | 1<<s_B | 1<<s_C | 1<<s_D) // символ "У"
 #define fnt_qest (1<<s_A | 1<<s_B | 1<<s_E | 1<<s_G) // символ "?"
 #define fnt_rC (1<<s_A | 1<<s_B | 1<<s_C | 1<<s_D) // символ ) (обратная скобка)
 #define fnt_gradus (1<<s_A | 1<<s_B | 1<<s_F | 1<<s_G) // верхний кружок "символ грвдуса"
 #define fnt_minus (1<<s_G) // символ "-" (средняя черта)
 #define fnt_aplin (1<<s_A) // символ "верхняя черта"
 #define fnt_dnlin (1<<s_D) // символ "_" (нижняя черта)
 #define fnt_trlin (1<<s_A | 1<<s_G | 1<<s_D) // символ "три черты"
 #define fnt_coma (1<<s_H) // символ "," (децимальная точка)
а не массивы!
8)
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: Котуинко

Сообщение jcxz »

[uquote="ARV",url="/forum/viewtopic.php?p=3701554#p3701554"]категорически недопустимо![/uquote]
Допустимо. Но только константы: char const codetable[TABLE_SIZE] = {1,2,3,4,5,6,7,8};
А вот создавать объекты в ОЗУ с инициализацией их из flash, в тех случаях когда изменение этого объекта в run-time не требуется - действительно недопустимо... в грамотном коде. В быдлокоде конечно сойдёт...
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Котуинко

Сообщение ARV »

BOB51 писал(а):Имелось ввиду вот такое:
такое вообще по барабану - оно не занимает места в памяти. такое можно делать сколько угодно раз где угодно - максимум компилятор варнинг выдаст о повторном описании макроса. а если заголовок сделан по феншую, то и варнинга не будет :)
jcxz писал(а):Допустимо. Но только константы
и чо, компилятор не поругается на многократное определение массива?

Добавлено after 2 minutes 7 seconds:
кстати,BOB51, таблица - это как бы массив... а просто перечень констант - это не таблица :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15562
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Котуинко

Сообщение BOB51 »

Флэш - константы в ПЗУ для ардуиноподобных плохой тон.
Поскольку сама платформа подразумевает не только AVR МК, а проработка констант/строк в ПЗУ выполнена исключительно относительно АВРок, адаптация программы под иной МК (те же платформы с STM или ESP) может иметь проблемы.
8)
ARV
Это не просто перечень констант, а сгенерированный препроцессором по заранее заданному шаблону аппаратной реализации номеров сегментов конкретной версии индикатора набор констант сегментных кодов - его уже можно и кодовой таблицей обматюкать.
Зато весьма удобно перестраивать под новые аппаратные номера - только табличку номеров сегментов подправить - их там ВСЕГО 8 штук.
8)
Последний раз редактировалось BOB51 Пн сен 16, 2019 10:28:40, всего редактировалось 1 раз.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Котуинко

Сообщение ARV »

BOB51 писал(а):его уже можно и кодовой таблицей обматюкать.
вы можете называть что угодно как угодно, например, никто не запретит вам ворону называть стулом, а стул - индюком. только понимать вас никто не сможет.

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

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

Мой уютный бложик... заходите!
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15562
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Котуинко

Сообщение BOB51 »

НО... Тут ведь также - каждой константе присваивается своя кодовая комбинация (из набора нумерованных констант).
Сведенное в одно место - уже перечень как минимум.
:roll:
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Котуинко

Сообщение ARV »

BOB51, вы уже пожинаете плоды собственной терминологии - не понимаю вас. рекомендую придерживаться традиций :)

итак, что такое "кодовая таблица"? например, символ '0' в одной кодировке может быть представлен комбинацией битов 0b11101011, а в другой 0b01110111. так вот, мы создаем ТАБЛИЦУ символов: char table[10] = {0b11101011, ......}; и НУЛЕВОЙ элемент этой таблицы будет соответствовать СИМВОЛУ НОЛЬ, а остальные элементы - остальным символам. поменяется ТАБЛИЦА - поменяются и "представления" тех же символов, но всегда table[0] будет означать "изображение" НУЛЯ.

вот это - таблица. а SYMBOL_NULL - это не таблица, это просто КОД.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: Котуинко

Сообщение jcxz »

[uquote="BOB51",url="/forum/viewtopic.php?p=3701575#p3701575"]Флэш - константы в ПЗУ для ардуиноподобных плохой тон.
Поскольку сама платформа подразумевает не только AVR МК, а проработка констант/строк в ПЗУ выполнена исключительно относительно АВРок, адаптация программы под иной МК (те же платформы с STM или ESP) может иметь проблемы.[/uquote]
Что за бред... :shock:
const - часть языка си и есть под все системы. Везде его использую, и на ПК тоже. Хоть там и нет flash.
const говорит что объект не модифицируется в run-time. Хоть во флешь он находится хоть в ОЗУ.
А уже конкретная система позволяет размещать const-данные во флешь, если он имеется.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Котуинко

Сообщение ARV »

jcxz писал(а):const
это не означает размещение данных в неизменяемой области адресного пространства, это указание компилятору следить за тем, чтобы не было попытки изменить эти данные в пользовательском коде. только и всего.

именно поэтому ранее вы написали фигню:
jcxz писал(а):Допустимо. Но только константы: char const codetable[TABLE_SIZE] = {1,2,3,4,5,6,7,8};
- так делать нельзя, потому что компиляр обязательно возмутится многократным объявлением одного и того же "символа" codetable
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: Котуинко

Сообщение jcxz »

[uquote="ARV",url="/forum/viewtopic.php?p=3701600#p3701600"]
jcxz писал(а):const
это не означает размещение данных в неизменяемой области адресного пространства, это указание компилятору следить за тем, чтобы не было попытки изменить эти данные в пользовательском коде. только и всего.[/uquote]
Не только. Попробуйте попытаться записать что-то в const-объект на ПК. Получите исключение. Хоть он и находится в ОЗУ. И компилятор тут не при чём.
И в embedded-системах аналогично: в грамотно написанной программе на ARM, const-секции находятся в сегменте памяти, защищённом от записи (MPU или MMU). Неважно в ОЗУ этот сегмент находится или во флешь. И при попытке их модификации случится fault. И опять - компилятор тут не при чём.
Именно в грамотно написанной. Про быдлокод речь не идёт.

[uquote="ARV",url="/forum/viewtopic.php?p=3701600#p3701600"]
jcxz писал(а):Допустимо. Но только константы: char const codetable[TABLE_SIZE] = {1,2,3,4,5,6,7,8};
- так делать нельзя, потому что компиляр обязательно возмутится многократным объявлением одного и того же "символа" codetable[/uquote]
Попробуйте когда-нить хоть что-то написать на си. А не только всякий вздор в форуме. И скомпилировать. Сильно удивитесь. :)))

Добавлено after 23 minutes 48 seconds:
[uquote="ARV",url="/forum/viewtopic.php?p=3701572#p3701572"]такое можно делать сколько угодно раз где угодно - максимум компилятор варнинг выдаст о повторном описании макроса. а если заголовок сделан по феншую, то и варнинга не будет :)[/uquote]
Опять мимо кассы. Компилятор варнинг в таком случае не выдаст. Какие-то заголовки тут не при чём. Варнинг на переопределение #define выдаётся только если выражения в правой части #define разные. А в указанном сообщении выражения одинаковые. Так что всё будет прекрасно компилироваться без всяких магических заголовков.

PS: Не стоит писать о том, о чём понятия не имеете. Чтобы не садиться в лужу регулярно.... :dont_know:
Ответить

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