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

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

  1. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Как в Си правильно вводить новые типы данных и правильно работать с их орифметикой?
    Например я ввожу тип данных
    typedef struct _complex{
    DWORD a;
    DWORD b;
    DWORD c;
    DWORD d;
    }complex,*pcomplex;

    мне нужно чтобы a было целой частью, а оставшиеся b,c и d были дробной частью.
    Я догадываюсь что нужно перегружать операторы +,-,/,*, но незнаю как это правильно делать.
    Может у кого пример есть?!


    Ээ может я зря выпендриваюсь и в си уже есть тип complex(_CMPLX)??
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    twgt
    #include <complex>

    А по поводу создания своей реализации - у Страуструпа описано.
     
  3. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    IceStudent
    Спасибо. Но не пойму как теперь правильно объявить этот тип.


    Всё, разобрался, спасибо!
     
  4. Keva

    Keva New Member

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    130
    Подскажите как победить ошибку? E2015 Ambiguity between '__stdcall System::SetLastError(int)' and '__stdcall SetLastError(unsigned long)'. Заранее благодарю.
     
  5. T_A_M_A_R_A

    T_A_M_A_R_A New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2006
    Сообщения:
    4
    Заранее извиняюсь, если такие вопросы уже обсуждались... Слабым оправданием мне является только шок от вынужденного перехода с асма на си++...

    1) Как сделать ассемблерную вставку в Borland C++ 5.02, если при попытке написать что-то вроде:
    __asm
    {
    ...
    };

    компилятор ругается: error parsing transfer macros?

    2) Как в этом же компиляторе отключить генерацию прологового кода?

    Заранее благодарю...
     
  6. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    насколько помню:
    Код (Text):
    1. asm {
    2. ...
    3. }
     
  7. T_A_M_A_R_A

    T_A_M_A_R_A New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2006
    Сообщения:
    4
    Пробовала - не работает...
     
  8. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    T_A_M_A_R_A
    Тогда может в справке посмотрите?
     
  9. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    в свете последних тем у меня появился вопрос:

    Код (Text):
    1. class C
    2. {
    3.   //
    4.   void func();
    5.   char *pChar;
    6. };
    7.  
    8. void C::func()
    9. {
    10.    pChar = new char('x');
    11. }
    теперь нам нужно получить данные из класса C как const char *, т.е. чтобы далее в коде мы не могли изменять данные, на которые указывает pChar.
    как будет правильнее это сделать:
    1.
    Код (Text):
    1. const char* C::getPointer() const
    2. {
    3.     return pChar;
    4. }
    или же
    2.
    Код (Text):
    1. const char* C::getPointer() const
    2. {
    3.     return static_cast<const char*>(pChar);
    4. }
    второй вариант является излишеством и лучше оставить первый или что?
     
  10. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    varnie
    Угу, приведение к константному типу выполняется неявно.
     
  11. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    здравствуйте.

    поясните пожалуйста, каким образом правильно предусмотреть исключительные ситуации , которые могут вознинуть в конструкторе? читал, что не рекомендуется их использовать в конструкторах, но что тогда делать, если нужно проинициализировать член класса, являющийся указателем на какой-либо др. тип/объект? спасибо!

    ps: я вас уже достал наверно своими С++ вопросами. если знаете хороший С++ форум, сообщите мне об этом, чтоб я вас здесь не терзал далее:).
     
  12. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
  13. Keva

    Keva New Member

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    130
    Доброго всем времени суток. Вопрос такой, есть три переменные x,y,z как поменять значения местами не вводя дополнительной переменной? Менять как угодно. Буду признателен
     
  14. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    xor a, b
    xor b, a
    xor a, b
     
  15. Quark

    Quark New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    211
    Я вот думаю.. стоит ли в прогах юзать goto? многие говорят что это неэтично. а что делать, когда for|while не справляются?
     
  16. Keva

    Keva New Member

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    130
    Как реализовать xor на С без ассемблерной вставки?
     
  17. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Как с помощью стандартного потока ввода/вывода считать поток символов в список вида
    struct str
    {
    char s[10];
    str *next;
    };
    т.е. при вводе поток символов ограничен Enter'ом

    ЗЫ как обычно интересно более или менее элегантное решение, вопрос конечно из разряда утчи матчасть, но просто плохо есче знаком сo стандартными классами c++
     
  18. letopisec

    letopisec New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2004
    Сообщения:
    228
    Вот что пишут по этому поводу Jonathan Corbet, Alessandro Rubini, Greg Kroah-Hartman, в своей книге linux device drivers, во второй главе:

    Error Handling in init_module.
    ...
    Error recovery is sometimes best handled with the goto statement. We normally
    hate to use goto , but in our opinion this is one situation (well, the only situation)
    where it is useful. In the kernel, goto is often used as shown here to deal with
    errors.
    The following sample code (using fictitious registration and unregistration func-
    tions) behaves correctly if initialization fails at any point.

    Код (Text):
    1. int init_module(void)
    2. {
    3.   int err;
    4.  
    5.   /*registration takes a pointer and a name */
    6.  
    7.   err = register_this(ptr1,"skull");
    8.   if (err)  goto fail_this;
    9.  
    10.   err = register_that(ptr2,"skull");
    11.   if (err)  goto fail_that;
    12.  
    13.   err = register_those(ptr3,"skull");
    14.   if (err)  goto fail_those;
    15.  
    16.   return 0;/*success */
    17.  
    18.   fail_those:  unregister_that(ptr2,"skull");
    19.   fail_that:    unregister_this(ptr1,"skull");
    20.   fail_this:     return err;/*propagate the error */
    21. }
    This code attempts to register three (fictitious) facilities. The goto statement is
    used in case of failure to cause the unregistration of only the facilities that had
    been successfully registered before things went bad.



    А вот что Linus Torvalds в kernel/documentation/CodingStyle:

    Chapter 7: Centralized exiting of functions

    Albeit deprecated by some people, the equivalent of the goto statement is
    used frequently by compilers in form of the unconditional jump instruction.

    The goto statement comes in handy when a function exits from multiple
    locations and some common work such as cleanup has to be done.

    The rationale is:

    - unconditional statements are easier to understand and follow
    - nesting is reduced
    - errors by not updating individual exit points when making
    modifications are prevented
    - saves the compiler work to optimize redundant code away ;)

    Код (Text):
    1. int fun(int a)
    2. {
    3.     int result = 0;
    4.     char *buffer = kmalloc(SIZE);
    5.  
    6.     if (buffer == NULL)
    7.         return -ENOMEM;
    8.  
    9.     if (condition1) {
    10.         while (loop1) {
    11.             ...
    12.         }
    13.         result = 1;
    14.         goto out;
    15.     }
    16.     ...
    17. out:
    18.     kfree(buffer);
    19.     return result;
    20. }
    Так что иногда это бывает удобно/оправдано.
     
  19. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    x=x^key
     
  20. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    SPA
    думаю надо перегрузить оператор >>