LINUX.ORG.RU

Сообщения Pirr

 

Plasma 5 нет композитных эффектов

Форум — Desktop

В очередной раз поломались композитные эффекты (нет прозрачности) в KDE 5. Подскажите как лечить?

Видеокарта nvidia + intel.

 ,

Pirr
()

Kubuntu+NVIDIA=артефакты вокруг курсора

Форум — Desktop

Добрый день!

Ноутбук с гибридной графикой intel + GF 540M, Kubuntu 17.04 64 bit

Ставлю проприетарные драйвера nvidia от 375 до 384 - после загрузки, вокруг курсора появляется квадрат артефактов.

Почитал в интернетах, говорят сделайте рестарт sddm «sudo systemctl restart sddm». Сделал, помогает.

Но как то это не комильфо, после каждой загрузки перезапускать sddm.

Может есть вариант как избавится от этого бага?

 , , ,

Pirr
()

Cisco (Voip) - настройка VIC2-4FXO

Форум — Admin

Добрый день!

Помогите пожалуйста с настройкой.

Есть Cisco 3825 с кодеками PVDM2-64 и модулем Cisco VIC2-4FXO. Необходимо входящие звонки с городских телефонов подключенных к FXO портам перенаправлять на внутренние SIP номера (АТС Asterisk).

Нужен пример конфигурации или годная статья по настройке.

 , ,

Pirr
()

Debian testing live dvd

Форум — Linux-install

Подскажите где можно скачать live dvd Debian testing?

 

Pirr
()

Безопасность сети предприятия

Форум — Security

Здравствуйте! Посоветуйте, что почитать чтобы освежить свои знания в области современных средств обеспечения безопасности локальной сети предприятия подключенной к интернету (объединение удаленных офисов, удаленный доступ в локальную сеть через интернет и т.д.).

 

Pirr
()

Проброс сети от виртуальной машины к хосту.

Форум — Admin

Здравствуйте!

Есть роутер (DHCP включен) который раздает интернет, к нему подключен компьютер (который получает ip адрес 192.168.0.101), на нем поднят KVM в котором в свою очередь запущена CentOS 7 (подключение типа bridge, ip адрес получает от роутера 192.168.0.103). Интернет есть и на компьютере и в виртуалке, оба пингуют роутер 192.168.0.1, но почему то они не видят друг друга. Подскажите в чем может быть проблема?

 , ,

Pirr
()

Тестовое задание для Linux администратора

Форум — Admin

Много лет в своем быту использую Linux системы, но на хлеб насущный зарабатываю администрируя в госконторе Windows зоопарк. Хочу проверить свои навыки в области Linux, но для этого необходимо придумать задачу.

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

 

Pirr
()

Chromium - печать в pdf

Форум — Desktop

При нажатии «Печать» в Chromium появляется такое окно с неактивными кнопками. в чём может быть проблема?

 ,

Pirr
()

Как «заморозить» пакет в Fedora?

Форум — Desktop

Собственно суть вопроса, установил Skype с официального сайта. Всё работает, все устраивает, но из russianfedora-nonfree лезет обновление которое ломает Skype. Как «заморозить» пакет skype?

 , , ,

Pirr
()

Откуда KDE берет локаль?

Форум — Desktop

Система: FreeBSD 10.1 + KDE 4.14.2

Голая консоль в FreeBSD - русифицирована.

locale

LANG=ru_RU.UTF-8

LC_CTYPE=«ru_RU.UTF-8»

LC_COLLATE=«ru_RU.UTF-8»

LC_TIME=«ru_RU.UTF-8»

LC_NUMERIC=«ru_RU.UTF-8»

LC_MONETARY=«ru_RU.UTF-8»

LC_MESSAGES=«ru_RU.UTF-8»

LC_ALL=

KDE тоже русифицирован, но вот в konsole он упорно показывает:

locale

LANG=en_US.UTF-8

LC_CTYPE=«en_US.UTF-8»

LC_COLLATE=«en_US.UTF-8»

LC_TIME=«en_US.UTF-8»

LC_NUMERIC=«en_US.UTF-8»

LC_MONETARY=«en_US.UTF-8»

LC_MESSAGES=«en_US.UTF-8»

LC_ALL=en_US.UTF-8

