Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2007.09.02;
Скачать: [xml.tar.bz2];

Вниз

Непонятная строчка кода   Найти похожие ветки 

 
исследователь ©   (2007-08-03 12:40) [0]

Уважаемые Мастера!
Читал сейчас код один старенький для чтения GIF-файла и стопанулся вот на чем:

Getbyte:=GIFStuff^[GIFPtr];

Это что за операция такая - ^[] ?

Заранее спасибо


 
clickmaker ©   (2007-08-03 12:41) [1]

разыменование указателя


 
исследователь ©   (2007-08-03 12:43) [2]

Поясните, пожалуйста, что происходит здесь, по пунктам - и каков результат действия.


 
исследователь ©   (2007-08-03 12:44) [3]

я просто привык, что разыменовывание указателя - это просто P^

а эти квадратные скобки... шо цэ?


 
clickmaker ©   (2007-08-03 12:45) [4]


> а эти квадратные скобки... шо цэ?

эээ... элемент массива?


 
wp2 ©   (2007-08-03 12:45) [5]

А паскаль сложно почитать?


 
Dib@zol ©   (2007-08-03 12:45) [6]

GifStuff - это не массив, а УКАЗАТЕЛЬ на массив. Разыменование - это операция позволяющая считать такие GifStuff-ы обычными массивами (или указатель на переменную - обычной переменной). PInteger^=Integer.


 
wp2 ©   (2007-08-03 12:48) [7]

type S = array[1..20] of Integer;
var W: ^S;
begin
    W^[1] := 20;
    WriteLn(W^[1]);
    ReadLn
end.


 
исследователь ©   (2007-08-03 12:49) [8]

Спасибо, теперь понял.

Только вот к чему автор делал все через указатели, если опять же затем пытается работать с ними, как с обычными массивами?


 
исследователь ©   (2007-08-03 12:50) [9]


> type S = array[1..20] of Integer;var W: ^S;begin     W^[1]
> := 20;     WriteLn(W^[1]);     ReadLnend.

спасибо, все наглядно и ясно


 
Dib@zol ©   (2007-08-03 12:50) [10]

> Только вот к чему автор делал все через указатели, если
> опять же затем пытается работать с ними, как с обычными
> массивами?

Кхм. ГИФы могут быть, ээ, различного размера...


 
wp2 ©   (2007-08-03 12:50) [11]

> PInteger^=Integer.

Гы

PInteger = ^Integer;


 
исследователь ©   (2007-08-03 12:51) [12]

могут, не спорю. И что? Скорость вычислений?


 
исследователь ©   (2007-08-03 12:51) [13]


> PInteger = ^Integer;

Спасибо, а то я испугался, что совсем дурак и уже начал вводить себе НОВУЮ философию кода :)


 
Dib@zol ©   (2007-08-03 12:53) [14]

> Скорость вычислений?

Именно. В частности, скорость парсинга параметров функции. Попробуй передать какой нибудь подпрограмме массив весом килобайт в тридцать...


 
Yanis ©   (2007-08-03 12:55) [15]


> а то я испугался, что совсем дурак

Честно говоря вопросы типа
> Это что за операция такая - ^[] ?

тоже на хорошие мысли не наталкивают.


 
@!!ex ©   (2007-08-03 12:56) [16]

Автор, почитай про указатели, ты не втыкаешь зачем они нужны.
Вопрос к тебе, зачем нужен указатель, если потом не работать с ним как с данными??


 
wp2 ©   (2007-08-03 12:56) [17]

>Только вот к чему автор делал все через указатели, если
> опять же затем пытается работать с ними, как с обычными
> массивами?


Ну, это больше философский вопрос. Зачем использовать указатели, если можно использовать обычные переменные.
Вон, в Java вообще нет указателей. Живы ведь.

ЗЫ. Не забывай, что обычные переменные это тоже указатели ;-)


 
Yanis ©   (2007-08-03 12:58) [18]

Куда ни глянь одни указатели.
Даёшь больше данных! Прогоним указатели.


 
Bless ©   (2007-08-03 12:58) [19]


> Dib@zol ©   (03.08.07 12:53) [14]
>
> > Скорость вычислений?
>
> Именно. В частности, скорость парсинга параметров функции.
>  Попробуй передать какой нибудь подпрограмме массив весом
> килобайт в тридцать...


в результате попытки будет передан только указатель на этот массив :)


 
исследователь ©   (2007-08-03 12:58) [20]

Понял. Извините, что так беспокою, но вот еще одна неясность:
Код этот  я нашел на http://www.forums.avtograd.ru/viewtopic.php?t=6516696&sid=1d9cc31b74df5372c22c9284f60f4839 , где-то посредине страницы. Зачем эта операция с масками:

Code:=(RawCode shr (BitOffset mod ) and ReadMask;


 
Dib@zol ©   (2007-08-03 12:59) [21]

Удалено модератором
Примечание: Жаргон смени


 
исследователь ©   (2007-08-03 13:00) [22]


> Yanis ©   (03.08.07 12:55) [15]

зачем сразу оскорблять? Ты не был новичком? Я всего лишь попросил помочь, думаю, не стоит так сразу.


> @!!ex ©   (03.08.07 12:56) [16]

Уже начал "ффыкать"


 
исследователь ©   (2007-08-03 13:03) [23]

Причем явно строчка некорректна


 
исследователь ©   (2007-08-03 13:04) [24]

Видимо, из-за смайла в очках 8)

там было

Code:=(RawCode shr (BitOffset mod 8) and ReadMask;


 
Yanis ©   (2007-08-03 13:06) [25]


> зачем сразу оскорблять?

А я и не пытался :) Потому как

> был новичком


 
исследователь ©   (2007-08-03 13:08) [26]


> А я и не пытался :) Потому как

ты лучше вот помоги, строчку объясни


 
wp2 ©   (2007-08-03 13:08) [27]

ясно, что не корректна, количество открытых скобок не соотвествует количеству закрытых :-)

Да еще и после мода нет операнда.


 
@!!ex ©   (2007-08-03 13:08) [28]

> [17] wp2 ©   (03.08.07 12:56)

Обычные переменные - не указатели. вернее фиксированные указатели. Им нельзя выделять память, их нельзя изменять.


> в результате попытки будет передан только указатель на этот
> массив :)


Не. Нифига. Копия массива будет передана(если разговор не о динамическом массиве, который сам по себе является указателем)


 
wp2 ©   (2007-08-03 13:10) [29]

Обычные переменные - не указатели. вернее фиксированные указатели. Им нельзя выделять память, их нельзя изменять.

Ну, это понятно.

А вон в С/С++ можно вообще, через указатели константу поменять!!!


 
исследователь ©   (2007-08-03 13:14) [30]

Я уже подправил строчку, объясните, пожалуйста.


 
Dib@zol ©   (2007-08-03 13:20) [31]

shr - бинарный сдвиг влево, быстрый аналог div 2. shr 8 означает сдвиг на восемь разрядов.
mod - нахождение остатка от деления. 3 mod 2 = 1. 10 mod 5 = 0.
and - побитное сличение разрядов чисел. то есть в числе (в его двоичном представлении) остаются единицами тока те разряды, которые и во 2-м числе единицы.


 
исследователь ©   (2007-08-03 13:21) [32]

Поверьте, я знаю назначение всех операция, даже shr-ом могу похвастаться :) Меня интересует, зачем это было сделано и что получилось.


 
wp2 ©   (2007-08-03 13:22) [33]

>Code:=(RawCode shr (BitOffset mod 8) and ReadMask;

количество открытых скобок не соотвествует количеству закрытых

Ты, если решил программировать, то хоть бы книжку какую почитал...


 
clickmaker ©   (2007-08-03 13:24) [34]


> Меня интересует, зачем это было сделано и что получилось

надеешься, что здесь объявится автор кода?


 
Dib@zol ©   (2007-08-03 13:25) [35]

В итоге RawCode сдвигается на 1-7 разрядов, сиречь делится на 2-28, а потом из него выделяется определённая цепочка бит и пишется в Code.


 
исследователь ©   (2007-08-03 13:26) [36]


> wp2 ©   (03.08.07 13:22) [33]

та б... хорошо,

Code:=(RawCode shr (BitOffset mod 8) ) and ReadMask;

думаю очевидно, что больше ставить ее некуда, разве что в конец :), но это тупо. Я не такой ламак, просто не заметил


 
исследователь ©   (2007-08-03 13:28) [37]


> надеешься, что здесь объявится автор кода?

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


> определённая цепочка бит и пишется в Code.

это тоже я понял, вопрос в том - нафига? (с)


 
Dib@zol ©   (2007-08-03 13:30) [38]

> это тоже я понял, вопрос в том - нафига? (с)

Уууу... Эт сложный вопрос. Вот если б я знал, откуда ты этот код сковырнул, тогда да. А так... Звиняй.


 
Zeqfreed ©   (2007-08-03 13:31) [39]

При чем здесь скорость вычислений? Просто обращаться к данным по индексу гораздо удобней, чем вручную сдвигать указатель.


 
ProgRAMmer Dimonych ©   (2007-08-03 13:32) [40]

> исследователь ©   (03.08.07 13:28) [37]
> это тоже я понял, вопрос в том - нафига? (с)

