Виж темите без отговор | Виж активните теми
Дата и час: Чет Мар 28, 2024 10:37 am
"C" въпрос, как се прави това?
Автор |
Съобщение |
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 10:22 pm Мнения: 3074
|
Re: "C" въпрос, как се прави това?
Днес малко се заиграх с pic24/XC16. uint16_t X,Y; unsigned long Z; Za=X*Y; Zb=(unsigned long)(X*Y); Zc=X;Zc=Zc*Y;
Za е реално младшата дума на произведението; Zb и Zc са коректни. Реших да погледна какво прави на ниско ниво...и изненада.
Zb - най-интересният случай, се пресмята като произведение на две long числа, по-дълго и по-бавно.Процесорът има специфична инструкция за умножение на две 16-битови с 32битов резултат, но тя не се използва(пряко) от компилатора в случая. Умножава младши , старши(нула) , кръстоосано (нула) и сумира. Има ли някакъв квалификатор на "C", който трябва да използвам, или това усложняване идва заради ограниченията в оптимизацията, и трябва да го заобиколя през асемблера ?
============== Off. Инсталирах MPLAB-X (в.4.последна), лаптоп W7-32 на I5. Очаквах трагедии с джавата, но работи цял ден задоволително, само с едно успиване в симулатора. Засега не съм закачал хардуер.
|
Сря Окт 10, 2018 6:49 pm |
|
|
TheWizard
Ранг: Форумен бог
Регистриран на: Сря Апр 27, 2005 11:48 am Мнения: 4670
|
Re: "C" въпрос, как се прави това?
няма, дори се съмнявам платения с оптимизация да използва хардуерното умножение ако го искаш - пишеш си конкретика Трагедии с java-та им от доста време не съм наблюдавал, верно, има си глупостите, ам те са навсякъде... edit: виж __builtin-совете дали няма нещо "оптимизирано" http://ww1.microchip.com/downloads/en/D ... Final1.pdfтърси __builtin_mul
_________________ main[-1u]={1};
|
Сря Окт 10, 2018 9:31 pm |
|
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 8:21 pm Мнения: 27949 Местоположение: София
|
Re: "C" въпрос, как се прави това?
Ами за пика не знам, но примерно кейла използва побитови операции само при конкретно дефинирана променлива, може и с умножението да е така,a може и компилатора изобщо да не е чувал за такава инструкция.
|
Чет Окт 11, 2018 2:35 am |
|
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 10:22 pm Мнения: 3074
|
Re: Пак, "C" въпрос, как се прави това?
Опитвам се да си измисля някакъв по-общ подход за създаване на меню на прост дисплей. И съответно се опитвам да дефинирам някакви данни и структури . Трябват ми менюта(екрани) с по няколко линии , с по един или няколко параметъра на линия . Сметнах ,че ми трябват 3 структури , една в друга . Една линията се описва като няколко двойки числа {номер на текст, номер на параметър}; Дотук добре. Втората структура трябва да включва две числа и указател към структура от предния тип. Същата грешка се получава и при последната структура, която трябва включи данните от втората структура Не можах да налучкам къде бъркам.
|
Пон Юни 29, 2020 3:00 pm |
|
|
ps66
Ранг: Форумен бог
Регистриран на: Пет Яну 19, 2007 8:16 am Мнения: 1063 Местоположение: путинофили: "иди н***й"
|
Re: "C" въпрос, как се прави това?
структурите са фиксиран размер - няма как да са с променлив такъв (както искаш) декларирай си multimeniline някъде и му укажи адреса в структурата
|
Пон Юни 29, 2020 6:05 pm |
|
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 10:22 pm Мнения: 3074
|
Re: "C" въпрос, как се прави това?
В структурите с грешка се опитвам да сложа указател към масив, struct multimenulinetype { const word paramsbeforethisline; const word paramsinthisline; const linecontent * const linecontentarray[];
};
Кое тук се вижда като променлив размер?
|
Пон Юни 29, 2020 7:42 pm |
|
|
ps66
Ранг: Форумен бог
Регистриран на: Пет Яну 19, 2007 8:16 am Мнения: 1063 Местоположение: путинофили: "иди н***й"
|
Re: "C" въпрос, как се прави това?
в декларацията няма проблем … проблема ти е в инициализацията на структурата! linecontentarray трябва да е инициализиран с указател към масив деклариран извън структурата!
|
Пон Юни 29, 2020 7:50 pm |
|
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 10:22 pm Мнения: 3074
|
Re: "C" въпрос, как се прави това?
Наистина не разбирам, може ли да ми покажеш?
|
Пон Юни 29, 2020 8:02 pm |
|
|
ps66
Ранг: Форумен бог
Регистриран на: Пет Яну 19, 2007 8:16 am Мнения: 1063 Местоположение: путинофили: "иди н***й"
|
Re: "C" въпрос, как се прави това?
typedef struct { const word paramsbeforethisline; const word paramsinthisline; const char *linecontentarray[]; } multimenulinetype;
char *menulines[]= { "menu1", "menu2", "menu3", NULL };
multimenulinetype menu = { 1, 2, menulines };
|
Пон Юни 29, 2020 8:29 pm |
|
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 10:22 pm Мнения: 3074
|
Re: "C" въпрос, как се прави това?
PS. Писали сме заедно. Да , май схванах , че третата структура е кофти. Сега остана предупреждение за 3-та структура | | | | Код: #include <stdio.h> #include <stdlib.h> typedef unsigned int word; struct linecontenttype { const word messagenum; const word structnum; };
typedef struct linecontenttype linecontent;
const linecontent menu1line1[]= { {100,200} }; const linecontent menu1line2[]= { {101,201}, {102,202} }; const linecontent menu1line3[]= { {103,203}, {104,204} };
/////////////////////
typedef struct { const word paramsbeforethisline; const word paramsinthisline; const linecontent * const linecontentarray[];
}multimenuline;
const multimenuline m1_L1= {
0, 1, &menu1line1 /// taka dawa WARNING ///D:\c_work\strukprob2\main.c|45|warning: missing braces around initializer [-Wmissing-braces]| ///D:\c_work\strukprob2\main.c|45|warning: (near initialization for 'm1_L1.linecontentarray') [-Wmissing-braces]| ///D:\c_work\strukprob2\main.c|45|warning: initialization from incompatible pointer type [enabled by default]| ///D:\c_work\strukprob2\main.c|45|warning: (near initialization for 'm1_L1.linecontentarray[0]') [enabled by default]|
};
const multimenuline m1_L2= { 1, 2, {menu1line2} ///Taka minawa
};
const multimenuline m1_L3= { 3, 2, {menu1line3}
};
//////////////////
typedef struct { const word linescounttotal; const word paramscounttotal; const multimenuline * const linesarray[];//linescounttotal]; } multimenustruct ;
const multimenuline * const M1linesarray1[]={
&m1_L1, &m1_L2, &m1_L3 }; multimenustruct M1_struct= { 3, 5, {M1linesarray1} ///9||=== Build: Debug in strukprob2 (compiler: GNU GCC Compiler) ===| ///D:\c_work\strukprob2\main.c|85|warning: initialization from incompatible pointer type [enabled by default]| ///D:\c_work\strukprob2\main.c|85|warning: (near initialization for 'M1_struct.linesarray[0]') [enabled by default]| ///||=== Build finished: 0 error(s), 6 warning(s) (0 minute(s), 0 second(s)) ===|
} ;
//////////////////
int main() { printf("Hello world!\n"); return 0; }
| | | | |
|
Пон Юни 29, 2020 8:35 pm |
|
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 10:22 pm Мнения: 3074
|
Re: "C" въпрос, как се прави това?
Всъщност се опитвам в 3-та структура да обявя указател към масив от указатели( за да индексирам в него, без да правя сам математиката за индексацията), ама не ми се получи. В крайна сметка IAR/MSP430 хареса следния вариант : | | | | Код: #include "io430.h" //#include <stdio.h> //#include <stdlib.h> typedef unsigned int word;
typedef struct //1 { word messagenum; word ramdatastructnum; } linecontent;
typedef struct //2 { word paramsbeforethisline; word paramsinthisline; linecontent * linecontentarray;
}multimenuline;
typedef struct //3 { word linescounttotal; word paramscounttotal; multimenuline ** linesarray;// } multimenustruct ;
__ro_placement const volatile linecontent menu1line1[]= { {100,200} }; __ro_placement const volatile linecontent menu1line2[]= { {101,201}, {102,202} }; __ro_placement const volatile linecontent menu1line3[]= { {103,203}, {104,204} };
/////////////////////
__ro_placement const volatile multimenuline m1_L1= {
0, 1, (linecontent *) &menu1line1[0] };
__ro_placement const volatile multimenuline m1_L2= { 1, 2, (linecontent *)&menu1line2[0] ///Taka minawa
};
__ro_placement const volatile multimenuline m1_L3= { 3, 2, (linecontent *)&menu1line3[0]
};
//////////////////
__ro_placement const volatile multimenuline * const volatile M1linesarray1[]={ &m1_L1, &m1_L2, &m1_L3
};
__ro_placement const volatile multimenustruct M1_struct= { 3, 5, (multimenuline **)&M1linesarray1[0]
} ;
const volatile multimenustruct * mmptr; //////////////////
int main( void ) { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; mmptr=&M1_struct; return 0; }
| | | | |
|
Пон Юни 29, 2020 11:05 pm |
|
|
MYXATA
Ранг: Форумен бог
Регистриран на: Пон Юни 05, 2006 12:48 pm Мнения: 4393 Местоположение: където небето среща земята, ракията е Jameson, а бирата Guinness
|
Re: Пак, "C" въпрос, как се прави това?
точно микрочип имаха една графична библиотека с индекси - много лека и много бърза за прости дисплеи(2хН реда). също една по-сложна за г.рафични. не беше нещо сложно, аз ги адаптирах за други процессори... виж порови им из сайта/форумите. няма нужда да измисляш топлата вода, освен ако не я правиш с по-добър вкус
_________________ ... ако трети ден не ти се работи... това означава, че е сряда !
|
Вто Юни 30, 2020 2:09 pm |
|
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 10:22 pm Мнения: 3074
|
Re: "C" въпрос, как се прави това?
ще потърся.... Схемата долу-горе съм я измислил. Стана ми интересно , указател към масив, указател към масив от указатели...като член на структура. Сакаш просто трябва да пропусна квадратните скоби, ще пробвам...
То с МSP430-X имa един страничен проблем-моделът на паметта и кое как се обявява ....някой неща са направо гумени - за да му кажа ,че искам структурата да е във флаша, и адресът и да бъде в друга структура във флаша, с достъп през 20 битов (а не 16) адрес....трябва да изпиша една гора служебни думички... __ro_placement const volatile e задтължителна комбинация... __data20 e за разкош....
|
Вто Юни 30, 2020 9:40 pm |
|
|
gicho
Ранг: Форумен бог
Регистриран на: Пон Мар 13, 2006 12:59 pm Мнения: 3855 Местоположение: Габрово
|
Re: "C" въпрос, как се прави това?
За такива описания (референция към външна таблица/списък с неизвестен размер) аз слагам два елемента - едното е пойнтъра към началото на тая външна таблица, т.е. към нулевия елемент, т.е. към елемент е пойнтъра като тиш, и втори елемент, който е брой елементи в тая таблица. Иначе е неизползваемо, освен ако направиш "null terminated" вариант, в която обаче си изядаш памет за цял елемент, само за терминатора. Съвсем примерно: Това последното - sizeof(array)/sizeof(array[0]) може да си го направиш на макро. Понеже често ми се налага да ползвам такива описания на списъци съм си го описал на предкомилатор това "поинтър и размер".
|
Сря Юли 01, 2020 9:50 am |
|
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 10:22 pm Мнения: 3074
|
Re: "C" въпрос, как се прави това?
Да, схванах че не мога в структура да сложа квадратните скоби... После как се обръщаш към i-ия елемент от масива g_stSampleElements, (ползвайки g_stDisplay.pstMyElement ) трябва ли нещо като кастване? sizeof ...не е ли всъщност макрос, който се обработва от компилатора в случая? Тая структура не я разбрах съвсем, тия точки отляво какво правят? Така е правилно да се пише инициализатора на структурата, предполагам. Не знаех.
|
Сря Юли 01, 2020 10:27 am |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 5 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|