LINUX.ORG.RU

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

Ваще ерунду полную написал, надо так:

struct newstr{ 
 int len; 
 int start;  
 smartchar* strbuff;  
} 

struct smartchar{ 
 int refcount; 
 char* buff; //данные, для них делается malloc и realloc 
}


void find(newstr* data, char ch){
 newstr* res = malloc(sizeof(newstr));
 res->strbuff = data->strbuff;
 res->strbuff->refcount++;
 res->start = index(data->strbuff->buff,ch) - data->strbuff->buff;
 return res;
};

void newstrcat(char* dest, char* src){
 dest->len += strlen(src);
 dest->strbuff->buff = realloc(dest->strbuff->buff,dest->len+1);
 strcat(dest->strbuff->buff,src);
};

void delete(newstr* str){
 if(str->strbuff->refcount==0){
  free(str->strbuff->buff);
  free(str->strbuff);
 }else{
  str->strbuff->refcount--;
 }
 free(str);
};

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

>см. выше о плохих алгоритмах

это где? и так все-таки делают, и это бывает удобно.

>Дуракоустойчивость возрастает - нет больше понятия buffer overflow со строками.

однако наружу видны всяческие вспомогательные переменные, которые ручками трогать ни-ни! и Ц не позволяет в отличии от плюсов их скрыть от нечаянного вмешательства!

>Производительность возрастает за счет функции strlen и всех функций которые ее используют: strcat, printf, etc.

чуть ли не каждая операция c newstr - жонглирование указателями и динамической памятью - это дороговатые вещи. А в конечном итоге просто усложненные обертки для существующих функций.

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

>это где? и так все-таки делают, и это бывает удобно.

Как бывает удобно делать GOTO или друге вещи которые часто не кошерны но иногда можно. Удобно-неудобно а надо делать так чтоб потом все работало как у людей и читать код было просто.

>однако наружу видны всяческие вспомогательные переменные, которые ручками трогать ни-ни! и Ц не позволяет в отличии от плюсов их скрыть от нечаянного вмешательства!

А по другому видна вся память:

char[4] str = "abc"; strcat(str, "d");

и сегфолт. Легче научить студента не трогать вспомогательные переменные чем учить его управлять динамической памятью в контексте строк.

>чуть ли не каждая операция c newstr - жонглирование указателями и динамической памятью - это дороговатые вещи. А в конечном итоге просто усложненные обертки для существующих функций.

Опять же strcat, printf, etc завязанна на strlen, а по классической модели strlen будет медленнее чем по новой модели пропорционально длине строки:

speed of classic model = lambda * length of string * speed of new model

где lambda есть константа зависящая от железа и обычно порядка 10^0 (время уйдет на вызов функций и выделение памяти но там выделять особо нечего). Значит при строке в 1000 символов speed of classic model = [10 до 100] * speed new model

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

>Как бывает удобно делать GOTO или друге вещи которые часто не кошерны но иногда можно.

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

>А по другому видна вся память

Если писать на сях, то вся память будет видна в любом случае.

>Легче научить студента не трогать вспомогательные переменные чем учить его управлять динамической памятью в контексте строк.

Таких студентов надо отправлять в биореактор, на жабабыдлокодеров учиться ;) Си не для них.

Я понимаю что тебе не нравится: существует какой-то дефицит в языках "среднего" уровня (как пример могу назвать Modula-2, дальнейшее развитие паскаля). Есть и широко используются C/C++ для низкого уровня и perl/python/java для высокого, а вот посередине - пустота (если не считать всяческих монструозных сишноплюсовых фреймворков, которые не совсем труЪ).

А насчет производительности что языками трепать? Возьми портируй какую-нибудь простенькую утилитку или либу под альтернативную строковую библиотеку и добейся повышения производительности - коммьюнити большое спасибо скажет :)

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

>А кто сказал что goto - страшное зло от которого _любой ценой_ надо избавляться? Это миф. Не многого ли хочешь от низкоуровневого языка, который по сути юзер-френдли ассемблер? В том-то его и самый смак, что строка - это кусок памяти (коей она реально является в памяти компа), а не вещь в себе.

