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


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