Видимо, эта операция позволяет восстановить исходную последовательность байтов, описывающих изображение, из сжатой. Т.е. где-то рядом в статье должно быть объяснение - зачем. Если нет - можно поверить, можно - найти описание формата. Там что-нибудь обязательно будет.


 
исследователь ©   (2007-08-03 13:33) [41]


> Вот если б я знал, откуда ты этот код сковырнул

я вроде написал:

http://www.forums.avtograd.ru/viewtopic.php?t=6516696&sid=1d9cc31b74df5372c22c9284f60f4839


 
@!!ex ©   (2007-08-03 13:34) [42]

> [37] исследователь ©   (03.08.07 13:28)

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


 
Dib@zol ©   (2007-08-03 13:34) [43]

Чур меня!!! Нечисть... Мне с такой бандуриной неделю разбираться! Нет уж нафик...


 
Плохиш ©   (2007-08-03 13:35) [44]


> исследователь ©   (03.08.07 13:33) [41]

Первое с чего надо было бы начинать, описано в вразе из [40] "найти описание формата".


 
Плохиш ©   (2007-08-03 13:36) [45]


> вразе

"фразе", вот ведь снова промахнулся...


 
исследователь ©   (2007-08-03 13:37) [46]


> гиф хранится или лезть смотреть

описание формата я читал, было мне НЕ в лом, но вот про эту маску там не слова нет :) - это издержки программирования, так что не надо


> Плохиш ©   (03.08.07 13:35) [44]

то же самое


> бандуриной

бандурина - это что конкретно? там код только посредине этот, там и другие исходники есть.


 
ProgRAMmer Dimonych ©   (2007-08-03 13:41) [47]

> Плохиш ©   (03.08.07 13:36) [45]
> > вразе
> "фразе", вот ведь снова промахнулся...

Сегодня явно не Ваш день: Клава не в духе :):):)

> исследователь ©   (03.08.07 13:37) [46]
> > гиф хранится или лезть смотреть
> описание формата я читал, было мне НЕ в лом, но вот про
> эту маску там не слова нет :) - это издержки программирования,
>  так что не надо

Верно. Если Вы приведёте здесь фрагмент описания формата GIF, который касается этого места в коде, любой из здесь присутствующих с радостью объяснит. Хотя бы в общих чертах: для чего используется эта часть кода - расшифровки-распаковки изображения или чтения информации о нём - и что по этому поводу в описании формата.


 
Плохиш ©   (2007-08-03 13:44) [48]


> Сегодня явно не Ваш день

Фии...


 
исследователь ©   (2007-08-03 13:44) [49]


> фрагмент описания формата GIF

для того, чтобы привести этот фрагмент, мне нужно его НАЙТИ, а если я его НАЙДУ,  то значит и РАЗБЕРУСЬ, что чему соотвествует, тогда зачем мне помощь? Замкнутый круг, я не могу разобраться и в тупике! Помогите, кто может уделить хоть немного времени!


 
исследователь ©   (2007-08-03 13:45) [50]


>  соотвествует

извините, соответствует


 
Dib@zol ©   (2007-08-03 13:46) [51]

{ Делает поpцию из 24-бит}
U.b1:=Raster^[Byteoffset];
U.B2:=Raster^[Byteoffset+1];
U.W1:=0;
If CodeSize>=8 then
U.W1:=Raster^[Byteoffset+2];
RawCode:=U.Wo;
{ вычисляем пеpвое значение по фоpмуле
Rawcode:=Raster^[Byteoffset]+(256*Raster^[Byteoffset+1])+
(65536*Raster[Byteoffset+2])
пpовеpить на ошибку !}

Code:=(RawCode shr (BitOffset mod 8)) and ReadMask;

Урряя! Code - это код ошибки!!!


 
Плохиш ©   (2007-08-03 13:48) [52]

Хм,

{ Выбиpает следующий код из pастpового потока. Код может содеpжать
от 3 до 12 бит, упакованные в 8-ми битные байты. Используется
значение смещения BIT. Мы подсчитываем смещение делением на 8 }

Procedure ReadCode;
type Univ=record
case integer of
1:(b1,b2:byte;w1:word);
2:(Wo:longint);
end;

Var RawCode:LongInt;
U:Univ;
Begin
ByteOffset:=BitOffset shr 3;

{ Делает поpцию из 24-бит}
U.b1:=Raster^[Byteoffset];
U.B2:=Raster^[Byteoffset+1];
U.W1:=0;
If CodeSize>=8 then
U.W1:=Raster^[Byteoffset+2];
RawCode:=U.Wo;
{ вычисляем пеpвое значение по фоpмуле
Rawcode:=Raster^[Byteoffset]+(256*Raster^[Byteoffset+1])+
(65536*Raster[Byteoffset+2])
пpовеpить на ошибку !}