ГОТО это не зло как не зло и твой последний пример. Просто по достижении какой-то критической массы ГОТО в коде, он (код) становится не читабельным. Так и со всякими malloc/realloc'ами. Зачястую там нет никакой примудрости и программа может с этим справится не хуже человека (char s[1024] vs char *s = malloc(1024*sizeof(char))).

>Таких студентов надо отправлять в биореактор, на жабабыдлокодеров учиться ;) Си не для них.

Может быть.

>Я понимаю что тебе не нравится: существует какой-то дефицит в языках "среднего" уровня (как пример могу назвать Modula-2, дальнейшее развитие паскаля). Есть и широко используются C/C++ для низкого уровня и perl/python/java для высокого, а вот посередине - пустота (если не считать всяческих монструозных сишноплюсовых фреймворков, которые не совсем труЪ).

Ну в общем да. В смысле что хотелось бы C но без обектов и с самовыделяющейся памятью (только когда ты этого хочешь). Простое програмирование но тот же низкий уровень работы. C++ как раз по моему и есть средний уровень но это не то. Там С торчит на ружу и обекты. Нафиг такое городить когда просто нужен простой и удобный язык.

>А насчет производительности что языками трепать? Возьми портируй какую-нибудь простенькую утилитку или либу под альтернативную строковую библиотеку и добейся повышения производительности - коммьюнити большое спасибо скажет :)

Может и буду дерзать Ж). С чего начать интересно? Чето в голову ничего не лезет - пора спать. Хорошо поговорили - спасибо.

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

> хотелось бы C но без обектов

А что такое ваша новая строка, как не объект? Или строкам можно, а остальным нельзя? И чем вам вообще объекты не нравятся? И чем вам в C++ не нравится C - вас никто не заставляет его использовать.

>Нафиг такое городить когда просто нужен простой и удобный язык

use perl

Xellos ★★★★★
()

> Так почему же никто так и не сделал нечто типа:

Судя по вопросу и по треду, pascal - твой потолок.

geek ★★★
()

мну просто рыдает :'-(

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

>Ты вообще в курсе что кроме Linux/glibc есть и другие платформы? И ты в курсе, сколько софта написано на C, который ради твоей прихоти никто переписывать не собирается?

Что-то я не понял, почему придется переписывать весь софт, если просто ДОБАВИТЬ в glibc описанную выше структуру =)

А вообще, если по теме --- то кто мешает пользоваться готовыми либами, если они действительно есть? =)

MYMUR ★★★★
()

З.Ы. тем кто кричит про buffer overflow совет вынуть руки из жопы и писать нормальный код...

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

Человек хочет именно заменить. Добавить его не устраивает - мелко слишком.

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

>тем кто кричит про buffer overflow совет вынуть руки из жопы и писать нормальный код...

Да ну, вот ещё. То ли дело - паскакаль. Указателей нормальных нет, объектов нет, воды нет, жизни нет, населён роботами.

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

> Прочитай имя файла в строку.

Прочитал.

> Или ты не боишся buffer overflow?

Я это учел.

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

> З.Ы. тем кто кричит про buffer overflow совет вынуть руки из жопы и писать нормальный код...

+1, на лиспе

bugmaker ★★★★☆
()

Это не извращение. ты просто не вкурил суть.

Вообще у обоих подходов к хранению строк есть свои достоинства и недостатки.

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

А вот пихать подобное в либц - это действительно извращение.

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

>Она ищет длину строки таким вот способом: while (c != '\0') { c = str[i]; i++; }

При чём это оно ещё с многобайтовыми кодировками работать не будет :)

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

>Судя по вопросу и по треду, pascal - твой потолок.

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

Игорь

Krechet
() автор топика
Ответ на: комментарий от Ex

>З.Ы. тем кто кричит про buffer overflow совет вынуть руки из жопы и писать нормальный код...

Вот наверное сама суть и вылезает. Я в состоянии предотвротить buffer overflow в моем коде но я не считаю это "нормальным кодом" учитывая альтернативы (описанные выше). Я считаю что нормальный код это код который читается нормально и который выполняется быстро и эффективно и главное является элегантным решением задачи. Многие со мной как видно не согласны и считают что код должен быть удобен машине. По моему в 21ом веке компъютерная программа может сама уследить за своей памятью, тем более что выше описанный подход даст приемущество в производительности и стабильности, а так же уменьшит количество кода нужного для получения того же результата.

Наверное и правда что не стоит заменять классику но тем не менее строки в С используются настолько часто что по моему давно пора сделать это по крайней мере стандартной опцией языка.

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

>Если же это не явлется попыткой оскорбления то пожалуйста развейте свою мысль - будет очень интересно послушать ваше несомненно просвященное мнение по сему вопросу (по тону вы явно эксперт).

если ты боишься указателей и переполнений буфера - тебе явно не стоит использовать Си. Есть более другие языки. А пытаться сделать из Си паскаль - не очень умно.

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

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

и в 21 веке Си остается низкоуровневым языком программирования.

>Наверное и правда что не стоит заменять классику но тем не менее строки в С используются настолько часто что по моему давно пора сделать это по крайней мере стандартной опцией языка.

язык не трогать, а если тебе нужны безопасные указатели - используй другой язык или любую другую библиотеку работы со строками.

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

>если ты боишься указателей и переполнений буфера - тебе явно не стоит использовать Си.

Чего их боятся? Они же не злые собаки и не киллеры маньяки так?

>Есть более другие языки.

А есть и менее другие? А есть ли ровно столько же другие?.. Ж)))

>А пытаться сделать из Си паскаль - не очень умно.

Ну во первых просто добавив все описанное выше в С не сделает его паскалем. Паскаль в классическом своем виде как раз и имел строки очень похожие на С - массив char'ов фиксированной длинны в 255 символов. Так же паскаль поддерживал укозатели но не так как в С - там отсутствовалла арифметика укозателей.

Именно в Turbo Pascal 5.5 добавили "нормальные" строки потому что Turbo Pascal 5.5 был Object oriented. Таким образом он стал более близок Objective C и C++.

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

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

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

>>если ты боишься указателей и переполнений буфера - тебе явно не стоит использовать Си.

>Чего их боятся? Они же не злые собаки и не киллеры маньяки так?

Забыл добавить что сам очень часто использую укозатили на структуры или char'ы. Просто когда массив чаров - строка текста то это становится не очень удобно и иногда очень медленно.

>Именно в Turbo Pascal 5.5 добавили "нормальные" строки потому что Turbo Pascal 5.5 был Object oriented. Таким образом он стал более близок Objective C и C++.

В тот же Turbo Pascal 5.5 добавили арифметику укозателей которую смоделировали с С/С++.

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

>Просто когда массив чаров - строка текста то это становится не очень удобно и иногда очень медленно.

если медленно - меняй алгоритм.

>В тот же Turbo Pascal 5.5 добавили арифметику укозателей которую смоделировали с С/С++.

да и в жабу тоже добавили что-то похожее. Без указателей видимо никак :)

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

>когда массив чаров - строка текста то это становится не очень удобно и иногда очень медленно

1) Перепишите свой код

2) Используйте C++ и перестаньте заниматься сексом с мозгами собеседников.

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

>Паскаль в классическом своем виде как раз и имел строки очень похожие на С - массив char'ов фиксированной длинны в 255 символов.

там не asciiz - строки, если я правильно помню. По крайней мере в TP/BP. Размер строки хранился в первом байте массива

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

производительность надо увеличивать другими методами. Если у тебя идет активная работа со строками - то тебе никто не мешает делать как в паскале. Но пихать это в либцы смысла никакого.

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

На ЛОР можна узнать много интересного...

Про арифметику указателей на java я ещё не слышал, но если это говорит великий спец по всем вопросам Гик то так оно и есть ;)

Ссылки да есть, а вот указателей нет. Более того все переменные не примитивного типа в java суть ссылки, типизированные ;) в отличае от

А извраты, вроде

int* x = 0; *x = 0;

пусть кушают гики

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

>А извраты, вроде >int* x = 0; *x = 0; >пусть кушают гики

Процитирую сам себя ;)

>Таких студентов надо отправлять в биореактор, на жабабыдлокодеров учиться ;) Си не для них.

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

