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

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

  1. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    добавлено после следующего топика: memcpy пофегу какой формат строки :)
     
  2. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    ! %)
    ansi/utf-8/utf-16/etc. (все это строки символов)
     
  3. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    Всем приветы. Есть ряд вопросов по VC6... ))))
    1. Чем отличается запись вида xxx.yyy от xxx->yyy ?
    2. В масме массив данных объявляется так:
    NopArray db 1000h dup (90h)
    Как в Си++ задать 1000h ноп-ов?
    3. Нужно ли в С++, подобно делфи, на начале асмовской вставки и в ее конце сохранять все ригистры и восстанавливать соответственно...?
    Заранее спасибо...
     
  4. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    Код (Text):
    1. struct aaa{
    2. yyy
    3. zzzz}
    4. aaa xxx;
    5. aaa* zzz;
    6. ...
    7. ...
    8. xxx.yyy
    9. zzz->yyy
    типа когда xxx структура, тогда точка, когда укозатель на структуру, тогда стрелко.
    2. memset
    3. имхо да. но может зависеть от компиллера и от того, что ты собственно в асм вставке делоешь, проверь в отладчеке
     
  5. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    nitrotoluol
    Запись вида xxx.yyy; - это как правило стек, т.е. когда ты видишь:

    mov ebp,esp
    sub esp,размер структуру в байтах
    mov dword[ebp+yyyy],reg - это пример обращение к xxx.yyy

    Если ты используешь str1 * xxx = new str1;
    то это использование динамической памяти как правило сводится к винапи VirtualAllocEx или подобное этой, в результате указатель, который называется this в си он довольно часто лежит в ecx. Ну и обращаешься к нему соответсвенно. Это без оптимизации, но смысл думаю ясен, -> это всего лишь обратиться к переменной через указатель, ты по идее заместо xxx->yyy можешь написать и (*xxx).yyy но тебе это удобно?
     
  6. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    По поводу нопов
    Нужно чтобы при компиляции в определенном месте были нопы.
    Скажем, так

    ...somecode...
    i = k+x;
    _asm {
    nop
    nop
    nop
    ...
    nop
    }
    ...somecode...
     
  7. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    nitrotoluol
    2. AFAIK, такого механизма в C++ нет. Лучше делать это в рантайме (memset), т.к. статическая инициализация ненулевым значением приводит к разбуханию размера бинарника. MASMа это тоже касается. :derisive:
    3. в обычной ф-ции не обязательно, в naked - надо.
     
  8. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    green
    Именно разбухание и нужно
    Нужно в бинарнике зарезервировать метсто, чтобы другим бинарником вставить в ехе нужные данные....
     
  9. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    nitrotoluol
    char PustoeMesto[90];
    Только не локально (на стеке), а глобально нужно объявлять.
     
  10. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    и static вроди есчо написать
     
  11. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Можно и статик. Можно просто выделить память (VirtualAlloc) c флагом PAGE_EXECUTE_READWRITE, и туда копировать свой код, который будет выполняться. И зачем столько нопов? если в исходном состоянии этот кусок не должен ничего делать - просто вставить в начале ret (если это отдельная процедура) или jmp на конец этого куска.
     
  12. FMeat

    FMeat New Member

    Публикаций:
    0
    Регистрация:
    4 мар 2007
    Сообщения:
    25
    Доброго времени суток, форумчане.
    После вынужденного перерыва возратился к изичению С++ и сразу же сталкнулся с проблемой - отсутсвием справочного материала. (Он был у мне я но сейчас, увы, он храниться на жёстком диске который уже как пол года не работает.)
    Вообщем к сути: пользуясь учебником "Как програмировать на С++" Харви и Пола Дейтл's (Не решился сколнять их фамилию на руский манер) набрал учебный пример и скомпилировал, естественно пример работает, хотя и не совсем так как должен.
    Сама же проблема состоит в том что многои из тех конструкций что там использовались мне не понятны и нет справочного материала который бы мог прояснить ситуацию.
    Так что оставив смущение выложу сюда очень не маленьку программу и попрашу вас набраться терпения исправить и/или объяснить то что у меня вызвало затруднения.

    И так программа состоит из трёх файлов:
    employ.h
    employ.c++
    main.c++
    Думаю тут что то объяснять не надо.
    Так что дальше.

    Код (Text):
    1. // Файл employ.h
    2.  
    3. #ifndef EMPLOY_H
    4. #define EMPLOY_H
    5.  
    6. class Employee
    7. {
    8. public:
    9.     Employee(const char*, const char*);
    10.     ~Employee();
    11.     const char *getFirstName() const;
    12.     const char *getLastName() const;
    13.  
    14.     static int getCount();
    15.  
    16. private:
    17.     char *firstName;
    18.     char *lastName;
    19.  
    20.     static int count;
    21. };
    22.  
    23. #endif
    24.  
    25. // Файл employ.c++
    26.  
    27. #include "iostream"
    28. #include "string"
    29. #include "assert.h"
    30. #include "employ.h"
    31.  
    32. using namespace std;
    33.  
    34. int Employee::count = 0; //Первый момент который хочеться прояснить: если элемент static то как случилось что ему присваиваиться значение не один раз?
    35.  
    36. int Employee::getCount()
    37. {
    38.     return count;
    39. }
    40.  
    41. Employee::Employee(const char *first, const char *last)
    42. {
    43.     firstName = new char[ strlen(first) + 1 ]; // [ strlen(first) + 1 ] как я понял это парметры (размер) создоваемого массива. Непонтным остаёться то что делает эта функциция и как.
    44.     assert (firstName != 0); // Здесь таже самая проблема что и в пердыдужем вопросе: что и как?
    45.     strcpy (firstName, first); // И снова вопрос не изменен - что и как?
    46.  
    47.     lastName = new char [ strlen(last) + 1 ];
    48.     assert (lastName != 0);
    49.     strcpy (lastName, last);
    50.  
    51.     ++count; // Вот то что я упоминал в первом вопросе - присваивание объекту static значения.
    52.  
    53.     cout << "Konstrutor dlya " << firstName << " " << lastName << " vizvan." << endl;
    54. }
    55.  
    56. Employee::~Employee()
    57. {
    58.     cout << "Destrutor dlya " << firstName << " " << lastName << " vizvan." << endl;
    59.    
    60.     delete [ ] firstName;
    61.     delete [ ] lastName;
    62.  
    63.     --count;
    64. }
    65.  
    66. const char *Employee::getFirstName() const
    67. {
    68.     return firstName;
    69. }
    70.  
    71. const char *Employee::getLastName() const
    72. {
    73.     return lastName;
    74. }
    75.  
    76. // Файл main.c++
    77.  
    78. #include "iostream"
    79. #include "employ.h"
    80.  
    81. using namespace std;
    82.  
    83. void main ()
    84. {
    85.     cout << "Count = " << Employee::getCount << endl;
    86.  
    87.     Employee *e1Ptr = new Employee ("susan", "beker");
    88.     Employee *e2Ptr = new Employee ("robert", "jones");
    89.  
    90.     cout << "Count = " << Employee::getCount << endl;
    91.  
    92.     cout << endl << "Chel 1: "
    93.         << e1Ptr->getFirstName() << " "
    94.         << e1Ptr->getLastName()
    95.         << endl << "Chel 2: "
    96.         << e2Ptr->getFirstName() << " "
    97.         << e2Ptr->getLastName() << endl;
    98.  
    99.     delete e1Ptr;
    100.     delete e2Ptr;
    101.  
    102.     cout << "Count = " << Employee::getCount << endl;
    103. }
    Думаю это пока все вопросы. Если сей текст слишком громзодок, прошу прощения - я только учусь.
    Ешё мне пока я писал пришло в голову что я малло что знаю об указателя и ссылках. Не могли бы мне порекомедовать ресурс где есть об этом какя либо нформация на рускмо языке?
     
  13. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Значение присваивается только один раз, еще до вызова main()
    длина строки + 1 на завершающий ноль '\0'
    отладочная проверка на не ноль
    подсчет копий объекта

    Вердикт: учиться-учиться-учиться.
     
  14. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    Народ, подскажите как правильней создать проект в msvc++ 6.0/2005 express.
    В общем нужно так:
    проект1: выходной файл - .lib
    проект2: выходной файл - .exe, использует lib из проекта1

    Создавал workspace с двумя проектами, ставил dependense проекта2 от проекта1. Но в этом случае ресурсы, которые содержатся в проекте1, отрезаются линкером при создании exe-файла проекта2, что нежелательно.
     
  15. FMeat

    FMeat New Member

    Публикаций:
    0
    Регистрация:
    4 мар 2007
    Сообщения:
    25
    censored
    Благодарю.
     
  16. lukash

    lukash New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2006
    Сообщения:
    142
    Всем привет!
    Пытаюсь со структурами разобраться, не выходит ничего.

    Допустим, есть структура

    Код (Text):
    1. struct pkt
    2. {
    3. in_Header in;
    4. tcp_Header tcp;
    5. longword maxsegopt;
    6. };
    и структура

    Код (Text):
    1. struct in_Header
    2. {
    3. word            vht;    /* version, hdrlen, tos */
    4. word            length;
    5. word            identification;
    6. word            frag;
    7. word            ttlProtocol;
    8. word            checksum;
    9. in_HwAddress    source;
    10. in_HwAddress    destination;
    11. };
    создаю указатель
    pkt *pkt;

    почему при отладке во всех ячейках ptk
    CXX0030: Error: expression cannot be evaluated

    а при pkt->in.vht = 0x4500; /* version 4, hdrlen 5, tos 0 */ = 0, например,
    выскакивает ошибка по обращению к памяти?
    Подскажите плз.
     
  17. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    lukash
    Ты создал указатель, но он не указывает ни на что - нужно ещё создать саму структуру:
    Код (Text):
    1. pkt *name = new pkt; // выделение
    2. ... // используешь
    3. delete name; // освобождение
    Или, если не обязательно динамическое выделение памяти, то просто:
    Код (Text):
    1. pkt name;
     
  18. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Код (Text):
    1. int foo(void) {
    2.   ...
    3.   foo(); foo(); foo(); foo(); foo();
    4.   foo(); foo(); foo(); foo(); foo();
    5.   foo(); foo(); foo(); foo(); foo();
    6.   foo(); foo(); foo(); foo(); foo();
    7.   ...
    8. }
     
  19. lukash

    lukash New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2006
    Сообщения:
    142
    maxdiver

    Спасибо, работает
     
  20. lukash

    lukash New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2006
    Сообщения:
    142
    Еще один вопрос.
    Ошибка линкера error LNK2019: unresolved external symbol. Уже много раз обсуждалось, но вроде как все правильно подключил.
    Нужно использовать процедуры из winpcap, все нужные файлы скопировал в соответствующие директории. Посмотрите плз.

    http://slil.ru/24596359