Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Поясните конструкции С из segment_init
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Dopler
Господа, поясните, пожалуйста, что означает данная конструкция:

Код
typedef struct
{
  long   Size;                  /* Number of bytes to initialize */
  char*  Dst;                   /* Destination. If Dst==Src, then init to 0 */
  char*  Src;                   /* Source address. Usually in ROM. */
} InitBlock_Type;

...

_interwork void __segment_init(void)
{
  InitBlock_Type const * const initTableBegin = __sfb( "INITTAB" );
  InitBlock_Type const * const initTableEnd = __sfe( "INITTAB" );
  InitBlock_Type const * initTableP;

  /* Loop over all elements in the initialization table. */
  for (initTableP=initTableBegin; initTableP<initTableEnd; initTableP++)
  {
    /* If src=dest then we should clear a memory
     * block, otherwise it's a copy operation. */
    if (initTableP->Src == initTableP->Dst)
    {
      memset(initTableP->Dst, 0, initTableP->Size);
    }
    else
    {
      memcpy(initTableP->Dst, initTableP->Src, initTableP->Size);
    }
  }
}


InitBlock_Type const * const особо интересует, хотя все остальное мне тоже мало понятно.

Код взят из segment_init IAR и идет с директивой #pragma language=extended, что это значит?
zltigo
Цитата(Dopler @ Feb 3 2007, 09:28) *
что это значит?

Это значит, что пора просто читать книги по языку.
Совершенно обычная работа со структурами и указателями на оные sad.gif.
Ну а __sfb __sfe это уже в IAR расширения и про них уже в документации на IAR компилятор.
#pragma language - там-же.
Dopler
Цитата(zltigo @ Feb 3 2007, 12:50) *
Цитата(Dopler @ Feb 3 2007, 09:28) *

что это значит?

Это значит, что пора просто читать книги по языку.
Совершенно обычная работа со структурами и указателями на оные sad.gif.
Ну а __sfb __sfe это уже в IAR расширения и про них уже в документации на IAR компилятор.
#pragma language - там-же.


Как раз про __sfb __sfe все понятно, про #pragma language тоже более-менее. Но вот конструкция InitBlock_Type const * const initTableBegin мне не понятна совершенно. Как раз сейчас читаю целых две книги по C, и ясности не прибавляется. Бывает три типа применения const:

Код
const char *c = "123";   // каждый символ в строке не изменен, но указатель можно менять
char *const c = "123";   // указатель не изменен, строку можно менять
const char *const c = "123";   // все неизменно

а вот что такое const * const не понятно ни капельки


Поправьте, если я не прав.
zltigo
Цитата(Dopler @ Feb 3 2007, 12:04) *
Как раз сейчас читаю целых две книги по C, и ясности не прибавляется. Бывает три типа применения const:
Код
const char *const c = "123";   // все неизменно
а вот что такое const * const не понятно ни капельки

А так smile.gif :
char const *const c = "123"; // все неизменно

Мне тоже не нравится такая форма записи sad.gif.
Сергей Борщ
Читаем указатели справа налево:
Код
const char *c = "123";

с есть указатель на константный char. ему присвоен адрес строки. То есть значение на который он указывает менять нельзя, его самого - можно.

На самом деле эта запись эквивалентна
Код
char const *c = "123";
и в книгах рекомендуется использовать последнюю. Да и читается она как бы более естественно: "с есть указатель на константнту типа char". Это именно та форма, которая вас сбила с толку.
Код
char *const c = "123";

с есть константный указатель на char. ему присвоен адрес строки. То есть значение на которое он указывает менять можно, его самого - нет
Код
const char *const c = "123";

с есть константный указатель на константный char. ему присвоен адрес строки. То есть значение на которое он указывает менять нельзя, его самого - тоже.

Теперь ваш:
InitBlock_Type const * const initTableBegin - initTableBegin есть константный указатель на константу типа InitBlock_Type.

Чтобы не путаться, запомните простое правило: в С нет понятия const *, это два отдельных понятия, а сочетание * const - это одно понятие. Или, более строго, ptr-operator состоит из * и вслед за ним (возможно пустого) списка квалификаторов.
zltigo
Цитата(Сергей Борщ @ Feb 3 2007, 13:38) *
в книгах рекомендуется использовать последнюю. Да и читается она как бы более естественно: "с есть указатель на константнту типа char".

Естественне sad.gif, хотя и справа на лево smile.gif
В принципе надо привыкать для однозначности пользоваться именно такой формой. Просто в моем случае сказываются многолетние привычки sad.gif "глаза" вполне спокойно читают любое, ну а "руки" пишут "не естественный" вариант, когда хоть пару слов, но в естественном для европейца порядке.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.