Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Просьба проверить / 25 сообщений из 46, страница 1 из 2
23.01.2007, 14:48
    #34275454
СИСАША
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просьба проверить
Написал функцию Копирования фрагмента строки в строку, начиная с Index символа и заканчивая Finish. Правильно ли она написана?

Код: plaintext
1.
2.
3.
4.
5.
 char* Copy(char* value,int Index,int Finish)
{
        char* result = new char[Finish+ 1 ];
        strncpy( result, value + Index, Finish );
        return result;
}
...
Рейтинг: 0 / 0
23.01.2007, 14:57
    #34275515
man_555
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просьба проверить
лучше memcpy использовать
...
Рейтинг: 0 / 0
23.01.2007, 15:00
    #34275535
Gluk (Kazan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просьба проверить
man_555лучше memcpy использовать

чем лучше ?
...
Рейтинг: 0 / 0
23.01.2007, 15:02
    #34275545
СИСАША
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просьба проверить
man_555лучше memcpy использовать
С memcpy у меня ошибку выкидывает
...
Рейтинг: 0 / 0
23.01.2007, 15:13
    #34275593
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просьба проверить
1) Finished - количество байт. Так и подразумевалось?
2) strncpy сюда действительно более подходит.
3) Посе копирования надо result[Finished] сделать равным нулем.
...
Рейтинг: 0 / 0
23.01.2007, 15:15
    #34275598
СИСАША
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просьба проверить
Akh1) Finished - количество байт. Так и подразумевалось?
2) strncpy сюда действительно более подходит.
3) Посе копирования надо result[Finished] сделать равным нулем.

1. Да, малость перепутал в формулировке.

3) Посе копирования надо result[Finished] сделать равным нулем. - А это я не совсем понял
...
Рейтинг: 0 / 0
23.01.2007, 15:16
    #34275602
СИСАША
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просьба проверить
Akh1) Finished - количество байт. Так и подразумевалось?
2) strncpy сюда действительно более подходит.
3) Посе копирования надо result[Finished] сделать равным нулем.
3. delete(result) - так?
...
Рейтинг: 0 / 0
23.01.2007, 15:17
    #34275608
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просьба проверить
СИСАША
3) Посе копирования надо result[Finished] сделать равным нулем. - А это я не совсем понял

strncpy
Функция strncpy работает аналогично, кроме того, что копируютсятолько первые n байтов строки src. Таким образом, есл и
в n байтах строки src нет нулевого байта, то строка результатане будет заканчиваться символом ‘\0’.
...
Рейтинг: 0 / 0
23.01.2007, 15:17
    #34275612
man_555
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просьба проверить
перво-наперво - какова цель, и почему не использовать stl::string?

а есть кусок кода, который отвечает за delete result? Или это надо всё-время помнить, что после copy надо вызывать delete?

imho стиль довольно-таки опасный. Зачем использовать старые C-функции заместо новых возможностей C++?
...
Рейтинг: 0 / 0
23.01.2007, 15:17
    #34275617
СИСАША
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просьба проверить
Akh1) Finished - количество байт. Так и подразумевалось?
2) strncpy сюда действительно более подходит.
3) Посе копирования надо result[Finished] сделать равным нулем.

3. Подразумевалось, что char* должен заканчиваться терминатором?
...
Рейтинг: 0 / 0
23.01.2007, 15:18
    #34275619
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просьба проверить
СИСАША Akh1) Finished - количество байт. Так и подразумевалось?
2) strncpy сюда действительно более подходит.
3) Посе копирования надо result[Finished] сделать равным нулем.
3. delete(result) - так?

Нет. Это после использования.
Код: plaintext
1.
delete[] result;
...
Рейтинг: 0 / 0
23.01.2007, 15:19
    #34275631
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просьба проверить
СИСАША Akh1) Finished - количество байт. Так и подразумевалось?
2) strncpy сюда действительно более подходит.
3) Посе копирования надо result[Finished] сделать равным нулем.

3. Подразумевалось, что char* должен заканчиваться терминатором?

Да. А в твоем коде это не детерминировано.
...
Рейтинг: 0 / 0
23.01.2007, 15:20
    #34275632
СИСАША
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просьба проверить
man_555перво-наперво - какова цель, и почему не использовать stl::string?

а есть кусок кода, который отвечает за delete result? Или это надо всё-время помнить, что после copy надо вызывать delete?

