Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.10.2010, 14:52   #11
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Гром
Код:
void resize(int* arr, int N, int NewN)
{
int* NewArr = new int[NewN];
//копирование
delete[] arr;
arr = NewArr;
}
я надеюсь ты прикалываешься. твой указатель - локальная переменная. если уж и хочешь так сделать, используй двойной указатель.
как бы я сделал ресайз? пжалста

Код:
int *resize(int *pData, int len, int new_len)
{
   int *ret = new int[new_len];
   memcpy(ret, pData, min(len, new_len));
   delete [] pData;
   return ret;
}

по поводу остальных вопросов отвечу только на 1, ибо влом
Цитата:
Или мы передаем в качестве параметра реальный размер? А почему в стандарте не передаем?
да, strcat небезопасная функция. если размер буфера будет меньше размера строки - выход за диапазон. для этого есть безопасная функция strncat, где мы можем указать максимальный размер

Цитата:
Как говорил Винни-Пух, "я реализовываю".
винни пух и закончил не очень то весело
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 19.10.2010 в 15:03.
pproger вне форума Ответить с цитированием
Старый 19.10.2010, 16:02   #12
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Цитата:
твой указатель - локальная переменная.
Ну и что?? NewArr - локальная переменная, а вот памяти, выделенной через new глубоко на это фиолетово. В конце функции на эту память указывает вполне себе внешний указатель, который где-то там нормально используется.
По поводу resize'а. Как тогда, не присваивая ничего переменной, на которую сказали delete, сделать resize в классе? Как там было насчет сигнатуры этой функции у Страуструпа?
Код:
template<class T, class A = allocator<T>> class vector
{
//...
void resize(size_type sz, T val = T());
//...
}
Или, скажем, чтоб попроще
Код:
class Vector
{
//...
void resize(int sz);
//...
int size;
int* array;
}
Цитата:
да, strcat небезопасная функция. если размер буфера будет меньше размера строки - выход за диапазон. для этого есть безопасная функция strncat, где мы можем указать максимальный размер
Ок, согласен. Погуглил, убедился.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 19.10.2010, 16:16   #13
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Гром
Цитата:
Ну и что?? NewArr - локальная переменная, а вот памяти, выделенной через new глубоко на это фиолетово. В конце функции на эту память указывает вполне себе внешний указатель, который где-то там нормально используется.
Код:
void resize(int* arr, int N, int NewN)
{
int* NewArr = new int[NewN];
//копирование
delete[] arr;
arr = NewArr;
}
я не про newArr!! а про arr! значение твоего указателя (arr, arr, arr!!!!) уйдет в никуда после выхода из функции! неужели не очевидно???


вижу, что ты подвис, поэтому покажу тебе ПРАВИЛЬНЫЙ пример твоего винни пух стайл варианта

Код:
void resize(int **arr, int N, int NewN)
{
int* NewArr = new int[NewN];
//копирование
delete[] *arr;
*arr = NewArr;
а использовать ТОЛЬКО, ТОЛЬКО, и еще раз ТОЛЬКО так
Код:
int *buff = new int[10];
resize(&buff, 10, 100);

// теперь buff указавает на массив из 100 элементов
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 19.10.2010 в 16:37.
pproger вне форума Ответить с цитированием
Старый 20.10.2010, 11:03   #14
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

pproger, все, дошло! И в самом деле чушь какую-то сморозил. Ну зато, как говорится, в спорах рождается истина!
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 24.10.2010, 13:04   #15
kloffelin
Пользователь
 
Регистрация: 21.02.2010
Сообщений: 27
По умолчанию

Цитата:
Сообщение от Гром Посмотреть сообщение
Знаете, переделайте лучше все через указатели char*, а не char[]. Тогда strcat (если я правильно понял, в результате strcat(s1, s2) для s2 фактически получаем s2 = s1 + s2) будет примерно такой:
Код:
void strcat(char* s1, char* s2)
{
int len1 = strlength(s1), len2 = strlength(s2);
char* str = new char[len1 + len2 + 1];
int i = 0, j = 0;
while (i < len1)
 str[j++] = s1[i++];
i = 0;
while (i < len2)
 str[j++] = s2[i++];
str[j] = 0;   //То же самое: str[j] = '\0';
delete[] s2;
s2 = str;
}

не работает при выполнении ничего не происходит, а при пошаговом - на строке delete[] s2; выдает ошибку "Error directive: Must use C++ with new.h"
kloffelin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
XMLGear - библиотека для полноценной работы с XML igorsolkin Общие вопросы по Java, Java SE, Kotlin 0 16.04.2010 17:53
Библиотека для WINAPI для работы с ORACL Golovastik SQL, базы данных 2 02.03.2010 19:42
Библиотека, расширяющая функции для работы с текстом (Delphi) a_n_n_a Помощь студентам 3 28.04.2009 10:42
Библиотека для работы с *.psd-файлами. vinni Мультимедиа в Delphi 3 23.10.2008 20:29
HELP!Си - программа для работы со строками + сумма строк в матрице! DUPLET Помощь студентам 1 20.12.2007 21:16