LINUX.ORG.RU

скрипт на Си работает, но ругается

 


0

2
[user@alexey-laptop] ~/dev/scripts
$ gcc -Wall -O0 dcutf.c -o dcutf

[user@alexey-laptop] ~/dev/scripts
$ for i in {1..40}; do echo -n 'ы'; done | ./dcutf -n3 -s '©'
ыыы©
dcutf: ../iconv/skeleton.c:415: __gconv_transform_utf8_internal: Проверочное утверждение «outbufstart == ((void *)0)» не выполнено.
Аварийный останов

Текущая версия скрипта: https://github.com/batekman/scripts/blob/820f98c54709811894a29344d132fac551e7...

LANG=C gcc -v

Вопрос: где проблема, и как её исправить?

P.S.: Также интересный вывод: http://pastebin.com/vKkdvfY4

★★★

Последнее исправление: cetjs2 (всего исправлений: 4)

Спасибо, что сообщил.

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

Скриптами я привык называть мелкие и несерьёзные программки, которые пишу, в первую очередь, для личного пользования. И насколько я помню, не я один на данном ресурсе придерживаюсь такого мнения.

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

mbstowcs(end,ending,strlen(ending)*8); неплохо бы проверять её на ошибки.

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

peregrine ★★★★★
()

strlen(ending)*8

В мане же написано как получать длину

(mbstowcs(NULL, ending, 0) + 1) * sizeof(wchar_t)

Deleted
()
Ответ на: комментарий от peregrine
        if(c == '\n')
            i = 0;
        else
            ++i;

Ошибка, по ходу, тут в сравнении: убрал — вроде молчит.

batekman ★★★
() автор топика

Сдаётся мне, что виной тому недавнее обновление glibc 2.21 → 2.22.

А началось всё с того, что в хомяке появился файлик с названием core. И file на нём указывал именно на dcutf. Сейчас там написано «from 'skb -1'», это индикатор раскладки (http://plhk.ru/), тоже на сишке и даже тоже одним файлом.

Буду пересобирать мир, а development тут вовсе ни при чём.

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

Буду пересобирать мир, а development тут вовсе ни при чём.

сноси gentoo, ставь slackware, перестань прогуливать школу и учи уже наконец «C» :-)

первые коменты были такими какие они есть не от того что люди злые или версия glibc крива - просто приведённый по ссылке «скрипт» (впрочем как и постановка вопроса) это на самом деле выхлоп из /dev/null, что на LOR встречается крайне редко.

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

Скрипт всё то, что можно модифицировать без пересборки и содержится в одном файле. Крупную программу на python из кучи файлов и классов скриптом конечно назвать нельзя. У меня такая терминология :)

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Добавь сюда, что код на скриптовых языках компилируется интерпретатором «на лету», в отличие от кода на компилируемых, запускаемых непосредственно ОС и хранящихся в файлах специального формата (в Linux — ELF).

yars068 ★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Добавь сюда, что код на скриптовых языках компилируется интерпретатором «на лету», в отличие от кода на компилируемых, запускаемых непосредственно ОС и хранящихся в файлах специального формата (в Linux — ELF).

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

Да, но пользователь для этого ничего самостоятельно не делает, можно писать скрипты кажись чуть ли не на D или Vala - хотя вроде нативщина, но пользователь ничего для этого не делает...

I-Love-Microsoft ★★★★★
()

О, тоже человек мелочевку сишную скриптами называет... А вот хрюникод не одобряю.

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

О, тоже человек мелочевку сишную скриптами называет...

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

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

Что ты имеешь против скриптов? Я видел башизмы на сотни строк! Так что, если сишная погромулинка укладывается в ≤500 строк, то ее смело можно скриптом называть!

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от MKuznetsov

сноси gentoo, ставь slackware

Там то же самое, только руками.

перестань прогуливать школу

Перестал, когда её закончил :)

учи уже наконец «C»

Зачем? Для меня это просто вспомогательный язычок для таких мелких утилит-скриптов.

первые коменты были такими какие они есть не от того что люди злые или версия glibc крива

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

это на самом деле выхлоп из /dev/null

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

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

Так что, если сишная погромулинка укладывается в ≤500 строк, то ее смело можно скриптом называть!

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

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

А мне пофиг. CGI же называют скриптами, хоть они на сях написаны...

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от batekman

Япростофшоке! Я НЕ знал про tcc! Теперь знаю на чем скрипты писать буду!

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от batekman

Зачем? Для меня это просто вспомогательный язычок для таких мелких утилит-скриптов

тогда правда лучше питон - а когда надоест потребуется многопроцессирование то соскочишь на golang

для скриптоты ща даже bash не всегда достаточно высокоуровнев.

python не пхп всёж и у питона в отличии от с более батарейно.

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

число ошибок программиста линейно от числа строк кода.

твой С код по ссылке unsound при том что и в С есть уже в библиотеках что тебе нужно.

т.е python(да хоть awk) тут подошёл бы куда лучше.

qulinxao ★★☆
()
Последнее исправление: qulinxao (всего исправлений: 1)
Ответ на: комментарий от qulinxao

python3 и golang щупал, в репе есть некоторые отходы жизнедеятельности. Python как раз тупо надоел, а в Go я сломал мозг, осиливая многопоточность, хотя как раз там она сделана довольно просто. В конце концов решил не распылять силы, а изучать Java.

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

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

Си тут оверхеднее(в части байтолюбства) питона.

вообще тут однострочник через конвеер штатных(либо Wide) баш утил

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

Мой код по ссылке просто делает ровно то, что мне нужно,

сформулировать если возможно словесно что же нужно ,

ибо по коду и ОП впечатление что код делает больше чем нужно как минимум

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

Си тут оверхеднее(в части байтолюбства) питона.

Не знаю насчёт байтолюбства, но голый Python 3 только стартует 40 мс, судя по выводу time python3 -c "exit". Вообще, «питон» и «минимализм» понятия не особо-то совместимые, так что не понимаю, к чему ты его тут приплетаешь.

вообще тут однострочник через конвеер штатных(либо Wide) баш утил

Но я уже постарался, и написал эту программу, которая заменяет башевские гирлянды из пайпов. То, что в системе что-то сломалось, не повод переписывать этот бриллиант изящества на тормозном баше или учить очередной ненужный мне язык в лице perl5.

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

сформулировать если возможно словесно что же нужно

Как раз после выдернутой тобой фразы идёт уточнение, что же именно мне нужно:

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

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

бриллиант изящества

.

твой код делает несколько иное.

например он прекращает читать иногда ввод(в смысле у тебя так i управляется, что при достижении некоторого положения весь ввод сжирается)

т.е хоть при том что твой код в некоторых случаях несколько строк выдаёт- фактически есть внешнее ограничение на размер вывода(т.е как раз для конки)

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

просто поиграйся cat|твоё_творение -n 4 -sT

на разных входах.

qulinxao ★★☆
()
Последнее исправление: qulinxao (всего исправлений: 1)
Ответ на: комментарий от zloy_starper

Отвечает капитан Очевидность:

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

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

anonymous
()
10 января 2016 г.
Ответ на: комментарий от Eddy_Em

Шпециалист по шнипетам подтянулся

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