imho стиль довольно-таки опасный. Зачем использовать старые C-функции заместо новых возможностей C++?

Мне казалось, что так будет рациональнее и правельнее. Эту функцию надо будет потом вставить в dll и откомпилить на VC2006
...
Рейтинг: 0 / 0
23.01.2007, 15:20
    #34275634
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просьба проверить
man_555перво-наперво - какова цель, и почему не использовать stl::string?

а есть кусок кода, который отвечает за delete result? Или это надо всё-время помнить, что после copy надо вызывать delete?

imho стиль довольно-таки опасный. Зачем использовать старые C-функции заместо новых возможностей C++?

1. Задание - проверить существующий код.

3. Да, стиля нет.
...
Рейтинг: 0 / 0
23.01.2007, 15:22
    #34275648
СИСАША
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просьба проверить
Akh СИСАША Akh1) Finished - количество байт. Так и подразумевалось?
2) strncpy сюда действительно более подходит.
3) Посе копирования надо result[Finished] сделать равным нулем.
3. delete(result) - так?

Нет. Это после использования.
Код: plaintext
1.
2.



Итак

Код: plaintext
1.
2.
3.
4.
5.
6.
 char* Copy(char* value,int Index,int Finish)
{
        char* result = new char[Finish+ 1 ];
        strncpy( result, value + Index, Finish );
        result[Finish+ 1 ] = '0';
        return result;
}
Вот только не понятно, куда
Код: plaintext
delete[] result;
вставить. Перед return нельзя, а после не выполнится.
...
Рейтинг: 0 / 0
23.01.2007, 15:23
    #34275651
СИСАША
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просьба проверить
Akh man_555перво-наперво - какова цель, и почему не использовать stl::string?

а есть кусок кода, который отвечает за delete result? Или это надо всё-время помнить, что после copy надо вызывать delete?

imho стиль довольно-таки опасный. Зачем использовать старые C-функции заместо новых возможностей C++?

1. Задание - проверить существующий код.

3. Да, стиля нет.

А что подразумеваете под стилем?
...
Рейтинг: 0 / 0
23.01.2007, 15:23
    #34275652
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просьба проверить
СИСАШАМне казалось, что так будет рациональнее и правельнее. Эту функцию надо будет потом вставить в dll и откомпилить на VC2006

Конечно в некоторых случаях можно и так писать, это как исключения из правил. Но сам для себя должен иметь обоснования такому подходу. Желательно же, чтобы каждый уровень кода сам отвечал за память которую он выделяет. Т.е. выделил память, передал функции, получил результат, использовал, очистил память.
...
Рейтинг: 0 / 0
23.01.2007, 15:25
    #34275668
СИСАША
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просьба проверить
Akh СИСАШАМне казалось, что так будет рациональнее и правельнее. Эту функцию надо будет потом вставить в dll и откомпилить на VC2006

Конечно в некоторых случаях можно и так писать, это как исключения из правил. Но сам для себя должен иметь обоснования такому подходу. Желательно же, чтобы каждый уровень кода сам отвечал за память которую он выделяет. Т.е. выделил память, передал функции, получил результат, использовал, очистил память.

Вот меня и мучал вопрос об очистке памяти. Память мы выделили только Result, значит и очищать надо только результ, а вот в какое "место" вставить очищение - мне не понятно
...
Рейтинг: 0 / 0
23.01.2007, 15:25
    #34275670
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просьба проверить
СИСАША Akh СИСАША Akh1) Finished - количество байт. Так и подразумевалось?
2) strncpy сюда действительно более подходит.
3) Посе копирования надо result[Finished] сделать равным нулем.
3. delete(result) - так?

Нет. Это после использования.
Код: plaintext
1.
2.



Итак

Код: plaintext
1.
2.
3.
4.
5.
6.
 char* Copy(char* value,int Index,int Finish)
{
        char* result = new char[Finish+ 1 ];
        strncpy( result, value + Index, Finish );
        result[Finish+ 1 ] = '0';
        return result;
}
Вот только не понятно, куда
Код: plaintext
delete[] result;
вставить. Перед return нельзя, а после не выполнится.

Об этом и речь. Стиль плохой. Тебе надо будет не забывать, после вызова функции и использования результата очищать память.
...
Рейтинг: 0 / 0
23.01.2007, 15:31
    #34275701
СИСАША
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просьба проверить
AkhОб этом и речь. Стиль плохой. Тебе надо будет не забывать, после вызова функции и использования результата очищать память.

Но Result у меня объявлена локально, я думал очищать память надо тоже в теле функции. Или можно и вне? А как тогда обратиться к локальной переменной? Или в качестве параметра в функцию добавить указатель на область памяти Result, а потом её очистить?
...
Рейтинг: 0 / 0
23.01.2007, 15:34
    #34275714
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просьба проверить
СИСАШАВот меня и мучал вопрос об очистке памяти. Память мы выделили только Result, значит и очищать надо только результ, а вот в какое "место" вставить очищение - мне не понятно

Для функции strncpy передают блок памяти, причем те кто передает заранее должны побеспокоится, что памяти хватит. Почему бы тебе не сделать так же?

Можно сделать с проверкой размера, если тебе его будут передавать. Тогда если не хватит памяти, то можешь вернуть ошибку или скопировать сколько влезет.
...
Рейтинг: 0 / 0
23.01.2007, 15:38
    #34275734
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просьба проверить
СИСАША AkhОб этом и речь. Стиль плохой. Тебе надо будет не забывать, после вызова функции и использования результата очищать память.

Но Result у меня объявлена локально, я думал очищать память надо тоже в теле функции. Или можно и вне? А как тогда обратиться к локальной переменной? Или в качестве параметра в функцию добавить указатель на область памяти Result, а потом её очистить?

Разберись сначала.
result у тебя локальная. Память у тебя глобальная. Ты возвращаешь локальную переменную. Что ты имеешь в результате? Ты имеешь значение указателя на данные, которые не в стеке а из кучи. Если бы они были из стека, то после выхода из функции ты их и использовать бы не мог. Значит ты имеешь все что надо - очищай глобальную память с указаением указателя на нее.
...
Рейтинг: 0 / 0
23.01.2007, 15:39
    #34275741
СИСАША
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просьба проверить
Akh СИСАШАВот меня и мучал вопрос об очистке памяти. Память мы выделили только Result, значит и очищать надо только результ, а вот в какое "место" вставить очищение - мне не понятно

Для функции strncpy передают блок памяти, причем те кто передает заранее должны побеспокоится, что памяти хватит. Почему бы тебе не сделать так же?

Можно сделать с проверкой размера, если тебе его будут передавать. Тогда если не хватит памяти, то можешь вернуть ошибку или скопировать сколько влезет.

Для функции strncpy передают блок памяти - а как это сделать(или посоветуйте где прочитать). До меня без примеров туго доходит. И ещё хотел спросить - есть ли для BCB6 русский хелп, или для каких нить других версий? Я немного "туговат" в English
...
Рейтинг: 0 / 0
23.01.2007, 15:55
    #34275816
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просьба проверить
СИСАША Akh СИСАШАВот меня и мучал вопрос об очистке памяти. Память мы выделили только Result, значит и очищать надо только результ, а вот в какое "место" вставить очищение - мне не понятно

Для функции strncpy передают блок памяти, причем те кто передает заранее должны побеспокоится, что памяти хватит. Почему бы тебе не сделать так же?

Можно сделать с проверкой размера, если тебе его будут передавать. Тогда если не хватит памяти, то можешь вернуть ошибку или скопировать сколько влезет.

Для функции strncpy передают блок памяти - а как это сделать(или посоветуйте где прочитать). До меня без примеров туго доходит. И ещё хотел спросить - есть ли для BCB6 русский хелп, или для каких нить других версий? Я немного "туговат" в English

Передай указатель на память так же как и передавал указатель на строку

Код: plaintext
1.
2.
3.
func(char *dst, char*src, int offset, int n) {


};

или с указанием размера

Код: plaintext
1.
2.
3.
4.
func(char *dst, int dstSize, char*src, int offset, int n) {


};

Функции strncpy, memcpy и тому подобные - это функции стандартной библиотеки С++. С ними надо знакомится в учебнике по С++ или по С (а не билдер). Раздел, что-то про строки.
...
Рейтинг: 0 / 0
23.01.2007, 16:12
    #34275901
man_555
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Просьба проверить
strncpy, memcpy - это всё же С. С++ преследует иную идеологию в теперешнем виде.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Просьба проверить / 25 сообщений из 46, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]