Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> непонятка с массивом объявленого как static, будет ли общим для кажд. единицы реализ 
:(
    Опции темы
EvilsInterrupt
Дата 29.3.2010, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 2
Всего: 9



ввопрос простой, если есть хидер super1.h и в нем объявлен как static массив:

static const char * exception_string_table[exc_str_len];

То если юзать его в file1.cpp и в file2.cpp :
1) будет общим для этих двух единиц трансляции, т.е. в местах использования в бинарном виде подставится указатель на этот массив
2) у каждого файла реализации будет своя таблица

какой из пунктов ?

или что вообще будет? ;)

PM MAIL WWW ICQ Jabber   Вверх
mes
Дата 29.3.2010, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(EvilsInterrupt @  29.3.2010,  16:54 Найти цитируемый пост)
какой из пунктов ?

пунк 2 
smile


--------------------
PM MAIL WWW   Вверх
EvilsInterrupt
Дата 29.3.2010, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 2
Всего: 9



mes, Мне хочется запихнуть массив в хидер, потом его подрубать и при этом хочется чтобы в местах использования подставлялся указатель на него ! как это сделать ? ;)
PM MAIL WWW ICQ Jabber   Вверх
mes
Дата 30.3.2010, 09:08 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(EvilsInterrupt @  29.3.2010,  19:42 Найти цитируемый пост)
Мне хочется запихнуть массив в хидер, потом его подрубать и при этом хочется чтобы в местах использования подставлялся указатель на него ! как это сделать ? ;) 

в хидере объявить extern массив и в одном .cpp его определить.

Это сообщение отредактировал(а) mes - 30.3.2010, 09:08


--------------------
PM MAIL WWW   Вверх
EvilsInterrupt
Дата 30.3.2010, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 2
Всего: 9



mes, спасибо за вариант, о нем тоже думал, но он не подходит. Чтобы пояснить почему, опишу контекст решаемое сейчас задачи ;)

Есть:

<library folder>\include\std_exception.h: 
class std_exception; // ну и реализация прямо в хидере

есть либа:
<library folder>\include\libio.h: 
Код

class i_stream_base;
class c_file_stream           :  public  i_stream_base;
class c_memory_stream   :  public  i_stream_base;

классы относятся к нэймспэйсу libio

есть реализация:
<library folder>\src\libio\libio.cpp: 
Код

libio::i_stream_base:i_stream_base()
{
  m_private = new(PRIVATE_CTX);
  if(m_private == 0)
   // throw МЕСТО №1
}


т.к. в коде методов этой либы могут возникать ошибки, то надо бы как-то сообщать об этом пользователю. Решил что если это при создании классов, то буду генерировать исключение, а вот если менее важно, к примеру не прочитались данные, не записались то код ошибки, а вдруг пользовательский код сумеет поправить ситуацию , тогда проверка на ошибку куда быстрее по выполнению чем раскрутка исключения!!!

Но ! Для реализации исключений, т.е. наследников от std_exception желательно еще кидать с текстом!!! Вопрос: где хранить массив текстовок ошибок типа const char *  ?
мне пришло в голову, что раз уж у меня есть 
<library folder>\include\detailed\libio_errors_io.h , то туда и запихну этот массив, но !!! Не сделав его как static буду получать ругань от компилятора ;(

Что смущает меня при применении static ?
1) при подключении <library folder>\include\detailed\libio_errors_io.h в инклуд <library folder>\include\libio.h мы получим научим видеть пользовательский код классы исключений, но при реализации в libio.cpp мы их будем генерить! Из этого вытекает, что массив будет доступен в двух и более еденицах трансляции!!! static ведь!

что можно предприянять ? ;)

ЗЫ:
Очень старался пояснить и надеюсь мне удалось )))

Это сообщение отредактировал(а) EvilsInterrupt - 30.3.2010, 16:38
PM MAIL WWW ICQ Jabber   Вверх
mes
Дата 30.3.2010, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(EvilsInterrupt @  30.3.2010,  15:37 Найти цитируемый пост)
Очень старался пояснить и надеюсь мне удалось )))

ну про статик и так понятно.. а чем extern не угодил то ?

Добавлено через 48 секунд
Цитата(EvilsInterrupt @  30.3.2010,  15:37 Найти цитируемый пост)
Вопрос: где хранить массив текстовок ошибок типа const char *  ?

вопрос в сторону, а зачем хранить все тексты ошибок как массив ?



--------------------
PM MAIL WWW   Вверх
EvilsInterrupt
Дата 30.3.2010, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 2
Всего: 9



mes, 
>>вопрос в сторону, а зачем хранить все тексты ошибок как массив ?

мне куда проще писать:
throw new (e_stream_create(error_string_table[err_no]));

т.е. обращаясь к табличке за текстом, чем писать текстовку по месту:
throw new (e_stream_create("stream create failed"));
PM MAIL WWW ICQ Jabber   Вверх
mes
Дата 30.3.2010, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(EvilsInterrupt @  30.3.2010,  16:29 Найти цитируемый пост)
мне куда проще писать:
throw new (e_stream_create(error_string_table[err_no]));

т.е. обращаясь к табличке за текстом, чем писать текстовку по месту:
throw new (e_stream_create("stream create failed")); 


ну так не только этими двумя вариантами ограничен мир программирования smile
чем не подходит, к примеру, выделение переменной под каждое сообщение ?

Добавлено через 53 секунды
и почему throw new  ? зачем лишние заботы ?

Это сообщение отредактировал(а) mes - 30.3.2010, 17:34


--------------------
PM MAIL WWW   Вверх
EvilsInterrupt
Дата 30.3.2010, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 2
Всего: 9



mes, лишние new нафиг надо! ;) Уж лучше на стадии построения файла компиллером все что надо ляжет и выделится(по возможности)

Вобщем, решил, чуть позже напишу что и как именно! ;)))

ЗЫ:
Вопрос не закрываю, а то вдруг не то понял ))
PM MAIL WWW ICQ Jabber   Вверх
EvilsInterrupt
Дата 30.3.2010, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 2
Всего: 9



крыша уже едет:

есть:

class std_exception
{
public:
  std_exception(const char * const error) { m_what = error; }


  class e_libio_error   : public std_exception  {};
  class e_stream_create : public e_libio_error  {};

и табличко:
enum EXCEPTION_NUMBER {
  en_strm_create = 0,

  EXCEPTION_NUM_MAX
};
static const char * excep_str_tbl[EXCEPTION_NUM_MAX] = {
  "Stream create failed"
};

пишу:

  if(m_private == 0)
    throw( e_stream_create( excep_str_tbl[en_strm_create] ) );

в месте использования

catch(libio::e_libio_error & e)

и получаю:
Error    1    error C2440: '<function-style-cast>' : cannot convert from 'const char *' to 'libio::e_stream_create'    ..туто путь..\libio\libio.cpp    34    dotnetdump

в чем мблин трабл то ? вроде все ок! ;( где туплю ?
PM MAIL WWW ICQ Jabber   Вверх
GoldFinch
Дата 30.3.2010, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



EvilsInterrupt, используй синглтон с нужным массивом
PM MAIL ICQ   Вверх
mes
Дата 30.3.2010, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(EvilsInterrupt @  30.3.2010,  16:58 Найти цитируемый пост)
в чем мблин трабл то ? 

ну так где нужные конструкторы у классов исключений ?


--------------------
PM MAIL WWW   Вверх
EvilsInterrupt
Дата 30.3.2010, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 2
Всего: 9



>>ну так где нужные конструкторы у классов исключений ? 
Пашед ;))) Но, а разве конструкторы не наследуются ? ;) 


Это сообщение отредактировал(а) EvilsInterrupt - 30.3.2010, 18:15
PM MAIL WWW ICQ Jabber   Вверх
mes
Дата 30.3.2010, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(GoldFinch @  30.3.2010,  17:05 Найти цитируемый пост)
, используй синглтон с нужным массивом 

мне кажется это утяжеление.. имхо задача (про текст) решается через .inc файл в котором с помощью макроса описаны все строки.
при включении .inc`a в хидер нужно определить макрос как объявление внешних переменных, а при включении .inc`a в .cpp -реализатор макрос определяется как опредение переменных с инициализацией..

Добавлено через 51 секунду
Цитата(EvilsInterrupt @  30.3.2010,  17:08 Найти цитируемый пост)
а разве конструкторы не наследуются ? ;) 

увы )

Добавлено через 9 минут и 52 секунды
если нужны подобные, но разнотипные классы исключений и неохота париться с конструкторами, то можно прибегнуть к шаблонам,
например как в этой теме : http://forum.vingrad.ru/index.php?showtopi...t&p=2104028



--------------------
PM MAIL WWW   Вверх
EvilsInterrupt
Дата 1.4.2010, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 2
Всего: 9



Это решение сделал таковым:

<sdk folder>\include\detailed\libio_const_io.h:
Код

class e_libio_error : public std_exception { ... };
class e_stream_create : public e_libio_error  { ... };

где первое будут ловить, что бы знать о том была ли вообще ошибка!
а второе и подобное ему, для конкретизации ситуации

в <sdk folder>\src\libio\libio.cpp:
Код

const int_t e_max_len = 0x200;  /* maximal length for error text */

struct libio::i_stream_base::PRIVATE_CTX {
  char    error_text[e_max_len];
  uint_t  error_number;
  uint_t  os_specific;
};

/*----------------------------------------------------------------------------*/
enum EXCEPTION_NUMBER {
  en_strm_create = 0,

  EXCEPTION_NUM_MAX
};
static const char * excep_str_tbl[EXCEPTION_NUM_MAX] = {
  "Stream create failed"
};


таким образом я добился чего хотел: (при релиз-сборке)
1) в obj-файле нет упомянания о excep_str_tbl по место использования просто адрес!
2) клиент может отловить и детализировать ошибку относящиеся к это либе
3) при этом клиент не видит массива строк, но ему это будет доступном методом в what() в классе исключения!

Это. что касательно того что я хотел узнать и реализовать в момент создания темы )

>>если нужны подобные, но разнотипные классы исключений и неохота париться с конструкторами, то можно прибегнуть к шаблонам,

Читал приведенный пост, но пока не понял как и чего там у вас работает. Когда знания выростут, почитаю еще раз ;)

ЗЫ:
Нужна ли кому тема, в которой выложу опыт и небольшие знания о том как начать писать СДК и библиотеку, что к текущему моменту наскреб ?

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0582 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.