powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Просьба проверить
46 сообщений из 46, показаны все 2 страниц
Просьба проверить
    #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
Просьба проверить
    #34275515
man_555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
лучше memcpy использовать
...
Рейтинг: 0 / 0
Просьба проверить
    #34275535
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
man_555лучше memcpy использовать

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

3. Да, стиля нет.
...
Рейтинг: 0 / 0
Просьба проверить
    #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
Просьба проверить
    #34275651
СИСАША
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akh man_555перво-наперво - какова цель, и почему не использовать stl::string?

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

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

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

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

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

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

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

Вот меня и мучал вопрос об очистке памяти. Память мы выделили только Result, значит и очищать надо только результ, а вот в какое "место" вставить очищение - мне не понятно
...
Рейтинг: 0 / 0
Просьба проверить
    #34275670
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
Просьба проверить
    #34275701
СИСАША
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkhОб этом и речь. Стиль плохой. Тебе надо будет не забывать, после вызова функции и использования результата очищать память.

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

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

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

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

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

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

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

Для функции strncpy передают блок памяти - а как это сделать(или посоветуйте где прочитать). До меня без примеров туго доходит. И ещё хотел спросить - есть ли для BCB6 русский хелп, или для каких нить других версий? Я немного "туговат" в English
...
Рейтинг: 0 / 0
Просьба проверить
    #34275816
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
Просьба проверить
    #34275901
man_555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
strncpy, memcpy - это всё же С. С++ преследует иную идеологию в теперешнем виде.
...
Рейтинг: 0 / 0
Просьба проверить
    #34275919
СИСАША
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Функция
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
char* Copy(char* value,int Index,int Finish,char Address)
{
        char* result = new char[Finish+ 1 ];
        strncpy( result, value + Index, Finish );
        result[Finish+ 1 ] = '\0';
        Address = *result;
        return result;
}

Вызов
Код: plaintext
1.
2.
3.
...Bin....
char z;
Edit1->Text = AnsiString(Copy(Bin, 0 , 10 ,z));
delete (&z);
Надеюсь правильно?
...
Рейтинг: 0 / 0
Просьба проверить
    #34275939
СИСАША
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
man_555strncpy, memcpy - это всё же С. С++ преследует иную идеологию в теперешнем виде.
Какую? С использованием AnsiString?
...
Рейтинг: 0 / 0
Просьба проверить
    #34275954
man_555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СИСАША man_555strncpy, memcpy - это всё же С. С++ преследует иную идеологию в теперешнем виде.
Какую? С использованием AnsiString?

рекомендую покурить Страструпа, а AnsiString - это вообще-то реплизация класса "Строка" на Delphi.

stl::string - вот это про с++
...
Рейтинг: 0 / 0
Просьба проверить
    #34275961
СИСАША
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
man_555 СИСАША man_555strncpy, memcpy - это всё же С. С++ преследует иную идеологию в теперешнем виде.
Какую? С использованием AnsiString?

рекомендую покурить Страструпа, а AnsiString - это вообще-то реплизация класса "Строка" на Delphi.

stl::string - вот это про с++

А есть Страструп в электронном виде?
...
Рейтинг: 0 / 0
Просьба проверить
    #34276080
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СИСАШАФункция
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
char* Copy(char* value,int Index,int Finish,char Address)
{
        char* result = new char[Finish+ 1 ];
        strncpy( result, value + Index, Finish );
        result[Finish+ 1 ] = '\0';
        Address = *result;
        return result;
}

Вызов
Код: plaintext
1.
2.
3.
...Bin....
char z;
Edit1->Text = AnsiString(Copy(Bin, 0 , 10 ,z));
delete (&z);
Надеюсь правильно?

Непонятно, что именно ты тут хотел добиться.
...
Рейтинг: 0 / 0
Просьба проверить
    #34276188
СИСАША
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akh СИСАШАФункция
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
char* Copy(char* value,int Index,int Finish,char Address)
{
        char* result = new char[Finish+ 1 ];
        strncpy( result, value + Index, Finish );
        result[Finish+ 1 ] = '\0';
        Address = *result;
        return result;
}

Вызов
Код: plaintext
1.
2.
3.
...Bin....
char z;
Edit1->Text = AnsiString(Copy(Bin, 0 , 10 ,z));
delete (&z);
Надеюсь правильно?

