|
Понятие стандартного типа и тип операндов..., 16/32битный Cи компилятор. Хочу раз и на всегда уточнить. |
|
|
|
Nov 28 2009, 21:51
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(Злодей @ Nov 28 2009, 23:57)  А можно как-нибудь так, чтобы 240 хранилось в int8 или int16, а то int32 как-то накладно выглядит. P.S: На случай, если они перестанут быть константными или поучаствуют ещё-где-нибудь. Можно через дефайн. Но потребуется явно приводить их к соответствующему типу для исключения переполнения. А можно и наоборот приводить к байту или слову в требуемых случаях, когда константы объявлены как UL. Но проблема ИМХО надуманная. Как это так, они вдруг перестанут быть константами? Ну а с квалификатором ststic const константы не занимают память вовсе, пока в программе не производится взятие адреса этой константы.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Nov 29 2009, 09:26
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(dxp @ Nov 28 2009, 13:39)  Код static const uint32_t X_SIZE = 320; static const uint32_t Y_SIZE = 240; Зачем такой "огород" с константами и статиками? Только лишь для того, чтобы автоматически задавать размерность? Но ведь всё равно при оперировании с любыми константами операнды должны иметь правильную размерность, иначе переполнения и ошибки не избежать. Как правило, все константы задаются просто через дефайны: Код #define X_SIZE 320ul
|
|
|
|
|
Nov 29 2009, 15:13
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(demiurg_spb @ Nov 29 2009, 02:47)  Так будет корректней: Код static const uint32_t X_SIZE = 320UL; static const uint32_t Y_SIZE = 240UL; uint32_t a = X_SIZE * Y_SIZE; Без статика возможны "игры разума" компиляторов... И ещё, никакого оверхеда быть не может, т.к. константные выражения вычислятся при компиляции. У меня и так его (оверхеда) нет и без статиков, бо С++.  И указывать суффикс UL тоже излише. Тип и так четко и однозначно указан. Цитата(Злодей @ Nov 29 2009, 02:57)  Код const uint32_t X_SIZE = 320; const uint32_t Y_SIZE = 240; uint32_t a = X_SIZE * Y_SIZE; А можно как-нибудь так, чтобы 240 хранилось в int8 или int16, а то int32 как-то накладно выглядит. P.S: На случай, если они перестанут быть константными или поучаствуют ещё-где-нибудь. Можно объявить const uint8_t Y_SIZE = 240;. На дальнейшее использование это не повлияет - в использующем выражении операнды все равно будут приведены к нужному типу. Цитата(sonycman @ Nov 29 2009, 15:26)  Как правило, все константы задаются просто через дефайны: Код #define X_SIZE 320ul Задавались. А нынче рулят константы. И нет ни одной причины использовать тут макросы. Зато причин не использовать предостаточно.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Nov 29 2009, 20:16
|
Частый гость
 
Группа: Участник
Сообщений: 92
Регистрация: 23-12-08
Из: Кишинёв
Пользователь №: 42 680

|
sigmaN Скорее всего моя терминология хромает, я имею ввиду элеметарную ситуацию: Код const int x_size = 10; int x_mas[x_size]; В Си не соберётся.
|
|
|
|
|
Nov 29 2009, 20:28
|

I WANT TO BELIEVE
     
Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751

|
аа, об этом я уже как-то упоминал. Не собирается(как мне объяснили) потому, что объявление и инициализация - это разные этапы компиляции. Т.е. на момент первого прохода компилятор ещё ничего не знает о том, что x_size == 10. Выходом из этой ситуации может быть enum или #define Как там с подобными конструкциями в плюсах - не знаю....может там и соберется. Цитата Скорее всего моя терминология хромает, я имею ввиду элеметарную ситуацию: да нет, скорее всего я просто Вас неправильно понял и дал ответ на совершенно иной вопрос  тут найдете много чего полезного http://electronix.ru/forum/index.php?showtopic=68225
--------------------
The truth is out there...
|
|
|
|
|
Dec 1 2009, 06:47
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(baralgin @ Nov 30 2009, 11:29)  Я обычно все глобальные переменные static'ом обзываю (от греха подальше). Вы имеете ввиду глобальные константы? Ибо переменная в модуле становится локальной... Ну и все подряд константы делать статическими тоже неверно... Цитата(dxp @ Nov 29 2009, 18:13)  У меня и так его (оверхеда) нет и без статиков, бо С++.  Ну так а тож  Цитата Можно объявить const uint8_t Y_SIZE = 240; На дальнейшее использование это не повлияет - в использующем выражении операнды все равно будут приведены к нужному типу. Ещё как повлияет, если в int не впишется... Цитата Задавались. А нынче рулят константы. И нет ни одной причины использовать тут макросы. Зато причин не использовать предостаточно. +1
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Dec 1 2009, 08:17
|
Частый гость
 
Группа: Участник
Сообщений: 92
Регистрация: 23-12-08
Из: Кишинёв
Пользователь №: 42 680

|
Цитата(demiurg_spb @ Dec 1 2009, 08:47)  Вы имеете ввиду глобальные константы? Ибо переменная в модуле становится локальной... Ну и все подряд константы делать статическими тоже неверно... Не, я имел ввиду переменные и локальность это только плюс(практически плюсплюс  ). Const'антами пользуюсь пока крайне умеренно. Тут больше вопрос не "что использовать define или const", а "Си или С++".
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|