Отговори на тема  [ 21 мнения ]  Отиди на страница Предишна  1, 2
Странен код 
Автор Съобщение
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Вто Окт 25, 2005 10:54 am
Мнения: 896
Мнение Re: Странен код
Аре и от мен - тоя код може и да не работи ако се изпълнява от FLASH, защото:

uint8_t *pack = {0}; // компилатора заделя един указател в стека и го насочва към:
1. константен масив от един елемент някъде из флаша - щото няма смисъл да е в РАМа както например при принтф("мара ба свят!"); - по вероятно
2. копие в РАМа на масив от флаша(напреавено от Ц стартъп кода), щото е инизиализиран, но компилатора знае че узера ще го модифицира - малко вероятно. Това според мен би станало при: uint8_t pack[] = {0}; но не и при горното където юзера изрично иска указател а не масив...

И все пак горното ще работи ако кода се изпълнява от РАМ както е в 99% от случаите в сегашните системи, щото РАМа е повече и по евтин от флаша.

... все пак висчко зависи от компилатора и линкер скрипта де :)


Пон Яну 21, 2013 3:10 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11266
Местоположение: Добрич
Мнение Re: Странен код
Tito и ти бъркаш като мен ;-)

woody се оказа прав...

Няма заделяне изобщо, а дори и да имаше щеше да се получи димачен масив, а той не можел да се инициализира...

Ей голяма боза с тия фигурни инициализатори. Последно инициализация с фигурни скобки можело да се прави само на статичен масив и POD структура. Простите указатели не можело.... а защо няма warnings като не може остава загадка :axe:

Та изложихме се с две думи :oops:


Пон Яну 21, 2013 4:08 pm
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Вто Окт 25, 2005 10:54 am
Мнения: 896
Мнение Re: Странен код
Пу м..му, верно е така... похабих се за нищо :)


Пон Яну 21, 2013 4:29 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Окт 11, 2011 11:53 pm
Мнения: 4582
Местоположение: Brussels / Пловдив
Мнение Re: Странен код
ОК, де - изяснихме го че се инициализира с NULL колкото и шантаво да изглежда.
Мен ме притеснява това писане после в този указател - т.е. пише се на адрес 0 ... чист бъг си е, освен ако някой съзнателно не е оставил буфер там та да си маже когато му скимне.
Типичен пример за unmaintainable код ...

_________________
Мразя да мразя ...


Пон Яну 21, 2013 6:01 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Съб Ное 12, 2011 9:21 pm
Мнения: 62
Мнение Re: Странен код
и на мен не ми е ясно какво точно прави кодът 'uint8_t *pack = {0};' но често ползвам подобна конструкция, която ми е много удобна - това са т.нар. 'съставни литерали', които са стандартна конструкция в c99; друга стандартна конструкция в c99 са т.нар. 'обозначени инициализатори' (designated initializerzs), мисля, че стандартни са и анонимните структури/обединения, вложени в структури; доста удобни са ми били, също така, и някои gcc разширения

искам да споделя тези неща като примерна C програма, може би ще са полезни и за други колеги, в случай, че не са ги срещали; следната програма е валиден C код, който ползва разширения специфични за gcc, а също и някои от разширенията на c99 стандарта; програмата се комилира с флаг '-std=c99', т.е.: 'gcc -std=c99 program.c':

Код:
#include <stdio.h>

struct xstr
{
   int a, b;
   struct
   {
      int x, y;
   };
};

static struct xstr dump_struct(struct xstr * x)
{
   printf("a == %i\n", x->a);
   printf("b == %i\n", x->b);
   printf("x == %i\n", x->x);
   printf("y == %i\n", x->y);
   x->a = x->x + x->y;
   return * x;
}

int main(void)
{
int * p = (int[]){ [2] = 0, [1] = 1, [0] = 2, };
void dump_array(int n, int * arr)
{
   for (int i = 0; i < n; printf("arr[%i] == %i\n", i, arr[i]), i ++);
   p[0];
}

   dump_array(3, p);
   dump_array(4, (int[4]) { [1] = 2, [2] = 10, [3] = 7, [0] = 5, });
   printf("dump_struct().a == x + y == %i\n",
      dump_struct(&(struct xstr) { .b = __COUNTER__, .a = __COUNTER__, .y = __COUNTER__, .x = __COUNTER__, })
         . a
   );
   return 0;
}


тук кодът 'int * p = (int[]){ [2] = 0, [1] = 1, [0] = 2, };' насочва указателя към масив, който в същото време се инициализира с елементи { 2, 1, 0}; в случая изразът '(int[]){ [2] = 0, [1] = 1, [0] = 2, }' представлява не typecast, а т.нар. 'compound literal'; подизразите '[2] = 0, [1] = 1, [0] = 2' са т.нар. 'designated initializers', и инициализират втория елемент на масива с 0, първия с 1, нулевия с 2; ф-я 'dump_array()' е т.нар. nested function - това е gcc разширение, като интересното е, че идентификаторите в тази ф-я са с т.нар. 'lexical scoping' - това значи, че параметрите на ф-я 'main()', а също и автоматичните променливи дефинирани преди дефиницията на 'dump_array' са видими в 'dump_array' - в случая достъпът до 'p' от 'dump_array' е валиден; интересно е, че 'compound literal'-ите са същевременно и леви стойности, т.е. имат адреси в памет, върху която може да се пише - това е илюстрирано при викането на функция 'dump_struct()', и ползване на резултата й

при някои специфични приложения, полезен може да се окаже и макросът '__COUNTER__' - доколкото знам, това е специфично за gcc, но и микрософтските компилатори го поддържат; стойността на този макрос започва да се разширява като числото 0, и при всяка следваща употреба се увеличава с 1

при мен изходът на програмата е:
Код:
arr[0] == 2
arr[1] == 1
arr[2] == 0
arr[0] == 5
arr[1] == 2
arr[2] == 10
arr[3] == 7
a == 1
b == 0
x == 3
y == 2
dump_struct().a == x + y == 5


Вто Яну 22, 2013 2:00 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Юли 31, 2007 2:55 pm
Мнения: 1792
Местоположение: София
Мнение Re: Странен код
Миро, радвам се че стигнахме до едно мнение.
Наздраве. :)


Вто Яну 22, 2013 7:16 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 21 мнения ]  Отиди на страница Предишна  1, 2

Кой е на линия

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


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

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