Запарился с указателями

Тема в разделе "WASM.BEGINNERS", создана пользователем Delphi, 9 авг 2006.

  1. Delphi

    Delphi New Member

    Публикаций:
    0
    Регистрация:
    15 май 2006
    Сообщения:
    26
    Адрес:
    Russia
    Здравствуйте.
    Чего то я совсем запарился с указателями
    Помогите а?

    Код (Text):
    1. char z(char* Stroka)
    2. {
    3.  
    4.     char Buf[255]="";
    5.     memcpy(Buf, &Stroka[2], 2); //LeftStr
    6.  
    7.     return *Buf;
    8. };
    9.  
    10. void CMy78Dlg::OnOK()
    11. {
    12.     // TODO: Add extra validation here
    13.    
    14.    
    15.    MessageBox((const char*)z("123456"),"",0);// здесь ошибку выдает
    16. }
    тег code используем, да?
     
  2. Bohdan200

    Bohdan200 New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2005
    Сообщения:
    134
    Адрес:
    Lviv
    char z(char* Stroka) -> char* z(char* Stroka)
     
  3. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Так совсем нельзя делать -- ты выделяешь место под Buf[255] в стековом кадре, который гибнет сразу после выхода из ф-ии (м.б. данные и не запортятся -- тут как повезет).

    memcpy, если я не ошибаюсь, принимает 2 параметра, а не 3 (имелось ввиду memncpy?..) MessageBox тоже хочет 4 параметра, на 3.

    Ну это так, в общем...

    Что вообще сделать требуется? :)
     
  4. Delphi

    Delphi New Member

    Публикаций:
    0
    Регистрация:
    15 май 2006
    Сообщения:
    26
    Адрес:
    Russia
    Нужно сделать функию MIdStr типа как в Паскале
    MidStr(Source: String; Start, Size: Integer): string;

    т.е source строка допустим "123456"
    Start начало отсчета доп 2
    Size размер доп 3
    на выходе получаем 345

    на паскакале я это махом реализовал а вот на сишнике с указателями запарился :dntknw:(
     
  5. Bohdan200

    Bohdan200 New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2005
    Сообщения:
    134
    Адрес:
    Lviv
    Mika0x65 прав, char Buf[255] надо сделать глобальной.

    void *memcpy(
    void *dest,
    const void *src,
    size_t count
    );
    В MFC есть вот такая надстройка:
    int MessageBox(
    LPCTSTR lpszText,
    LPCTSTR lpszCaption = NULL,
    UINT nType = MB_OK
    );
     
  6. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Не обязательно глобальной -- можно держать ее в стеке вызывающей ф-ии.

    Бес попутал :dntknw:.

    Delphi
    В твоем случае прототип должен выглядеть так: char *MidStr(char *dst, char *src, int start, int len);

    В dst передаешь указатель на буфер, куда требуется скопировать, в src -- откуда. Возвращать char * -- указатель на результат -- не обязательно, можно, например, возвращать там число реально скопированных литер (на случай, если src окажется короче). В общем, зависит от того, что ты хочешь сделать. Вызов тогда должен выглядеть примерно так:
    Код (Text):
    1. char src[] = "Hello, C++!";
    2. char dst[5];
    3.  
    4. MidStr(dst, src, 0, 4);
    5. dst[4] = '\0'; //Не забудь вставить NULL terminator в конце :).
    6. printf("%s\n", dst);
     
  7. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    Bohdan200
    Mika0x65 прав, char Buf[255] надо сделать глобальной.

    Все даже еще хуже. Статическое выделение памяти под строки - зло и мерзость. Делать надо примерно так:

    Код (Text):
    1. char* MidStr(char* str,int start,int len)
    2. {
    3. char* r2=res=(char*)malloc(len+1);
    4. for(char* p=str+start;*p && len;p++,r2++,len--) *r2=*p;
    5. *r2='\0';
    6. return res;
    7. }
    Потом, правда, надо память не забыть освободить.
     
  8. Bohdan200

    Bohdan200 New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2005
    Сообщения:
    134
    Адрес:
    Lviv
    Это смотря сколько раз за микросекунду нужно функцию вызывать :)
     
  9. EvilsInterrupt

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

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Delphi
    Можно сделать и не глобальной этот Buf! Почему? Потому что есть naked , то бишь самому можно определить и пролог и эпилог, а следовательно убийство локальных переменных ф-ции! Но надо ли это?

    Бросается что ты принимаешь указатель на символы! А копируешь:
    , т.е не сами байты-символы,а байты из которых состоит значение указателя на символы! К тому же возвраешь не указатель на строку, а черте что:
     
  10. Bohdan200

    Bohdan200 New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2005
    Сообщения:
    134
    Адрес:
    Lviv
    Если не жалко входной строки и она читабельно-писабельна :))))
    Код (Text):
    1. char *midstr(char *src, int start, int len)
    2. {
    3.     src[start+len+1]=0;
    4.     return &str[start]
    5. }
    только start zero based
     
  11. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    А почему? Все-таки поиск и выделение блока памяти -- время. +фрагментация и возможность утечки. Мелкие объекты, ИМХО, можно и в стеке держать.
     
  12. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Mika0x65
    Delphi, VB и т.д. - все так делают. Плохо, конечно, но как иначе поступить? В стеке их держать извратными способами... Так вся логика работы со стеком на порядок усложнится.
     
  13. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Почему извратными? Не, ну конечно, стек растет вниз, массив растет вверх -- поначалу путаешься, но со временем проходит :). Единственная проблема, которую я знаю -- если массив больше страницы, приходится "прощелкивать" вниз каждую страницу массива, чтобы сдвинуть вниз защитную страницу и не скакнуть за нее.
     
  14. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Mika0x65
    Попробуй реализовать - поймёшь.

    Это цветочки.
     
  15. Bohdan200

    Bohdan200 New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2005
    Сообщения:
    134
    Адрес:
    Lviv
    Если нужна большая скорость - работаем со статической памятью
    Если важна прозрачность и структурированность проги - new/delete/malloc/free
    Как на меня - возвращать хитрым способом строку в стеке - полный изврат. Все функции работы со строками __declspec(naked) - это УЖОС!!!
     
  16. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Учите матчасть. А вообще, для c++ есть rsdn.ru и книги.

    Bohdan200
    return str + start

    Delphi
    Посмотри std::string или CString, может пройдёт желание писать делфийские обёртки над С++ :)