|
|
  |
Олимпиада программистов, Чистый С |
|
|
|
Feb 25 2013, 09:05
|
Местный
  
Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753

|
Не знаю, разрешено ли здесь такие сообщения давать. Но надеюсь, что модератор не обидится. Знакомая компания проводит олимпиаду по программированию. Решили поискать программистов в русскоговорящем мире. Меня попросили рассказать, где могу. А я только на этом форуме и бываю. Причем только в разделе для начинающих. http://hola.org/challenge_ru.htmlНадо написать две простые функции на чистом С.
|
|
|
|
|
Feb 25 2013, 15:49
|
Местный
  
Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753

|
Цитата(SyncLair @ Feb 25 2013, 19:10)  Уж простите но как то лохотроном попахивает )  Я здесь хоть и не старожил, но достаточно давно общаюсь. Репутацией дорожу. В чем лохоторон? Людей этих я знаю. Один из них, кстати, написал известный Windriver. Люди ценят тех, кто умеет писать короткий и элегантный код. И считают, что такой метод поиска дешевле и эффективнее чем многочисленные собеседования. Задачи не так просты, как кажутся. Хотя я считаю, что embedded программистам решить их проще, чем остальным. От вас ничего, кроме нескольких строчек кода, не требуется. Я прямой финансовой выгоды здесь не имею. Хотя если кто-то напишет решение, которое им понравится, и скажет им, что это по моей наводке, то я тоже получу такою-же премию, как и победитель.
|
|
|
|
|
Feb 25 2013, 16:18
|
Местный
  
Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753

|
Цитата(SyncLair @ Feb 25 2013, 20:01)  Да я не про вашу репутацию. Я про фирму. Ей наверное надо просто собрать базу ембеддеров. А чей код будет круче -- ведь чисто субъективная оценка. База ембедеров им точно ни к чему. Они "чистые программисты". Хороших программистов они да, ищут. Код оценивается просто - есть тесты, которые он должен пройти, чтобы его приняли за идеальный. Мопед не мой. Я просто знаю этих людей и у меня хорошие с ними отношения. Комментарий на русский я переводил. Они пытались после "google translate" текст оставить
|
|
|
|
|
Feb 25 2013, 19:21
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Причём совершенно непонятно, круче будет тот вариант, который после str_cpy(&s, s+5); сразу сделает realloc() на меньший размер, чтобы сразу память освободить, или тот, котрый это дело отложит, а в str_cat() сможет по указателю узнать размер блока и закажет больше, чтобы влезло " Mundo". Ну а str_printf() как-то сам должен " Mundo" на " World" менять, но реализация его пока не требуется.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Feb 25 2013, 20:00
|
Местный
  
Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753

|
Цитата(Iptash @ Feb 25 2013, 22:24)  В функции str_cat перед конкатенации нужно Mundo еще и преобразовать в World что ли? Открою немного закулисы. В исходном варианте надо было получить "Hola Mundo". Я сказал, что лично я не знаю что такое мундо, гугл транслейт тоже не знает, и вообще по русски это звучит неприлично. Поэтому они решили заменить эту мунду в русском тесте на World. Вечером я заглянул, а там полмунды осталось.... Не обращайте внимание. Завтра почистят.
|
|
|
|
|
Feb 26 2013, 11:43
|
Местный
  
Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866

|
Цитата(ViKo @ Feb 26 2013, 13:37)  Ваши друзья - испанцы! Вы слишком категоричны. Они могут быть и колумбийцами.
--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
|
|
|
|
|
Feb 26 2013, 12:51
|
Местный
  
Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753

|
Цитата(Сергей Борщ @ Feb 26 2013, 16:04)  Мда... Олимпиада - высшее спортивное состязание. Тут же этим словом прикрыт банальный и циничный поиск дешевой, но квалифицированной рабсилы. Блин. Это я так перевел. А как бы Вы перевели "Coding Challenge"? Русскоговорящий (но не русскомыслящий) товарищ из Холы перевел это "вызов кодирования". Хорошо еще что он узнал что я скучаю на больничном и попросил прочитать, что он там написал. Если предложите перевод лучше - они могут и поправить. Оригинал - здесь http://hola.org/hola_5min_challenge.htmlОни ищут квалифицированных программистов, это да. Про дешевизну речи не было. Мозгоклюи они еще те (работать с ними мало кто может), но в банальности их еще никто не упрекал. Или сейчас все работодатели премии за успешно решенные тесты дают?
|
|
|
|
|
Feb 26 2013, 13:46
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (igorle @ Feb 26 2013, 14:51)  Если предложите перевод лучше - они могут и поправить. А они заплатят за лучший перевод? Не имею никакого желания помогать капиталистам организовывать их набор сотрудников. И вы и они тщательно убрали из заголовка цель всего мероприятия - набор сотрудников. Подменив ее в заголовке средством достижения этой цели - конкурсом. Банальный, простите, развод. Возможно мне бы и было интересно соревнование ради соревнования, из спортивного интереса. А вот наниматься никуда не собираюсь и одолжения "может быть мы вам позвоним" мне тем более не нужны.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Feb 26 2013, 13:48
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(ReAl @ Feb 25 2013, 23:21)  Ну а str_printf() как-то сам должен " Mundo" на " World" менять, но реализация его пока не требуется. А оно ИМХО и не реализуемо. Я было попробовал, но неизбежно переполнение буфера, т.к. нам не известен его требуемый размер... Код int str_printf(char** pdst, char* format, ...) { va_list arg_ptr;
va_start(arg_ptr, format);
int x = vsprintf(*pdst, format, arg_ptr);
va_end(arg_ptr);
return (x); } Задания с багами даже на "Олимпиаде":(
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Feb 26 2013, 13:56
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(demiurg_spb @ Feb 26 2013, 15:48)  не известен его требуемый размер... А чо™ — пробежаться по форматной строке в режиме dry-run :-), вычислить длину. Потом по указателю на получатель уточнить у менеджера памяти реальный размер выделенного блока (он может отличаться от того, который запрашивали в тех str_cpy() и, возможно, перезапрашивали в str_cat()), например, потому, что менеджер памяти округляет размер блока до 16 или 32 байт. Ну и тогда уже решать, лезет в тот же блок или нет, перезапрашивать новый. Ну и потом уже реально печатать. Всё можно, было бы желание. Кстати, в str_printf там еще может быть морока, в задании оно печатает в ту же строку, из которой берёт. В случае формата "!%s!" оно начнёт налазить само на себя, нужен какой-от промежуточный буфер либо совсем новый, указатель на который потом записывать в первый аргумент. Так что не зря пока сказано, что str_printf делать не надо :-) Но и для str_cpy и str_cat подобная беда будет, там всего лишь проще считать необходимую длину.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Feb 26 2013, 14:00
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(ReAl @ Feb 26 2013, 17:56)  А чо™ — пробежаться по форматной строке в режиме dry-run :-), вычислить длину. Ага учесть все возможные форматы *%+-0 u l d f s hu hhu .... и нигде не облажаться, ну-ну™.... Я пас! Проще ещё раз реалоцировать буфер с офигенным запасом и использовать s nprint. И это тоже буде та ещё кака, но зато рабочая в большинстве случаев.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Feb 26 2013, 14:47
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(demiurg_spb @ Feb 26 2013, 16:00)  Ага учесть все возможные форматы *%+-0 u l d f s hu hhu Ага, и %*.*s c правильной отработкой отрицательной ширины поля в аругменте. Ну так ведь олимпиада™ и прочий контест™ с челленджем™ Дорога героев. А буфер с запасом — удел слабаков. На 500 баксов не тянет.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Feb 26 2013, 15:41
|
Местный
  
Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753

|
про str_printf: Цитата(demiurg_spb @ Feb 26 2013, 16:48)  А оно ИМХО и не реализуемо. Таки реализуемо. Обратите внимание - в английском варианте challengа требование к участникам из Jungo - реализоавть эти функции тоже. И кода должно быть не много
|
|
|
|
|
Feb 26 2013, 16:54
|
Гуру
     
Группа: Свой
Сообщений: 2 884
Регистрация: 7-11-09
Из: Ростовская обл.
Пользователь №: 53 484

|
Цитата(igorle @ Feb 25 2013, 19:18)  - есть тесты, которые он должен пройти, чтобы его приняли за идеальный. Помнится в программистском детстве прибаливал получить сертификат программиста ответив на подборку вопросов на сайте. Глупости все это... А проработав несколько лет программером и казалось бы все знавше в своей области, несмог ответить на вопросы анкеты одной конторки, у них наверно была какая-то своя специфика кодинга. Например, мне ясно дали понять, если буду писать имена классов C++ не с буквы "К", а с буквы "C" как привык, я им не подхожу. у них своя особая идеология. Олимпиада, это все очень сомнительно. Не подпадаеш под шаблон, выбываешь...
|
|
|
|
|
Feb 26 2013, 17:06
|
Местный
  
Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753

|
Цитата(Слесарь @ Feb 26 2013, 19:54)  ... Например, мне ясно дали понять, если буду писать имена классов C++ не с буквы "К", а с буквы "C" как привык, я им не подхожу. у них своя особая идеология Это не имеет отношения к теме ветки совсем. Но раз уж мы все здесь собрались.... Code Convention - очень полезная вещь. Помогает читать код друг друга. На интервью (и на тестах) не важно как ты писал раньше, но если программист в _работе_ отказывается следовать правилам, принятым в фирме - это сильный аргумент за его увольнение. А вообще, похоже что на этом форуме концентрация "волков-одиночек" выше, чем в среднем по больнице.
|
|
|
|
|
Mar 18 2013, 10:08
|

Профессионал
    
Группа: Свой
Сообщений: 1 433
Регистрация: 27-10-08
Из: Украина, Киев
Пользователь №: 41 215

