Отговори на тема  [ 90 мнения ]  Отиди на страница Предишна  1, 2, 3, 4, 5, 6  Следваща
"C" въпрос, как се прави това? 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 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
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 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
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 8:21 pm
Мнения: 27949
Местоположение: София
Мнение Re: "C" въпрос, как се прави това?
Ами за пика не знам, но примерно кейла използва побитови операции само при конкретно дефинирана променлива, може и с умножението да е така,a може и компилатора изобщо да не е чувал за такава инструкция.


Чет Окт 11, 2018 2:35 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 07, 2012 10:22 pm
Мнения: 3074
Мнение Re: Пак, "C" въпрос, как се прави това?
Опитвам се да си измисля някакъв по-общ подход за създаване на меню на прост дисплей.
И съответно се опитвам да дефинирам някакви данни и структури .
Трябват ми менюта(екрани) с по няколко линии , с по един или няколко параметъра на линия .
Сметнах ,че ми трябват 3 структури , една в друга .

Една линията се описва като няколко двойки числа {номер на текст, номер на параметър};

Код:
typedef unsigned int word;
struct linecontenttype
{
const word messagenum;
const word structnum;
};

typedef struct linecontenttype linecontent;

linecontent menu1line1[]=
{ {100,200} };
linecontent menu1line2[]=
{ {101,201},
   {102,202}
};
linecontent menu1line3[]=
{ {103,203},
   {104,204}
};



Дотук добре.


Втората структура трябва да включва две числа и указател към структура от предния тип.


Код:
struct multimenulinetype
{
const   word paramsbeforethisline;
const  word paramsinthisline;
const  linecontent  * const linecontentarray[];

};


typedef struct multimenulinetype multimenuline;



multimenuline m1_L1=
{

  0,
  1,
  &menu1line1[0]   //                *******************Тук компилаторът дава грешка
                            //           Too many initializer values.
   
};

multimenuline m1_L2=
{
1,
2,
&menu1line2[0]           //      *******************Тук компилаторът дава грешка


};

multimenuline m1_L3=
{
3,
2,
&menu1line3[3] //               *******************Тук компилаторът дава грешка

};




Същата грешка се получава и при последната структура, която трябва включи данните от втората структура

Код:
struct   multimenustructype
{
  word linescounttotal;
  word paramscounttotal;
  multimenuline * linesarray[];
}  ;

typedef struct multimenustructype multimenustuct;


multimenustuct M1_struct=
{
3,
5,
&m1_L1,
&m1_L2,
&m1_L3   *******************Тук компилаторът дава грешка
}  ;


Не можах да налучкам къде бъркам.


Пон Юни 29, 2020 3:00 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Яну 19, 2007 8:16 am
Мнения: 1063
Местоположение: путинофили: "иди н***й"
Мнение Re: "C" въпрос, как се прави това?
структурите са фиксиран размер - няма как да са с променлив такъв (както искаш)
декларирай си multimeniline някъде и му укажи адреса в структурата


Пон Юни 29, 2020 6:05 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 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
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Яну 19, 2007 8:16 am
Мнения: 1063
Местоположение: путинофили: "иди н***й"
Мнение Re: "C" въпрос, как се прави това?
в декларацията няма проблем … проблема ти е в инициализацията на структурата!
linecontentarray трябва да е инициализиран с указател към масив деклариран извън структурата!


Пон Юни 29, 2020 7:50 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 07, 2012 10:22 pm
Мнения: 3074
Мнение Re: "C" въпрос, как се прави това?
Наистина не разбирам, може ли да ми покажеш?


Пон Юни 29, 2020 8:02 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Яну 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
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 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
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 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
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Юни 05, 2006 12:48 pm
Мнения: 4393
Местоположение: където небето среща земята, ракията е Jameson, а бирата Guinness
Мнение Re: Пак, "C" въпрос, как се прави това?
stefan63 написа:
Опитвам се да си измисля някакъв по-общ подход за създаване на меню на прост дисплей.
...

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

_________________
... ако трети ден не ти се работи... това означава, че е сряда !


Вто Юни 30, 2020 2:09 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 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
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пон Мар 13, 2006 12:59 pm
Мнения: 3855
Местоположение: Габрово
Мнение Re: "C" въпрос, как се прави това?
За такива описания (референция към външна таблица/списък с неизвестен размер) аз слагам два елемента - едното е пойнтъра към началото на тая външна таблица, т.е. към нулевия елемент, т.е. към елемент е пойнтъра като тиш, и втори елемент, който е брой елементи в тая таблица. Иначе е неизползваемо, освен ако направиш "null terminated" вариант, в която обаче си изядаш памет за цял елемент, само за терминатора.
Съвсем примерно:
Код:
typedef struct
{
    uint32_t blabla;
    uint32_t haha;
    ...
}ST_MY_ELEMENT;

typedef
{
    const ST_MY_ELEMENT* pstMyElement;
    int NumOfElements;
}ST_MY_MENU_DISPLAY;

const ST_MY_ELEMENTg_stSampleElements[] = {....};

const ST_MY_MENU_DISPLAY g_stDisplay =
{
.pstMyElement = &g_stSampleElements;
.NumOfElements =  sizeof(g_stSampleElements)/sizeof(g_stSampleElements[0]);
};

Това последното - sizeof(array)/sizeof(array[0]) може да си го направиш на макро.

Понеже често ми се налага да ползвам такива описания на списъци съм си го описал на предкомилатор това "поинтър и размер".


Сря Юли 01, 2020 9:50 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 07, 2012 10:22 pm
Мнения: 3074
Мнение Re: "C" въпрос, как се прави това?
Да, схванах че не мога в структура да сложа квадратните скоби...
После как се обръщаш към i-ия елемент от масива g_stSampleElements,
(ползвайки g_stDisplay.pstMyElement )
трябва ли нещо като кастване?



Код:
const ST_MY_MENU_DISPLAY g_stDisplay =
{
.pstMyElement = &g_stSampleElements;
.NumOfElements =  sizeof(g_stSampleElements)/sizeof(g_stSampleElements[0]);
};


sizeof ...не е ли всъщност макрос, който се обработва от компилатора в случая?

Тая структура не я разбрах съвсем, тия точки отляво какво правят? Така е правилно да се пише инициализатора на структурата, предполагам. Не знаех.


Сря Юли 01, 2020 10:27 am
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 90 мнения ]  Отиди на страница Предишна  1, 2, 3, 4, 5, 6  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 5 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни