Re[24]: Зачем нужны циклы если есть рекурсивные функции
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 01.10.09 07:05
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, gandjustas, Вы писали:


PD>>>Линейный список. Количество элементов неизвестно, последний элемент имеет .pNext == 0. Логически то же самое.

G>>Да, но это уже не последовательность байтов

PD>Кто мне про общие принципы толковал ? Общий принцип тут один и тот же — структура с терминатором.

Ну так это и есть тот самый список, который чаще всего рекусривно обрабатывается.
Читай SICP.

PD>>>Упаси боже меня от рекурсии на линейных списках. Мне только стек дергать на ровном месте не хватало. Еще, чего доброго, его переполнишь.

G>>Ты уже забыл что даже компиляторы C умеют оптимизировать хвостовую рекурсию?
PD>Упаси меня бог от рекурсии на списках, как хвостовой, так и безхвостой, как оптимизированной, так и нет.
Ну и что ты имеешь против рекурсии?


PD>>>Кстати, в дотнете разве в классах коллекций для IList используется рекурсия для основных действий ? Нет. Вот тебе пример. Класс LinkedList

PD>>>А уж казалось бы, как красиво можно поиск рекурсивно организовать! Но что-то они не стали. Правильно не стали
G>>Потому что в компиляторе C# оптимизации хвостовой рекурсии нет.
PD>Слава богу.
Темная сторона силы владеет тобой, о юный падаван.


PD>>>>>Такая задача может возникнуть, или же, коль скоро в С такое используют для С-строк, надо эту задачу анафеме предать ?

G>>>>Ну покажи хоть один реальный пример, иначе анафеме предаем.
PD>>>Показал. Твой же пример
G>>Какой?
PD>Список.
Читай SICP, там две трети про списки и обработку их с помощью рекурсии.
Re[23]: Зачем нужны циклы если есть рекурсивные функции
От: Pavel Dvorkin Россия  
Дата: 01.10.09 07:06
Оценка: -3 :)))
Здравствуйте, FR, Вы писали:

FR>Здравствуйте, Pavel Dvorkin, Вы писали:



PD>>Упаси боже меня от рекурсии на линейных списках. Мне только стек дергать на ровном месте не хватало. Еще, чего доброго, его переполнишь.


FR>Вся функциональщина живет на рекурсивных алгоритмах на линейных списках, стек при этом никуда не дергается.


А я живу без функциональщины. Мне и так хорошо
With best regards
Pavel Dvorkin
Re[35]: Зачем нужны циклы если есть рекурсивные функции
От: Pavel Dvorkin Россия  
Дата: 01.10.09 07:12
Оценка:
Здравствуйте, FR, Вы писали:


PD>>Согласен. Но я его и не использую. Мне char* хватит. Он не сделан бездарно


FR>Тоже ничего хорошего


Доказательства в студию!

PD>>Я что-то не понял, что ты этим хочешь сказать ? Что std::string барахло ? Согласен. Что можно сделать умнее, чем просто аллоцировать новую строку каждый раз, когда она нужна ? Тоже согласен. Есть еще, кстати, strtok, она как раз делит строку на фрагменты без выделения новой памяти вообще, правда, портит исходную строку. Но какое это отношение имеет к твоему утверждению, что ASCIIZ очень медленный ?


FR>Такое что даже переписанные на ASCIIZ алгоритмы (второй вариант) были на порядок тормознее чем срезы.


Батенька, ну нельзя же так! Срезы — это некая иная идея. Строки она не отменяет, просто для определенных задач она позволяет более эффективно работать. В других случаях они просто неприменимы. Из того, что что-то частное можно организовать лучше, вовсе не следует. что это частное можно использовать в общем случае.

>В функциях текстовой обработки или поиска достаточно часто требуется вернуть фрагмент подстроки.


А если мне модифицировать строки надо, да еще с изменением длины, когда inplace нельзя, а фрагменты эти даром не нужны — тогда как ?
With best regards
Pavel Dvorkin
Re[19]: Зачем нужны циклы если есть рекурсивные функции
От: Pavel Dvorkin Россия  
Дата: 01.10.09 07:18
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>Здравствуйте, Pavel Dvorkin, Вы писали:


GN>>>Модификация кода во время выполнения.


