votează SUA (6)

Există o modalitate de compilare de a detecta/preveni valorile duplicate într-o enumerare C/C++?

Trucul este că există mai multe elemente care sunt inițializate cu valori explicite .

Fundal:

Am moștenit ceva cod C, cum ar fi:

#define BASE1_VAL (5) #define BASE2_VAL (7) typedef enumerare (MsgFoo1A = BASE1_VAL, // 5 MsgFoo1B, // 6 MsgFoo1C, // 7 MsgFoo1D, // 8 MsgFoo1E, //o92Vs, //o din nou ... // Uh oh! 8 din nou ...) FOO;

Problema este că, pe măsură ce codul crește și pe măsură ce dezvoltatorii adaugă mai multe mesaje grupului MsgFoo1x, în cele din urmă depășește BASE2_VAL.

Acest cod va fi portat în cele din urmă la C ++, deci dacă există doar o soluție C ++ (magie șablon?), E ok - dar o soluție care funcționează cu C și C ++ este mai bună.

Există mai multe modalități de a verifica acest timp de compilare, dar este posibil să nu funcționeze întotdeauna pentru dvs. Începeți prin a introduce valoarea markerului „marker” chiar înainte de MsgFoo2A.

typedef enumerare (MsgFoo1A = BASE1_VAL, MsgFoo1B, MsgFoo1C, MsgFoo1D, MsgFoo1E, MARKER_1_DONT_USE, / * Nu folosiți această valoare, dar lăsați-o aici. * / MsgFoo2A = BASE2_VAL, MsgFoo2B) FOO;

Acum avem nevoie de o modalitate de a ne asigura că MARKER_1_DONT_USE< BASE2_VAL во время компиляции. Есть два распространенных метода.

Matrice de dimensiuni negative

A apărut o eroare la declararea unei matrice cu o dimensiune negativă. Arată puțin urât, dar funcționează.

extern int IGNORE_ENUM_CHECK [MARKER_1_DONT_USE> BASE2_VAL? - unsprezece ];

Aproape fiecare compilator scris vreodată generează o eroare dacă MARKER_1_DONT_USE este mai mare decât BASE_2_VAL. GCC scuipă:

Test. c: 16: eroare: dimensiunea matricei „IGNORE_ENUM_CHECK” este negativă

Afirmații statice

Dacă compilatorul dumneavoastră acceptă C11, puteți utiliza _Static_assert. Suportul C11 nu este omniprezent, dar compilatorul poate suporta _Static_assert oricum, mai ales că funcția corespunzătoare C ++ este acceptată pe scară largă.

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

GCC emite următorul mesaj:

Test. c: 16: 1: eroare: afirmația statică a eșuat: „Valorile de enumerare se suprapun”. _Afirmare_statică (MARKER_1_DONT_USE< BASE2_VAL , "Enum values overlap." ); ^

O altă abordare ar putea fi să folosiți ceva de genul gccxml (sau mai convenabil pygccxml) pentru a identifica candidații pentru inspecția manuală.

Nu știu nimic despre ce va verifica automat toți membrii unei enumerari, dar dacă doriți să verificați că modificările viitoare ale inițializatoarelor (sau macrocomenzile pe care se bazează) nu provoacă conflicte:

comutator (0) (caz MsgFoo1A: pauză; caz MsgFoo1B: pauză; caz MsgFoo1C: pauză; caz MsgFoo1D: pauză; caz MsgFoo1E: pauză; caz MsgFoo2A: pauză; caz MsgFoo2B: pauză;)

va avea ca rezultat o eroare a compilatorului dacă oricare dintre valorile integrale este reutilizată și majoritatea compilatorilor vă vor spune chiar care valoare (valoare numerică) a fost problema.

Nu cred că există o modalitate de a detecta acest lucru cu limbajul în sine, având în vedere că există cazuri imaginabile în care doriți ca două valori de enumerare să fie la fel. Cu toate acestea, puteți oricând să vă asigurați că toate elementele specificate în mod explicit sunt în partea de sus a listei:

typedef enumerare (MsgFoo1A = BASE1_VAL, // 5 MsgFoo2A = BASE2_VAL, // 7 MsgFoo1B, // 8 MsgFoo1C, // 9 MsgFoo1D, // 10 MsgFoo1E, // 12B) // 12B)

Atâta timp cât valorile atribuite sunt în partea de sus, nu are loc nicio coliziune decât dacă, dintr-un motiv oarecare, macrocomenzile se extind la valori care sunt aceleași.

De obicei, această problemă este depășită prin furnizarea unui număr fix de biți pentru fiecare grup MsgFooX și asigurându-vă că fiecare grup nu se depășește, acesta alocă numărul de biți. Soluția Număr de biți este bună, deoarece permite testarea pe biți pentru a determina cărui grup de mesaje aparține ceva. Dar nu există o funcție de limbaj încorporată pentru aceasta, deoarece există cazuri legitime pentru o enumerare care are două valori identice:

typedef enum (gri = 4, // Gry ar trebui să fie același gri = 4, culoare = 5, // Are, de asemenea, sens în unele cazuri couleur = 5) FOO;

Deși nu avem o reflecție completă, puteți remedia această problemă dacă puteți restabili valorile de enumerare.

Undeva se declara asta:

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

în altă parte construim acest mecanism:

șablon< typename S , S s0 , S ... s >struct first_nut_same_as_rest: std :: true_type (); șablon< 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 ... >:: valoare> (); șablon< typename S , S ... s >structura este_distintă: std :: tip_adevărat (); șablon< typename S , S s0 , S ... s >struct is_distinct: std :: integral_constant< bool , std :: is_distinct < S , s ...>:: valoare && first_nut_same_as_rest< S , s0 , s ... >:: valoare> ();

Odată ce aveți acest hardware (care necesită C++ 11), putem face următoarele:

static_assert (este_distinct< E , A , B >:: valoare, „Au fost detectate valori duplicate în E”);

iar la compilare ne asigurăm că nu există două elemente.

Acest lucru necesită O (n) adâncime de recursivitate, iar O (n ^ 2) funcționează de către compilator în timpul compilării, așa că pentru enumări extrem de mari, acest lucru poate cauza probleme. AO (lg (n)) și O (n lg (n)) funcționează cu un factor constant mult mai mare, se poate face mai întâi sortând lista de elemente, dar aceasta este mult mai mult.

Cu codul de conversie enumerat sugerat pentru C ++ 1y-C ++ 17, acest lucru ar fi realizabil fără elemente repetate.

Nu mi-a plăcut niciunul dintre răspunsurile deja postate aici, dar mi-au dat câteva idei. Cea mai importantă metodă este să folosiți răspunsul lui Ben Voight la utilizarea unei declarații switch. Dacă mai multe cazuri din switch au același număr, veți primi o eroare de compilare.

Cel mai util pentru mine, și poate posterul original, nu necesită nicio capacitate C ++.

Pentru a curăța lucrurile, am folosit răspunsul aaronps: Cum pot evita să mă repet atunci când creez o enumerare C ++ și o structură de date dependentă?

Mai întâi definiți-l într-un antet undeva:

#define DEFINE_ENUM_VALUE (nume, valoare) nume = valoare, #define CHECK_ENUM_VALUE (nume, valoare) nume de caz: #define DEFINE_ENUM (nume_enum, valori_enum) \ typedef enum (valori_enum (DEFINE_ENUM_VALUE)) nume_enum; #define CHECK_ENUM (nume_enum, valori_enum) \ void nume_enum ## _test (nulat) (comutați (0) (enum_values ​​​​(CHECK_ENUM_VALUE);))

Acum, când trebuie să aveți o enumerare:

#define COLOR_VALUES (GEN) \ GEN (Roșu, 1) \ GEN (Verde, 2) \ GEN (Albastru, 2)

În cele din urmă, aceste rânduri sunt necesare pentru listarea reală:

DEFINE_ENUM (culoare, COLOR_VALUES) CHECK_ENUM (culoare, COLOR_VALUES)

DEFINE_ENUM creează un tip de date de enumerare. CHECK_ENUM efectuează o funcție de testare care include toate valorile de enumerare. Compilatorul se va bloca la compilarea CHECK_ENUM dacă aveți duplicate.

Este deja clar din însăși definiția unui semn că principala sa caracteristică este funcția sa reprezentativă inerentă: a fi un reprezentant, sau un substitut, într-un limbaj dat al unui obiect (definit). Și asta - sens semn. Semnificația semnelor verbale poate fi obiecte în sensul larg al cuvântului - tot ceea ce poate fi cumva distins și numit, despre care ceva este afirmat sau infirmat. De remarcat că semnificațiile sunt, în primul rând, obiecte ale realității extralingvistice – naturale și sociale. O altă caracteristică esențială a unei mărci verbale este semnificația sa. Sensexpresie lingvistică Este o informație formatată verbal asociată cu aceasta, care vă permite să distingeți obiectul pe care îl reprezintă (sau un set de obiecte de același tip) între alte obiecte. De exemplu, sensul cuvântului „Lună” - în utilizarea sa obișnuită - poate fi o caracteristică a acestuia ca „un satelit natural al Pământului”; sensul propoziției germane „DerSchneeistwei” în rusă este reprodus de propoziția „Zăpada este albă”; sensul cuvântului „furt” este „furt secret al proprietății altcuiva” etc.

Rețineți că pentru același obiect (sau un set de obiecte), sunt posibile caracteristici distinctive diferite. Aceasta înseamnă că două expresii diferite pot avea semnificații diferite, dar același sens, de exemplu, „triunghi echilateral” și „triunghi echilateral”. Sunt numite cuvinte (sau expresii) cu același înțeles echivalentÎn plus, același cuvânt poate avea mai multe sensuri și, prin urmare, poate exprima concepte (sensuri) diferite. Acest fenomen se numește ambiguitate... Ambiguitatea cuvintelor este nepotrivită în comunicarea științifică și profesională.

Sensul este o legătură de legătură între un cuvânt și obiectul pe care îl denotă. A da sens unei expresii lingvistice este o modalitate logică importantă de a introduce termeni noi într-o limbă și de a clarifica semnificațiile cuvintelor deja existente.

Când vorbim despre sens, ne referim Drept sensul cuvintelor și expresiilor, spre deosebire de, de exemplu, indirect, figurativ („aur alb”, „aur negru”, „muște pe aripile iubirii” și alte expresii metaforice care indică doar o anumită asemănare a unor obiecte, procese, fenomene cu altele). Sensul direct trebuie de asemenea distins de „literal”, sau etimologic sensul ("geografia" înseamnă literal o descriere a Pământului, "a minți" înseamnă literal "a vorbi", "a vorbi", etc.).

În ceea ce privește sensul și sensul, este general acceptat în logică că sensul unui semn este o funcție a sensului său. Aceasta subliniază rolul special al sensului: indică fără ambiguitate obiectul indicat de semn, distingându-l mental de multe altele.

Este clar că atât societatea, cât și fiecare persoană în parte trebuie să aibă un anumit stoc de cuvinte care sunt corelate cu semnificațiile lor fără mijlocul de semnificație. Aici avem utilizarea cuvintelor ca semne, a căror legătură cu semnificațiile cărora se stabilește în procesul de pronunțare a unui cuvânt și percepția senzorială simultană a semnificației acestuia, de exemplu, culoarea („roșu”), mirosul, configurația spațială a obiect desemnat etc.

Toată lumea știe împărțirea expresiilor limbajului natural în părți de vorbire. În „gramatica” logică există o subdiviziune similară, dar pe o bază diferită, și anume, în funcție de tipul de obiecte ale gândirii reprezentate de cuvinte (sau fraze).

Primul tip de obiecte va include articole individuale. Vom considera astfel de obiecte de cunoaștere ca obiecte unice, fiecare dintre ele având o diferență individuală față de obiectele de același tip: numărul 7, căsătoria lui A.S. Pușkin, Luna etc. Categoria logică a expresiilor lingvistice corespunzătoare subiectelor individuale este singur nume. Semnificația lor este informația asociată acestora, ceea ce face posibilă distingerea fără ambiguitate a acestui singur obiect de setul de obiecte de același tip. Exemple de astfel de nume: „Petru 1”, „Actualul președinte al Federației Ruse”, „Autorul romanului” Eugen Onegin ”, „Sărbătoarea a 66 de ani de la Ziua Victoriei asupra Germaniei naziste”, etc. Numele unice sunt împărțite în descriptiv (complex)și pe nedescriptiv (simplu) nume. Exemple de nume simple (nedescriptive) sunt cuvintele „Everest”, „Yu.A. Gagarin ", exemple de nume complexe (descriptive) -" Primul cosmonaut-pilot "," Cel mai mare râu din Europa. "

Al doilea tip de obiecte sunt proprietățile obiectelor și relația dintre ele. Vor fi numite expresiile care reprezintă astfel de obiecte în limbaj universale... Exemple de universale: cuvântul „masă” din afirmația „Acest tabel este rotund”; cuvântul „frate” din proclamația „Ivan este fratele lui Petru”; cuvântul „crimă” în afirmația „Furtul este o crimă”. Universalul se caracterizează prin faptul că poate îndeplini un rol dublu într-o propoziție: 1) face parte din „predicatul” logic, adică reprezintă orice proprietate sau relație atribuită obiectelor, ca în exemplul „Acest tabel este rundă"; în această funcţie se vor numi universalii predicate; 2) să fie un „subiect” logic, adică reprezintă în enunț un obiect luat în mod arbitrar al unui anumit set de obiecte de același tip, fiecare dintre ele având o proprietate corespunzătoare, ca în exemplul „Orice crima periculos pentru societate.” Astfel de universale vor fi numite subiecte.

Al treilea tip de obiecte este situații (starea de lucruri)... Categoria logică a expresiilor lingvistice corespunzătoare situaţiilor este propoziții narative. De exemplu, prezența unei situații în care Volga se varsă în Marea Caspică este reprodusă în propoziția „Volga se varsă în Marea Caspică”, iar situația în care suma unghiurilor unui triunghi este egală cu 180 ° este reprodusă. în propoziția „Suma unghiurilor unui triunghi este egală cu 2d”, etc. Situațiile pot fi simple sau complexe, în funcție de faptul că propozițiile care le reprezintă sunt simple sau complexe. Exemple de propoziții complexe și, în consecință, situații: „Dacă un număr este divizibil cu 6, atunci este divizibil cu 2”; „Jan și tatăl lui erau acasă în acel moment”.

Sensul propoziției este judecata. Diferența dintre o judecată și o propoziție (ca formă de semn de judecată) poate fi observată atunci când comparăm două propoziții care sunt traduceri corecte dintr-o limbă naturală în alta: structurile semnelor sunt diferite, dar sensul lor este același. Sensul propozițieiși există judecată. Întrucât vorbim despre analiza logică a limbajului, sensul propoziției este considerat a fi oricare dintre obiectele abstracte. Adevărat sau Minciuna. Astfel, afirmația „Volga se varsă în Marea Caspică” înseamnă adevăr (deoarece această propunere reproduce situația în realitate), iar afirmația „Volga se varsă în Marea Neagră” este o minciună (din moment ce nu corespunde realității). ).