>там не asciiz - строки, если я правильно помню. По крайней мере в TP/BP. Размер строки хранился в первом байте массива

From Wikipedia: These are usually implemented by a length byte (limiting the maximum length to 255) and a fixed array of payload characters, and are therefore space-inefficient if the maximal length is seldom used in practice.

>производительность надо увеличивать другими методами. Если у тебя идет активная работа со строками - то тебе никто не мешает делать как в паскале. Но пихать это в либцы смысла никакого.

Опять же как в паскале нельзя. Мне нужны строки длиннее 255 символов (и вообще не фиксированной длинны). А если ты про Turbo Pascal >5.5 или Object Pascal то там вообще объекты/классы.

Я пойду даже дальше и предположу что ты таки понял что я написал выше и попытался выразить умную мысль но у тебя это не очень получилось. Если ты предлагаешь применять нечто похожее на вышеописанный метод но не включая его в стандартный язык С то это идиотизм с точки зренея изобретения велосипеда каждый раз. Уж лучше смирится с убогостью и использовать готовую библиотеку вроде приведнных выше.

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

>Опять же как в паскале нельзя. Мне нужны строки длиннее 255 символов (и вообще не фиксированной длинны). А если ты про Turbo Pascal >5.5 или Object Pascal то там вообще объекты/классы.

-4 :)

>Если ты предлагаешь применять нечто похожее на вышеописанный метод но не включая его в стандартный язык С то это идиотизм с точки зренея изобретения велосипеда каждый раз

я предлагаю применять это "нечто" тем, кто ниасилил разработку правильных алгоритмов :)

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

>-4 :)

-4 :) -> %4) -> (4%) -> 0.04 -> 4/100 -> 1/25 -> 5^-2 -> 5<2

:) Твой коментарий не имеет смысла Ж)

>я предлагаю применять это "нечто" тем, кто ниасилил разработку правильных алгоритмов :)

А не мог бы ты продемонстрировать "правельный" алгоритм?

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

>А не мог бы ты продемонстрировать "правельный" алгоритм?

для чего?

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

Например:

NFS сервер для девайса вроде NSLU2. Память огриниченна, MAX_FILENAME_LENGTH неизвестен. Надо прочитать все названия файлов в директории и записать их в массив добавив к ним путь к директории. Количество файлов не известно, длина имени не известна. Использовать можно только C т.к. С++ дает много оверхеда на таком железе. При этом не забудь что должно получится быстрее чем у меня и код должен быть элегантнее. Когда напишешь свой вариант я приведу свой используя рутины написанные выше root_at_localhost'ом.

Считая что я бросил перчатку Ж).

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

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

NFS? Что-то я не припомню, где именно такое нужно. Ткни меня носом в соответствующий пункт rfc3010

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

>LOOKUP procedure называется. Да ты хоть на простом примере ftp/http/db сервера сделай.

ыыы...или я что-то не понимаю, но для lookup не нужно строить массивы :-\

достаточно strcat и fopen. Можно поинтересоваться, что ты понимаешь под lookup?

This operation LOOKUPs or finds a file system object starting from

the directory specified by the current filehandle. LOOKUP

evaluates the pathname contained in the array of names and obtains

a new current filehandle from the final name. All but the final

name in the list must be the names of directories.

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

А в версиях 2 и 3 был доп. протокол MOUNT. Ты от вопроса не уходи то, а то анонимусы посчитают что ты не знаешь как Ж)

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

>Ты от вопроса не уходи то, а то анонимусы посчитают что ты не знаешь как Ж)

пока что я вижу, что ты делаешь какой-то свой lookup, не предусмотренный rfc =) Отсюда и проблемы

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

geek: Сделай функцию пополнения базы данных в медиа плеере типа mpd. Или просто абстрактно реши задачу (с выше описанными условиями). Тут нет ничего сложного - можешь даже содрать код из mpd. Я уверен что ты сможешь в следуйшем же посте перестать уходить от вопроса и привесть этот код! Жду с нетерпением!

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

>И еще, не уверен, но когда используем char str[1024] никакого malloc не вызывается, память выделяется статически, а это гораздо быстрее.

зато стек разростается... :-/

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