LINUX.ORG.RU

C++ realloc

 ,


1

1

Потребовалось написать собственный realloc с блекджеком и дамами. Но выскакивает ошибка, которую никак не могу понять.

Упрощенно:

void resize(char* array, int &bufsz) {
 bufsz += 10;
 char* temp = new char[bufsz];
 for (int i = 0; i < bufsz - 10; i++) { 
  temp[i] = array[i];
 }
 delete[] array;
 array = temp;
}

Но эта функция портит массив, когда из неё выходишь. В чём ошибка?

Deleted

Последнее исправление: merhalak (всего исправлений: 1)

Ответ на: комментарий от Deleted

Потому что иначе параметр передаётся по значению (копируется). А вообще функция должна возвращать результат, а не параметры модифицировать.

Begemoth ★★★★★
()
Ответ на: комментарий от Begemoth

То есть если в main будет:

char *array = new char[buf];
resize(array, buf);
То в функцию передастся не адрес массива, а скопируется его память? Черт, неочевидно.

Deleted
()
Ответ на: комментарий от Deleted

Нет, конечно.

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

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от Deleted

То в функцию передастся не адрес массива, а скопируется его память

Нет, дело в том, что переменные array в main и в resize не связаны никак. Ты меняешь ту, что в resize, а array в main при этом не изменяется, она по прежнему указывает на первый массив (который ты уже удалил).

Begemoth ★★★★★
()
Ответ на: комментарий от intelfx

Теперь до меня дошло, почему в juce framework используется

type* name;
type* name2;
в codestyle, а не как то иначе.

Deleted
()
Ответ на: комментарий от Gvidon

Печаль в том, что я пару лет практикую джаву. Сейчас мигрирую на 8-ую. И одновременно с этим мне приходится разбираться с плюсами на лабах в универе. А на лабах нам запрещают пользоваться STL. Меня и так от плюсов тошнит из-за того, что базовые типы изменяют размеры от платформы к платформе. Жалею, что cstdint появился только в C++11.

Deleted
()
Ответ на: комментарий от Deleted

Меня и так от плюсов тошнит из-за того, что базовые типы изменяют размеры от платформы к платформе

Что же вы там на лабах такое пишите, что для вас это имеет значение?

Gvidon ★★★★
()
Ответ на: комментарий от Deleted

Запрещают использовать STL? Наркомания.
Што... cstdint появился не в c++11. А даже если бы и в с++11, то всегда есть stdint.h.

ck114
()
Ответ на: комментарий от ck114

студентам всегда во все времена запрещали пользоваться стандартными (и не очень) библиотеками, пусть все руками делают для внутреннего понимания вещей

unt1tled ★★★★
()
Ответ на: комментарий от unt1tled

пусть все руками делают для внутреннего понимания вещей

Желательно, на вручную спаянных компьютерах из-под собственноручно написанных ОСей и с использованием собственных компиляторов.

Gvidon ★★★★
()
Последнее исправление: Gvidon (всего исправлений: 1)
Ответ на: комментарий от unt1tled

Нам разрешено использовать C++/FP и любые библиотеки, но у нас более жёсткие требования и сроки. Хотя и деление на группы было по уровню подготовки.

ck114
()
Ответ на: комментарий от Gvidon

ну да, в нормальном техновузе паяют свои железяки, если не пишут, то изучают и модифицируют существующие оси (обычным курсачом может быть написать свой планировщик задач для миникс) и на курсе по компиляторам пишут свой компилятор

что не так? :)

unt1tled ★★★★
()
Ответ на: комментарий от anonymous

никак быдлан мегабакс за аноном шкерится =D

unt1tled ★★★★
()

Но эта функция портит массив, когда из неё выходишь. В чём ошибка?

delete[] array;
array = temp;

Вы изменяете локальную переменную, но при этом убиваете данные.

andreyu ★★★★★
()
Ответ на: комментарий от Deleted

То в функцию передастся не адрес массива, а скопируется его память? Черт, неочевидно.

Передается адрес, ничего не копируется. Но модифицируете вы в своем коде локальную array.

andreyu ★★★★★
()

Чёрт... А я что-то не подумал. Если вам запрещают stl, запили себе шаблонный класс динамического массива и пользуй.

ck114
()
Ответ на: комментарий от Deleted

Меня и так от плюсов тошнит из-за того, что базовые типы изменяют размеры от платформы к платформе.Жалею, что cstdint появился только в C++11.

stdint.h зато появился аж в C99, болезный ты наш.

cyanide_regime
()
Ответ на: комментарий от ck114

Например так:

#include <stddef.h>

template <class T>
class dynarray {
public:
    typedef T element_type;

    dynarray(size_t size = 0)
    {
        size_ = size;
        array_ = new element_type[size_];
    }

    element_type& operator[](size_t index)
    {
        return array_[index];
    }

    void resize(size_t new_size)
    {
        if(new_size == size_)
            return;

        element_type *new_array = new element_type[new_size];

        for(size_t i = 0; i < (new_size < size_ ? new_size : size_); i++)
            new_array[i] = array_[i];


        delete [] array_;

        array_ = new_array;
        size_ = new_size;
    }

    element_type *data() const
    {
        return array_;
    }

    size_t size() const
    {
        return size_;
    }

