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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.12.2015, 13:11   #21
taras-proger
Подтвердите свой е-майл
 
Регистрация: 12.11.2014
Сообщений: 470
По умолчанию

Цитата:
сообщение #7
Цитата:
С каких пор вектор или лист стал экзотикой?
А с каких пор у них исчезла размерность? Вектор-столбец воообще то одномерен, как и вектор-строка, геометрический вектор имеет размерность своего пространства, определяемую, видимо, типом. А вот чтоб у элемента индексы то были, но в количестве, равном нолю, такого я что то не видал.

Последний раз редактировалось taras-proger; 28.12.2015 в 13:14.
taras-proger вне форума Ответить с цитированием
Старый 28.12.2015, 21:12   #22
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от taras-proger Посмотреть сообщение
А вот чтоб у элемента индексы то были, но в количестве, равном нолю, такого я что то не видал.
может просто мало ещё на свете живете?

Код:
рецепт изготовления "структур с переменной длиной"

pure-c

#include <iostream>

struct Data
{
    size_t size;
    char data[0]; //<--- маркер конца структуры
};

Data* create(const size_t size)
{
    // выделяем больше, чем нужно для самой структуры
    // таким образом получаем "хвостик" 
    // идущий сразу же за подобъектом структуры
    Data* data = static_cast<Data*>(malloc(sizeof(Data) + size));


    data->size = size;

    // благодаря маркеру, мы знаем, где начинается этот "хвост"
    return data;
}

void use(Data* data)
{
    // так же, благодаря маркеру
    // мы можем легко получать доступ к этому хвостику
    // и наполнять его данными
    for(size_t i = 0; i < data->size; ++i)
        data->data[i] = 123;
}

int main()
{
    std::cout << "Hello, world!\n";

    struct date* d = create(1024);

    use(d);
}


с++

#include <iostream>
#include <cstring>
#include <cstdlib>

struct Response
{
    Response(int code, char const * str)
        : code_(code)
    { std::memcpy(data_, str, size_); }

    char * data()            { return data_;              }
    char const * data()const { return data_;              }
    size_t size() const      { return size_;              }
    size_t length() const    { return std::strlen(data_); }
    int code() const         { return code_;              }

    // перегружаем оператор по точно такому же принципу
    // как и в случае с pure-c
    void* operator new(size_t size, size_t length)
    {
        Response * ptr = (Response*)std::malloc(size + sizeof(char) * length);
        if(ptr)
            ptr->size_ = length + 1;
        
        return ptr;
    }
    void operator delete(void* ptr) { std::free(ptr); }

private:
    int const code_;
    size_t    size_;
    char      data_[1]; //<--- на языке с++ нельзя объявить массив нулевого размера
                 // поэтому, делаем маркер из 1 байта
};

int main()
{
    const char ptr[] = "privet mir";

    Response * resp = new(std::strlen(ptr)) Response(1, ptr);

    std::cout << resp->code()   << std::endl;
    std::cout << resp->data()   << std::endl;
    std::cout << resp->size()   << std::endl;
    std::cout << resp->length() << std::endl;
    delete resp;
}
_Bers вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите девушке! Заполнить массив случайным образом, выделить в отдельные массивы буквы латинского алфавита, Svetlana90 Помощь студентам 0 19.05.2015 14:14
Помогите девушке alena1995 Помощь студентам 7 03.12.2014 17:03
Паскаль массив, помогите девушке!!!на учебную практику срочно нужно!!! анастасия56 Помощь студентам 1 30.05.2009 13:37