PD>>Ну я же говорю, что тебя трюки в основном и привлекают


GN>Мне лишь приходится с этим иметь дело. Желающих пропатчить код Винды сейчас пруд пруди.


Успехов! Я серьезно.

GN>Континуации на асме были названы трюками. А на С — обычным делом С первым я и не согласен.


Ладно, пусть так. В конце концов при желании можно любой код назвать континуацией

PD>>Хм, а почему это нельзя ? Указатели вроде не отменили, запись по ним тоже.


GN>Это процесс времени трансляции. Компилятор С++ помещает нужную информацию в объектник не для всех случаев. Решается линковкой оттранслированного асм файла (не содержащего кстати ни одной мнемоники)


Ничего не понял. Как это асм файл можно линковать ???


GN>Многие другие конструкции С++ приводят к встраиванию команд


Очень многие. Все, кроме декларативных


>об этом и речь, что нет нужды писать их руками.


Если хорошо встраивает — тогда да. А если не очень — то нет.

Кстати, насчет твоей GetSeperMegaFastThreadID. Проверял, быстрее. А вот счет 1:0 не признаю. Ты же алгоритм изменил. Твой быстрее, верно, но при чем тут ассемблер ?
With best regards
Pavel Dvorkin
Re[36]: Зачем нужны циклы если есть рекурсивные функции
От: FR  
Дата: 01.10.09 07:20
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

FR>>Тоже ничего хорошего


PD>Доказательства в студию!


http://russian.joelonsoftware.com/Articles/BacktoBasics.html

FR>>Такое что даже переписанные на ASCIIZ алгоритмы (второй вариант) были на порядок тормознее чем срезы.


PD>Батенька, ну нельзя же так! Срезы — это некая иная идея. Строки она не отменяет, просто для определенных задач она позволяет более эффективно работать. В других случаях они просто неприменимы. Из того, что что-то частное можно организовать лучше, вовсе не следует. что это частное можно использовать в общем случае.


А в других случаях ASCIIZ практически всегда сливают, например для строк с счетчиком длины.

>>В функциях текстовой обработки или поиска достаточно часто требуется вернуть фрагмент подстроки.


PD>А если мне модифицировать строки надо, да еще с изменением длины, когда inplace нельзя, а фрагменты эти даром не нужны — тогда как ?


Тогда конечно только вручную на ассемблере
Re[33]: Зачем нужны циклы если есть рекурсивные функции
От: Pavel Dvorkin Россия  
Дата: 01.10.09 07:26
Оценка:
Здравствуйте, Klapaucius, Вы писали:

K>Вопрос во-первых, в том, сколько динамической памяти выделяется. Выделить подстроку можно, например, выделяя константное кол-во памяти, а не линейное.


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

>>>И рекламировать их все-равно что рекламировать супер оптимизированную написанную на ассемблере сортировку пузырьком.

PD>>В огороде бузина, а в Киеве дядька.

K>Да нет, намек достаточно прозрачен. Есть мнение, что асимптотика алгоритма имеет значение.

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

Это верно почти всегда, только надо иметь в виду, что а) вычисление длины за константное время невозможно, если кто-то ее до этого не вычислил и не положил куда следует, причем вычислил за линейное время и б) в ряде случаев можно потратить на вычисление длины нулевое время, потому как она совсем не нужна
With best regards
Pavel Dvorkin
Re[34]: Зачем нужны циклы если есть рекурсивные функции
От: Klapaucius  
Дата: 01.10.09 07:39
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

K>>Вопрос во-первых, в том, сколько динамической памяти выделяется. Выделить подстроку можно, например, выделяя константное кол-во памяти, а не линейное.

PD>Можно насчет значения константы поинтересоваться и о том, что делать, если истинная длина строки больше ее ?

Значение этой константы — размер двух указателей на границы интервала (или двух индексов), или размер одного узла дерева и т.д. Зависит от структуры данных. И длинна строки, разумеется, занчительно больше.

PD>Это верно почти всегда,


Вот именно.

PD> только надо иметь в виду, что а) вычисление длины за константное время невозможно, если кто-то ее до этого не вычислил и не положил куда следует, причем вычислил за линейное время


Один раз (во время компиляции или чтения из файла, например), а не много раз, как в случае, когда размер не хранится вместе со строкой.

PD>б) в ряде случаев можно потратить на вычисление длины нулевое время, потому как она совсем не нужна


Это существенного значения не имеет.
... << RSDN@Home 1.2.0 alpha 4 rev. 1228>>
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Re[16]: Зачем нужны циклы если есть рекурсивные функции
От: gear nuke  
Дата: 01.10.09 07:41
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

GN>>
GN>>    mov eax, [pixels]
GN>>    stc    ; используем Carry Flag как "маркер" конца битовой последовательности.
GN>>@@: rcr eax, 1 ; копируем очередной бит в Carry Flag. за счёт цикличности сдвига, меркер перейдёт в младший бит на первом проходе.
GN>>    ;
GN>>    ; тут что-то делаем с битом
GN>>    ;
GN>>    or  eax, eax  ; проверяем, остался ли бит маркера.
GN>>    jnz @b
GN>>


PD>Двумя словами — проход с барьером. Если хочешь пример аналога без битов — проход циклического списка с псевдоначалом (неким выбранным элементом, с которого стартуем и который содержит, скажем, NULL в поле данных).


То что я называю маркером, имеет значение совпадающее с возможным для данных.

PD>Другое дело, что это лишнее, проход и без этого "маркера" можно провести.


Можно, но потребует дополнительных ресурсов.

PD>Не так уж мало. И там и тут проход с барьером. Только ты (и я в варианте со списком) этот барьер заносишь явно, а для char* его занесли до нас.


Аналогом могла бы служить последовательность только из байтов 0 и 1.
.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[20]: Зачем нужны циклы если есть рекурсивные функции
От: gear nuke  
Дата: 01.10.09 07:41
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

GN>>Это процесс времени трансляции. Компилятор С++ помещает нужную информацию в объектник не для всех случаев. Решается линковкой оттранслированного асм файла (не содержащего кстати ни одной мнемоники)


PD>Ничего не понял. Как это асм файл можно линковать ???


Имеется ввиду объектник.

PD>Кстати, насчет твоей GetSeperMegaFastThreadID. Проверял, быстрее. А вот счет 1:0 не признаю. Ты же алгоритм изменил. Твой быстрее, верно, но при чем тут ассемблер ?


Вот я к тому и веду — что от ассемблера мало что зависит
.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[25]: Зачем нужны циклы если есть рекурсивные функции
От: Pavel Dvorkin Россия  
Дата: 01.10.09 07:43
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Темная сторона силы владеет тобой, о юный падаван.


Эх, где моя юность . Попался бы ты мне в юные года, я бы тебе не такое сказал
With best regards
Pavel Dvorkin
Re[37]: Зачем нужны циклы если есть рекурсивные функции
От: Pavel Dvorkin Россия  
Дата: 01.10.09 08:07
Оценка:
Здравствуйте, FR, Вы писали:

FR>Здравствуйте, Pavel Dvorkin, Вы писали:


FR>>>Тоже ничего хорошего


PD>>Доказательства в студию!


FR>http://russian.joelonsoftware.com/Articles/BacktoBasics.html


Да уж. Пример с strcat — классический способ демонстрации того, как даже с помощью наилучшего инструмента можно все испортить. Глупостями заниматься нечего.

>Как с этим бороться? Многие хитрые программисты на C написали свою функцию mystrcat примерно так:


И я писал, но немного не так. Код не приведу, а прототип дам

static int ConcatenateStrings(char* pWriteTo, char* szString, ... );

Ну все. Сейчас флейм на тему переменного числа параметров начнется

>Глаза б мои не видели. Вы, наверное, уже готовы переключить канал. Я понимаю, но подождите ещё чуть-чуть, потому что сейчас будет самое интересное. Нам нужно пройти по всем строкам раз, чтобы определить, сколько места выделить, и затем ещё раз, чтобы их соединить


Мои бы тоже. Мне бы ваши проблемы. А уж дальше про работу кучи — вообще прелесть.

>Соответственно malloc объявляет перерыв и начинает перетряхивать список свободных блоков, сливая соседние маленькие блоки воедино, на что уходит три с половиной дня.


