
Viktor
02.03.2016
18:00:00
есть именно такие массивы
которые эффективны в этом плане?

Pavel
02.03.2016
18:00:52
например, односвязный список :)

Google

Ivan
02.03.2016
18:02:23
(Да, экономия в алгоритмах не мой конек)

Viktor
02.03.2016
18:02:46
да не, я именно с точки зрения теории смотр/
первое что пришло в голову — каждый элемент имеет один бит, который определяет, хранится в нем значение или ссылка
но это не лучшая идея
как минимум из-за необходимости переносить значения
почему бы их сразу не перенести
второй вариант — сделать не массив указателей

Pavel
02.03.2016
18:06:01
односвязный список + индексы для быстрого доступа.

Viktor
02.03.2016
18:06:03
но это неэффективно по памяти, и не позволяет просто сместить елементы

Pavel
02.03.2016
18:08:20
тогда без индексов. нужен пятый элемент - считай раз-два-три-четыре-пять.

Viktor
02.03.2016
18:08:35

Google

Pavel
02.03.2016
18:09:01
а что сдвиг? переписывай указатели да и всё.

Viktor
02.03.2016
18:10:05
как такой вариант: у каждого массива есть некий заголовок, который указывает его длинну и ссылку на продолжение при наличии
вот например массив 1 2 3 4 5
тогда:
len: 5
next: NULL
start: УКАЗАТЕЛЬ_НА_1
ой, и еще ссылка на первый элемент

Pavel
02.03.2016
18:13:01
Это и называется односвязный список. ☺️

Viktor
02.03.2016
18:14:23
и если мы захотели вставить между двойкой и тройкой еще и 5 6 7 8, то просто создаем новый такого же типа почти_массив
и получится у нас:
0x00 -> HEAD0
0x01 1
0x02 2
0x03 3
0x04 4
0x05 5
0x06 -> HEAD1
0x07 5
0x08 6
0x09 7
0x0A 8
0x0B -> HEAD2
HEAD0:
len: 2
start: 0x01
next: 0x06
HEAD1:
len: 4
start: 0x07
next: 0x0B
HEAD2:
len: 3
start: 0x03
next: NULL

Pavel
02.03.2016
18:19:29
Что это?

Viktor
02.03.2016
18:19:31

Whore Amazing
02.03.2016
18:19:49
простите что прерываю ваш оккультный диалог своей приземленной джангой, но ватафак?
__init__() got an unexpected keyword argument 'instance'

Viktor
02.03.2016
18:20:28
что-то лишнее передал классу при создании

Pavel
02.03.2016
18:20:33
Пихаешь инстанции туда, где он не ждётся.

Whore Amazing
02.03.2016
18:20:53
__init__ я не перегружал
мамой клянусь

Viktor
02.03.2016
18:20:58
причем как я понял instance=XXX передаешь

Whore Amazing
02.03.2016
18:21:05
нет, ничуть

Aragaer
02.03.2016
18:21:15
просто куда-то передается лишний аргумент

Viktor
02.03.2016
18:21:24
так что поищи instance= в коде и посмотри везде ли надо

Aragaer
02.03.2016
18:21:25
в какой-то конструктор

Google

Aragaer
02.03.2016
18:21:35
дык стектрейс же есть

Whore Amazing
02.03.2016
18:21:41
откуда он туда может передаваться?

Aragaer
02.03.2016
18:22:24
что значит *item?
наверно struct
и видимо это сиплюсплюс

Viktor
02.03.2016
18:22:57

Aragaer
02.03.2016
18:23:06
нет, плюсы
в С надо писать struct item *next

Pavel
02.03.2016
18:23:20

Viktor
02.03.2016
18:23:30

Aragaer
02.03.2016
18:23:35
уже удален

Viktor
02.03.2016
18:23:37
увидел и он исчез
ага
так что не могу сказать
так вот, вернемся к моему велосипедостроению

Pavel
02.03.2016
18:24:10

Viktor
02.03.2016
18:24:30

Whore Amazing
02.03.2016
18:25:04
где смотреть стектрейс
я не нашел таких слов в трейсбэке

Pavel
02.03.2016
18:25:12
какие указатели-то?
Односвязный список. В структуре указатель на следующий элемент и на нагрузку.

Google

Viktor
02.03.2016
18:25:49
Что это?
первая часть — дамп памяти, где слева адрес, а справа значение (либо -> HEADx)
вторая часть — эти самые `HEADx`ы
да, это действительно оно
но вот у меня вопрос возник
чтобы вставить один элемент нам потребуется аж два заголовка!

Pavel
02.03.2016
18:27:08

Viktor
02.03.2016
18:27:11
а если вставлять раз за разом

Whore Amazing
02.03.2016
18:27:35

Viktor
02.03.2016
18:27:41
то оно вообще разростется в кучу указателей на указатели

Admin
ERROR: S client not available

Viktor
02.03.2016
18:27:46
тогда посмоти на какой строке джанги

Pavel
02.03.2016
18:28:01

Viktor
02.03.2016
18:28:15
стоп

Whore Amazing
02.03.2016
18:28:21

Viktor
02.03.2016
18:28:34

Whore Amazing
02.03.2016
18:29:42

Pavel
02.03.2016
18:29:43
то оно вообще разростется в кучу указателей на указатели
нет же. У тебя в каждом элементе два указателя: на следующий элемент и на полезную нагрузку. Для инсерта в середину ты правишь один указатель (предыдущего элемента на только что созданный), а во вновь созданном элементе next направляешь туда, где был next у предыдущего. Односвязный список - самая простая структура, после линейного масива.

Viktor
02.03.2016
18:30:26
я если вставлю один раз
потом еще один

Google

Viktor
02.03.2016
18:31:10
погоди, так список может хранить только один элемент?
то есть

Pavel
02.03.2016
18:31:14
потом еще один
http://prog-cpp.ru/wp-content/uploads/2014/04/ols-add.png

Viktor
02.03.2016
18:31:25
нагрузка это один элемент только?

Pavel
02.03.2016
18:31:40
указатель на что хочешь. Мы же про С говорим?

Viktor
02.03.2016
18:31:47
ну смотри
вот данные корня — 1, 2, 3, 4
между 2 и 3 мы вставляем еще
тогда же нужно создать узел с добавляемыми данными
и узел, который будет хранить оставшиеся части этого самого корня
и станет

Pavel
02.03.2016
18:35:24
я с трудом понимаю, что ты там себе придумал, я тебе рассказываю вот про такую простую штуку:
typedef struct Node {
void *payload;
struct Node *next;
} Node;

Viktor
02.03.2016
18:35:40
так значит
у нас будет в каждой ноде один элемент только, и никак не несколько?

Pavel
02.03.2016
18:36:24
ну конечно.

Viktor
02.03.2016
18:36:42
а в том что я себе напридумывал был не один
в этом и суть
то есть
typedef struct Block {
void *payload_arr;
size_t length;
struct Block next;
} Block;
это скорее блоки, чем ноды