Непонятно, что именно ты тут хотел добиться.
Я просто не понял как "убить память". Смешно конечно реализовал, но попробую объяснить, что хотел. Вызываем функцию Copy, она выделяет память под result, выполняется и передается в Address адрес блока памяти, выделенного под result, ну а потом delete (&z) высвобождаем память, выделенную под result. Но по вашему вопросу я понял, что сделал не правильно. Мне как то на примере легче научиться :))
...
Рейтинг: 0 / 0
Просьба проверить
    #34276242
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СИСАША Akh СИСАШАФункция
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
char* Copy(char* value,int Index,int Finish,char Address)
{
        char* result = new char[Finish+ 1 ];
        strncpy( result, value + Index, Finish );
        result[Finish+ 1 ] = '\0';
        Address = *result;
        return result;
}

Вызов
Код: plaintext
1.
2.
3.
...Bin....
char z;
Edit1->Text = AnsiString(Copy(Bin, 0 , 10 ,z));
delete (&z);
Надеюсь правильно?

Непонятно, что именно ты тут хотел добиться.
Я просто не понял как "убить память". Смешно конечно реализовал, но попробую объяснить, что хотел. Вызываем функцию Copy, она выделяет память под result, выполняется и передается в Address адрес блока памяти, выделенного под result, ну а потом delete (&z) высвобождаем память, выделенную под result. Но по вашему вопросу я понял, что сделал не правильно. Мне как то на примере легче научиться :))

Теперь понятно.
Если делать как ты, то тогда:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
char* Copy(char* value,int Index,int Finish,char *&Address)
{
        char* result = new char[Finish+ 1 ];
        strncpy( result, value + Index, Finish );
        result[Finish+ 1 ] = '\0';
        Address = result;
        return result;
}

Вызов
Код: plaintext
1.
2.
3.
...Bin....
char *z;
Edit1->Text = AnsiString(Copy(Bin, 0 , 10 ,z));
delete[] z;

Но можно и так:

Код: 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
1.
2.
3.
...Bin....
char *z;
Edit1->Text = AnsiString(z=Copy(Bin, 0 , 10 ));
delete[] z;


Стиль же так же и осталься плохим. Зато теперь память будет очищаться.
...
Рейтинг: 0 / 0
Просьба проверить
    #34276254
СИСАША
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkhСтиль же так же и осталься плохим. Зато теперь память будет очищаться.

Спасибо!:) Но вот про стиль всё равно ничего не понял! В чём заключаются ошибки моего "стиля"?
...
Рейтинг: 0 / 0
Просьба проверить
    #34276271
СИСАША
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И ещё. Написал такой кусочек - Обработка события нажатия кнопки

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  char* Result = new char[ 8 ];
  Result[ 0 ] = '1';
  strcat(Result,"0");
  Button1->Caption = (AnsiString)Result;
  delete[](Result);
}

При первом нажатии кнопки её Caption принимает 10 . Если память при
Код: plaintext
delete[](Result);
высвобождается, то при втором нажатии её Caption тоже должен принять 10 , но у меня принимает 100 . Или я кусок этого кода написал не правильно, или вообще new\delete понял неправильно?
...
Рейтинг: 0 / 0
Просьба проверить
    #34276301
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СИСАША AkhСтиль же так же и осталься плохим. Зато теперь память будет очищаться.

Спасибо!:) Но вот про стиль всё равно ничего не понял! В чём заключаются ошибки моего "стиля"?

Нет целостности работы с памятью. Функция должна выполнять только свою работу, и проявлять как можно меньше побочных эффектов, т.к. любой побочный эффект от этой функции не ожидается, и поэтому он влекет за собой не желательные последствия. У тебя задача функции - скопировать часть строки. Скопировать, это значит, откуда-то взять и куда-то положить. У тебя же есть побочный эффект - твоя функция выделяет память. Минимальный ущерб, который твоя функция наносит это:
1) Ты не можешь использовать уже готовый буфер в целях экономии времени.
2) Ты не можешь использовать уже готовый буфер в целях экономии кода (если опять же тебе кто-то буфер передал, и тебе надо его заполнить, и для этого ты вызываешь функцию).
3) Тебе постоянно надо помнить о том, что твоя функия выделяет память и неободимо ее освобождать. А если у тебя будет 10 тысяч подобных функций, с произвольными "побочными эффектами"?
Максимальный же - ты в конце концов "съешь" всю оперативную память и весь своп.
...
Рейтинг: 0 / 0
Просьба проверить
    #34276305
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СИСАШАИ ещё. Написал такой кусочек - Обработка события нажатия кнопки

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  char* Result = new char[ 8 ];
  Result[ 0 ] = '1';
  strcat(Result,"0");
  Button1->Caption = (AnsiString)Result;
  delete[](Result);
}

При первом нажатии кнопки её Caption принимает 10 . Если память при
Код: plaintext
delete[](Result);
высвобождается, то при втором нажатии её Caption тоже должен принять 10 , но у меня принимает 100 . Или я кусок этого кода написал не правильно, или вообще new\delete понял неправильно?

Это хорошо, что у тебя еще не акссес виолейшен. Где завершающий нуль у Result, перед вызовом strcat?
...
Рейтинг: 0 / 0
Просьба проверить
    #34276385
СИСАША
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akh СИСАША AkhСтиль же так же и осталься плохим. Зато теперь память будет очищаться.

Спасибо!:) Но вот про стиль всё равно ничего не понял! В чём заключаются ошибки моего "стиля"?

Нет целостности работы с памятью. Функция должна выполнять только свою работу, и проявлять как можно меньше побочных эффектов, т.к. любой побочный эффект от этой функции не ожидается, и поэтому он влекет за собой не желательные последствия. У тебя задача функции - скопировать часть строки. Скопировать, это значит, откуда-то взять и куда-то положить. У тебя же есть побочный эффект - твоя функция выделяет память. Минимальный ущерб, который твоя функция наносит это:
1) Ты не можешь использовать уже готовый буфер в целях экономии времени.
2) Ты не можешь использовать уже готовый буфер в целях экономии кода (если опять же тебе кто-то буфер передал, и тебе надо его заполнить, и для этого ты вызываешь функцию).
3) Тебе постоянно надо помнить о том, что твоя функия выделяет память и неободимо ее освобождать. А если у тебя будет 10 тысяч подобных функций, с произвольными "побочными эффектами"?
Максимальный же - ты в конце концов "съешь" всю оперативную память и весь своп.

А есть другие варианты реализации Copy у кого-нибудь?
...
Рейтинг: 0 / 0
Просьба проверить
    #34276395
man_555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh СИСАША AkhСтиль же так же и осталься плохим. Зато теперь память будет очищаться.

Спасибо!:) Но вот про стиль всё равно ничего не понял! В чём заключаются ошибки моего "стиля"?

Нет целостности работы с памятью. Функция должна выполнять только свою работу, и проявлять как можно меньше побочных эффектов, т.к. любой побочный эффект от этой функции не ожидается, и поэтому он влекет за собой не желательные последствия. У тебя задача функции - скопировать часть строки. Скопировать, это значит, откуда-то взять и куда-то положить. У тебя же есть побочный эффект - твоя функция выделяет память. Минимальный ущерб, который твоя функция наносит это:
1) Ты не можешь использовать уже готовый буфер в целях экономии времени.
2) Ты не можешь использовать уже готовый буфер в целях экономии кода (если опять же тебе кто-то буфер передал, и тебе надо его заполнить, и для этого ты вызываешь функцию).
3) Тебе постоянно надо помнить о том, что твоя функия выделяет память и неободимо ее освобождать. А если у тебя будет 10 тысяч подобных функций, с произвольными "побочными эффектами"?
Максимальный же - ты в конце концов "съешь" всю оперативную память и весь своп.

Польностью согласен. От себя бы добавил, что если нет специальных ограничений для приложения, то лучше всё-таки пользоваться современным языком.

Код: plaintext
1.
2.
3.
4.
std::string str1 = "Test";
std::string str2 = "";
...
str2 = str1; //imho, гораздо безопаснее работы с char*
...
Рейтинг: 0 / 0
Просьба проверить
    #34276403
эх, отожгу
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
man_555лучше memcpy использовать

то что для копирования строк можно использовать memcpy - это однозначно, и возможно, что программист не забудет поставить где надо завершающие нули, правильно вычислит размер нужного буфера. но все равно в коде будет логическая ошибка - mem*** предназначены для сырой памяти, а str*** - для с-строк. это и есть один из признаков плохого стиля - использовать для какого то типа данных, при наличии аналогичных функций, функции, предназначенные для другого, даже если они и работают как надо.

оправдание такого подхода - это только жесткая оптимизация, но в этой задаче ей и не пахнет.

man_555рекомендую покурить Страструпа, а AnsiString - это вообще-то реплизация класса "Строка" на Delphi.

stl::string - вот это про с++
а это вот почему? по какому критерию определяется сиплюсплюсистость:) класса? лежит ли он в STL или нет? string -
это так называемый simple type, и все равно что он выведен из шаблона, конечный пользователь об этом не знает.
кстати stl::string - нет такого :)
...
Рейтинг: 0 / 0
Просьба проверить
    #34276406
СИСАША
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
man_555 Akh СИСАША AkhСтиль же так же и осталься плохим. Зато теперь память будет очищаться.

Спасибо!:) Но вот про стиль всё равно ничего не понял! В чём заключаются ошибки моего "стиля"?

Нет целостности работы с памятью. Функция должна выполнять только свою работу, и проявлять как можно меньше побочных эффектов, т.к. любой побочный эффект от этой функции не ожидается, и поэтому он влекет за собой не желательные последствия. У тебя задача функции - скопировать часть строки. Скопировать, это значит, откуда-то взять и куда-то положить. У тебя же есть побочный эффект - твоя функция выделяет память. Минимальный ущерб, который твоя функция наносит это:
1) Ты не можешь использовать уже готовый буфер в целях экономии времени.
2) Ты не можешь использовать уже готовый буфер в целях экономии кода (если опять же тебе кто-то буфер передал, и тебе надо его заполнить, и для этого ты вызываешь функцию).
3) Тебе постоянно надо помнить о том, что твоя функия выделяет память и неободимо ее освобождать. А если у тебя будет 10 тысяч подобных функций, с произвольными "побочными эффектами"?
Максимальный же - ты в конце концов "съешь" всю оперативную память и весь своп.

Польностью согласен. От себя бы добавил, что если нет специальных ограничений для приложения, то лучше всё-таки пользоваться современным языком.

Код: plaintext
1.
2.
3.
4.
std::string str1 = "Test";
std::string str2 = "";
...
str2 = str1; //imho, гораздо безопаснее работы с char*


Мне в конечном итоге надо получить DLL, у которой в параметрах функций будет только char* и int. Дайте ссылки на статьи или учебники(проверенные :)), где можно посмотреть и изучить "современный" язык.
...
Рейтинг: 0 / 0
Просьба проверить
    #34276751
man_555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
эх, отожгу man_555лучше memcpy использовать

то что для копирования строк можно использовать memcpy - это однозначно, и возможно, что программист не забудет поставить где надо завершающие нули, правильно вычислит размер нужного буфера. но все равно в коде будет логическая ошибка - mem*** предназначены для сырой памяти, а str*** - для с-строк. это и есть один из признаков плохого стиля - использовать для какого то типа данных, при наличии аналогичных функций, функции, предназначенные для другого, даже если они и работают как надо.

оправдание такого подхода - это только жесткая оптимизация, но в этой задаче ей и не пахнет.

man_555рекомендую покурить Страструпа, а AnsiString - это вообще-то реплизация класса "Строка" на Delphi.

stl::string - вот это про с++
а это вот почему? по какому критерию определяется сиплюсплюсистость:) класса? лежит ли он в STL или нет? string -
это так называемый simple type, и все равно что он выведен из шаблона, конечный пользователь об этом не знает.
кстати stl::string - нет такого :)

молодец, возьми с полки пряник! Чего не прдставился то?

Хорошо, если по всем канонам, то std::basic_string, но заверю, что stl::string работает так же замечательно ;-). "Приплюснотость" определяется современными тенденциями. Конечно, С++ существует помимо привычек и вкусов своего создателя, но этот класс был создан именно для работы со строками.

Второе. Вы всё-таки определитесь C это или С++. Если второе, то memcpy как раз то, что доктор прописал, ибо хорошим стилем, при отходе от основных концепций, является то, что наиболее эффективно т.е. memcpy (рекомендация его же Страуструпа. Третье издание.), хотя можно спорить...
...
Рейтинг: 0 / 0
Просьба проверить
    #34276902
эх, отожгу
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
man_555Хорошо, если по всем канонам, то std::basic_string
я просто хотел сказать что string это просто класс, не лучше или хуже чем другие.

man_555но заверю, что stl::string работает так же замечательно ;-).
ну не знаю, где это у вас работает, в vs2003 не хочет у меня суфлером ничего показывать, дальше смотреть было лень... покажите чтоли пример.

man_555"Приплюснотость" определяется современными тенденциями.

огласите их чтоли, а то непонятно, цикл for современен или надо уже везде for_each

man_555Конечно, С++ существует помимо привычек и вкусов своего создателя, но этот класс был создан именно для работы со строками.

мне кажется что AnsiString тоже был создан для работы со строками. мало того, в мфц приложении
я буду использовать CString вместо string потому что он более родной для этой среды, несмотря
ни на какие модные веяния.

man_555Второе. Вы всё-таки определитесь C это или С++. Если второе, то memcpy как раз то, что доктор прописал, ибо хорошим стилем, при отходе от основных концепций, является то, что наиболее эффективно т.е. memcpy (рекомендация его же Страуструпа. Третье издание.), хотя можно спорить...
я чего то не пойму здесь. от каких концепций произведен отход? и эффективно с точки зрения чего? скорости работы, количества занимаемой памяти, повторного использования, легкости восприятия?
...
Рейтинг: 0 / 0
Просьба проверить
    #34277327
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СИСАШАМне в конечном итоге надо получить DLL, у которой в параметрах функций будет только char* и int. Дайте ссылки на статьи или учебники(проверенные :)), где можно посмотреть и изучить "современный" язык.

Во первых разберись, что такое указатели, и как их едят. Для этого тебе надо почитать учебник по с++. Например можешь поискать в сети
автор
Б. Керниган, Д. Ритчи
Язык программирования Си
Издание 3-е, исправленное
Перевод с английского под редакцией Вс. С. Штаркмана
Невский Диалект, Санкт-Петербург 2001

В сети 100% где-то есть.

Когда разберешься, обрати еще раз свое внимание на strncpy, которой ты пользуешься. Тогда сам увидишь что твоя функция может иметь интерфейс такого же плана, но в ней будет на один-два параметра больше (char* или char* и int). На счет типа с смысла возвращаемого значения тоже стоит подумать.
...
Рейтинг: 0 / 0
Просьба проверить
    #34277344
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
man_555Второе. Вы всё-таки определитесь C это или С++. Если второе, то memcpy как раз то, что доктор прописал, ибо хорошим стилем, при отходе от основных концепций, является то, что наиболее эффективно т.е. memcpy (рекомендация его же Страуструпа. Третье издание.), хотя можно спорить...

strncpy и memcpy - C.
strncpy же не будет копировать мусор за строкой, а будет dst заполнять нулями. Это кстати дает еще один плюс - надежность.
...
Рейтинг: 0 / 0
Просьба проверить
    #34278770
СИСАША
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И опять у меня аналогичное
Функция
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
char* ByteToBin(Byte value)
{
   char* Result = new char[ 8 ];
  (value^0x01) < value ? Result[ 7 ] = '1' : Result[ 7 ] = '0';
  (value^0x02) < value ? Result[ 6 ] = '1' : Result[ 6 ] = '0';
  (value^0x04) < value ? Result[ 5 ] = '1' : Result[ 5 ] = '0';
  (value^0x08) < value ? Result[ 4 ] = '1' : Result[ 4 ] = '0';
  (value^0x10) < value ? Result[ 3 ] = '1' : Result[ 3 ] = '0';
  (value^0x20) < value ? Result[ 2 ] = '1' : Result[ 2 ] = '0';
  (value^0x40) < value ? Result[ 1 ] = '1' : Result[ 1 ] = '0';
  (value^0x80) < value ? Result[ 0 ] = '1' : Result[ 0 ] = '0';
  Result[ 8 ] ='\0';
   return Result;
}

И вызов
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  char* S = new char[ 8 ];
  char* Address;
  S = (Address=ByteToBin(StrToInt(Edit1->Text)));
  Button1->Caption = (AnsiString)S;
  delete[] S;
  delete[] Address;
}

А стиля нет. "Подскажите" пример этого со стилем.
...
Рейтинг: 0 / 0
Просьба проверить
    #34279217
СИСАША
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
void  Copy(char* value,int Index,int Finish,char* Result)
{
        unsigned char z;
	for (int i = Index; i < Index + Finish; i++) {
		z = value[i];
                      strncat(Result,&z, 1 );
          }
        Result[Finish]= '\0';
}

А так стиль есть?
...
Рейтинг: 0 / 0
46 сообщений из 46, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Просьба проверить
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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