Думи с двойно значение: определение, примери за употреба. Множество измервания на едно и също количество по един и същи начин могат да дадат различни стойности. Примери за многозначни съществителни



гласувайте САЩ (6)

Има ли начин за компилация за откриване/предотвратяване на дублирани стойности в C/C++ enum?

Уловката е в това има няколко елемента, които са инициализирани с изрични стойности .

Заден план:

Наследих някакъв C код като:

#define BASE1_VAL (5 ) #define BASE2_VAL (7) typedef enum ( MsgFoo1A = BASE1_VAL , // 5 MsgFoo1B , // 6 MsgFoo1C , // 7 MsgFoo1D , // 8 MsgFoo1D , // 8 MsgFoo1D , // 8 MsgFoo1D , // 8 MsgFoo1D , // 8 MsgFoo1D , // 8 MsgFoo1D , //oo2 F !7 отново... MsgFoo2B // Uh oh!8 отново... ) FOO ;

Проблемът е, че с нарастването на кода и докато разработчиците добавят повече съобщения към групата MsgFoo1x, в крайна сметка той ще препълни BASE2_VAL .

Този код в крайна сметка ще бъде пренесен на C++, така че ако има само C++ решение (магия на шаблони?), това е добре - но решение, което работи с C и C++, е по-добро.

Има няколко начина да проверите това време за компилиране, но те не винаги работят за вас. Започнете, като вмъкнете стойността на маркера "marker" точно преди MsgFoo2A.

typedef enum ( MsgFoo1A = BASE1_VAL , MsgFoo1B , MsgFoo1C , MsgFoo1D , MsgFoo1E , MARKER_1_DONT_USE , /* Не използвайте тази стойност, но я оставете тук. */ MsgFoo2A = BASE2_VAL, MsgFoo2B) FOO;

Сега имаме нужда от начин да гарантираме, че MARKER_1_DONT_USE< BASE2_VAL во время компиляции. Есть два распространенных метода.

Масиви с отрицателен размер

Грешка при деклариране на масив с отрицателен размер. Изглежда малко грозно, но работи.

extern int IGNORE_ENUM_CHECK [ MARKER_1_DONT_USE > BASE2_VAL ? - единадесет];

Почти всеки компилатор, написан някога, генерира грешка, ако MARKER_1_DONT_USE е по-голямо от BASE_2_VAL. GCC изплюва:

тест. c: 16: грешка: размерът на масива „IGNORE_ENUM_CHECK“ е отрицателен

Статични твърдения

Ако вашият компилатор поддържа C11, можете да използвате _Static_assert. Поддръжката за C11 не е повсеместна, но вашият компилатор може да поддържа _Static_assert така или иначе, особено след като съответната функция в C++ е широко поддържана.

_Static_assert(MARKER_1_DONT_USE< BASE2_VAL , "Enum values overlap." );

GCC издава следното съобщение:

тест. c : 16 : 1 : грешка: статичното твърдение не бе успешно: "Enum стойности се припокриват." _Static_assert(MARKER_1_DONT_USE< BASE2_VAL , "Enum values overlap." ); ^

Друг подход може да бъде използването на нещо като gccxml (или по-удобно pygccxml) за идентифициране на кандидати за ръчна проверка.

Не съм наясно с нищо, което автоматично ще проверява всички членове на enum, но ако искате да проверите дали бъдещите промени в инициализаторите (или макросите, на които разчитат) не причиняват конфликти:

ключ (0) ( случай MsgFoo1A : прекъсване ; случай MsgFoo1B : прекъсване ; случай MsgFoo1C : прекъсване ; случай MsgFoo1D : прекъсване ;

ще доведе до грешка в компилатора, ако някоя от интегралните стойности се използва повторно, а повечето компилатори дори ще ви кажат коя стойност (числова стойност) е била проблемът.

Не вярвам, че има начин да се открие това със самия език, като се има предвид, че има възможни случаи, в които искате две стойности на enum да са еднакви. Въпреки това, винаги можете да се уверите, че всички изрично дадени елементи са в горната част на списъка:

typedef enum ( MsgFoo1A = BASE1_VAL , // 5 MsgFoo2A = BASE2_VAL , // 7 MsgFoo1B , // 8 MsgFoo1C , // 9 MsgFoo1D , // 10 MsgFoo1E , //gFoo1E , //gFoo1 Ms ; //gFoo1B)

Докато присвоените стойности са в горната част, не се случва сблъсък, освен ако по някаква причина макросите не се разширят до стойности, които са същите.

Обикновено този проблем се преодолява чрез предоставяне на фиксиран брой битове за всяка група от MsgFooX и гарантиране, че всяка група не препълва, тя разпределя броя на битовете. Решението "брой битове" е добро, защото позволява побитово тестване, за да се определи към коя група съобщения принадлежи нещо. Но няма вградена езикова функция за това, тъй като има законни случаи за enum с две еднакви стойности:

typedef enum ( сиво = 4 , //Gry трябва да е същото сиво = 4 , цвят = 5 , // Също така има смисъл в някои случаи couleur = 5) FOO ;

Въпреки че нямаме пълно отражение, можете да разрешите този проблем, ако можете да възстановите стойностите на enum.

Някъде е декларирано:

enum E ( A = 0 , B = 0 );

другаде изграждаме този механизъм:

шаблон< typename S , S s0 , S ... s >struct first_not_same_as_rest : std::true_type(); шаблон< typename S , S s0 , S s1 , S ... s >struct first_not_same_as_rest : std::integral_constant< bool , (s0 != s1 ) && first_not_same_as_rest < S , s0 , s ... >::стойност>(); шаблон< typename S , S ... s >struct is_distinct : std::true_type(); шаблон< typename S , S s0 , S ... s >структура is_distinct : std::integral_constant< bool , std :: is_distinct < S , s ...>:: стойност && first_not_same_as_rest< S , s0 , s ... >::стойност>();

След като имате този хардуер (който изисква C++11), можем да направим следното:

static_assert ( is_distinct< E , A , B >:: стойност , "открити дублиращи се стойности в E");

и по време на компилиране гарантираме, че няма два елемента.

Това изисква O(n) дълбочина на рекурсията, а O(n^2) стартира компилатора по време на компилиране, така че за изключително големи изброявания това може да причини проблеми. AO(lg(n)) и O(n lg(n)) работят при много по-голям постоянен коефициент, може да се направи като първо се сортира списъкът с елементи, но това е много повече.

С кода за преобразуване на enum, предложен за C++1y-C++17, това ще бъде изпълнимо без повтарящи се елементи.

Не ми хареса нито един от вече публикуваните тук отговори, но ми дадоха някои идеи. Решаващият метод е да използвате отговора на Бен Войгт за използване на оператор switch. Ако няколко случая в превключвателя имат един и същ номер, ще получите грешка при компилация.

Най-полезен за мен и вероятно оригиналният плакат, това не изисква никакви C++ възможности.

За да изясня нещата, използвах aaronps answer: Как мога да избегна да се повтарям, когато създавам C++ enum и зависима структура от данни?

Първо го дефинирайте в някое заглавие някъде:

#define DEFINE_ENUM_VALUE (име, стойност) име = стойност, #define CHECK_ENUM_VALUE (име, стойност) име на случай: #define DEFINE_ENUM (име_име, избройни_стойности) \ typedef enum (enum_values ​​(DEFINE_ENUM_name) #define CHECK_ENUM (enum_name , enum_values ​​) \ void enum_name ## _test (void) ( switch(0) ( enum_values(CHECK_ENUM_VALUE); ) )

Сега, когато трябва да имате enum:

#define COLOR_VALUES (GEN) \ GEN (червено, 1) \ GEN (зелено, 2) \ GEN (синьо, 2)

И накрая, тези редове са необходими за действителното изброяване:

DEFINE_ENUM (Цвят, COLOR_VALUES) CHECK_ENUM (Цвят, COLOR_VALUES)

DEFINE_ENUM създава тип данни за enum. CHECK_ENUM изпълнява тестова функция, която включва всички стойности на enum. Компилаторът ще се срине при компилиране на CHECK_ENUM, ако имате дубликати.

Нека анализираме текущата ситуация.

Първо, нека разберем защо различните начини за измерване на една и съща височина са довели до различни резултати.

На пръв поглед първият метод е най-надеждният. Прилагаме рулетка към повърхността на сградата и определяме желаната височина. По-внимателният анализ показва, че това не е съвсем вярно. Оказва се, че сградата е с лек наклон, а стената на мястото, където се правят измерванията, има определена кривина - тя е изпъкнала, и то към улицата. Това означава, че не сме измервали височината на сградата, а дължината на стената, свързана с височината.

Вторият начин е непряко измерване. Чрез измерване на времето за падане на топката, ние изчисляваме височината, използвайки добре познатата формула за свободно падане: h = gt 2 /2. Този път измерването наистина е за височина. Но ние забравихме, че топката се движи във въздуха и следователно изпитва съпротивлението на средата. Следователно, изчислената по формулата стойност също не е истинската стойност на височината на сградата.

Третото измерение, както и второто, е косвено. Височината се определя от геометрични съображения: в правоъгълен триъгълникдължината на противоположния катет е равна на произведението на дължината на съседния катет и тангенса на ъгъла. В нашия случай височината играе ролята на единия крак, а разстоянието от лазера до сградата играе ролята на друг. Този път бяхме разочаровани от предположението за идеално хоризонтална повърхност, върху която стои сградата. Резултатът - отново измерена стойност, която не е височина, но сега по друга причина.

И така, във всеки метод има някои фиксирани фактори(във всеки случай, свои собствени и може да има няколко), които водят до появата системна грешкаизмервания по този начин. Всеки път, когато стойността на една и съща величина се измерва при едни и същи условия, систематичната грешка има същата стойност. Ако тези фактори се вземат предвид чрез въвеждане на съответните корекции, тогава е възможно да се доближи до реалната стойност на измерената величина и тогава резултатите от измерванията по различни методи (като се вземат предвид корекциите за систематична грешка) могат да се окажат като доста близо. По този начин, по принцип системните грешки могат да бъдат взети предвид и дори изключени , въпреки че това може да се окаже доста предизвикателство на практика.

Сега нека се опитаме да разберем защо многократните измервания на една и съща височина по същия начин (включително един и същ набор от инструменти) могат да доведат до различни стойности. Свързва се с редица случайни фактори. В разглеждания пример може да има малки механични вибрациипочва, сграда и уреди, топлинни ефекти, свързани с промяна в линейните размери на стената и използваните уреди и др. И накрая, съществува и човешкият фактор, свързан с възприемането на протичащите процеси и реакцията на това възприятие. В резултат на това многократните измервания на едно и също количество могат да доведат до различни стойности, свързани с случайни грешки. От измерване до измерване, една случайна грешка може да промени както знака, така и величината си. Поради случайния характер на ефектите невъзможно е предварително да се предвиди големината на такава грешка .



Нашият анализ повдига основателни въпроси:

1. Каква е "истинската" стойност на измерената величина?

2. Как се представят резултатите от измерването, като се вземат предвид грешките?

Тъй като тези въпроси засягат не само разглеждания пример, но

и всякакви други измервания, ще преминем към обобщения и разработване на общи препоръки.

Този конкретен пример показа обща собственост, характерно за всякакви измервания, – всяко измерване е придружено от грешки .

Това свойство в крайна сметка се дължи на факта, че всяко измерване включва определена взаимосвързана верига от участници в процедурата на измерване: наблюдател - измервателно устройство - анализиран обект - "външна среда".

Елементите на тази верига са свързани голямо количествовзаимодействия и движения. По време на процеса на измерване анализираният обект, измервателният уред и наблюдателят могат да бъдат подложени на различни влияния (включително взаимни), което се отразява на резултата от измерването.

Разбира се, ако намалим влиянията, които не са пряко свързани с процедурата на измерване, и се опитаме да вземем предвид неотстранимите влияния, тогава точността на нашите измервания ще се увеличи. Но абсолютно точно измерване е невъзможно по принцип. И това до голяма степен се дължи на естеството на самите измервани величини.



Ако например искаме да измерим абсолютно точно дължината на метален прът, тогава ще открием наличието на фундаментално неотстраними (макар и много малки) вибрации на кристалната решетка. Няма абсолютно точна "истинска" дължина за пръчката. Тя непрекъснато се променя произволно, отклонявайки се в една или друга посока от някаква най-често срещана стойност. Можем да приемем тази стойност като „истинска“ стойност на дължината и впоследствие да работим с нея, като говорим за дължината на пръчката или използваме тази стойност за всякакви изчисления, например, за да определим обема на пръчката.

Този вид ситуация се среща в много други измерения. Самите измерени величини могат да се променят произволно, което се дължи, както вече беше споменато по-горе, на физическата природа на тези величини. Така сме изправени пред фундаментална неотменимост на случайни фактори . Те могат да бъдат сведени до минимум, но не могат да бъдат напълно елиминирани. следователно, когато представяме резултатите от измерванията, трябва да дадем информация относно нашата оценка на "истинската" стойност на количеството, като се вземат предвид случайните грешки при измерването (при условие, че системната грешка е изключена или взета предвид под формата на подходяща корекция). Ясно е, че такава информация може да бъде представена най-пълно от резултатите от множество измервания.

Не е рядкост на руски език. Много често една и съща дума може да се нарича и/или характеризира напълно различни обекти или явления. Такива думи имат едно основно значение - оригинално, буквално и едно (или повече) - образно, образно, метафорично. Последното обикновено възниква на базата на някаква особеност, прилика, асоциация.

Примери за многозначни съществителни

Сред съществителните можете да намерите много примери за думи с двойно значение. Ето само няколко от тях:

дума пряко значение Образно значение
Билет Билет за самолет или влак, билет за театър или кино. Билет за изпит.
Гребен Инструмент за разресване, четка за коса. Гребен на вълна или планина.
дума речева единица. литературен жанр. Например "Сказката за похода на Игор".
Ръка Част от тялото - дясна ръка, лява ръка.
  • Позиция, позиция на човек - "Той е моята дясна ръка."
  • „Почерк”, начин на изпълнение, разпознаваем авторски щрих – „ръката на голям художник”.
  • Физическа сила - "тежка ръка".
Четка Ръката е част от тялото от китката до върховете на пръстите. Инструмент за боядисване.
Работете Физически труд, усилия, човешка професия. Видимият резултат от физическия труд е „Добра работа!“.
Лист Лист, растящ на дърво. Лист хартия, тетрадка или пейзажен лист.
корен Корен на дърво. Частта от дървото, която е под земята.
  • Математическият корен на число. Например, коренът от 4 е 2.
  • Причината за някакво явление или събитие е "коренът на злото", "коренът на проблемите".
Дежурство Парична сума или материална стойност, обещана от едно лице на друго, резултат от заемане. Морално желание за нещо, морален дълг.

Това не е целият списък. Вероятно е просто невъзможно да се състави всичко, защото в руския има почти толкова думи с двойно значение, колкото и еднозначните.

Примери за многозначни прилагателни

Разни предметиедна дума може не само да назове, но и да характеризира. Ето няколко примера за такива думи:

дума пряко значение Образно значение
стомана Изработена от стомана. Например стоманен нож. Много здрав, непоклатим - "стоманени нерви".
злато Изработени от злато - "златни обеци", "златно колие". Много ценен, мил, притежаващ изключителен морален характер- "златен човек", "златно дете", "златно сърце".
Тежка Поемане на голямо количество физически усилия - "упорита работа". За нещо, което другите трудно издържат – „тежък човек“, „тежък характер“.
Бяла Бяло - "бял сняг", "бял чаршаф". Стихотворение без рима е "празен стих".
Черен Черен цвят - "черни очи", "черен маркер". Ядосан, саркастичен, засягащ чувствителни теми по груб начин – „черен хумор”, „черна комедия”.

Отново списъкът е непълен. Освен това списъкът с думи с двойно значение може да включва прилагателни, които едновременно описват цветове, миризми и/или вкусове: портокал, малина, лимон, слива и т.н.

Примери за полисемантични глаголи

Думите за действие също могат да имат повече от едно значение:

дума пряко значение Образно значение
седни Седнете на стол, във фотьойл, на кон. Качете се във влака (не седнете буквално на покрива на влака, а в преносен смисъл – заемете мястото си в него).
Слизай / слизай Можете да слезете от влака, да слезете на желаната спирка, да отидете до магазина. "Побъркай / полудей"
Бийте Стачка. „Изворът е чешма“, „животът е в разгара си“.
Разрез Разделете на парчета с нож или друго остро острие. Предизвиква неприятно усещане - "светлината боли очите", "звукът боли ухото".

Най-често думите с двойно значение са родни руски думи. Заимстваните термини обикновено имат същото значение.

Разлики от омоними

Много е важно да се разграничат думите с двойно значение от омоними: различни думи, които се изписват еднакво. В многозначни думиима пряко, основно значение и прехвърлено на някаква основа. Омонимите имат независими значения. "дръжка" (врата) и "дръжка" (писване) са омоними, тъй като няма връзка между тях. Но думата "сателит" е двусмислена - небесното тяло е наречено "сателит", защото се движи около планетата, като човешки спътник.

От самото определение на знака вече става ясно, че основната му характеристика е присъщата му представителна функция: да бъде представител или заместител на даден език на някакъв (определен) обект. И този - смисълзнак. Значението на словните знаци могат да бъдат обекти в широк смисълдуми - всичко, което по някакъв начин може да бъде отделено и назовано, за което нещо се утвърждава или отрича. Трябва да се отбележи, че на първо място, обектите на екстралингвистична реалност, естествени и социални, действат като значения. Друга съществена характеристика на словесния знак е неговото значение. смисълезиков израз- това е словесната формализирана информация, свързана с него, която ви позволява да разграничите обекта, който представлява (или набор от обекти от същия тип) сред другите обекти. Например, значението на думата "Луна" - в обичайната й употреба - може да бъде такава характеристика за нея като "естествен спътник на Земята"; значението на немското изречение "DerSchneeistwei" на руски език се възпроизвежда от изречението "Снегът е бял"; значението на думата "кражба" е "тайна кражба на чуждо имущество" и т.н.

Имайте предвид, че за един и същ обект (или набор от обекти) са възможни различни отличителни характеристики. Това означава, че два различни израза могат да имат различни значения, но едно и също значение, като "равноъгълен триъгълник" и "равностранен триъгълник". Наричат ​​се думи (или фрази) със същото значение еквивалентен.Освен това една и съща дума може да има няколко значения и следователно да изразява различни концепции(значения). Такова явление се нарича неяснота. Многозначността на думите е неуместна в научната и професионалната комуникация.

Значението е връзката между думата и обекта, който тя обозначава. Придаването на смисъл на някои езикови изрази е важен логически начин за въвеждане на нови термини в езика и изясняване на значенията на думите, които вече са в него.

Когато говорим за смисъл, имаме предвид правзначението на думите и фразите, за разлика, например, от непряк, фигуративен („бяло злато”, „черно злато”, „лети на крилете на любовта” и други метафорични изрази, които показват само известно сходство на едни обекти, процеси, явления с други). Прякото значение също трябва да се разграничава от "буквалното" или етимологичензначение („география“ буквално означава описване на Земята, „лъжа“ буквално означава „да говоря“, „говоря“ и т.н.).

По отношение на значението и значението в логиката е обичайно да се приема, че значението на знака е функция от неговото значение. Това подчертава особената роля на значението: то недвусмислено сочи към обекта, обозначен със знака, като мислено го подчертава от много други.

Ясно е, че както обществото, така и всеки отделен човек трябва да има определен запас от думи, които да са съотнесени със значенията им без посредничеството на значението. Тук имаме използването на думи като знаци, връзката със значенията на които се установява в процеса на произнасяне на думата и едновременното сетивно възприемане на нейното значение, например цвят („червено“), мирис, пространствена конфигурация на обозначения обект и др.

Всеки знае разделянето на изразите на естествения език на части на речта. В логическата "граматика" има подобно подразделение, но на различна основа, а именно в зависимост от вида на мисловните обекти, представени от думи (или фрази).

Първият тип обекти ще включва единични обекти. Ще разглеждаме като единични обекти такива обекти на познание, всеки от които има индивидуална разлика от обекти от същия тип с него: числото 7, бракът на A.S. Пушкин, Луна и др. Логическата категория на езиковите изрази, съответстващи на единични обекти е единичен имена.Тяхното значение е свързаната с тях информация, която позволява недвусмислено да се разграничи този единичен обект от множество обекти от същия тип с него. Примери за такива имена: „Петър 1“, „Настоящият президент на Руската федерация“, „Автор на романа „Евгений Онегин“, „Честване на 66-та годишнина от Победата над нацистка Германия" и т.н. Единичните имена се подразделят на описателен (сложен)и нататък неописателен (прост)имена. Примери за прости (неописателни) имена са думите "Еверест", "Ю.А. Гагарин", примери за сложни (описателни) имена - "Първият пилот-космонавт", "Най-голямата река в Европа".

Вторият тип обекти са свойствата на обектите и връзките между тях. Ще наречем изрази, които представляват обекти от този вид в езика универсали. Примери за универсали: думата "маса" в изявлението "Тази маса е кръгла"; думата "брат" в твърдението "Иван е брат на Петър"; думата „престъпление“ в твърдението „Кражбата е престъпление“. Универсалното се характеризира с това, че може да играе двойна роля в изречение: 1) съставлява част от логическото „предикат“, т.е. представляват всяко свойство или релация, приписана на обекти, както в примера „Тази таблица е кръгъл»; в тази функция ще бъдат извикани универсалите предикати; 2) да бъде логически "субект", т.е. представят в изявлението произволно взет обект от определен набор от обекти от същия тип, всеки от които има съответно свойство, както в примера „Всяко престъплениетоопасни за обществото." Такива универсали ще се наричат субекти.

Третият тип обекти са ситуации (състояния на нещата). подходящи ситуации логическа категорияезиковите изрази са разказни изречения.Например, наличието на ситуацията, при която Волга се влива в Каспийско море, се възпроизвежда в изречението "Волга се влива в Каспийско море", а ситуацията, когато сумата от ъглите на триъгълник е равна на 180 °, се възпроизвежда в изречението "Сборът от ъглите на триъгълник е 2d" и т.н. Ситуациите могат да бъдат прости или сложни, в зависимост от това дали изреченията, които ги представят, са прости или сложни. Примери за сложни изречения и, съответно, ситуации: „Ако числото се дели на 6, то се дели на 2“; „Янг и баща му бяха вкъщи по това време.“

Значението на изречението е присъда. Разликата между присъда и изречение (като знакова форма на съждение) може да се види, когато сравним две изречения, които са правилни преводи от един естествен език на друг: знаковите структури са различни, но значението им е едно и също. Значението на изречениетои има присъда. Тъй като говорим за логическия анализ на езика, значението на изречението е всеки един от абстрактните обекти вярноили лъжа.По този начин твърдението „Волга се влива в Каспийско море“ означава вярно (тъй като това изречение възпроизвежда ситуацията, която се случва в действителност), а твърдението „Волга се влива в Черно море“ е лъжа (защото не отговаря на реалността ).

Всяка наука има специфични термини за това. Можете да говорите за математически термини: "число", "геометрична фигура", "множество"; има физически термини като "маса", "елементарна частица", "електричен заряд"; в биологията се появяват термините "клетка", "организъм", "наследственост"; в медицината - „симптом”, „синдром”, „болест”; в юриспруденцията - "правна норма", "престъпление", "кражба". Тези изрази съставляват категорията описателни термини(лат. description - описание), всеки от които е специфичен обект, някакво свойство или съвкупност от обекти от един и същи вид и пр. В нашия анализ описателните термини са имена и универсалии.

В езика на всяка наука, в допълнение към описателните термини, които характеризират обектите от собствената й предметна област, се използват изрази, които се използват във всички науки. Те включват някои от частиците и съюзите като "и", "или", "ако, тогава", "не е вярно това", "тогава и само тогава". С помощта на тези термини се образуват сложни (съставни) твърдения от прости твърдения (съждения). Същата група от „интердисциплинарни“ термини включва изразите „е“ („същност“), „всички“ („всеки“), „някои“ („съществуват“), „не“, с помощта на които просто единствено число и множествено число са изградени (общи и частни) съждения.Те съставляват категория логически термини(логически константи).

Без логически термини не може да се изрази преценка. Определят ги до крайност цялостна структуралогическа форма, свързани с тях логически отношенияи законите на логиката. Някои от тези термини понякога се пропускат с цел краткост, както в „Човекът е смъртен“. При логическия анализ на съжденията ние сме длъжни да възстановим всички тези „пропуски“, което ни позволява да изясним тяхното логическо съдържание, да разрешим въпроса за тяхната истинност или невярност. По-специално, току-що цитираното изявление ще приеме следната форма: „Всички мъже са смъртни“. И въпреки че след такава реконструкция и завършване тези изречения понякога стават някак неудобни, изразените от тях мисли придобиват яснота и сигурност.