Супер! Мозги ему перетряхнуть надо, чтобы чушь не писал.
Кстати, интересно, знает ли он, что кроме кучи кое-что еще есть ?

И такими аргументами ты хочешь меня в чем-то убедить ?

FR>А в других случаях ASCIIZ практически всегда сливают, например для строк с счетчиком длины.


А длину святой дух установил ? Или ее все же подсчитали когда-то путем все-таки линейного прохода ? Потому что другого способа все же нет (хотя, конечно, вычисление длины могло бы быть побочным результатом того же копирования). Если хочешь сказать, что ее подсчитали один раз, а потом не пересчитывали, а мне придется каждый раз — немедленно соглашусь. Но если она мне нужна много раз — кто мне мешает тоже ее один раз вычислить и хранить ? А вот если она мне совсем не нужна, то ты пустую работу по ее вычислению делаешь.

Если короче — я привесить длину к char* могу без труда, если надо, а вот ты убрать ее из своего класса не можешь — никак

А вот что да — так это то, что в string.h не все идеально. Например,

char *strcpy(
char *strDestination,
const char *strSource
);
Each of these functions returns the destination string

Единственное, что ИМХО оправдывает этот возврат — возможность вложенных вызовов. Но это экзотика, да и без них можно обычно обойтись. Я бы вместо того, чтобы возвращать destination, вернул бы указатель на '\0' в этом destination. И целым рядом проблем меньше.

Кстати

int sprintf(
char *buffer,
const char *format [,
argument] ...
);

Return Value
The number of characters written

то есть фактически указатель на конец строки. Но как замена strcpy или strcat не пойдет — форматные операции как-никак. Я думаю, что внутри она при формате %s ничего с символами не делает, но все равно как замена не годится — парсинг формата не отменишь.

>>>В функциях текстовой обработки или поиска достаточно часто требуется вернуть фрагмент подстроки.


PD>>А если мне модифицировать строки надо, да еще с изменением длины, когда inplace нельзя, а фрагменты эти даром не нужны — тогда как ?


FR>Тогда конечно только вручную на ассемблере




Пора, наверное, заканчивать ?
With best regards
Pavel Dvorkin
Re[38]: Зачем нужны циклы если есть рекурсивные функции
От: FR  
Дата: 01.10.09 08:10
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Пора, наверное, заканчивать ?


Угу
Re[35]: Зачем нужны циклы если есть рекурсивные функции
От: Pavel Dvorkin Россия  
Дата: 01.10.09 08:13
Оценка:
Здравствуйте, Klapaucius, Вы писали:

PD>>Можно насчет значения константы поинтересоваться и о том, что делать, если истинная длина строки больше ее ?


K>Значение этой константы — размер двух указателей на границы интервала (или двух индексов) или размер одного узла дерева и т.д. Зависит от структуры данных. И длинна строки, разумеется, занчительно больше.


Ты хоть сам понимаешь, что написал ? Не говоря уж о том, что первую фразу понять невозможно, как это длина строки значительно больше, если ты сам сказал, что для строк выделяется память в размере этой самой константы ???

K>Один раз (во время компиляции


Супер! Остается только все строки в исходники включить!

> или чтения из файла, например), а не много раз, как в случае, когда размер не хранится вместе со строкой.


А как ты думаешь, если длина у меня не хранится, то я могу, если надо, ее все же один раз вычислить и хранить ? Если надо. А вот ты можешь ее не вычислять и не хранить, если не надо ?

PD>>б) в ряде случаев можно потратить на вычисление длины нулевое время, потому как она совсем не нужна


K>Это существенного значения не имеет.


Для тебя.
With best regards
Pavel Dvorkin
Re[21]: Зачем нужны циклы если есть рекурсивные функции
От: Pavel Dvorkin Россия  
Дата: 01.10.09 08:16
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>Здравствуйте, Pavel Dvorkin, Вы писали:


GN>>>Это процесс времени трансляции. Компилятор С++ помещает нужную информацию в объектник не для всех случаев. Решается линковкой оттранслированного асм файла (не содержащего кстати ни одной мнемоники)


PD>>Ничего не понял. Как это асм файл можно линковать ???


GN>Имеется ввиду объектник.


С объектником ясно, но все же не пойму, почему править PE заголовок можно только на асме, а на С нельзя. Что там такое в асме есть особенное ?

PD>>Кстати, насчет твоей GetSeperMegaFastThreadID. Проверял, быстрее. А вот счет 1:0 не признаю. Ты же алгоритм изменил. Твой быстрее, верно, но при чем тут ассемблер ?


GN>Вот я к тому и веду — что от ассемблера мало что зависит


От алгоритма больше, согласен
With best regards
Pavel Dvorkin
Re[17]: Зачем нужны циклы если есть рекурсивные функции
От: Pavel Dvorkin Россия  
Дата: 01.10.09 08:25
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>Здравствуйте, Pavel Dvorkin, Вы писали:


PD>>Двумя словами — проход с барьером. Если хочешь пример аналога без битов — проход циклического списка с псевдоначалом (неким выбранным элементом, с которого стартуем и который содержит, скажем, NULL в поле данных).


GN>То что я называю маркером, имеет значение совпадающее с возможным для данных.


NULL — совершенно корректное значение для данных. Впрочем, если не нравится NULL — поставь указатель на некий статический объект и проверяй на равенство ему.

PD>>Другое дело, что это лишнее, проход и без этого "маркера" можно провести.


GN>Можно, но потребует дополнительных ресурсов.


Каких ?

cur = start->next; // начало с NULL пропустим
while(cur->data)
cur = cur->next;

Это с моим нулем.


и

cur = start;
do {
cur = cur->next;
}
while(cur!=start);


без него

Наоборот, одни элементом в списке меньше. Экономия

PD>>Не так уж мало. И там и тут проход с барьером. Только ты (и я в варианте со списком) этот барьер заносишь явно, а для char* его занесли до нас.


GN>Аналогом могла бы служить последовательность только из байтов 0 и 1.


Ну где я тебе возьму такие байты ? И чем тебя остальные 254 не устраивают ?
With best regards
Pavel Dvorkin
Re[39]: Зачем нужны циклы если есть рекурсивные функции
От: Pavel Dvorkin Россия  
Дата: 01.10.09 08:25
Оценка: :)
Здравствуйте, FR, Вы писали:

FR>Здравствуйте, Pavel Dvorkin, Вы писали:


PD>>Пора, наверное, заканчивать ?


FR>Угу


With best regards
Pavel Dvorkin
Re[36]: Зачем нужны циклы если есть рекурсивные функции
От: Klapaucius  
Дата: 01.10.09 08:32
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Ты хоть сам понимаешь, что написал ?


Отлично понимаю. А вы?

PD>Не говоря уж о том, что первую фразу понять невозможно, как это длина строки значительно больше, если ты сам сказал, что для строк выделяется память в размере этой самой константы ???


Я этого не говорил. Размер памяти для размещения строк линейно зависит от их длинны. О какой константе тут речь? Для результата конкатенации строк длинной N и K нужно от O(1) до O(log (min (N, K))) и для выделения подстроки от O(1) до O(log N) памяти. В зависимости от структуры данных. Понятно? Или мне теперь еще и преподавателю программирования объяснять что такое деревья?

>> или чтения из файла, например), а не много раз, как в случае, когда размер не хранится вместе со строкой.


PD>А как ты думаешь, если длина у меня не хранится, то я могу, если надо, ее все же один раз вычислить и хранить ? Если надо. А вот ты можешь ее не вычислять и не хранить, если не надо ?


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

K>>Это существенного значения не имеет.

PD>Для тебя.

Ну и сколько процентов время увеличения целого счетчика на размер блока составляет от времени чтения этого блока с диска?
... << RSDN@Home 1.2.0 alpha 4 rev. 1228>>
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Re[37]: Зачем нужны циклы если есть рекурсивные функции
От: Pavel Dvorkin Россия  
Дата: 01.10.09 08:43
Оценка: -1
Здравствуйте, Klapaucius, Вы писали:

K>Здравствуйте, Pavel Dvorkin, Вы писали:


PD>>Ты хоть сам понимаешь, что написал ?


K>Отлично понимаю. А вы?


Нет. У меня телепатических способностей нет.

PD>>Не говоря уж о том, что первую фразу понять невозможно, как это длина строки значительно больше, если ты сам сказал, что для строк выделяется память в размере этой самой константы ???


K>Я этого не говорил. Размер памяти для размещения строк линейно зависит от их длинны. О какой константе тут речь?


Вот об этой

>Выделить подстроку можно, например, выделяя константное кол-во памяти, а не линейное.


http://rsdn.ru/forum/philosophy/3553842.1.aspx
Автор: Klapaucius
Дата: 01.10.09



>Для результата конкатенации строк длинной N и K нужно от O(1) до O(log (min (N, K))) и для выделения подстроки от O(1) до O(log N) памяти. В зависимости от структуры данных. Понятно? Или мне теперь еще и преподавателю программирования объяснять что такое деревья?


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

http://rsdn.ru/forum/philosophy/3553842.1.aspx
Автор: Klapaucius
Дата: 01.10.09


этого не следует, а я не телепат.

>>> или чтения из файла, например), а не много раз, как в случае, когда размер не хранится вместе со строкой.


PD>>А как ты думаешь, если длина у меня не хранится, то я могу, если надо, ее все же один раз вычислить и хранить ? Если надо. А вот ты можешь ее не вычислять и не хранить, если не надо ?


K>Предпочтение следует отдавать статистически более вероятным вариантам использования а не статистически невероятным.


Статистику в студию! Это раз. В разных задачах разные ситуации. В моей как раз наоборот было. Это два.

K>>>Это существенного значения не имеет.

PD>>Для тебя.

K>Ну и сколько процентов время увеличения целого счетчика на размер блока составляет от времени чтения этого блока с диска?


А где я говорил, что я вообще читаю эти строки с диска ?

Ладно, все, хватит.
With best regards
Pavel Dvorkin
Re[22]: Зачем нужны циклы если есть рекурсивные функции
От: gear nuke  
Дата: 01.10.09 08:58
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>С объектником ясно, но все же не пойму, почему править PE заголовок можно только на асме, а на С нельзя. Что там такое в асме есть особенное ?


Никто заголовки не правит, линкер добавляет информацию из объектника при сборке. Директива .SAFESEH В С такого нет. Там возможна только автоматическая регистрация __except блоков, а не произвольных функций.
.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[18]: Зачем нужны циклы если есть рекурсивные функции
От: gear nuke  
Дата: 01.10.09 08:58
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>>>Двумя словами — проход с барьером. Если хочешь пример аналога без битов — проход циклического списка с псевдоначалом (неким выбранным элементом, с которого стартуем и который содержит, скажем, NULL в поле данных).


GN>>То что я называю маркером, имеет значение совпадающее с возможным для данных.


PD>NULL — совершенно корректное значение для данных.


Внутри С-строки?

PD> Впрочем, если не нравится NULL — поставь указатель на некий статический объект и проверяй на равенство ему.


Еще раз. В моем примере идёт последовательность битов. 1 и 0 — это валидные значения для данных. "Маркер" имеет значение 1. Помимо других проблем, нужно как-то уметь определить, что конкретный 1 — это именно маркер окончания, а не данные.

PD>>>Другое дело, что это лишнее, проход и без этого "маркера" можно провести.


GN>>Можно, но потребует дополнительных ресурсов.


PD>Каких ?


В 1м примере был использован счётчик битов.
    mov eax, [pixels]  
    mov ecx, 32  
@@: shr eax, 1  ; копируем очередной бит в Carry Flag
    ;
    ; тут что-то делаем с битом
    ;
    dec ecx  ; итерируем цикл
    jnz @b


PD>cur = start->next; // начало с NULL пропустим

PD>while(cur->data)
PD> cur = cur->next;

Одно из полей — лишнее. Осталось объедлинить data и next в одну ячейку памяти.

PD>>>Не так уж мало. И там и тут проход с барьером. Только ты (и я в варианте со списком) этот барьер заносишь явно, а для char* его занесли до нас.


GN>>Аналогом могла бы служить последовательность только из байтов 0 и 1.


PD>Ну где я тебе возьму такие байты ?


char s[] = '\0\1\1\0\1\0\1\0\1\0";

Очевидно strlen не посчитает длину.

PD> И чем тебя остальные 254 не устраивают ?


Они впринципе устраивают. Не устраивает невозможность наличия 0 в середине.
.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.