Code:=(RawCode shr (BitOffset mod 8) and ReadMask;

Афигеть, долго и неудержно рыдал...


 
исследователь ©   (2007-08-03 13:49) [53]

Неправда.

Используется для определения, не конец ли файла и не некий ли "код сброса"


 
Dib@zol ©   (2007-08-03 13:49) [54]

Тфу...


 
исследователь ©   (2007-08-03 13:50) [55]


> исследователь ©   (03.08.07 13:49) [53]

это я по поводу 51


> Афигеть, долго и неудержно рыдал..

над чем ржал? эта строка и выполняет то, что написано у вас жирным?


 
исследователь ©   (2007-08-03 13:51) [56]

тогда какую все-такие роль играет маска?


 
ProgRAMmer Dimonych ©   (2007-08-03 13:55) [57]

> исследователь ©   (03.08.07 13:37) [46]
> описание формата я читал, было мне НЕ в лом, но вот про
> эту маску там не слова нет :) - это издержки программирования,
>  так что не надо

> исследователь ©   (03.08.07 13:44) [49]
> для того, чтобы привести этот фрагмент, мне нужно его НАЙТИ,
>  а если я его НАЙДУ,  то значит и РАЗБЕРУСЬ, что чему соотвествует,
>  тогда зачем мне помощь? Замкнутый круг, я не могу разобраться
> и в тупике! Помогите, кто может уделить хоть немного времени!

А зачем ещё нужно описание формата, кроме как чтобы разобраться?


 
исследователь ©   (2007-08-03 13:56) [58]


> А зачем ещё нужно описание формата, кроме как чтобы разобраться?

многие сорцы чтения GIF предлагают читать BlockRead-ом через структуры, которые и описаны в формате.


 
wp2 ©   (2007-08-03 13:57) [59]

>Помогите, кто может уделить хоть немного времени!

Да я и так целый час уделил тебе.


 
исследователь ©   (2007-08-03 13:59) [60]


> Да я и так целый час уделил тебе.

мне поклониться?

по делу - ничего.


 
AZIZE ©   (2007-08-03 14:04) [61]


> по делу - ничего.
>

не перебирай харчами


 
исследователь ©   (2007-08-03 14:07) [62]

не болтайте ерундой, лучше по сути на 56 ответьте


 
исследователь ©   (2007-08-03 14:46) [63]

Видимо, никто не знает


 
@!!ex ©   (2007-08-03 15:01) [64]

Та уже 10 раз ответили.
А гвооришь что знаешь как работает and....
ReadMask это как раз маска с которой соответствует значение.
Если полученное значение соответствует маске, то что мы получим на выходе???


 
wp2 ©   (2007-08-03 15:06) [65]

Исследователь слушай, оно тебе надо? Скажи. Работает, пускай себе работает!


 
исследователь ©   (2007-08-03 15:18) [66]


> @!!ex ©   (03.08.07 15:01) [64]

вроде такое же значение? если 1 and 1=1, 0 and 0 = 0


> wp2 ©   (03.08.07 15:06) [65]

типа "не трожь г, вонять не будет?"


 
@!!ex ©   (2007-08-03 15:45) [67]

> [66] исследователь ©   (03.08.07 15:18)

Правильно.
Маска служит для выдирания из большого числа частей.
Например нам нужно знать, какое число лежит в трех битах справа:
01010101
and
00000111
=
00000101=5

Ок? Тоесть маска позволяет вырезать из числа часть данных.


 
исследователь ©   (2007-08-03 16:14) [68]

Понял. Большое вам спасибо. Научили :)


 
Anatoly Podgoretsky ©   (2007-08-03 16:29) [69]

> исследователь  (03.08.2007 13:04:24)  [24]

Эта строчка не откомпилируется


 
wp2 ©   (2007-08-03 16:30) [70]

How Old are you?



Страницы: 1 2 вся ветка

Форум: "Прочее";
Текущий архив: 2007.09.02;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.62 MB
Время: 0.045 c
2-1186807933
Alex7
2007-08-11 08:52
2007.09.02
SELECT DISTINCT :myParameter FROM ... можно ли так?


4-1173028061
GrayFace
2007-03-04 20:07
2007.09.02
Access Violation в shell32.dll при вызове IFolderView.Items


15-1186037896
Knight
2007-08-02 10:58
2007.09.02
Хочу пойти учиться заочно...


15-1186376614
de.
2007-08-06 09:03
2007.09.02
>>> По поводу законности размещения антенн в России <<<


2-1186581369
Constantin
2007-08-08 17:56
2007.09.02
Double





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский