![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| oleg1973 |
|
|||
![]() asm fanat ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3283 Регистрация: 16.7.2003 Где: Italy Репутация: 1 Всего: 34 |
кароче использую компилер LCC-WIN32 почему когда делаю unsigned long A; A++; или А=А+1; в результате А увеличивается на 4 ? а хотелось на 1 -------------------- SST 465555 icq 200-512-712 |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
может, перепутал и сделал указатель
? -------------------- ![]() |
|||
|
||||
| oleg1973 |
|
|||
![]() asm fanat ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3283 Регистрация: 16.7.2003 Где: Italy Репутация: 1 Всего: 34 |
опс да там unsigned long *A;
а почему на 4 увеличивается? -------------------- SST 465555 icq 200-512-712 |
|||
|
||||
| RAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
Потому что C язык - умный. Можно считать, что операции '+', '-', '++', '--' перегружены для каждого типа. unsigned long* A - это указатель на длинное целое. Операция ++ увеличивает A на величину, равную кол-ву байт, занимаемых типом unsigned long, 4 байта.
Пример 1: int arr[] = {1,2,3,4} int *a = arr; //Сейчас a указывает на первый элемент массива (1) a++; //В Win32 значение переменной a увеличится на 4, и она будет указывать на второй элемент (2) a += 2; //Увеличится на 8 и укажет на четвёртый элемент. Пример 2: typedef struct { int a1; int a2; } MyStruct; //Структура займёт 8 байт MyStruct *st; //указатель на структуру st++; //увеличит значение st на 8 |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
ЗЫ, это всё чтобы легче с массивами работать было ч/з указатели, что-то подобное реализовано в STL (операторы ++ и -- любого итератора).
-------------------- ![]() |
|||
|
||||
| DENNN |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
Потому что операция ++ для указателя означает переход к следующему в памяти элементу, а на твоем компилере unsigned long занимает 4 байта. |
|||
|
||||
| oleg1973 |
|
|||
![]() asm fanat ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3283 Регистрация: 16.7.2003 Где: Italy Репутация: 1 Всего: 34 |
как все заморочено
а как сделать подобное ? тоесть указательна 1 увеличить mov al,[esi] inc esi mov ah,[esi] -------------------- SST 465555 icq 200-512-712 |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
Преобразовываем наш указатель к "char *", увеличиваем на 1, преобразовываем обратно в unsigned long:
-------------------- ![]() |
|||
|
||||
| RAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
Три способа: 1. Преобразовать к указателю на тип, занимающий в памяти 1 байт (например, char* или byte*) unsigned long *A; ( (char*)A )++; Но если вдруг эти типы будут в будущем занимать больше одного байта в памяти, как это когда-то случилось с int, то ошибку найти будет сложно (забудешь - 100%) 2. Преобразовать к типу unsigned int. ( (unsigned)A )++; Проблемы могут быть в том случае, если компилятор не сможет преобразовать. Вдруг когда-нибудь sizeof(void*) не будет равен sizeof(unsigned int). Что мало вероятно, но всё же... Однако это вызовет ошибку компилятора и не придётся ломать голову. 3. "Железный" способ: использовать, приведённый тобой код на asm'е. P.S. Такое использование ++, как в первых двух примерах, возможно в Builder'е. MSVC не поддреживает. Но главное было передать смысл. |
|||
|
||||
| RAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
Чуть не забыл, на будущее:
Модератор: Пожалуйста, один топик - один вопрос. |
|||
|
||||
| DENNN |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
Это какое же "такое использование"? |
|||
|
||||
| oleg1973 |
|
|||
![]() asm fanat ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3283 Регистрация: 16.7.2003 Где: Italy Репутация: 1 Всего: 34 |
кароче асм рулит а впрочем как всегда -------------------- SST 465555 icq 200-512-712 |
|||
|
||||
| RAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
DENNN, введи ( (char*)A )++; в MSVC и он выдаст, что у оператора ++ должен быть lvalue.
oleg1973, то, что ты хочешь сделать требуется крайне редко. Например, я никогда этого не делал, по-моему. А вот увеличение указателя для перехода к следующему элементу массива - обычное дело. Вместе с тем "интелектуальность" операций ++ и др. позволяет писать шаблоны и вообще это очень удобно. |
|||
|
||||
| oleg1973 |
|
|||
![]() asm fanat ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3283 Регистрация: 16.7.2003 Где: Italy Репутация: 1 Всего: 34 |
RAN
просто понадбилось работать с 32 битным бэк буффером (4 байта на точку как извесно) вот и все так как в си я не силен поэтому так и делал через указатель может и другие способы есть я просто не знаю -------------------- SST 465555 icq 200-512-712 |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
oleg1973 что тебе мешает использовать указатель на такую структуру вместо "unsigned long*":
-------------------- ![]() |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |