Тут размещают свои топики новички в С/С++.

Тема в разделе "LANGS.C", создана пользователем nitrotoluol, 4 мар 2007.

  1. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    Я заметил что в книжках, статьях и форумах часто встречаются такие строки

    int **p1 = new int *[x]; (Вопрос nitrotoluol )

    int** p1 = new int*[x]; (Ответ Great )

    из контекста я чувствую что это синонимы но меня терзают сомнения - пробел и ** всетаки меняются местами .... ведь для чего то это нужно ???
     
  2. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    Rockphorr
    это синонимы
    можно было бы писать и без пробела, и с 2я пробелами
     
  3. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    GoldFinch
    спасибо
     
  4. verelex

    verelex New Member

    Публикаций:
    0
    Регистрация:
    15 ноя 2006
    Сообщения:
    90
    привет, вопрос такой:
    Код (Text):
    1. typedef std::list< Cmymy > CmymyList;
    2. ...
    3. void Cclass::foo(CmymyList::iterator  iterQ)
    4. {
    5. ...
    6. }
    когда мы передаем итератор по значению, создается новый объект или нет?
    Итератор же вроде как указатель. А если создается, то копия CmymyList?
     
  5. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    verelex
    копия итератора
     
  6. WhiteP

    WhiteP New Member

    Публикаций:
    0
    Регистрация:
    16 ноя 2008
    Сообщения:
    7
    Здравствуйте.
    Объясните, пожалуйста, пошагово вот такую конструкцию:

    *(FARPROC*)&pFunc=GetProcAddress(hMod,"funcname")

    а именно " *(FARPROC*)&pFunc ". То, что это приведение к FARPROC - понятно. Не понятна последовательность происходящих преобразований.
    Заранее спасибо.
     
  7. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Указатель на pFunc, приводится к указателю на FARPROC и разыменовывается.
    Что аналогично:
    Код (Text):
    1. int *pFunc2;
    2. int **pFunc = &pFunc2;
    3. *((FARPROC*)pFunc)=GetProcAddress(hMod,"funcname");
     
  8. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    WhiteP
    адрес pFunc, который имеет тип "указатель на что-то" приводится к типу FARPROC* - указатель на FARPROC
    это нормальное приведение, любой указатель можно привести к другому указателю (но не указатели на методы)
    затем FARPROC* разыменовывается, получается тип FARPROC, и туда копируется результат GetProcAddress, который имеет тип FARPROC

    это надо для тех случаев, когда невозможно приведение (FARPROC)pFunc
     
  9. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    GoldFinch
    Приведение возможно, но в данном случае его результатом будет read-value, временным объектом, которому ничего нельзя присвоить.
     
  10. WhiteP

    WhiteP New Member

    Публикаций:
    0
    Регистрация:
    16 ноя 2008
    Сообщения:
    7
    Booster,GoldFinch большое спасибо!
    Опять глупость спрошу, т.к. не очень понятно:

    FARPROC - указатель на функцию
    pFunc - указатель на функцию

    Получается, что адрес(&) указателя на функцию приводится к типу указатель на указатель на функцию и разыменовывается?...

    Если pFunc и FARPROC являются указателями, то "(FARPROC)pFunc" - понятно. А вот адрес указателя приводить зачем... Я так понимаю, что адрес указателя - это адрес в памяти, по которому лежит другой адрес.
     
  11. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    WhiteP
    тип указателя на что-то приводится к типу указателя на FARPROC
    это нормальная операция, любой U* можно привести к V*
    а вот U не всегда можно привести к V

    (FARPROC)pFunc невозможно если тип pFunc - void(C::*)()
    т.к. void(C::*)() не может быть приведен к void(*)()
    т.к. void(C::*)() - "указатель на функцию член", а не просто "указатель"

    и да, как сказал Booster, (FARPROC)pFunc это r-value, и не может стоять в левой части, а *(...) может
     
  12. lomerok

    lomerok New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2008
    Сообщения:
    60
    кажись я поспешил в этом разделе создавать тему извиняйте я только прибыл и незаметил этой темы , вот вопрос :
    почему неработает вставка вот эта
    Код (Text):
    1. char* test;
    2.  asm
    3.  {
    4.   mov test,15
    5.  };
    6.  MessageBox(0,test,test,0);
    в borland c++ 6 .
    вот ошибки :
    Код (Text):
    1. 1 - Undefine symbol 'test' .
    2. 2 - Invalid combination of opcode and operands .
    3. обе на строке "mov test,15"
     
  13. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Если у pFunc тип FARPROC, то ничего приводить не надо. При приведении нужно осознавать, что приведение работает как read-value, то есть создаётся временный объект и далее уже он и фигурирует.
    Например это не пройдёт:
    Код (Text):
    1. int i;
    2. float f;
    3. (float*)&i = &f;
    Так как выражение: (float*)&i, преобразуется компилятором во временный read-value указатель, которому ничего присвоить нельзя. А если мы разыменуем этот временный read-value указатель, то пожалуйста присваивай. По-этому и берётся указатель на указатель, который приводиться, и потом разыменовывается. (FARPROC)pFunc нам даст read-value.
     
  14. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    lomerok
    mov byte ptr [test],15
     
  15. WhiteP

    WhiteP New Member

    Публикаций:
    0
    Регистрация:
    16 ноя 2008
    Сообщения:
    7
    GoldFinch
    Booster

    Теперь дошло. Спасибо за разжевывание!
     
  16. lomerok

    lomerok New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2008
    Сообщения:
    60
    теперь код такой:
    Код (Text):
    1.  char* test;
    2.  asm
    3.  {
    4.   mov byte ptr [test],15;
    5.  }
    6.  MessageBox(0,test,test,0);
    а ошибка такая :
    Код (Text):
    1. Undefined symbol 'test'.
    ругается опять на эту строку "mov byte ptr [test],15;" .
     
  17. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    lomerok
    Что за компилер?
    Код (Text):
    1. char* test;
    2. __asm
    3. {
    4.   mov byte ptr [test],15;
    5. }
    6. MessageBox(0,test,test,0);
     
  18. lomerok

    lomerok New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2008
    Сообщения:
    60
    Borland C++ 6.
     
  19. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    Booster
    http://www.wasm.ru/forum/viewtopic.php?pid=345925#p345925
     
  20. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    lomerok
    Тогда изучать tasm, basm.