реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Поясните конструкции С из segment_init
Dopler
сообщение Feb 3 2007, 10:28
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 437
Регистрация: 23-04-05
Из: Таганрог
Пользователь №: 4 425



Господа, поясните, пожалуйста, что означает данная конструкция:

Код
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, что это значит?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 3 2007, 12:50
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Dopler @ Feb 3 2007, 09:28) *
что это значит?

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Dopler
сообщение Feb 3 2007, 13:04
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 437
Регистрация: 23-04-05
Из: Таганрог
Пользователь №: 4 425



Цитата(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 не понятно ни капельки


Поправьте, если я не прав.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 3 2007, 14:23
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



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

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

Мне тоже не нравится такая форма записи sad.gif.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 3 2007, 14:38
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Читаем указатели справа налево:
Код
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 состоит из * и вслед за ним (возможно пустого) списка квалификаторов.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 3 2007, 14:55
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



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

Естественне sad.gif, хотя и справа на лево smile.gif
В принципе надо привыкать для однозначности пользоваться именно такой формой. Просто в моем случае сказываются многолетние привычки sad.gif "глаза" вполне спокойно читают любое, ну а "руки" пишут "не естественный" вариант, когда хоть пару слов, но в естественном для европейца порядке.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 07:36
Рейтинг@Mail.ru


Страница сгенерированна за 0.01364 секунд с 7
ELECTRONIX ©2004-2016