|
|
  |
Олимпиада программистов, Чистый С |
|
|
|
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 отработает нормально.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|