И соответственно весь сторонний софт устанавливается на английском языке.

Подскажите куда копать?

 ,

Pirr
()

Счетчик в web2py

Форум — Web-development

Здравствуйте! Сделал в web2py CRUD-форму но не пойму как мне сделать поле со счетчиком?

Счетчик должен иметь вид: XXXXXXXX\DDMMYY\YYZZZZZZZZ

Где: XXXXXXXX - номер подразделения, он все время одинаковый, DDMMYY - текущая дата, YY - цифровой код операции (задает пользователь), ZZZZZZZZ - счетчик.

В итоге должно получится, что то типа: 12345678\300115\3000000012

Погуглив нашел только, как делать счетчик посещений с помощью хранения счетчика в куках, но это не то.

 

Pirr
()

Конкурентные преимущества FreeBSD?

Форум — General

Не холивара ради а лишь для удовлетворения своего понимания возник данный вопрос.

Погуглив нашел: https://www.freebsd.org/doc/ru/articles/linux-comparison/freebsd-advantages.html - не убедило.

Послушав господина Пищулина (наверное какой то адепт FreeBSD) https://www.youtube.com/watch?v=ZX6ELvNztZs , https://www.youtube.com/watch?v=WcBTvOpbYGg - мало того что не убедило, так еще и понравилось высказывание его друга, который на вопрос: «Почему променял FreeBSD на Убунточку?», ответил: «Что устал тратить кучу времени на „тюнинг FreeBSD“, а Ubuntu - это просто, быстро и надежно.».

Может найдется человек, который профессионально использует Linux и FreeBSD, и сможет объяснить в каких случаях он использует Linux а в каких предпочитает FreeBSD.

 

Pirr
()

Scaffolding - на чем лучше сделать?

Форум — Web-development

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

Подобное я уже делал ранее на Grails, но на это ушло много времени.

Подскажите на чем можно решить эту задачу, максимально быстро?

Pirr
()

Свой класс Any

Форум — Development

Помогите разобраться с заданием:

В первом уроке вы реализовали простой шаблон ValueHolder, в этом задании мы используем его чтобы написать класс Any (интересно, что не шаблонный), который позволяет хранить значения любого типа! Например, вы сможете создать массив объектов типа Any, и сохранять в них int-ы, double-ы или даже объекты Array. Подробности в шаблоне кода. Hint: в нешаблонном классе Any могут быть шаблонные методы, например, шаблонный конструктор.

// Эти классы реализовывать заново не нужно
struct ICloneable;

// Поле data_ типа T в классе ValueHolder
// открыто, к нему можно обращаться
template <typename T>
struct ValueHolder;

// Это класс, который вам нужно реализовать
class Any
{
    // В классе Any должен быть конструктор,
    // который можно вызвать без параметров,
    // чтобы работал следующий код:
    //    Any empty; // empty ничего не хранит

    // В классе Any должен быть шаблонный
    // конструктор от одного параметра, чтобы
    // можно было создавать объекты типа Any,
    // например, следующим образом:
    //    Any i(10); // i хранит значение 10

    // Не забудьте про деструктор. Все выделенные
    // ресурсы нужно освободить.

    // В классе Any также должен быть конструктор
    // копирования (вам поможет метод clone
    // интерфейса ICloneable)

    // В классе должен быть оператор присваивания и/или
    // шаблонный оператор присваивания, чтобы работал
    // следующий код:
    //    Any copy(i); // copy хранит 10, как и i
    //    empty = copy; // empty хранит 10, как и copy
    //    empty = 0; // а теперь empty хранит 0

    // Ну и наконец, мы хотим уметь получать хранимое
    // значение, для этого определите в классе Any
    // шаблонный метод cast, который возвращает
    // указатель на хранимое значение, или нулевой
    // указатель в случае несоответствия типов или
    // если объект Any ничего не хранит:
    //    int *iptr = i.cast<int>(); // *iptr == 10
    //    char *cptr = i.cast<char>(); // cptr == 0,
    //        // потому что i хранит int, а не char
    //    Any empty2;
    //    int *p = empty2.cast<int>(); // p == 0
    // При реализации используйте dynamic_cast,
    // который мы уже обсуждали ранее.
};

Вот мое решение:

#include <iostream>

using namespace std;