|
Может вот так попробовать: Код #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdarg.h>
void str_cpy (char **a, const char *b) { int _size = strlen(b)+1;
*a =realloc(*a, _size); memmove(*a, b, _size); }
void str_cat (char **a, const char *b){ int _size1 = strlen(b);
*a =realloc(*a, _size1); memmove(*a + strlen(*a), b, _size1); }
int main() { char *s = NULL; str_cpy(&s, "Hola Hola"); str_cpy(&s, s+5); str_cat(&s," World"); return 0; } "str_cat" можно переписать как вызовс сдвигами "str_cpy". "memmove" потому как он хитро работает и учитывает перекрытия.
--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
|
|
|
|
|
Mar 19 2013, 14:39
|
Местный
  
Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753

|
Цитата(Буратино @ Mar 18 2013, 14:08)  Может вот так попробовать: ... Я обещал не комментировать и никак иначе не помогать участникам. Так что, извините. Скажу только, что направление правильное, но пока что это не годится. Сплетнями поделться могу. Я спросил организаторов, как идут дела. Они сказали, что отказались от идеи предлагать удаленную работу программистам из России/Украины. Но от своих обязательств по олимпиаде не отказываются. И если кто сможет решить задачу, то премию получит. Пока никто не смог.
|
|
|
|
|
Mar 19 2013, 14:52
|
■ ■ ■ ■
    
Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443

|
Цитата Незнаю как и кто, но я ощущаю счастье в том, что пока еще могу себе позволить не работать. А я вот напротив ощущаю счастье в том что могу позволить себе поработать.
--------------------
Делай что должен и будь что будет.
|
|
|
|
|
Mar 19 2013, 17:27
|

Профессионал
    
Группа: Свой
Сообщений: 1 433
Регистрация: 27-10-08
Из: Украина, Киев
Пользователь №: 41 215

|
Цитата(igorle @ Mar 19 2013, 18:39)  Я обещал не комментировать и никак иначе не помогать участникам. Так что, извините. Скажу только, что направление правильное, но пока что это не годится.
Сплетнями поделться могу. Я спросил организаторов, как идут дела. Они сказали, что отказались от идеи предлагать удаленную работу программистам из России/Украины. Но от своих обязательств по олимпиаде не отказываются. И если кто сможет решить задачу, то премию получит.
Пока никто не смог. Да фиг с ней с премией, просто интересно!:) "realloc" не перетирает информацию, ну или точнее дублирует информацию в переразмереном буфере, а это важно и для "str_cpy" и для "str_cat". "memmove" переставляет блоки данных даже если есть перекрытие, учитывая это. Лишнего ничего нет ,но функции свои функции выполняют. Проверка на NULL еще не обдумана, но это в конце концов детали.
--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
|
|
|
|
|
Mar 20 2013, 07:09
|
Местный
  
Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753

|
Цитата(demiurg_spb @ Mar 20 2013, 08:17)  Ой-ли... Ничего удивительного. Когда я говорю "никто не смог", я имею ввиду - из России/Украины никто не смог решить. В целом - они в эту игру играют уже год. Список победителей за это время есть на их сайте.
Сообщение отредактировал igorle - Mar 20 2013, 07:10
|
|
|
|
|
Mar 20 2013, 07:40
|
Участник

Группа: Участник
Сообщений: 74
Регистрация: 12-01-13
Из: Нижний Новгород
Пользователь №: 75 160

|
На олимпиадное тут не тянет, даже далеко не тянет.
p.s. форумчанам просто *бут мозх
Сообщение отредактировал federal - Mar 20 2013, 08:46
|
|
|
|
|
Mar 20 2013, 10:08
|
Частый гость
 
Группа: Участник
Сообщений: 125
Регистрация: 29-05-11
Из: Nizhny Novgorod, Russian Federation
Пользователь №: 65 337

|
отправил ради интереса Код void str_cpy( char** to_str, char* from_str ) { if ( !from_str ) { return; }
if ( !( *to_str = ( char* )realloc( *to_str, strlen(from_str)*sizeof(char) + sizeof(char) ) ) ) { return; }
if ( !memmove( *to_str, from_str, strlen( from_str )*sizeof(char) + sizeof(char) ) ) { if ( !*to_str ) { free( *to_str ); } *to_str=NULL; } }
void str_cat(char** to_str, char* from_str) {
if ( !from_str ) { return; }
if ( !( *to_str = ( char* )realloc( *to_str, ( !*to_str ? 0: strlen(*to_str)*sizeof(char) ) + strlen(from_str)*sizeof(char) + sizeof(char) ) ) ) { return; }
if ( !memmove( *to_str + ( !*to_str ? 0: strlen(*to_str)*sizeof(char) ), from_str, strlen( from_str )*sizeof(char) + sizeof(char) ) ) { if ( !*to_str ) { free( *to_str ); } *to_str=NULL; }
} на что сразу же был получен ответ. Что,собственно, и ожидаемо Код Thank you for taking the time to answer our challenge.
Unfortunately the answer you gave is not the answer we are looking for. I do hope that you at least enjoyed the challenge (-;
In all solutions that don't pass this stage we find at least 2 problems from the list of blocking problems that you can find at http://www.hola.org/issues.html
We realize that the bugs in your solution may have been due to a hasty submission. Therefore, if this was your 1st submission you are welcome re-check your code carefully, use the issues list we gave, and try a 2nd attempt.
You can send this challenge to programmers you know and if they will answer the question perfectly then you and your friend may win 2K NIS...Please remember to CC me when you forward the link to the challenge so I will know they came from you (http://www.TheCodeIL.com/5min_forward_rules.html).
Below is an email that you can use to forward to your friends.
Good Luck and again, Thank you!
|
|
|
|
|
Mar 20 2013, 10:23
|

Профессионал
    
Группа: Свой
Сообщений: 1 433
Регистрация: 27-10-08
Из: Украина, Киев
Пользователь №: 41 215

|
Цитата(am1808 @ Mar 20 2013, 14:13)  размер типа правильно определять в runtime Но ведь char всегда 8 бит, зачем так делать? Я понимаю "int", там могут быть вопросы, но с "char" мне кажется лишним "сайзофать". Видимо в целом направление не верное в решении этой задачи. Поправлю свой вариант и попробуем иным путем пойти
--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
|
|
|
|
|
Mar 20 2013, 10:25
|
Частый гость
 
Группа: Участник
Сообщений: 125
Регистрация: 29-05-11
Из: Nizhny Novgorod, Russian Federation
Пользователь №: 65 337

|
Цитата(demiurg_spb @ Mar 20 2013, 14:17)  compiletime всё же B) да, конечно же compile-time, извиняюсь
|
|
|
|
|
Mar 20 2013, 10:28
|
Знающий
   
Группа: Участник
Сообщений: 750
Регистрация: 1-11-11
Пользователь №: 68 088

|
Цитата(Буратино @ Mar 20 2013, 13:09)  Скажите, а нафига "sizeof(char)" делать? Есть несколько правил "хорошего", "структурного" стиля программирования на C, которым учат в вузах. Например, "не использовать в С оператор goto", "использовать локальные переменные вместо глобальных, где это возможно", "давать переменным говорящие имена" и т. п. sizeof(char) - это следствие из усвоенного правила "не использовать прямых констант в тексте программы, заменяя их по возможности дефайнами или константами". Код strlen(from_str)*sizeof(char) Хотя в приведённом коде, по-моему, это явный перебор. И свидетельствует, скорее, о формальном подходе к программированию и непониманию происходящего.
--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
|
|
|
|
|
Mar 20 2013, 10:31
|
Частый гость
 
Группа: Участник
Сообщений: 125
Регистрация: 29-05-11
Из: Nizhny Novgorod, Russian Federation
Пользователь №: 65 337

|
Цитата(Буратино @ Mar 20 2013, 14:23)  Видимо в целом направление не верное в решении этой задачи. В целом, постановка задачи неправильная. Что вас в коде не устроило? приведите те ситуации, когда он не отработает? зы вот нафиг я от работы отвлекся)), теперь с этими израилитянами переписываюсь, жду, что они скажут(думаю, что ничего не скажут) Цитата(gerber @ Mar 20 2013, 14:28)  Код strlen(from_str)*sizeof(char) Хотя в приведённом коде, по-моему, это явный перебор. И свидетельствует, скорее, о формальном подходе к программированию и непониманию происходящего. Ну, вам виднее, товарисчь. Пиписьками меряться не стану с вами. Хотя соглашусь, лишнее
|
|
|
|
|
Mar 21 2013, 11:54
|

Профессионал
    
Группа: Свой
Сообщений: 1 433
Регистрация: 27-10-08
Из: Украина, Киев
Пользователь №: 41 215