Fiecare știință are termeni specifici ei. Se poate vorbi despre termeni matematici: „număr”, „figură geometrică”, „mult”; există termeni fizici precum „masă”, „particulă elementară”, „sarcină electrică”; în biologie apar termenii „celulă”, „organism”, „ereditate”; în medicină - „simptom”, „sindrom”, „boală”; în jurisprudență - „normă juridică”, „infracțiune”, „furt”. Aceste expresii constituie categoria termeni descriptivi(Descriere latină - descriere), fiecare dintre acestea fiind un obiect specific, o proprietate sau un set de obiecte similare etc. În analiza noastră, termenii descriptivi sunt nume și universale.

În limbajul oricărei științe, pe lângă termenii descriptivi care caracterizează obiectele din domeniul propriu, se folosesc expresii care sunt folosite în toate știința. Acestea includ unele dintre particule și conjuncții, cum ar fi „și”, „sau”, „dacă, atunci”, „fals că”, „atunci și numai atunci”. Cu ajutorul acestor termeni, din enunțuri (judecăți) simple se formează enunțuri complexe (compuse). Același grup de termeni „interdisciplinari” include expresiile „este” („esență”), „toți” („fiecare”), „unii” („există”), „nu”, cu ajutorul cărora simplu și simplu judecăți multiple (generale și particulare) Ele constituie o categorie termeni logici(constante booleene).

Nicio judecată nu poate fi exprimată fără termeni logici. Ei își definesc structura extrem de generală - formă logică, le sunt asociate relații logice și legile logicii. Unii dintre acești termeni sunt uneori omiși de dragul conciziei discursului, ca, de exemplu, în proverba „Omul este muritor”. În analiza logică a judecăților, suntem obligați să refacem toate aceste „lacune”, ceea ce ne permite să clarificăm conținutul lor logic, să rezolvăm problema adevărului sau falsității lor. În special, afirmația tocmai citată va lua următoarea formă: „Toți oamenii sunt muritori”. Și deși după o astfel de reconstrucție și completare aceste propoziții devin uneori oarecum incomode, gândurile exprimate de ele capătă claritate și certitudine.

Să analizăm situația actuală.

Mai întâi, să aflăm de ce metode diferite de măsurare a aceleiași înălțimi au condus la rezultate diferite.

La prima vedere, prima metodă este cea mai fiabilă. Aplicăm o bandă de măsurare pe suprafața clădirii și determinăm înălțimea dorită. O analiză mai atentă arată că acest lucru nu este în întregime adevărat. Se dovedește că clădirea are o pantă ușoară, iar peretele din locul în care se fac măsurătorile are o anumită curbură - este convex, și spre stradă. Aceasta înseamnă că nu am măsurat înălțimea clădirii, ci lungimea peretelui asociată cu înălțimea.

A doua modalitate este măsurarea indirectă. După ce am măsurat timpul căderii mingii, calculăm înălțimea folosind formula binecunoscută pentru căderea liberă: h = gt 2/2. De data aceasta, măsurarea atinge cu adevărat înălțimea. Dar, am uitat că mingea se mișcă în aer și, prin urmare, experimentează rezistența mediului. Prin urmare, valoarea calculată prin formulă nu este, de asemenea, valoarea adevărată a înălțimii clădirii.

A treia dimensiune, ca și a doua, este indirectă. Înălțimea este determinată din considerente geometrice: într-un triunghi dreptunghic, lungimea catetei opuse este egală cu produsul lungimii catetei adiacente cu tangentei unghiului. În cazul nostru, înălțimea joacă rolul unui picior, iar distanța de la laser la clădire joacă rolul altuia. De data aceasta am fost conduși de presupunerea unei suprafețe perfect orizontale pe care stă clădirea. Rezultat - din nou măsurat o valoare care nu este înălțimea, dar acum dintr-un motiv diferit.

Deci, în fiecare metodă există câteva factori permanenți(în fiecare caz al lor, și pot fi mai multe dintre ele), care duc la apariție eroare sistematică măsurători în acest fel. De fiecare dată când valoarea aceleiași mărimi este măsurată în aceleași condiții, eroarea sistematică are aceeași valoare. Dacă acești factori sunt luați în considerare prin introducerea corecțiilor corespunzătoare, atunci este posibil să se abordeze valoarea reală a mărimii măsurate și atunci rezultatele măsurării în moduri diferite (ținând cont de corecțiile pentru eroarea sistematică) se pot dovedi a fi destul de închide. Prin urmare, în principiu, erorile sistematice pot fi luate în considerare și chiar excluse deși a face acest lucru în practică poate fi destul de descurajantă.

Acum să încercăm să aflăm de ce măsurătorile multiple de aceeași înălțime în același mod (inclusiv același set de instrumente) pot duce la valori diferite. Acest lucru se datorează unui număr de factori aleatori... În exemplul luat în considerare, pot exista mici vibrații mecanice ale solului, clădirilor și dispozitivelor, efecte termice asociate cu modificarea dimensiunilor liniare ale peretelui și a dispozitivelor utilizate etc. În sfârșit, există și factorul uman asociat cu percepția proceselor în desfășurare și reacția la această percepție. Ca urmare, cu măsurători repetate ale aceleiași cantități, pot fi obținute valori diferite asociate erori aleatorii... De la măsurare la măsurare, o eroare aleatorie își poate schimba atât semnul, cât și valoarea. Datorită naturii aleatorii a impacturilor este imposibil de prezis în prealabil amploarea unei astfel de erori .



Analiza noastră ridică întrebări legitime:

1. Care este valoarea „adevărată” a mărimii măsurate?

2. Cum se prezintă rezultatele măsurătorilor ținând cont de erori?

Întrucât aceste întrebări privesc nu numai exemplul luat în considerare, ci

și orice alte măsurători, vom trece la generalizări și la elaborarea de recomandări generale.

Acest exemplu specific a demonstrat o proprietate comună comună oricărei măsurători - orice măsurătoare este însoțită de erori .

În cele din urmă, această proprietate se datorează faptului că fiecare măsurătoare presupune un anumit lanț interconectat de participanți la procedura de măsurare: observator – aparat de măsurare – obiect analizat – „mediu extern”.

Elementele acestui lanț sunt conectate printr-un număr mare de interacțiuni și mișcări. În timpul procesului de măsurare, obiectul analizat, dispozitivul de măsurare și observatorul pot fi supuse diferitelor influențe (inclusiv reciproce), care afectează rezultatul măsurării.

Desigur, dacă reducem influențele care nu sunt direct legate de procedura de măsurare și încercăm să ținem cont de influențele inevitabile, atunci precizia măsurătorilor noastre va crește. Dar o măsurare absolut exactă este imposibilă în principiu. Și acest lucru se datorează în mare măsură naturii cantităților măsurate în sine.



Dacă, de exemplu, dorim să măsurăm cu absolut exactitate lungimea unei tije metalice, atunci vom descoperi prezența unor vibrații fundamental inevitabile (deși foarte mici) ale rețelei cristaline. Lanseta nu are o lungime "adevărată" absolut exactă. Se modifică în mod constant aleatoriu, deviând într-o direcție sau alta de la unele dintre cele mai comune valori. Putem lua această valoare ca valoare „adevărată” a lungimii și în viitor să operam cu ea, vorbind despre lungimea tijei, sau folosind această valoare pentru orice calcule, de exemplu, pentru a determina volumul tijei.

Acest tip de situație se găsește în multe alte dimensiuni. Mărimile măsurate în sine se pot schimba aleatoriu, ceea ce se datorează, așa cum sa menționat deja mai sus, naturii fizice a acestor mărimi. Astfel, ne confruntăm cu inevitabilitatea fundamentală a factorilor aleatori ... Ele pot fi minimizate, dar nu pot fi eliminate complet. Prin urmare, atunci când prezentăm rezultatele măsurătorilor, trebuie să oferim informații cu privire la estimarea noastră a valorii „adevărate” a unei cantități, ținând cont de erorile aleatorii de măsurare (cu condiția ca eroarea sistematică să fie exclusă sau luată în considerare sub forma unei corectări corespunzătoare). Este clar că astfel de informații pot fi prezentate cel mai complet pe baza rezultatelor măsurătorilor multiple.

Nu neobișnuit în rusă. Foarte des, același cuvânt poate fi folosit pentru a numi și/sau descrie obiecte sau fenomene complet diferite. Astfel de cuvinte au un singur sens de bază - originalul, literal și unul (sau mai multe) - figurat, figurat, metaforic. Acesta din urmă apare de obicei pe baza unei trăsături, asemănări, asocieri.

Exemple de substantive poliseme

Există multe exemple de cuvinte cu sens dublu printre substantive. Iată doar câteva dintre ele:

Cuvânt Sensul direct Sensul figurativ
Bilet Bilet de avion sau de tren, bilet de teatru sau cinema. Biletul de examen.
Crest Instrument de periere a părului, pieptene. Creasta unui val sau munte.
Cuvânt Unitate de vorbire. Genul literar. De exemplu, „Cuvântul despre regimentul lui Igor”.
Mână Partea corpului - mana dreapta, mana stanga.
  • Poziția, poziția unei persoane - „El este mâna mea dreaptă”.
  • „Scris de mână”, mod de execuție, lovitura de autor recunoscută – „mâna unui mare artist”.
  • Forța fizică este o „mână grea”.
Perie Mâna este partea corpului de la încheietură până la vârful degetelor. Un instrument pentru pictura cu vopsele.
Muncă Munca fizică, efortul, ocupația unei persoane. Rezultatul vizibil al muncii fizice este „Bună treabă!”
Foaie O frunză care crește pe un copac. O foaie de hârtie, caiet sau foaie de peisaj.
Rădăcină Rădăcina copacului. Partea copacului care este sub pământ.
  • Rădăcina matematică a unui număr. De exemplu, rădăcina lui 4 este 2.
  • Cauza unui fenomen sau eveniment este „rădăcina răului”, „rădăcina problemelor”.
Datorie Suma de bani sau valoarea materială promisă de o persoană altuia este rezultatul împrumutului. Luptă morală pentru ceva, datorie morală.

Aceasta nu este întreaga listă. Probabil că este pur și simplu imposibil să compune totul, pentru că în limba rusă există aproape la fel de multe cuvinte cu dublă semnificație, câte sunt fără ambiguitate.

Exemple de adjective polisemantice

Diferite obiecte nu pot fi numite doar cu un singur cuvânt, ci și caracterizate. Iată câteva exemple de astfel de cuvinte:

Cuvânt Sensul direct Sensul figurativ
Oţel Facut din otel. De exemplu, un cuțit de oțel. Foarte puternic, de nezdruncinat - „nervi de oțel”.
Aur Din aur - „cercei de aur”, „colier de aur”. Foarte valoros, amabil, cu calități morale remarcabile - „om de aur”, „copil de aur”, „inima de aur”.
Greu Luarea unui efort fizic foarte mare – „muncă grea”. Despre ceva ce este greu de suportat pentru alții - „o persoană dificilă”, „un personaj dificil”.
alb Alb - „zăpadă albă”, „foaie albă”. O poezie fără rimă este un „vers gol”.
Negru Negru - „ochi negri”, „marker negru”. Furios, sarcastic, atingând subiecte sensibile într-o formă grosolană - „umor negru”, „comedie neagră”.

Din nou, lista este incompletă. În plus, lista de cuvinte cu dublă semnificație poate include adjective care descriu culori, mirosuri și/sau gusturi în același timp: portocală, zmeură, lămâie, prune și așa mai departe.

Exemple de verbe poliseme

Cuvintele de acțiune pot avea, de asemenea, mai multe semnificații:

Cuvânt Sensul direct Sensul figurativ
Așezați-vă Stai pe un scaun, pe un scaun, pe un cal. Urcă-te în tren (nu stai literalmente pe acoperișul trenului, ci la figurat - ia-ți locul în el).
Coborâți / coborâți Poți să cobori din tren, să cobori la stația dorită, să mergi la magazin. „Du-te/innebunește”.
Bate Lovitură. „Izvorul țâșnește cu fântână”, „viața este în plină desfășurare”.
A tăia Împărțiți în bucăți cu un cuțit sau altă lamă ascuțită. Provoacă o senzație neplăcută - „lumina doare ochii”, „sunetul doare urechea”.

Cel mai adesea, cuvintele cu sens dublu sunt inițial cuvinte rusești. Termenii împrumutați au de obicei un singur sens.

Diferențele față de omonime

Este foarte important să distingem cuvintele cu sens dublu de omonime: cuvinte diferite care sunt scrise la fel. Cuvintele polisemice au un sens direct, de bază și sunt transferate în funcție de anumite caracteristici. Pentru omonime, toate semnificațiile sunt independente. „mâner” (uşă) şi „mâner” (scris) sunt omonime, deoarece nu există nicio legătură între ele. Dar cuvântul „satelit” este ambiguu – corpul ceresc a fost numit „satelit” pentru că se mișcă în jurul planetei, ca un satelit uman.