struct ICloneable
{
    virtual ICloneable* clone() const = 0;
    virtual ~ICloneable() { }
};

template <typename T>
struct ValueHolder : ICloneable {
    ValueHolder(const T& data): data_(data){}
    T data_;
    ValueHolder * clone() const {
        return new ValueHolder(*this);
    }
};

class Any
{
    ICloneable * ptr;

public:
    Any() : ptr(0) { }

    template <class value_t>
    Any(const value_t& v_) : ptr(new ValueHolder<value_t>(v_)) { }

    Any(Any const & other) : ptr(other.ptr ? other.ptr->clone() : 0) {}

    Any& operator=(Any const & other)
    {
        if(this->ptr)
            delete this->ptr;
        this->ptr = NULL;
        if (other.ptr)
        {
            this->ptr=other.ptr->clone();
        }
        return *this;
    }
    template <class A>
    Any& operator=(A const& other)
    {
        if(this->ptr)
            delete this->ptr;
        this->ptr = NULL;
        if (other)
        {
            this->ptr=new ValueHolder<A>(other);
        }
        return *this;
    }

    ~Any() { delete this->ptr; }
    template <class T>
    T* cast()
    {
        if (dynamic_cast<ValueHolder<T>*>(this->ptr))
        {
            return (T*)dynamic_cast<ValueHolder<T>*>(this->ptr);
        }
        else
        {
            return 0;
        }
    }
};


int main()
{

    Any empty;
    Any i(10);
    cout << "[1] i=" << i.cast<int>() << endl;
    Any copy(i);
    cout << "[2] copy=" << copy.cast<int>() << endl;
    empty = copy;
    cout << "[3] empty=" << empty.cast<int>() << endl;
    empty = 0;
    cout << "[4] empty=" << empty.cast<int>() << endl;
    int *iptr = i.cast<int>();
    cout << "[5] *iptr=" << iptr << endl;
    char *cptr = i.cast<char>();
    cout << "[6] *cptr=" << cptr << endl;
    Any empty2;
    int *p = empty2.cast<int>();
    cout << "[7] *p=" << p << endl;
    Any a = 20;
    cout << "[8] a=" << a.cast<int>() << endl;
    a=0;
    cout << "[9] a=" << a.cast<int>() << endl;
    a='w';
    cout << "[10] a=" << a.cast<char>() << endl;
    return 0;
}

Засада в методе cast и [6] тесте. Как мне вернуть нулевой указатель при несоответствии типов char *cptr = i.cast<char>()?

 

Pirr
()

Вывод в поток «многомерного» Array

Форум — Development

Помогите решить задачу:

Шаблонный класс Array может хранить объекты любого типа, для которого определён конструктор копирования, в том числе и другой Array, например, Array< Array<int> >. Глубина вложенности может быть произвольной. Напишите шаблонную функцию (или несколько) flatten, которая принимает на вход такой «многомерный» Array неизвестной заранее глубины вложенности и выводит в поток out через пробел все элементы, хранящиеся на самом нижнем уровне. Примеры работы функции flatten:

Array<int> ints(2, 0);
ints[0] = 10;
ints[1] = 20;
flatten(ints, std::cout); // выводит на экран строку "10 20"
Array< Array<int> > array_of_ints(2, ints);
flatten(array_of_ints, std::cout); // выводит на экран строку "10 20 10 20"
Array<double> doubles(10, 0.0);
flatten(doubles, std::cout); // работать должно не только для типа int

Note: лидирующие и завершающие пробельные символы будут игнорироваться проверяющей системой, т. е. там где ожидается «10 20» будет так же принят, например, вариант " 10 20 ", но не вывод «1020».

Hint: шаблонные функции тоже можно перегружать, из нескольких шаблонных функций будет выбрана наиболее специфичная.

#include <iostream>


// Весь вывод должен осущствляться в поток out,
// переданный в качестве параметра.
//
// Можно заводить любые вспомогаетльные функции,
// структуры или даже изменять сигнатуру flatten,
// но при этом все примеры вызова из задания должны
// компилироваться и работать.

template <typename T>
void flatten(const Array<T>& array, std::ostream& out)
{ }

Пока завис на этом:

template <typename T>
  void flatten(const Array<T>& array, std::ostream& out)
  {
      if (typeid(Array<int>)==typeid(T) || typeid(Array<double>)==typeid(T)){
          // тут наверное надо рекурсивно вызывать flatten(array[i], out)
          // но так не выходит
      } else {
      for (int i=0; i<array.size(); ++i)
          out << array[i] << " ";
      }
  }
Может есть какие то стандартные способы развернуть такой Array?

 

Pirr
()

Использование placement new

Форум — Development

Помогите разобраться с заданием:

В предыдущей версии предполагается, что для типа T определен оператор присваивания или он ему не нужен (например, для примитивных типов он не нужен). При создании шаблонных классов контейнеров (вроде Array и не только) разумно стараться минимизировать требования к типам шаблонных параметров. Поэтому усложним задачу, реализуйте класс Array не полагаясь на то, что для типа T определен оператор присваивания. Hints: используйте placement new и явный вызов деструктора, чтобы создавать и уничтожать объекты, аллоцировать правильно выровненную память можно с помощью new char[N * sizeof(T)], где N - количество элементов массива.

#include <cstddef>

template <typename T>
class Array
{
    // Список операций:
    //
    // Array(size_t size, const T& value = T())
    //   конструктор класса, который создает
    //   Array размера size, заполненный значениями
    //   value типа T. Считайте что у типа T есть
    //   конструктор, который можно вызвать без
    //   без параметров, либо он ему не нужен.
    //
    // Array()
    //   конструктор класса, который можно вызвать
    //   без параметров. Должен создавать пустой
    //   Array.
    //
    // Array(const Array &)
    //   конструктор копирования, который создает
    //   копию параметра. Для типа T оператор
    //   присвивания не определен.
    //
    // ~Array()
    //   деструктор, если он вам необходим.
    //
    // Array& operator=(...)
    //   оператор присваивания.
    //
    // size_t size() const
    //   возвращает размер массива (количество
    //                              элемнтов).
    //
    // T& operator[](size_t)
    // const T& operator[](size_t) const
    //   две версии оператора доступа по индексу.
};

Вот моё решение:

template <typename T>
class Array
{
public:
    explicit Array(size_t size = 0, const T& value = T())
        :size_(size), data(new T[size])
    {
        for (int i=0; i<size; i++)
            data[i] = value;
    }
    //Array():size_(0), data(new T[0]) {}

    Array(const Array &arrayToCopy)
    {
        size_ = arrayToCopy.size();
        data = static_cast<T*>(operator new[] (size_ * sizeof(T)));
        for ( int i = 0; i < size_; ++i)
            data[i] = arrayToCopy[i];
    }
    ~Array()
    {
        for (int i = 0; i < size_; i++)
          {
              data[i].~T();
          }
        operator delete[](data);
    }

    Array& operator=(const Array & right)
    {
        size_=right.size();
        char * buff = new char[size_ * sizeof(T)];
        data = new (buff) T[size_];
        for (int i=0; i< size_; ++i)
            data[i]=right[i];
        return *this;
    }
    size_t size() const
    {
        return size_;
    }
    T& operator[](size_t i)
    {
        return data[i];
    }
    const T& operator[](size_t i) const
    {
        return data[i];
    }
private:
    size_t size_;
    T * data;
};

А вот выхлоп:

Compilation error main.cpp: In instantiation of ‘Array<T>::Array(size_t, const T&) [with T = Trace; size_t = long unsigned int]’: main.cpp:188:23: required from here main.cpp:177:9: error: ‘Trace& Trace::operator=(const Trace&)’ is private main.cpp:114:13: error: within this context main.cpp: In instantiation of ‘Array<T>& Array<T>::operator=(const Array<T>&) [with T = Trace; Array<T> = Array<Trace>]’: main.cpp:192:11: required from here main.cpp:177:9: error: ‘Trace& Trace::operator=(const Trace&)’ is private main.cpp:140:13: error: within this context main.cpp: In instantiation of ‘Array<T>::Array(const Array<T>&) [with T = Trace; Array<T> = Array<Trace>]’: main.cpp:195:28: required from here main.cpp:177:9: error: ‘Trace& Trace::operator=(const Trace&)’ is private main.cpp:123:13: error: within this context

Подскажите где ошибка?

 

Pirr
()

Правила переопределения операторов

Форум — Web-development

Помогите разобраться с задачей:

Вам дан класс Rational, который представляет рациональное число. В нем определены методы add, sub, mul и div, которые прибавляют к нему число, отнимают число, умножают на число и делят на число соответственно. Кроме того в нем определен метод neg, который меняет знак на противоположный. Вам нужно определить операторы +=, -=, *=, /= для класса Rational, так чтобы они могли принимать в качестве аргументов и объекты типа Rational и целые числа. Кроме того вам необходимо определить операторы унарного минуса и плюса для класса Rational.

struct Rational
{
    Rational(int numerator = 0, int denominator = 1);

    void add(Rational rational);
    void sub(Rational rational);
    void mul(Rational rational);
    void div(Rational rational);

    void neg();
    void inv();
    double to_double() const;

private:
    int numerator_;
    unsigned denominator_;
};

Вот мой неработающий черновик с идеями:

Rational& operator+=(Rational rational)
    {
        return (rational.add(*this));
    };
    Rational& operator-=(Rational rational)
    {
        return (rational.sub(*this));
    };
    Rational& operator*=(Rational rational)
    {
        return (rational.mul(*this));
    };
    Rational& operator/=(Rational rational)
    {
        return (rational.div(*this));
    };

    Rational operator-()
    {
        this->sub();
        return *this;
    };
    Rational operator+()
    {
        this->add();
        return *this;
    };

Самое главное я не пойму как мне получить rvalue для операторов +=, -=, *=, /=?

 

Pirr
()

Сворачивание констант в дереве (constant folding).

Форум — Development

Помогите разобраться с заданием:

В этой задаче вам необходимо реализовать сворачивание констант в дереве (constant folding). Например, у нас есть выражение (точнее, дерево, описывающее это выражение) abs(var * sqrt(32.0 - 16.0)), на выходе мы должны получить дерево для следующего выражения abs(var * 4.0), т. е. подвыражение sqrt(32.0 - 16.0) было вычислено.

Для того, чтобы определить, что выражение (Expression) на самом деле является числом (Number), используйте оператор dynamic_cast.

Все промежуточные узлы дерева, которые вы создали, нужно освободить.

#include <cassert>
#include <string>
#include <cmath>

struct Transformer;
struct Number;
struct BinaryOperation;
struct FunctionCall;
struct Variable;

struct Expression
{
    virtual ~Expression() { }
    virtual double evaluate() const = 0;
    virtual Expression *transform(Transformer *tr) const = 0;
};

struct Transformer
{
    virtual ~Transformer() { }
    virtual Expression *transformNumber(Number const *) = 0;
    virtual Expression *transformBinaryOperation(BinaryOperation const *) = 0;
    virtual Expression *transformFunctionCall(FunctionCall const *) = 0;
    virtual Expression *transformVariable(Variable const *) = 0;
};

struct Number : Expression
{
    Number(double value);
    double value() const;
    double evaluate() const;
    Expression *transform(Transformer *tr) const;

private:
    double value_;
};

struct BinaryOperation : Expression
{
    enum {
        PLUS = '+',
        MINUS = '-',
        DIV = '/',
        MUL = '*'
    };
    BinaryOperation(Expression const *left, int op, Expression const *right);
    ~BinaryOperation();
    double evaluate() const;
    Expression *transform(Transformer *tr) const;
    Expression const *left() const;
    Expression const *right() const;
    int operation() const;

private:
    Expression const *left_;
    Expression const *right_;
    int op_;
};

struct FunctionCall : Expression
{
    FunctionCall(std::string const &name, Expression const *arg);
    ~FunctionCall();
    double evaluate() const;
    Expression *transform(Transformer *tr) const;
    std::string const &name() const;
    Expression const *arg() const;

private:
    std::string const name_;
    Expression const *arg_;
};

struct Variable : Expression
{
    Variable(std::string const name);
    std::string const & name() const;
    double evaluate() const;
    Expression *transform(Transformer *tr) const;

private:
    std::string const name_;
};


/**
 * реализйте все необходимые методы
 * если считаете нужным, то можете
 * заводить любые вспомогетльные
 * методы
 */
struct FoldConstants : Transformer
{
    Expression *transformNumber(Number const *number)
    { }

    Expression *transformBinaryOperation(BinaryOperation const *binop)
    { }

    Expression *transformFunctionCall(FunctionCall const *fcall)
    { }

    Expression *transformVariable(Variable const *var)
    {  }
};

Вот мое решение, но оно не проходит тест:

struct FoldConstants : Transformer
{
    Expression *transformNumber(Number const *number)
    {
        return new Number(number->value());
    }
    Expression *transformBinaryOperation(BinaryOperation const *binop)
    {
        Expression * a;
        Expression * b;
        if (dynamic_cast<Number*>(binop->left()->transform(this)))
            {a = binop->left()->transform(this);}
        else
            {a = (Number*)(binop->left()->transform(this));}
        if (dynamic_cast<Number*>(binop->right()->transform(this)))
            {b = binop->right()->transform(this);}
        else
            {b = (Number*)(binop->right()->transform(this));}

        BinaryOperation * c = new BinaryOperation(a, binop->operation(), b);
        return new Number(c->evaluate());
        delete c;
    }
    Expression *transformFunctionCall(FunctionCall const *fcall)
    {
        Expression * a;
        if (dynamic_cast<Number*>(fcall->arg()->transform(this)))
            {a = fcall->arg()->transform(this);}
        else
            {a = (Number*)(fcall->arg()->transform(this));}
        FunctionCall * b = new FunctionCall(fcall->name(), a);
        return new Number(b->evaluate());
        delete b;
    }
    Expression *transformVariable(Variable const *var)
    {
        return new Variable(var->name());
    }
};

 

Pirr
()

Как узнать тип указателя без typeid и dynamic_cast

Форум — Development

Требуется реализовать функцию, которая принимает на вход два указателя на базовый класс Expression, и возвращает true, если оба указателя указывают на самом деле на объекты одного и того же класса, и false в противном случае.

C typeid все делается в одну строку:

bool check_equals(Expression const *left, Expression const *right)
{
    return (typeid(*left) == typeid(*right));
}

А как сделать тоже самое без typeid и dynamic_cast?

 

Pirr
()

Собственная функция getline

Форум — Development

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

Задание

В этой задаче вам необходимо написать функцию getline, которая читает строку из стандартного потока ввода cin. Конец строки достигается, если прочитан символ '\n' или поток ввода прочитан полностью. Если прочитан символ '\n', то сохранять его в строку не нужно. Не забудьте, что строка должна оканчиваться нулевым символом. Всю выделенную динамически память, кроме результирующей строки, необходимо освободить - будьте внимательны! Указатель возвращенный из getline будет освобожден с помощью delete[].

Замечания:

выделяйте и освобождайте память в стиле C++, функция ничего не должна выводить (Sample Output в примере — это возвращаемое значении функции в формате длина:строка).

Sample Input:

Hello

, world!

Sample Output:

5:Hello

8:, world!

Дают шаблон функции:

#include <iostream>

using namespace std;

char *getline() {
    // put your code here
}

Я написал функцию:

#include <iostream>

using namespace std;

char *getline() {

	int i = 0;
	char c = '\0';
	char * b = new char[1000];
	while (cin.get(c)) {
		i++;
		if (c == '\n')
			break;
	    b[i-1] = c;
	}
	cout << i-1 << ":" << b;
	delete [] b;
}

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

Вот дополнительные пояснения от преподавателя:

...нужно реализовать функцию getline, которая читает ровно одну строку, т. е. либо доходит до символа '\n', либо до конца входного потока (т. е. до состояния, когда в потоке не осталось символов). Больше ничего делать не надо (никакого дополнительного вывода, никакого main и тд). Функция main уже написана, она вызывает функцию getline, которую собственно вам и требуется реализовать. Надеюсь условия задания теперь понятны. Теперь касательно свободной памяти, тут вопрос не о количестве байт, а количестве выделенных участков. Так как размер строки, которую нужно прочитать не известен заранее, вполне возможно, что придется перевыделять память, и нужно позаботится о том, что старый участок памяти будет освобожден. Т. е. в результате функция должна вернуть указатель на единственный выделенный участок памяти, в котором будет храниться прочитанная строка, а все остальные выделенные участки памяти (если, конечно, они были выделены) должны быть освобождены.

Но один хрен, не пойму, что нужно сделать

 

Pirr
()

RSS подписка на новые темы