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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> обьясните дураку :), странности 
:(
    Опции темы
oleg1973
Дата 17.8.2003, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: 1
Всего: 34




кароче использую компилер LCC-WIN32
почему когда делаю
unsigned long A;
A++; или А=А+1;
в результате А увеличивается на 4 ? а хотелось на 1 smile.gif


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 17.8.2003, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



может, перепутал и сделал указатель
Код

     unsigned long *A;
     A++;     // A = A + sizeof(unsigned long)

?


--------------------
user posted image
PM MAIL WWW   Вверх
oleg1973
Дата 17.8.2003, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: 1
Всего: 34



опс да там unsigned long *A;
а почему на 4 увеличивается?smile.gif


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
RAN
Дата 17.8.2003, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 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
PM MAIL ICQ   Вверх
mr.DUDA
Дата 17.8.2003, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



ЗЫ, это всё чтобы легче с массивами работать было ч/з указатели, что-то подобное реализовано в STL (операторы ++ и -- любого итератора).
Код
int  *a = new int[10];   //  sizeof(int) = 4
a[3]     = 1;        // то-же самое что:
*(a+3) = 1;

// ...  и насчет того, что всё это даёт:
int  *b = a+2;    // теперь "b" указывает на 3-й элемент массива,
                         // а если бы (a+2) не было равно значению "a" плюс 8,
                         // то ничего подобного нельзя было бы сделать.



--------------------
user posted image
PM MAIL WWW   Вверх
DENNN
Дата 18.8.2003, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 1
Всего: 43



Цитата
а почему на 4 увеличивается?

Потому что операция ++ для указателя означает переход к следующему в памяти элементу, а на твоем компилере unsigned long занимает 4 байта.
PM ICQ   Вверх
oleg1973
Дата 18.8.2003, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: 1
Всего: 34



как все замороченоsmile.gif
а как сделать подобное ? тоесть указательна 1 увеличить
mov al,[esi]
inc esi
mov ah,[esi]



--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 18.8.2003, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



Преобразовываем наш указатель к "char *", увеличиваем на 1, преобразовываем обратно в unsigned long:
Код
unsigned long *A;
A = (unsigned long *)((char *)A + 1);



--------------------
user posted image
PM MAIL WWW   Вверх
RAN
Дата 18.8.2003, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

Репутация: 5
Всего: 6



Цитата
а как сделать подобное ? тоесть указательна 1 увеличить

Три способа:
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 не поддреживает. Но главное было передать смысл.
PM MAIL ICQ   Вверх
RAN
Дата 18.8.2003, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

Репутация: 5
Всего: 6



Чуть не забыл, на будущее:
Модератор: Пожалуйста, один топик - один вопрос.
PM MAIL ICQ   Вверх
DENNN
Дата 18.8.2003, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 1
Всего: 43



Цитата
акое использование ++, как в первых двух примерах, возможно в Builder'е. MSVC не поддреживает.

Это какое же "такое использование"?
PM ICQ   Вверх
oleg1973
Дата 18.8.2003, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: 1
Всего: 34



smile.gif
кароче асм рулит smile.gif
а впрочем как всегда smile.gif


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
RAN
Дата 18.8.2003, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

Репутация: 5
Всего: 6



DENNN, введи ( (char*)A )++; в MSVC и он выдаст, что у оператора ++ должен быть lvalue.

oleg1973, то, что ты хочешь сделать требуется крайне редко. Например, я никогда этого не делал, по-моему. А вот увеличение указателя для перехода к следующему элементу массива - обычное дело. Вместе с тем "интелектуальность" операций ++ и др. позволяет писать шаблоны и вообще это очень удобно.
PM MAIL ICQ   Вверх
oleg1973
Дата 19.8.2003, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: 1
Всего: 34



RAN
просто понадбилось работать с 32 битным бэк буффером (4 байта на точку как извесно)
вот и все smile.gif
так как в си я не силен поэтому так и делал через указатель
может и другие способы есть я просто не знаю


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 19.8.2003, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



oleg1973 что тебе мешает использовать указатель на такую структуру вместо "unsigned long*":
Код
union uRGB
{
     struct
     {
           char r;
           char g;
           char b;
           char a;
     } RGBA;
     unsigned long value;
 
     uRGB() {value = 0;}
};

// .... примерчик

void SomeFunc(void *back_buffer)
{
     uRGB  *pStruct = (uRGB *)back_buffer;
     for(int i=0; i<100; i++)
     {      
           pStruct->value = 0xff00ff00;   // можно работать с цветом "целиком"...
           pStruct->RGBA.r = 0xff;      // ...а можно работать с отдельными
           pStruct->RGBA.g = 0xa0;   // компонентами цвета каждой точки
           pStruct++;
     }
}



--------------------
user posted image
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0558 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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