реклама на сайте
подробности

 
 
7 страниц V  « < 2 3 4 5 6 > »   
Reply to this topicStart new topic
> Олимпиада программистов, Чистый С
am1808
сообщение Mar 20 2013, 10:25
Сообщение #46


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 29-05-11
Из: Nizhny Novgorod, Russian Federation
Пользователь №: 65 337



Цитата(demiurg_spb @ Mar 20 2013, 14:17) *
compiletime всё же B)

да, конечно же compile-time, извиняюсь
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 20 2013, 10:27
Сообщение #47


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Буратино @ Mar 20 2013, 14:23) *
Но ведь char всегда 8 бит...

Далеко не всегда.
Go to the top of the page
 
+Quote Post
gerber
сообщение Mar 20 2013, 10:28
Сообщение #48


Знающий
****

Группа: Участник
Сообщений: 750
Регистрация: 1-11-11
Пользователь №: 68 088



Цитата(Буратино @ Mar 20 2013, 13:09) *
Скажите, а нафига "sizeof(char)" делать?

Есть несколько правил "хорошего", "структурного" стиля программирования на C, которым учат в вузах. Например, "не использовать в С оператор goto", "использовать локальные переменные вместо глобальных, где это возможно", "давать переменным говорящие имена" и т. п.
sizeof(char) - это следствие из усвоенного правила "не использовать прямых констант в тексте программы, заменяя их по возможности дефайнами или константами".
Код
strlen(from_str)*sizeof(char)

Хотя в приведённом коде, по-моему, это явный перебор. И свидетельствует, скорее, о формальном подходе к программированию и непониманию происходящего.


--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
Go to the top of the page
 
+Quote Post
am1808
сообщение Mar 20 2013, 10:31
Сообщение #49


Частый гость
**

Группа: Участник
Сообщений: 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)

Хотя в приведённом коде, по-моему, это явный перебор. И свидетельствует, скорее, о формальном подходе к программированию и непониманию происходящего.

Ну, вам виднее, товарисчь. Пиписьками меряться не стану с вами.
Хотя соглашусь, лишнее
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Mar 20 2013, 10:39
Сообщение #50


неотягощённый злом
******

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



Цитата(aaarrr @ Mar 20 2013, 14:27) *
Далеко не всегда.
Верно сказать что sizeof(char)==1 байт всегда и везде, ну а байт может быть любой размерности. Поэтому формально Буратино прав и нет никаких доводов в пользу использования sizeof(char) вместо 1 кроме эстетических.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Буратино
сообщение Mar 20 2013, 11:06
Сообщение #51


Профессионал
*****

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



am1808, если открыть реализацию realloc, то там похоже есть проверка аргументов. Еще мне не очень, что вы несколько раз strlen вызываете, наверняка можно обойтись и одним разом на функцию.


--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
Go to the top of the page
 
+Quote Post
Буратино
сообщение Mar 21 2013, 11:54
Сообщение #52


Профессионал
*****

Группа: Свой
Сообщений: 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;
}


проверку аргументов пока вынесем за скобкиsm.gif


--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
Go to the top of the page
 
+Quote Post
Огурцов
сообщение Mar 21 2013, 11:58
Сообщение #53


Гуру
******

Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588



Цитата(demiurg_spb @ Mar 20 2013, 11:39) *
Верно сказать что sizeof(char)==1 байт всегда и везде, ну а байт может быть любой размерности.

А у нас в char`е два байта, при том, что в байте восемь бит. Двоичных, на всякий случай, а то мало ли у кого как.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Mar 21 2013, 12:20
Сообщение #54


неотягощённый злом
******

Группа: Свой
Сообщений: 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 влезло...wink.gif


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Буратино
сообщение Mar 21 2013, 14:37
Сообщение #55


Профессионал
*****

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



Цитата(demiurg_spb @ Mar 21 2013, 16:20) *
А как насчёт того, что в ТЗ сказано, что каждая функция должна быть порядка 7 строк? А тут всё в 1 влезло...wink.gif


"не более чем 7 строк кода на функцию"


--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
Go to the top of the page
 
+Quote Post
igorle
сообщение Mar 21 2013, 14:44
Сообщение #56


Местный
***

Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753



Цитата(Буратино @ Mar 21 2013, 17:37) *
"не более чем 7 строк кода на функцию"

Проблема общения в виртуале - никогда не уверен - человек шутит, или серьезно. Ваш вариант выглядит как троллинг.
Вы действительно хотите комментариев к этому коду?

Сообщение отредактировал igorle - Mar 21 2013, 14:45
Go to the top of the page
 
+Quote Post
Буратино
сообщение Mar 21 2013, 15:10
Сообщение #57


Профессионал
*****

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



Цитата(igorle @ Mar 21 2013, 17:44) *
Проблема общения в виртуале - никогда не уверен - человек шутит, или серьезно. Ваш вариант выглядит как троллинг.
Вы действительно хотите комментариев к этому коду?


А какой смысл размещать его тут кроме как получить каменты? Конечно хочу! Кстати данный код работает и выполняет функции. Почему так нельзя сделать!?


--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
Go to the top of the page
 
+Quote Post
igorle
сообщение Mar 21 2013, 15:52
Сообщение #58


Местный
***

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
msalov
сообщение Mar 22 2013, 06:10
Сообщение #59


Знающий
****

Группа: Свой
Сообщений: 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 отработает нормально.
Go to the top of the page
 
+Quote Post
am1808
сообщение Mar 22 2013, 07:18
Сообщение #60


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 29-05-11
Из: Nizhny Novgorod, Russian Federation
Пользователь №: 65 337



нее, не прокатит, множитель в виде sizeof(char) лишний, но ничего плохого в нем нет.

Типы параметров функции точно определены, поэтому sizeof(*from_str) строго определено.
Перегрузки тут нет никакой, это в плюсах можно так сделать.
Go to the top of the page
 
+Quote Post

7 страниц V  « < 2 3 4 5 6 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 18:09
Рейтинг@Mail.ru


Страница сгенерированна за 0.0166 секунд с 7
ELECTRONIX ©2004-2016