| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| C въпрос , грешка /предупреждение http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=14228 |
Страница 1 от 1 |
| Автор: | stefan63 [ Чет Дек 17, 2015 12:01 pm ] | |||||||||
| Заглавие: | C въпрос , грешка /предупреждение | |||||||||
Здравейте, Опитвам се да си сглобя някакво обобщено обработване на менюта на Си, Долният код го компилирам като C++ и като C . В първия случай ми дава грешка "main.cpp|56|error: cannot convert 'const singlefieldstruct* (*)[3]' to 'singlefieldstruct**' in initialization" Във втория случай му издава предупреждение ||=== Build: Release in pm1 (compiler: GNU GCC Compiler) ===| main.c|48|warning: initialization from incompatible pointer type warning: (near initialization for 'line1descriptor.fieldsinlineptrs') [enabled by default]| Изпълнението ми изглежда коректно. Това се случва на редовете отбелязани съсъ звездички. Какво предизвиква тия грешки/предупреждения, какво правя грешно?
|
||||||||||
| Автор: | radolin [ Чет Дек 17, 2015 12:48 pm ] |
| Заглавие: | Re: C въпрос , грешка /предупреждение |
Проблемът е, че при инициализацията предаваш const променлива към не-const такава. В декларацията на linedescriptorstruct, трябва да направиш singlefieldstruct const. Също обърни внимание на разликата между: const int*, const int * const, и int const *. В твоя случай май има смисъл и указателя и стойността да са const, ако не смяташ да променяш менюто по време на работа на програмата. |
|
| Автор: | stefan63 [ Чет Дек 17, 2015 1:13 pm ] |
| Заглавие: | Re: C въпрос , грешка /предупреждение |
не се справих, сложих "const" на const struct singlefieldstruct **fieldsinlineptrs; struct singlefieldstruct const **fieldsinlineptrs; struct singlefieldstruct ** const fieldsinlineptrs; const struct singlefieldstruct ** const fieldsinlineptrs; Все тая. Струва ми се ,че трябва да е нещо ,където са звездичките, където се цитират масивите с указатели. Менютата ще са фиксирани,тоест .всички са конст и с инициализиране. |
|
| Автор: | radolin [ Чет Дек 17, 2015 2:02 pm ] |
| Заглавие: | Re: C въпрос , грешка /предупреждение |
Сега гледам, че едното ти е pointer to pointer, другото array of pointers, което не е един и същи тип. Коато цяло на пръв поглед не мога да вникна точно в логиката ти (може би и поради липсата на коментари). |
|
| Автор: | radolin [ Чет Дек 17, 2015 2:29 pm ] | ||||||||||||||||||||||||||||||||||||
| Заглавие: | Re: C въпрос , грешка /предупреждение | ||||||||||||||||||||||||||||||||||||
Инсталирай си програмката 'cdecl' и после с нея можеш да си тестваш:
Също има разни правила, като четене отзад-напред и спираловидно: http://ieng9.ucsd.edu/~cs30x/rt_lt.rule.html http://c-faq.com/decl/spiral.anderson.html Не съм вниквал в логиката, но като се оправят типовете се компилира и при изпълнение извежда това на екрана:
За да се компилира са необходими следните промени (махнал съм и Уиндоус специфичните неща, за да тествам):
Ето и целия код:
|
|||||||||||||||||||||||||||||||||||||
| Автор: | stefan63 [ Чет Дек 17, 2015 4:38 pm ] | |||||||||
| Заглавие: | Re: C въпрос , грешка /предупреждение | |||||||||
Благодаря много Радолине, Компилира се на Си, много има да чета докато го схвана , особено това printf("\n%s _contains_ ",(*mymenu1.linesinmenuPTRS)[aa]->linenamecheck); Не ми е ясно дори как се назовава тая скоба със звездичка. Опитах и следното:
Съответно получих предупреждение: c:\work\probac\pm1\main.c|271|warning: assignment discards 'const' qualifier from pointer target type [enabled by default]| Отделно - от лшбопитсвто пуснах компилация като Си++. Продължава да дава грешки, въпреки корекциите. Сигурно още четене |
||||||||||
| Автор: | radolin [ Чет Дек 17, 2015 5:55 pm ] | ||||||||||||||||||||||||||||||||||||
| Заглавие: | Re: C въпрос , грешка /предупреждение | ||||||||||||||||||||||||||||||||||||
Това си е оператора * - pointer dereference. С него указва, че се интересуваш се от мястото към което сочи указателя, а не от стойността на самия указател. Скобите са като при всички други операции, за да укажеш приоритетите. Искаме първо на направим dereference (т.е да вземем на където сочи указателя) и чак след това да приложим оператора [] за да вземем елемент от масива. Членът linesinmenuPTRS на структурата mymeny1 ти е "указател към масив от указатели към структури от типа linedescriptorstruct". Ето нещата едно по едно: mymenu1 тип: структура от тип menudescriptorstruct mymenu1.linesinmenuPTRS елемента linesinmenuPTRS от структурата mymenu1 оператор: . достъп до член на структура тип: указател към масив от указатели към linedescriptorstruct *mymenu1.linesinmenuPTRS - накъдето сочи linesinmenuPTRS оператор: * pointer dereference тип: масив от указатели към структури от типа linedescriptorstruct (*mymenu1.linesinmenuPTRS)[aa] - елемент аа от въпросния масив оператор: [] достъп до елемент от масив тип: указател към структура от типа inedescriptorstruct (*mymenu1.linesinmenuPTRS)[aa]->linenamecheck - членът linenamecheck на структурата, към която сочи указателят (*mymenu1.linesinmenuPTRS)[aa] оператор: -> достъп до член на структура, чрез указател тип: масив от unsigned char
Ами то си ти казва точно за какво те предупреждава - mymenu1 ти е декларирано const, a ти правиш не-const указател към него, чрез който вече можеш да го модифицираш.
C++ някой по-компетентен да каже |
|||||||||||||||||||||||||||||||||||||
| Автор: | stefan63 [ Чет Дек 17, 2015 11:20 pm ] | |||||||||
| Заглавие: | Re: C въпрос , грешка /предупреждение | |||||||||
Благодаря за разясненията! Ще ги обмислям малко по-нататък и сигурно пак ще питам.
Утреще пробвам с "const" const struct menudescriptorstruct* menuwork; |
||||||||||
| Автор: | stefan63 [ Чет Дек 17, 2015 11:31 pm ] | |||||||||
| Заглавие: | Re: C въпрос , грешка /предупреждение | |||||||||
Обаче цял ден ме терзае начина ,по който реши проблема с масивите от указатели -
Тая дума "const" стои много странно по средата на дефиницията, а без нея не става. |
||||||||||
| Автор: | radolin [ Пет Дек 18, 2015 12:08 am ] | |||||||||
| Заглавие: | Re: C въпрос , грешка /предупреждение | |||||||||
Да, ако добавиш този const би трябвало да ти изчезне warning-a. |
||||||||||
| Автор: | radolin [ Пет Дек 18, 2015 12:16 am ] | |||||||||
| Заглавие: | Re: C въпрос , грешка /предупреждение | |||||||||
Предполагам, че по средата на дефиницията на структурата имаш предвид. Защо да е странно? Тя се отнася в случая само за елемента fieldsinlineptrs. По принцип може да махнеш всички const-ове и нещата ще си работят. Ползата от тях е, че ако си казал, че нещо не трябва да се променя, а после някъде из кода се опиташ да го промениш компилатора веднага ще ти изпищи. Съответно ще си хванеш грешката много по-рано и няма да загубиш дни и нощи в дебъгване на мистериозен проблем. Също евентуално може и да помогне на компилатора да оптимизира кода или къде се съхраняват променливите в някои случаи. |
||||||||||
| Страница 1 от 1 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|