|
Вот так еще можжно: Код #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdarg.h>
void str_cpy (char **a, char *b) { *a = b; }
void str_cat (char **a, char *b){ int _size1 = strlen(b); int _size2 = strlen(*a); char * tmp = NULL; tmp = realloc(tmp, _size1 + _size2 + 2); memmove(tmp , *a, _size2); memmove(tmp + _size2, b, _size1); *a = tmp; }
int main() { char *s = NULL; str_cpy(&s, "Hola Mola"); str_cpy(&s, s+5); str_cat(&s," World"); return 0; } проверку аргументов пока вынесем за скобки
--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
|
|
|
|
|
Mar 21 2013, 12:20
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(Огурцов @ Mar 21 2013, 15:58)  А у нас в char`е два байта, при том, что в байте восемь бит. Двоичных, на всякий случай, а то мало ли у кого как. У вас это где, в компиляторе для TI dsp'шок?. Стандарт однозначно говорит, что sizeof(char)=1. А у вас сколько sizeof(char) выдаёт? Цитата(Буратино @ Mar 21 2013, 15:54)  Код void str_cpy (char** a, char* b) {*a = b;} А как насчёт того, что в ТЗ сказано, что каждая функция должна быть порядка 7 строк? А тут всё в 1 влезло...
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Mar 21 2013, 14:44
|
Местный
  
Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753

|
Цитата(Буратино @ Mar 21 2013, 17:37)  "не более чем 7 строк кода на функцию" Проблема общения в виртуале - никогда не уверен - человек шутит, или серьезно. Ваш вариант выглядит как троллинг. Вы действительно хотите комментариев к этому коду?
Сообщение отредактировал igorle - Mar 21 2013, 14:45
|
|
|
|
|
Mar 21 2013, 15:52
|
Местный
  
Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753

|
Цитата(Буратино @ Mar 21 2013, 18:10)  А какой смысл размещать его тут кроме как получить каменты? Конечно хочу! Кстати данный код работает и выполняет функции. Почему так нельзя сделать!? Ну, некоторые пишут, чтобы получать лулзы, глядя как люди рвут на себе волосы "Код работает" - это совсем не аргумент. Надо не код, который один раз сработает с данным примером, а код, который будет работать в библиотеке. Он будет вызываться миллионы раз как с короткими, так и мегабайтными строками. Код void str_cpy (char **a, char *b) { *a = b; } Кто сказал что сорс будет существовать после вызова функции? Может быть я работаю с буфером, потом копирую строку и снова пишу в буфер. Или освобождаю буфер. Что будет с сохраненным значением? Код void str_cat (char **a, char *b){ int _size1 = strlen(b); int _size2 = strlen(*a); Функция может быть вызвана для неинициализированного дестинейшена. strlen для NULL - крэш Код char * tmp = NULL; tmp = realloc(tmp, _size1 + _size2 + 2); Зачем вызывать реаллок для NULL? Зачем двойка добавлена? Код memmove(tmp , *a, _size2); memmove(tmp + _size2, b, _size1); *a = tmp; } Старое значение *a перетерто. Память, на которую указывала *a - потеряна. Результирующая строка не ограничена нулем.
Сообщение отредактировал igorle - Mar 21 2013, 15:55
|
|
|
|
|
Mar 22 2013, 06:10
|
Знающий
   
Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045

|
Цитата(gerber @ Mar 20 2013, 13:28)  Код strlen(from_str)*sizeof(char) Хотя в приведённом коде, по-моему, это явный перебор. И свидетельствует, скорее, о формальном подходе к программированию и непониманию происходящего. В таком виде - да. Идея хорошая, но реализация чуть подкачала. Для данного случая то же самое по сути Код strlen(from_str)*sizeof(*from_str) , но если char станет wchar отработает нормально.
|
|
|
|
|
Mar 22 2013, 07:30
|

Профессионал
    
Группа: Свой
Сообщений: 1 433
Регистрация: 27-10-08
Из: Украина, Киев
Пользователь №: 41 215

|
igorle, замечания обдумываю, но вот например не ясно почему "покрошится" strlen от NULL? Это же просто 0 что собственно эквивалентно "\0" realloc можно вызывать с NULL, но у меня оно конечно не к селу ни к городу, однако realloc и NULL вполне себе ничего и есть причины так делать. Вот еще вариант ,но єто практически максимум того на что способен мой "мозг". Проверки и исключения пока не прикручивал ,важно понять это правильная идея или нет!? Код #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdarg.h>
void str_cpy (char **a, const char * b) { char * tmp = NULL; int size_str = strlen(b)+1; tmp = realloc(tmp, size_str); memmove (tmp, b, size_str); free (*a); *a = tmp; }
void str_cat (char **a, const char *b){ int size_str_1 = strlen(b); int size_str_2 = strlen(*a); *a = realloc(*a, size_str_1 + size_str_2 + 1); memmove (*a + size_str_2, b, size_str_1 + 1); }
int main() { char *s = NULL;
str_cpy(&s, "Hola Mola"); str_cpy(&s, s+5); str_cat(&s," World"); return 0; }
--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
|
|
|
|
|
Mar 22 2013, 07:52
|
Местный
  
Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753

|
Цитата(Буратино @ Mar 22 2013, 11:30)  ...не ясно почему "покрошится" strlen от NULL? Это же просто 0 что собственно эквивалентно "\0" Чтобы почуствовать разницу, забегите вот этот код: Код static void foo(char *str) { printf("%p\n", str); }
int main(void) { foo(NULL); foo("\0"); return 0; } После этого попытайтесь объяснить, почему ваше утверждение неверно. По поводу всего остального. Я подписал обязательство, согласно которому, если станет известно что я консультирую участников конкурса Холы, то я должен буду вернуть полученую от них приемию. А я премию уже потратил на детальки. Так что дальше - самостоятельно. Адью
|
|
|
|
|
Mar 22 2013, 11:28
|

Профессионал
    
Группа: Свой
Сообщений: 1 433
Регистрация: 27-10-08
Из: Украина, Киев
Пользователь №: 41 215

|
Если бы я мог как-то обезапасить строку от изменений на ее текущем месте, то получилось бы интереснее, но я так понимаю, что кроме как выделить память под строку и перелить в это мето данные не получится гарантировать ее сохранность! Создать в памяти резервирование под существующую строку (то есть под то место где она текущая лежит) так же не получится ибо наверное на архитектуре завязано много. Склеивать строки нельзя на пустом месте, нужно быть уверенным в том что это склейка разместится в свободном и безопасном пространстве. Что касается strlen, то мне нужно посмотреть как она, функция, сделана.
--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
|
|
|
|
|
Mar 22 2013, 13:08
|

Профессионал
    
Группа: Свой
Сообщений: 1 433
Регистрация: 27-10-08
Из: Украина, Киев
Пользователь №: 41 215

|
Цитата(federal @ Mar 22 2013, 15:29)  Буратино, какой же ты деревянный все таки  Я лично был свидетелем того, как тигр в зоопарке сожрал резинового утенка, как вор и бандит становится президентом страны и как можно штуку баксов потратить на туфельки. А уж Дуремаров разного сорта и помола, я столько раз встречал, что Вы даже просто статистически ничего для меня не значите.
--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
|
|
|
|
|
Mar 25 2013, 11:29
|

Профессионал
    
Группа: Свой
Сообщений: 1 433
Регистрация: 27-10-08
Из: Украина, Киев
Пользователь №: 41 215

|
igorle, Вы наверное хотели написать Код '\0' а не Код "\0" Вот код который печатает трижды NULL Код void foo(char *str) { printf("%s \n", str ); }
int main(void) { foo(NULL); foo('\0'); foo(0); return 0; } Код stdout: (null) (null) (null) Вот некая реализация strlen Код /* * Copyright (C) 2002 Manuel Novoa III * Copyright (C) 2000-2005 Erik Andersen <andersen@uclibc.org> * * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. */
#include "_string.h"
#ifdef WANT_WIDE # define Wstrlen wcslen #else # define Wstrlen strlen #endif
size_t Wstrlen(const Wchar *s) { register const Wchar *p;
for (p=s; *p; p++);
return p - s; } libc_hidden_weak(Wstrlen) На первый взгляд ничего криминального в передаче NULL в функцию нет, но те не менее strlen c NULL компилится с ошибкой.
--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
|
|
|
|
|
Mar 25 2013, 14:18
|
Местный
  
Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753

|
Я Вас теряю. Вы пишите Цитата не ясно почему "покрошится" strlen от NULL? Это же просто 0 что собственно эквивалентно "\0" Когда я объясняю, в чем разница между 0 и "\0", вы говорите Цитата igorle, Вы наверное хотели написать '\0' а не "\0" Нет. Вы написали "\0", поэтому я говорил об "\0", а не об '\0'. Логично, да? После этого я даю вам пример, где распечатываю поинтер (%p), и показываю в чем разница между 0 и "\0", а вы печатаете совсем другой пример, где распечатываете строку (%s) и даете совсем другие аргументы. Я не улавливаю ход Вашей мысли.
|
|
|
|
|
Mar 25 2013, 18:15
|

Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581

|
Цитата(Буратино @ Mar 25 2013, 20:41)  Кое-что почитал и думаю что нулевой указатель нельзя использовать с strlen, потому что нельзя разименовывать нулевой указатель. нулевой указатель нельзя использовать потому, что он обязан не указывать на любой обект программы, т.е. то, на что он указывает, явно не будет чем-то осмысленным. strlen(NULL) у вас вряд ли компилируется с ошибкой, скорее с предупреждением. а вот в процессе выполнения этого кода результат будет непредсказуем. точнее, если платформа вам хорошо знакома - результат можно предсказать, но он будет явно бессмысленным, т.к. по адресу памяти 0x0000 у вас наверняка никакой строки нет.
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Mar 26 2013, 07:22
|
Местный
  
Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753

|
Цитата(Буратино @ Mar 25 2013, 19:41)  Сори, но я имел в виду именно '\0', не строковой литерал. Кое-что почитал и думаю что нулевой указатель нельзя использовать с strlen, потому что нельзя разименовывать нулевой указатель. Абсолютно верно. NULL означает, что объект находится по адресу ноль. Обычно - защищенная область. Как поется в песне "Ай-ай-ай туда нельзя"
|
|
|
|
|
Mar 27 2013, 20:33
|

Профессионал
    
Группа: Свой
Сообщений: 1 433
Регистрация: 27-10-08
Из: Украина, Киев
Пользователь №: 41 215

|
Жаль что больше нет времени. 28го все закончится( Вот моя последняя реализация. Прокачал защиту от NULL, оптимизировал некоторые участки и обдумал траблу с перекрытием данных в строках. Код #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdarg.h>
void str_cpy ( char **a, const char * b ) {
int size_src; char overlap; if ( b ) size_src = strlen( b ) + 1; else return; overlap = (*a <= b && *a + size_src >= b) || (b <= *a && b + size_src >= *a); *a = realloc( *a, size_src ); if ( overlap ) for (*a += size_src, b += size_src; size_src--; *--*a = *--b); else memcpy( *a, b, size_src ); }
void str_cat ( char **a, const char *b ){ int size_src, size_des; if ( *a ) size_des = strlen( *a ); else size_des = 0; if ( b ) size_src = strlen( b ); else return; *a = realloc( *a, size_src + size_des + 1 ); memmove ( *a + size_des, b, size_src + 1 ); }
int main() { char *s = NULL; str_cpy( &s, "Hola Mola" ); str_cpy( &s, s+5 ); str_cat( &s," World" ); return 0; } Очень интересно как правильно, ждем ответ ответ на этот вопрос от организаторов!  (EDIT: Утром немного допилил и исправил ошибки)
--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
|
|
|
|
|
Mar 28 2013, 05:19
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(Буратино @ Mar 28 2013, 00:33)  обдумал траблу с перекрытием данных в строках. А чего её обдумывать? Посмотрите реализацию memmove. В ней всё уже обдумано: если нет перекрытия то вызывается memcpy. Оптимальнее вряд ли напишете. Я тоже отправил свой вариант в день размещения этой темы, но никакого ответа пока так и не получил. Завтра могу показать.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Mar 28 2013, 06:01
|
Местный
  
Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753

|
Цитата(demiurg_spb @ Mar 28 2013, 09:19)  Я тоже отправил свой вариант в день размещения этой темы, но никакого ответа пока так и не получил. Это странно. Они всегда отвечают если не в тот же день, то на следующий. Скажите, пожалуйста, свой емэйл. Можно частично. Я им прямо сейчас позвоню и спрошу как так получилось, что не ответили.
|
|
|
|
|
Mar 28 2013, 06:05
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(igorle @ Mar 28 2013, 10:01)  Это странно. Они всегда отвечают если не в тот же день, то на следующий. Скажите, пожалуйста, свой емэйл. Можно частично. Я им прямо сейчас позвоню и спрошу как так получилось, что не ответили. Отправлял и с demiurg_spb @ _ _ _.ru и с ___ @ kipspb.ru
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Mar 28 2013, 06:16
|
Местный
  
Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753

|
Цитата(demiurg_spb @ Mar 28 2013, 10:05)  Отправлял и с ... и с ... Я позвонил человеку, который просил меня сделать перевод. Он сегодня не работает (в Израиле сейчас неделя праздников), поэтому сгодня проверить как так получилось не может. Вернется на работу во вторник. Сопроводительное письмо было? На английском?
Сообщение отредактировал igorle - Mar 28 2013, 06:16
|
|
|
|
|
Mar 28 2013, 06:40
|

Профессионал
    
Группа: Свой
Сообщений: 1 433
Регистрация: 27-10-08
Из: Украина, Киев
Пользователь №: 41 215

|
Скажите, а как можно переписать покрасивше вот это: Код if ( b ) size_src = strlen( b ); else return; В Libc вместо char используют Wchar. Приблизительно я понимаю о чем речь, но вот конкретно для данной задачи оно нужно? Спасбио! Цитата(demiurg_spb @ Mar 28 2013, 08:19)  А чего её обдумывать? Посмотрите реализацию memmove. В ней всё уже обдумано: если нет перекрытия то вызывается memcpy. Оптимальнее вряд ли напишете. Я тоже отправил свой вариант в день размещения этой темы, но никакого ответа пока так и не получил. Завтра могу показать. Вот такая реализация мне доступна. Если я не ошибаюсь, здесь несколько упрощена проверка перекрытия. Код /* * Copyright (C) 2002 Manuel Novoa III * Copyright (C) 2000-2005 Erik Andersen <andersen@uclibc.org> * * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. */
#include "_string.h"
#ifdef WANT_WIDE # define Wmemmove wmemmove #else # define Wmemmove memmove #endif
Wvoid *Wmemmove(Wvoid *s1, const Wvoid *s2, size_t n) { register Wchar *s = (Wchar *) s1; register const Wchar *p = (const Wchar *) s2;
if (p >= s) { while (n) { *s++ = *p++; --n; } } else { while (n) { --n; s[n] = p[n]; } }
return s1; }
#ifndef WANT_WIDE libc_hidden_def(memmove) #endif
--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
|
|
|
|
|
Mar 28 2013, 06:45
|

Профессионал
    
Группа: Свой
Сообщений: 1 433
Регистрация: 27-10-08
Из: Украина, Киев
Пользователь №: 41 215

|
Цитата(demiurg_spb @ Mar 28 2013, 09:40)  Код char* p; size_t n = (p)? strlen(p) : 0; Нет, в случае если указатель нулевой то выход из функции осуществить! Зачем ноль присваивать если это уже не имеет смысла в нашем контексте например!? А зачем Вы используетет size_t, чем например int не подходит? (я понимаю, что это связано с важными моментами, но не ясно с какими)
--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
|
|
|
|
|
Mar 28 2013, 06:53
|
Местный
  
Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753

|
Цитата(demiurg_spb @ Mar 28 2013, 09:23)  Нет. Только код. А надо? Нет, не надо. Просто подумал, что если пришло письмо на русском, это могло их сбить с толку. Я их буду трясти во вторник.
|
|
|
|
|
Mar 28 2013, 07:00
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(Буратино @ Mar 28 2013, 10:45)  А зачем Вы используетет size_t, чем например int не подходит? Самодокументирование кода. Тем что int знаковый. sizeof() возвращает size_t. + Посмотрите как написана libc. Например посмотрите прототип memcpy. Видите какой тип у третьего аргумента? Или что возвращает strlen. Ну и т.д. и т.п. Вообщем если измеряется кол-во или размер самое место для size_t.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Mar 28 2013, 12:54
|
self made
   
Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795

|
Цитата(Буратино @ Mar 28 2013, 01:40)  Скажите, а как можно переписать покрасивше вот это: Код if ( b ) size_src = strlen( b ); else return; Код if ( !b ) return; size_src = strlen( b );
|
|
|
|
|
Apr 2 2013, 16:08
|
Местный
  
Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753

|
Цитата(demiurg_spb @ Mar 28 2013, 09:05)  Отправлял и с demiurg_spb @ _ _ _.ru и с ___ @ kipspb.ru Посмотрели. Говорят, что с @kipspb.ru был один участник. Давно. Ответили ему в тот же день. От demiurg_spb получили письмо только 28 марта. Были праздники, но скоро ответят (может быть уже ответили) Очень удивлялись, что люди обсуждают на форуме и выкладывают решения конкурсных задач. Считают что это нелогичным. тем более, что конкурс продолжается.
|
|
|
|
|
Apr 2 2013, 19:33
|
Местный
  
Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753

|
Цитата(Буратино @ Apr 2 2013, 20:55)  Как так продолжается? А когда заканчивается? Они этот процесс уже год как ведут. Можете посмотреть список "победителей". Там есть даты. Я не знаю, зачем он конечную дату публикуют, а потом корректируют. Хозяин - барин. Ну и, как помните, конкурс индивидуальный, а не коллективный. Так что лучше свои решения не публиковать.
Сообщение отредактировал igorle - Apr 2 2013, 19:35
|
|
|
|
|
Apr 3 2013, 05:16
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(igorle @ Apr 2 2013, 20:08)  Посмотрели. Говорят, что с @kipspb.ru был один участник. Давно. Ответили ему в тот же день. Ничего не получил. Цитата От demiurg_spb получили письмо только 28 марта. Были праздники, но скоро ответят (может быть уже ответили) Вчера прислали оповещение, что получили моё решение и извинились за задержку. Но пока никаких результатов и комментариев... Цитата(igorle @ Apr 2 2013, 23:33)  Так что лучше свои решения не публиковать. ок.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Apr 5 2013, 08:13
|
Местный
  
Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753

|
Цитата(demiurg_spb @ Apr 5 2013, 08:20)  Получил таки ответ от них:
Хотелось бы спросить... C ними только на английском изъясняться можно или они и по-русски разумеют? На английском. Там есть как минимум один человек, говорящий по русски. Но он обычно не занимается внешними связями. Помните что в Израиле выходные - пятница и суббота.
|
|
|
|
|
May 19 2013, 20:02
|
Местный
  
Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753

|
Цитата(Буратино @ May 17 2013, 13:41)  Так чем дело кончилось? Какое правильное решение? Дело не кончилось. Они продлевают это мероприятие. Судя по таблице победителей, последними на сегодня призы получили люди 18 и 19 марта. Всего я насчитал 52 победителя. Также можно видеть, что за всю историю из не израильтян приз получил только один человек из Норвегии. Русских было не менее одиннадцати (судя по типично русским именам), но все они - израильтяне (судя по адресу).
|
|
|
|
|
May 20 2013, 17:07
|
Местный
  
Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753

|
Цитата(Буратино @ May 20 2013, 15:01)  Для меня важно понять: правильное решение лежит исключительно в проф. плоскости или тут еще есть место всяким подколам/приколам и т.п. ? Исключительно в профплоскости. Людей интересует понимание программистом сути происходящего. Не более того. Когда-то они открыли фирму Jungo и проинтервьюировали кучу народа в Израиле. Статистика была такова - проходил один из 120. Вопросы были достаточно простые, типа операций с указателями. 119 писали в различных форумах о том, какие дебилы в этом Jungo. Вы можете и сейчас найти эти темы в русскоязычных форумах. Ну и не забываем, что профессиональные плоскости у разных достойных людей могут быть взаимно перпендикулярными. Вот тут недавно у нас решили провести конкурс из нескольких задач. Первую задачу я решил успешно. А потом организаторы обнародовали свои коментарии к решениям участников и сказали, что для них было важным, а что второстепенным. После этого я забил на конкурс и на возможный приз. Потому что мне их критерии не понравились. Задачу следующего тура даже поленился прочитать. Мне там не интересно. PS. На всякий случай уточню - этот второй конкурс проводится другими людьми и ни какого отношения к теме топика не имеет.
|
|
|
|
|
May 20 2013, 18:54
|
Местный
  
Группа: Участник
Сообщений: 351
Регистрация: 5-04-05
Пользователь №: 3 874

|
Цитата(igorle @ May 20 2013, 21:07)  119 писали в различных форумах о том, какие дебилы в этом Jungo не - маркетинг там на высоте! Цитата How does Hola make the Internet faster? The Internet is slowed down by server response times, Internet congestion, round trip times, and poorly written communication stacks in operating systems. Hola removes these bottlenecks by securely caching content on peers as they view it, and later serving it up to other nearby peers as they need it. Hola also compresses communication between peers to further speed the net. As more people install and use Hola, the faster and less congested it will be!
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|