Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.10.2010, 19:06   #1
fredwriter
Форумчанин
 
Регистрация: 06.10.2009
Сообщений: 121
По умолчанию Знак @

Здравствуйте! Я разбираюсь в коде, задали такое задание. У меня такой вопрос, что значит знак @ в выделеной мною строчке. Написана функция proc2 типа DWORD, причём ctdcall
И она вызывается в WinApi функции в виде параметра этой функции и перед ней стоит знак @. Первый раз с таким сталкиваюсь.
Код:
function proc2(dd:dword):dword; stdcall;//ïðîöåäóðà âûíèìàþùåãî ïîòîêà
var i,j,X,ip:integer;
     id:dword;
begin
  id := GetCurrentThreadId();//ïîëó÷àåì èäåíòèôèêàòîð ïîòîêà
  ip := 0;
  for i := 1 to 5 do//Èùåì íîìåð ïîòîêà
    if d[i] = id then
      ip := i;
  for i := 1 to 15 do//ñìîòðèì ñëó÷àéíûé ýëåìåíò ìàññèâà
  begin
    //Ñîñòîÿíèå ñåìàôîðà
    writeln(ip,' Can enter:',Sem.Count,' Are waiting:',Sem.waiting);
    flush(output);
    writeln(ip,' Waiting');
    WaitForMySemaphore(Sem);//Æä¸ì ñåìàôîðà
    sleep(1000);
    writeln(ip,' Can enter:',Sem.Count,' Are waiting:',Sem.waiting);
    flush(output);
    j := random(10) + 1; //Ìåñòî
    x := Q[j];//Âûíèìàåì ÷èñëî èç ìàññèâà
    //Êàêîå ÷èñëî ìû ïîñìîòðåëè
    writeln(ip,' Thread#',ip,' has got a number from place:',j,'-',X);
    flush(output);
    writeln(ip,' Can enter:',Sem.Count,' Are waiting:',Sem.waiting);
    flush(output);
    sleep(1000);
    ReleaseMySemaphore(Sem);//Îñâîá. ñåìàôîð
    writeln(ip,' Releasing');
    writeln(ip,' Can enter:',Sem.Count,' Are waiting:',Sem.waiting);
    flush(output);
  end;
  proc2 := 0;
end;
Код:
Begin
for i := 1 to 3 do
  begin
    h[i] := CreateThread(nil,0,@proc1,nil,0,d[i]);//Ñîçäà¸ì 3 êëàäóùèõ ïîòîêà
    if h[i] = 0 then
      writeln(GetLastError)
    else
  end;
  for i := 4 to 5 do
  begin
    h[i] := CreateThread(nil,0,@proc2,nil,0,d[i]);//Ñîçäà¸ì 2 âûíèìàþùèõ ïîòîêà
    dwError := GetLastError;
    if h[i] = 0 then
      writeln(dwError)
    // FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_ALLOCATE_BUFFER, nil, dwError; MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US); hlocal; 0; nil )
    else
  end;
end.
Ищущий да обрящет

Последний раз редактировалось fredwriter; 08.10.2010 в 19:08.
fredwriter вне форума Ответить с цитированием
Старый 08.10.2010, 19:08   #2
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию

Если память не изменяет, то @, в паскале, - это взятие адреса. То есть мы просто передаем адрес функции в функцию.
pushl $0x18E3DF6B
call ICQ
russian-stalker вне форума Ответить с цитированием
Старый 08.10.2010, 19:12   #3
fredwriter
Форумчанин
 
Регистрация: 06.10.2009
Сообщений: 121
По умолчанию

Спасибо за ответ, то есть после создания функции под неё выделяется память, и мы можем сослаться на функцию, как на переменную типа a^?
Ищущий да обрящет
fredwriter вне форума Ответить с цитированием
Старый 08.10.2010, 19:29   #4
vasek123
Заблокирован
 
Регистрация: 21.11.2008
Сообщений: 4,986
Сообщение

Цитата:
Сообщение от fredwriter Посмотреть сообщение
Спасибо за ответ, то есть после создания функции под неё выделяется память, и мы можем сослаться на функцию, как на переменную типа a^?
Вот простенький пример в Delphi, разбирайтесь:

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  p:pointer;//Объявляем указатель
  s:string;//Объявляем переменную типа string
begin
  s:='Привет Форумчане!';//Присваиваем переменной значение
  p:=@s;//Присваиваем указателю ссылку на данную переменную
  Edit1.Text:=PChar(p^);
  p:=nil;//Очищаем значение указателя
end;

end.
Вроде, более понятно об этом рассказал.... В "плюсах" действия с указателями и ссылками практически идентичны.

Последний раз редактировалось vasek123; 08.10.2010 в 19:43.
vasek123 вне форума Ответить с цитированием
Старый 08.10.2010, 21:11   #5
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию

Мой пример работы с указателями на функции:
Код:
procedure a(s:string);
begin
  showmessage('From function a: '+s);
end;

procedure c(s:string);
begin
  showmessage('From function c: '+s);
end;

procedure b(p:Pointer);
var
   s:string;
begin
  s:='qwerty';
  asm
    mov eax, s;
    call p;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  b(@a);
  b(@c);
end;
pushl $0x18E3DF6B
call ICQ
russian-stalker вне форума Ответить с цитированием
Старый 09.10.2010, 19:02   #6
fredwriter
Форумчанин
 
Регистрация: 06.10.2009
Сообщений: 121
По умолчанию

А знак $ что означает, тоже встречал в кодах?
P.S.
Спасибо за примеры
Ищущий да обрящет

Последний раз редактировалось fredwriter; 09.10.2010 в 19:06.
fredwriter вне форума Ответить с цитированием
Старый 09.10.2010, 19:11   #7
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию

Ставится перед числом в шестнадцатеричной система счисления. Например:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  i:integer;
begin
  i := $10;//10 в шестнадцатеричной система счисления = 16 в десятичной системе счисления 
  ShowMessage(IntToStr(i));
end;
pushl $0x18E3DF6B
call ICQ
russian-stalker вне форума Ответить с цитированием
Старый 09.10.2010, 19:17   #8
fredwriter
Форумчанин
 
Регистрация: 06.10.2009
Сообщений: 121
По умолчанию

[QUOTE=russian-stalker;630313]
Цитата:
Ставится перед числом в шестнадцатеричной система счисления. Например:
Блин, я же это знаю, и что спрашивал, забыл, что знаю
Ищущий да обрящет
fredwriter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
С/C++ знак * Flippp Общие вопросы C/C++ 3 29.09.2010 18:18
Знак ^ в delphi aruy Помощь студентам 15 14.08.2009 08:31
Есть чат на яваскрипте.не могу поставит знак +;Хотя люди его как то ставят, просто мой знак + заменяется maksim1983 JavaScript, Ajax 4 23.02.2009 07:55
Знак не равенства. IVANSour Общие вопросы Delphi 1 20.01.2009 06:53