Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> срочно нужно написать функцию 
:(
    Опции темы
Promitheus
Дата 8.5.2007, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 28.3.2007

Репутация: 1
Всего: 1



Господа, а граммотно ли 

Код

#define BUFFER_SIZE 100
...
char* buffer = ( char* ) malloc ( sizeof ( char ) * BUFFER_SIZE );
    char* src = buffer - 1;


Писать через #define жесткое количество элементов, а потом под них динамически память выделять ?
Не экономнее ли скажем массив завести ?

Или уж тогда с клавы читать количество требуемых элементов, а потом память выделять ? 
PM MAIL ICQ   Вверх
Promitheus
Дата 8.5.2007, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 28.3.2007

Репутация: 1
Всего: 1



 smile 

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

Ваш тон это ваше личное дело.

Я бы так сделал, по-деревенски:

Код

doublestr(char *dest,const char *source)
{int i=0,j=0;
  while (dest[j++]=source[i++]);
  i=0;j--;
  while (dest[j++]=source[i++]);}


Это сообщение отредактировал(а) Promitheus - 8.5.2007, 12:03
PM MAIL ICQ   Вверх
Promitheus
Дата 8.5.2007, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 28.3.2007

Репутация: 1
Всего: 1



 smile  Прежде всего спокойно, я войну никому не объявляю.

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



 
PM MAIL ICQ   Вверх
adLucem
Дата 8.5.2007, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 17.4.2007
Где: Украина, Донецк

Репутация: нет
Всего: 5



Цитата(Promitheus @  8.5.2007,  08:53 Найти цитируемый пост)
Писать через #define жесткое количество элементов, а потом под них динамически память выделять ?
Не экономнее ли скажем массив завести ?


В данном случае действительно можно использовать статический массив (использование динамической памяти пришло в процессе экспериментов).

Но в общем случае вопросы использования #define для задания максимального размера буфера и способа выделения памяти не связаны.
PM MAIL ICQ   Вверх
Voldemar2004
Дата 8.5.2007, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1650
Регистрация: 25.12.2004

Репутация: нет
Всего: 23



Цитата(chudik @  5.5.2007,  02:12 Найти цитируемый пост)
помогите написать функцию  для дублирования строкинапример: "боб" -> "боббоб"

Код
#include <string>

std::string DblStr(std::string My){

return My+=My;

}



--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
Promitheus
Дата 8.5.2007, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 28.3.2007

Репутация: 1
Всего: 1



adLucem, Всё спасиб. Про то, что такое #define я знаю.  smile  Всё, хватит уж воду в ступе толочь по этому поводу.
PM MAIL ICQ   Вверх
W4FhLF
Дата 8.5.2007, 16:57 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



Цитата(adLucem @  5.5.2007,  12:25 Найти цитируемый пост)
А кто-нибудь может это сделать менее чем на трех переменных (тип не имеет значения)?


Конечно, 1 переменная.

Код

void main(void)
{
    char str[ 100 ]="Bob";

    __asm {
        pushad
        
        //определяет длину строки
        lea edi, str
        xor eax,eax
        xor ecx, ecx
        not ecx
        repne scasb
        lea eax, str
        sub edi, eax
        mov eax, edi
        dec eax
        //////////////////////////

        //копируем строку
        lea esi,str
        mov edi,esi
        add edi,eax
        mov ecx,eax
        rep movsb
        //////////////////

        popad
    };

    cout << str << endl;
    return;
}





--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
chudik
Дата 9.5.2007, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 5.5.2007

Репутация: 0
Всего: 1



 а как сделать так чтобы ваши программы правильно определяли длинну строки? во всех ваших программах строка ситается до пробела после пробела информация не копируется. smile 
PM MAIL   Вверх
dizzy1984
Дата 10.5.2007, 07:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

Репутация: 3
Всего: 25



Информация копируется до символа '\0', т.е символа с кодом 0.
Пробелы также копируются.
PM MAIL   Вверх
chudik
Дата 10.5.2007, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 5.5.2007

Репутация: 0
Всего: 1



Цитата(dizzy1984 @ 10.5.2007,  07:01)

Пробелы также копируются.

но в том то и дело что не в одной из программ пробелы не копируются
PM MAIL   Вверх
dizzy1984
Дата 10.5.2007, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

Репутация: 3
Всего: 25



Borland C++ 3.1
Код

#include <stdio.h>

doublestr(char *dest, const char *source)
{int i=0,j=0;
while (dest[j++]=source[i++]);
i=0;j--;
while (dest[j++]=source[i++]);}

void  main() {
    char arr1[] = {"ad dsa sak"};
    char arr2[sizeof(arr1) * 2];

    doublestr(arr2, arr1);
    printf("%s\n%s", arr1, arr2);
};

Вывел
ad dsa sak
ad dsa sakad dsa sak

Что абсолюно верно. Пробелы скопировались.
Почему вы считаете иначе?
PM MAIL   Вверх
ama_kid
Дата 10.5.2007, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 2
Всего: 95



Цитата(dizzy1984 @  10.5.2007,  13:49 Найти цитируемый пост)
Почему вы считаете иначе?
Он считает иначе, потому что у тебя строка присваивается жестко, а в предложенных выше вариантов - строка считывается с помощью scanf или cin, которые считывают данные до пробела...
chudik, Все варианты работают правильно, только инициализацию строки надо проводить по другому. Вариант с scanf тебе предложили как наименее геморройный... Формирование строки с пробелом - это уже другая задача... 

Это сообщение отредактировал(а) ama_kid - 10.5.2007, 13:58


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
Dronchik
Дата 11.5.2007, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Звукач ёмаё
**


Профиль
Группа: Участник
Сообщений: 451
Регистрация: 1.5.2007

Репутация: 0
Всего: 37



А не легчели сделать...

Цитата

А кто-нибудь может это сделать менее чем на трех переменных (тип не имеет значения)?


Код

long stroka;
cin >> stroka;
cout << stroka << stroka;



--------------------
Вместо слов делай дело, от которого ты фанатеешь. (с)

PM MAIL WWW ICQ   Вверх
Voldemar2004
Дата 11.5.2007, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1650
Регистрация: 25.12.2004

Репутация: нет
Всего: 23



Мне кажется, самое простое это то, что я предложил:
Код
#include <string>
std::string DblStr(std::string My){
return My+=My;
}
 smile 

Это сообщение отредактировал(а) Voldemar2004 - 11.5.2007, 21:42


--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
chudik
Дата 25.5.2007, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 5.5.2007

Репутация: 0
Всего: 1



Цитата(adLucem @ 6.5.2007,  14:28)
nickless, зачтено

Немного переработанный код.
Код

void main ( ) {
    char* buffer = ( char* ) malloc ( sizeof ( char ) * BUFFER_SIZE );

    char* src = buffer - 1;
    while ( ( ++src < buffer + BUFFER_SIZE / 2 - 1 ) 
        && ( (*src = getchar ( ) ) != 0xA ) );
    *src = 0;
    while ( ( *++src = *++buffer ) );
    *buffer = * ( buffer - ( src - buffer ) );
    buffer = buffer - ( src - buffer );

    printf("%s", buffer);
    free ( buffer );
}


[/b]

а вы не могли бы закоментировать этот код
PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0934 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.