    ~dynarray()
    {
        delete [] array_;
    }

private:
    element_type *array_;
    size_t size_;
};

ck114
()
Ответ на: комментарий от ck114
    void resize(size_t new_size)
    {
        if(new_size == size_)
            return;

        element_type *new_array = new element_type[new_size];

        for(size_t i = 0; i < (new_size < size_ ? new_size : size_); i++)
            new_array[i] = array_[i];


        delete [] array_;

        array_ = new_array;
        size_ = new_size;
    }

вот из-за таких вот пейсателей такого вот говнокода кресты и ругают.

anonymous
()

на крестах так не пишут

напиши класс, реализующий буфер фиксированного размера. вложи его в другой класс с методом resize(). внутри него создай новый буфер, скопируй содержимое и обменяй (swap) его местами со своим.

почти готовый код был где-то у саттера.

anonymous
()
Ответ на: комментарий от unt1tled

Каким бы хорошим язык ни был, это не защитит его от неправильного применения идиотами. Блевать хочется не от языка, а от качества кода, который пишут множественные ублюдки, выкладывая его в интернеты.

post-factum ★★★★★
()
Ответ на: комментарий от post-factum

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

unt1tled ★★★★
()
Ответ на: комментарий от post-factum

Блевать хочется не от языка, а от качества кода

Эта, вполне правильная, мысля появляется тут раз в месяц, но адепты «<вставить_название_языка> г-но и ненужно, потому что на нем пишется г-нокод» появляются еще чаще.

anonymous
()
Ответ на: комментарий от unt1tled

я вчера видел. в исходниках virtualbox.

anonymous
()
Ответ на: комментарий от unt1tled

Да, видел. Очевидно, что это не тот код, который можно встретить в миллионах мануалов и туториалов, написанных пьяными индусами в калифорнийском угаре.

post-factum ★★★★★
()
Ответ на: комментарий от post-factum

Правильный ответ на вопрос с засыпкой был «я пишу хороший код на С++».

Мне стыдно признаться, что перевариваемого кода на плюсах я не видел никогда. От студентов такого счастья ожидать не приходилось, они хоть и писали «правильно», но вырвиглазия от этого только добавлялось.
На работах пишут продакшен, который ужасен во всем, от архитектуры до каждой отдельновзятой строчки.
А если кто-то и умудряется писать без вырвиглазного говнеца, то уродует код подругому, например однобуквенными переменными. Дада, это тоже из-за приплюснутости мозгов!

Вывод: хороший С++ это С, компилируемый g++ :)

unt1tled ★★★★
()
Ответ на: комментарий от Deleted

Жалею, что cstdint появился только в C++11.

юзай stdint.h, кто запрещает то?

shty ★★★★★
()
Ответ на: комментарий от unt1tled

Вывод: хороший С++ это С

Можно подумать, что хорошего кода на Це больше, чем на ЦПП. Там всё то же самое

Gvidon ★★★★
()
Ответ на: комментарий от unt1tled

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

ты не видишь хорошего кода на С++, а я не видел хорошей, красивой поэзии на китайском. Вот только я и китайский не знаю. Как ты не знаешь С++. Подумай об этом.

emulek
()
Ответ на: комментарий от Gvidon

Можно подумать, что хорошего кода на Це больше, чем на ЦПП. Там всё то же самое

меньше на Си. А на ассемблере совсем нет. Потому что в C++ больше хороших и разных выразительных средств.

emulek
()
Ответ на: комментарий от cyanide_regime

Это сишка. Не, я всё правильно сказал, только в c++11 появилась cstdint. И да, я знаю, что совместимо. Для личного умиротворения не хватает единообразия кода. Уютная джава расслабляет. Забей, один черт не по теме.

Deleted
()
Ответ на: комментарий от unt1tled

С использованием C++11 уже вполне красиво и годно. И foreach есть и много других вкусных плюшек.

Deleted
()
Ответ на: на крестах так не пишут от anonymous

Классы использовать в лабах нельзя. Это ж универ, что ты хочешь? Мы ведь «не проходили», а значит знать «не должны». Я то с радостью напишу. Более того, я ещё пару дней убью на то, чтобы преподу было удобнее читать и он не проверял внимательнее мою лабу, ибо на «доп вопросы» отвечать не хочется. Препод же не поверит, если че умное сбрякнешь. Скажет: списал, давай ка тебя по всех теории прогоним.

Deleted
()
Ответ на: комментарий от anonymous

Вот из-за таких как ты, которые любят покукарекать «ты сделал это неправильно», но не объясняют почему, быдлокод продолжает существовать.

ck114
()
Ответ на: комментарий от Deleted

Ну так и прогнался бы разок по доп. вопросам, не ответишь, что ли? Лучше уж сразу, чтобы потом было отношение к тебе нормальное и можно было договориться об использовании STL/чего-там-тебе-хочется.

ktan ★★★
()
Последнее исправление: ktan (всего исправлений: 1)
Ответ на: комментарий от post-factum

Вот раз уж такое дело пошло, то не мог бы ты рассказать, каким образом научиться писать качественный код?

ck114
()
Ответ на: комментарий от ck114

писать

This. Ну и думать, конечно. Хотя если вкуса нет, то что девок страшных выбирать будешь, что отвратный код напишешь.

post-factum ★★★★★
()
Ответ на: комментарий от post-factum

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

ck114
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.