am1808 0 20 марта, 2013 Опубликовано 20 марта, 2013 · Жалоба compiletime всё же B) да, конечно же compile-time, извиняюсь Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 68 20 марта, 2013 Опубликовано 20 марта, 2013 · Жалоба Но ведь char всегда 8 бит... Далеко не всегда. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gerber 8 20 марта, 2013 Опубликовано 20 марта, 2013 · Жалоба Скажите, а нафига "sizeof(char)" делать? Есть несколько правил "хорошего", "структурного" стиля программирования на C, которым учат в вузах. Например, "не использовать в С оператор goto", "использовать локальные переменные вместо глобальных, где это возможно", "давать переменным говорящие имена" и т. п. sizeof(char) - это следствие из усвоенного правила "не использовать прямых констант в тексте программы, заменяя их по возможности дефайнами или константами". strlen(from_str)*sizeof(char) Хотя в приведённом коде, по-моему, это явный перебор. И свидетельствует, скорее, о формальном подходе к программированию и непониманию происходящего. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
am1808 0 20 марта, 2013 Опубликовано 20 марта, 2013 · Жалоба Видимо в целом направление не верное в решении этой задачи. В целом, постановка задачи неправильная. Что вас в коде не устроило? приведите те ситуации, когда он не отработает? зы вот нафиг я от работы отвлекся)), теперь с этими израилитянами переписываюсь, жду, что они скажут(думаю, что ничего не скажут) strlen(from_str)*sizeof(char) Хотя в приведённом коде, по-моему, это явный перебор. И свидетельствует, скорее, о формальном подходе к программированию и непониманию происходящего. Ну, вам виднее, товарисчь. Пиписьками меряться не стану с вами. Хотя соглашусь, лишнее Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 20 марта, 2013 Опубликовано 20 марта, 2013 · Жалоба Далеко не всегда.Верно сказать что sizeof(char)==1 байт всегда и везде, ну а байт может быть любой размерности. Поэтому формально Буратино прав и нет никаких доводов в пользу использования sizeof(char) вместо 1 кроме эстетических. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Буратино 0 20 марта, 2013 Опубликовано 20 марта, 2013 · Жалоба am1808, если открыть реализацию realloc, то там похоже есть проверка аргументов. Еще мне не очень, что вы несколько раз strlen вызываете, наверняка можно обойтись и одним разом на функцию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Буратино 0 21 марта, 2013 Опубликовано 21 марта, 2013 · Жалоба Вот так еще можжно: #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; } проверку аргументов пока вынесем за скобки:) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VCucumber 0 21 марта, 2013 Опубликовано 21 марта, 2013 · Жалоба Верно сказать что sizeof(char)==1 байт всегда и везде, ну а байт может быть любой размерности. А у нас в char`е два байта, при том, что в байте восемь бит. Двоичных, на всякий случай, а то мало ли у кого как. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 21 марта, 2013 Опубликовано 21 марта, 2013 · Жалоба А у нас в char`е два байта, при том, что в байте восемь бит. Двоичных, на всякий случай, а то мало ли у кого как.У вас это где, в компиляторе для TI dsp'шок?. Стандарт однозначно говорит, что sizeof(char)=1. А у вас сколько sizeof(char) выдаёт? void str_cpy (char** a, char* b) {*a = b;} А как насчёт того, что в ТЗ сказано, что каждая функция должна быть порядка 7 строк? А тут всё в 1 влезло...;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Буратино 0 21 марта, 2013 Опубликовано 21 марта, 2013 · Жалоба А как насчёт того, что в ТЗ сказано, что каждая функция должна быть порядка 7 строк? А тут всё в 1 влезло...;) "не более чем 7 строк кода на функцию" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
igorle 0 21 марта, 2013 Опубликовано 21 марта, 2013 (изменено) · Жалоба "не более чем 7 строк кода на функцию" Проблема общения в виртуале - никогда не уверен - человек шутит, или серьезно. Ваш вариант выглядит как троллинг. Вы действительно хотите комментариев к этому коду? Изменено 21 марта, 2013 пользователем igorle Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Буратино 0 21 марта, 2013 Опубликовано 21 марта, 2013 · Жалоба Проблема общения в виртуале - никогда не уверен - человек шутит, или серьезно. Ваш вариант выглядит как троллинг. Вы действительно хотите комментариев к этому коду? А какой смысл размещать его тут кроме как получить каменты? Конечно хочу! Кстати данный код работает и выполняет функции. Почему так нельзя сделать!? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
igorle 0 21 марта, 2013 Опубликовано 21 марта, 2013 (изменено) · Жалоба А какой смысл размещать его тут кроме как получить каменты? Конечно хочу! Кстати данный код работает и выполняет функции. Почему так нельзя сделать!? Ну, некоторые пишут, чтобы получать лулзы, глядя как люди рвут на себе волосы "Код работает" - это совсем не аргумент. Надо не код, который один раз сработает с данным примером, а код, который будет работать в библиотеке. Он будет вызываться миллионы раз как с короткими, так и мегабайтными строками. 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 - потеряна. Результирующая строка не ограничена нулем. Изменено 21 марта, 2013 пользователем igorle Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
msalov 0 22 марта, 2013 Опубликовано 22 марта, 2013 · Жалоба strlen(from_str)*sizeof(char) Хотя в приведённом коде, по-моему, это явный перебор. И свидетельствует, скорее, о формальном подходе к программированию и непониманию происходящего. В таком виде - да. Идея хорошая, но реализация чуть подкачала. Для данного случая то же самое по сути strlen(from_str)*sizeof(*from_str) , но если char станет wchar отработает нормально. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
am1808 0 22 марта, 2013 Опубликовано 22 марта, 2013 · Жалоба нее, не прокатит, множитель в виде sizeof(char) лишний, но ничего плохого в нем нет. Типы параметров функции точно определены, поэтому sizeof(*from_str) строго определено. Перегрузки тут нет никакой, это в плюсах можно так сделать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться