Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 [2]  Все   Вниз
  Печать  
Автор Тема: Задача  (Прочитано 44431 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #30 : 22-05-2005 16:35 » 

Да Гром отстали мы от жизни. Шас проверил на Microsoft Visual C++ Toolkit 2003. Вроде работает. Хотя 6 версия VC обругала на чем свет стоит Улыбаюсь
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
LP
Помогающий

ru
Offline Offline

« Ответ #31 : 22-05-2005 17:04 » 

Книга "Введение в С++", авторы Стенли Липпман и Жози Лайо (Lajoie), глава 10, повсюду в главе
встречаются конструкции
Код:
template<class T,int size>
int f(T (&arr)[size])
Книга и авторы вполне авторитетны, например в предисловии написано, что

Цитата

Жози принимает участие в развитии самого языка С++,
являясь председателем рабочей группы по ядру языка в комитете по стандартизации и одним
из разработчиков компилятора С++ в IBM Canada Laboratory.

Кроме того на ACCU эта книга помечена как highly recommended

в общем не знаю что вам еще сказать, но вы не совсем правы.
Ну как минимум я не заслужил чтобы меня били ногами Улыбаюсь

Кстати, nikedeforest
[qoute]
Опять же позволю себе не согласиться sizeof(xx) вернет размер указателя.
Цитата
Да не вернет он размер указателя, что ты заладил Улыбаюсь
Если xx это имя массива то сайзоф вернет его размер. Попробуй скомпилировать - проверь Улыбаюсь
Хотя после постов Грома и Finch'а я уже не удивлюсь если твой компилятор этого не делает.

PS Не ну все-же владельцы BC++B 6 и MSVS 7.1, отзовитесь, не позволяйте твориться беспределу Ага Умоляю подтвердите мои слова!!! Улыбаюсь
ЗЗЫ Да, Finch и Гром, назовите, пожалуйста, название ваших компиляторов если не трудно.
« Последнее редактирование: 20-12-2007 17:53 от Алексей1153++ » Записан

Если эта надпись уменьшается, значит ваш монитор уносят
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #32 : 22-05-2005 17:10 » 

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

Не будите спашяго дракона.
             Джаффар (Коша)
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #33 : 22-05-2005 17:17 » 

Вот проверил, чтобы исключить дальнейшие споры
Код:
int x[5] = {1,2,3,4,5};
char *y = "123456789";
int i = sizeof(x);
i=sizeof(y);
После выполнения строки i = sizeof(x);
i будет равно 20 (5 элементов по 4 байта)
После выполнения i=sizeof(y);
i будет равно 4
Так как указатель имеет длину 4 байта.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #34 : 22-05-2005 20:02 » 

nikedeforest - а собственно не знаю как там чего добавится 0 или нет - проверять лениво - но если иметь ввиду не строку а массив данных, то ничерта не добавится. ИМХО и тут тоже. Суть не в этом, а втом, что массив не определить...

То, что меня зовут Саша, знают 90% постоянных клиентов Улыбаюсь

Михалыч Улыбаюсь

Финч - о какой проге и оибке идет речь???
Не вижу динамического массива в примере, запись x[]="advcv"; - статический массив.

Кроме того теорема Ферма формируется с точностью наоборот, что для вышеупомянутой записи решения ЕСТЬ на всей числовой прямой. Хотя увы могу ошибаться.

LP - еще раз.
Вышеприведенный код не компилируется в Vc6.0 VC.NET c одинаковыми ошибками.
Еще раз повторяю, если код не собирается то значит в нем ошибка - напиши нормальное решение.
Повторюсь передача в качетсве параметра такого выражения не пройдет если явно не указывать перегрузку приведения типов ИМХО тут.

А вот то, что код в виде форумного не собирается и не соберется в твоем варианте - это не ИМХО - это факт.




Записан

А птичку нашу прошу не обижать!!!
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #35 : 22-05-2005 20:06 » 

Да пока писал много нового появилось иоли это я так прочитал Жаль

Итак - если вышеприведенный пример работает только в VC.NET то к С он не имеет отношения совершенно никакого. Студия как уже много раз подмечено не соблюдает все стандарты С и кроме того сильно расширяет возможности языка.

Кроме того тут я понимаю есть путаница у кое-кого, в чем разница между с и с++ Улыбаюсь

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

А птичку нашу прошу не обижать!!!
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #36 : 22-05-2005 20:53 » 

Гром не внимательно читаеш. Я даже точную формулировку привел, взятую из книги. И ссылку дал на саму книгу.
Если хочеш могу привести еше ссылки. Да такие уравнения будут иметь решения. Но эти решения будут дробными. Но доказывается только для целых чисел. Посмотри главу "От теоремы Пифагора до Великой теоремы Ферма" Собственно я оттуда взял точную формулировку.
« Последнее редактирование: 22-05-2005 20:57 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #37 : 23-05-2005 04:41 » 

Да для целых - это я и имел ввиду - я же не акцентировал на этом - просто решения есть а не решений нет.
Записан

А птичку нашу прошу не обижать!!!
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #38 : 23-05-2005 10:18 » 

Я проверил в gcc 3.3.3, работает.
Но это решение будет справедливо только для статически инициализированных массивов (инициализатор или размер известен на этапе компиляции).  Динамически аллоцированный массив (ака указатель) будет отвергнут на этапе компиляции, для него не удастся провести инстанциирование шаблона.


Цитата
Вывод - не надо выкладывать непроверенные решения
Я проверял решение на C++Builder 6 и на MS Visual Studio 7.1 компилируют без проблем.
Если эти компиляторы вы считаете левыми, то я не знаю тогда...
Насчет конструкции:
template<class T,int size>
int f(T (&arr)[size])
встречал в книгах, могу поискать и дать ссылку.

PS Народ у кого есть BC++B 6.0 или MSVS 7.1, пожалуйста, попробуйте проверить.
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
LP
Помогающий

ru
Offline Offline

« Ответ #39 : 23-05-2005 12:34 » 

Спасибо, большое npak!

Ладно, давайте закончим этот бесконечный спор...
...И плавно перейдем к следующей задачке Ага
Записан

Если эта надпись уменьшается, значит ваш монитор уносят
Михалыч
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #40 : 23-05-2005 13:28 » new

А-а-а-а!!!... Пока пришел с работы домой - вижу, что опоздал к раздаче Улыбаюсь
Но тем не менее скажу, что хотел, благо хотел весь день Улыбаюсь

Не вижу никакого криминала в объявлении вида
template<class T,int size>
int sz(T (&arr)[size])
{
  return size;
}
В функцию передается именно ссылка на массив размера [size] элементов типа Т, а не на элемент
массива с индексом size. (Вспомните полный аналог - int (*arr)[11] - это ведь указатель на массив
целых размером в 11 штук...)
Решение получилось явно компиляторо-зависимое. Потому что, например gcc 2.95.3 из состава системы
QNX 6.2.1 и gcc 3.3.1 из QNX 6.3.0 "едят" эту задачку, как говорится "не подавившись". А у Finch и
Грома - не работает (что за компилятор?)... 6-го борланда и MSVC 7 у меня нет, проверить не смог, но
LP утверждает, что ведь работает...
У меня все компилируется и работает "на ура" с массивами ЛЮБЫХ типов (на то он и шаблон).
Массивы объявлены, их размеры известны компилятору - нет никаких проблем передать ему ссылку, а она
в данном случае и обязана быть в шаблоне с размером.
Красивое и действительно очень простое решение Улыбаюсь

Finch, если есть желание копаться с менеджерами памяти и реализациями компиляторов, то по поводу размера
динамического массива - вот, например цитата из "C++ for Real Programmers" Джеффа Элджера...
"В большинстве реализаций C++ оператор new записывает пару скрытых байтов перед возвращаемым адресом.
В этих байтах указывается размер выделенного блока. По ним оператор delete определяет, сколько памяти
за указанным адресом следует освободить."
При желании, видимо, можно покопаться и в этом...
Вышеприведенный код не компилируется в Vc6.0 VC.NET c одинаковыми ошибками.
Еще раз повторяю, если код не собирается то значит в нем ошибка - напиши нормальное решение.
Повторюсь передача в качетсве параметра такого выражения не пройдет если явно не указывать перегрузку приведения типов ИМХО тут.
А вот то, что код в виде форумного не собирается и не соберется в твоем варианте - это не ИМХО - это факт.
Не понял Улыбаюсь юмора... А если собирается в чем-то (и не в одном) другом?Не понял Может переписать то в чем не собирается Улыбаюсь
Шучу, шучу  Отлично Хотя, тут на форуме, мне судя по всему шутить надо крайне осторожно Улыбаюсь Одна шутка про Ферма чего стоит Отлично Шума - на весь лес  Жжешь
Итак - если вышеприведенный пример работает только в VC.NET то к С он не имеет отношения совершенно никакого. Студия как уже много раз подмечено не соблюдает все стандарты С и кроме того сильно расширяет возможности языка.
А так еще раз повторю -задача некорректна как и метод ее решения тут предлагаемый, это не относится к функциям, это уже немного другой уровень язковых конструкций.
Ну, как выяснилось работает в нескольких разных вариантах. И это хорошо Улыбаюсь VC.NET тут нипричем...
А задача и метод решения (на мой взгляд конечно) оригинальны и красивы.
А вот про другой уровень языковых конструкций - двумя руками (и одной ногой) ЗА!!! Шаблоны - это действительно крайне мощный (хотя и опасный иногда) инструмент. Данный пример - тому только в подтверждение...
« Последнее редактирование: 23-05-2005 13:42 от Михалыч » Записан

Поживем - увидим... Доживем - узнаем... Выживу - учту  Улыбаюсь
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #41 : 23-05-2005 13:42 » 

Михалыч, У Ферма было очень много хороших шуток. Одну его шутку Эйлер доказывал семь лет. Вторую Доказывают уже 400 лет Отлично
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Михалыч
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #42 : 23-05-2005 13:46 » 

Гы-ы-ы-ы!... Отлично
Хорошо, что я не Ферма. А то, ни дай Бог, тут всему форуму на 7 лет (как Эйлеру) работы бы хватило..
Однако опять шучу Улыбаюсь не примите за манию величия, пожалуйста. Не страдаю Улыбаюсь
А шутить еще буду и не раз Улыбаюсь
Записан

Поживем - увидим... Доживем - узнаем... Выживу - учту  Улыбаюсь
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #43 : 23-05-2005 14:16 » 

Михалыч - поясню.
1. Я шутки понимаю Улыбаюсь
2. Я говорил о том, что если код в чем либо не компилируется - то решение неверное. Это мое ИМХО и я его менять не буду.
gcc хороший компилятор, но не авторитет, как и ни один из вышеприведенных.
В некоторых компилится, в некоторых нет.
Студия НЕТ и 6-ка не собрала, но 2003 уже собирает.
С какого момента мы используем темплейты, для решения???
Массив как указано должон быть статичным, иначе вышеуказанная сруктурная особенность работать не будет ибо на стадии компиляции размер не известен.

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

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


Записан

А птичку нашу прошу не обижать!!!
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #44 : 23-05-2005 14:47 » 

Цитата
но если иметь ввиду не строку а массив данных,то ничерта не добавится.
Согласен.
Цитата
ИМХО и тут тоже.
Не понял, в нашем случае в массиве типа char содержится строка (так было написано)
Цитата
То, что меня зовут Саша, знают 90% постоянных клиентов
 
Ну, теперь и я среди них Улыбаюсь, интересно, откуда они узнают, если здесь в 99% случаях все называют друг друга по никам???
Я проходил теорему Ферма по сравнению с вами совсем недавно, но я ее в упор не помню, я вам завидую УлыбаюсьУлыбаюсьУлыбаюсь.
Напоследок вопрос: я из всего вышесказанного не понял, приведеное решение является отклонением от стандарта или нет?
Записан

ещё один вопрос ...
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #45 : 23-05-2005 15:02 » 

Это продолжение стандарта. В принципе вычисление размерности идет еше на стадии компиляции. И как заметили ранее не будет работать с динамическими массивами. Значит не имеет практической ценности. Хотя может натолкнуть на другие идеи подобного рода.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Михалыч
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #46 : 23-05-2005 15:57 » 

2. Я говорил о том, что если код в чем либо не компилируется - то решение неверное. Это мое ИМХО и я его менять не буду.
gcc хороший компилятор, но не авторитет, как и ни один из вышеприведенных.
В некоторых компилится, в некоторых нет.
Студия НЕТ и 6-ка не собрала, но 2003 уже собирает.
Решений верных на 100% по твоей методе вообще быть не может Улыбаюсь
Просто надо тогда вести речь о соответствии стандарту или не соответствии (и в какой степени и с какими обновлениями и т.д. и т.п) конкретного инструмента. Если 4 (если я не ошибся) приведенных разных компилятора для тебя не авторитет, то на чем ты работаешь??? Название - в студию!!! вдруг я это тоже залюблю со страшной силой Улыбаюсь
Цитата
С какого момента мы используем темплейты, для решения???
Чем не нравится подобный метод решения? Почему - низзя?
Цитата
Массив как указано должон быть статичным, иначе вышеуказанная сруктурная особенность работать не будет ибо на стадии компиляции размер не известен.
Вот и ответ - решение задачи нет, если решение не для всех случаев. В данной задаче и условие некорректное, только при таком вот виде - забыли изначально упомянуть...
Я не думаю (а точнее практически уверен, это мой личный опыт) что ЛЮБУЮ задачу необходимо пытаться решать В ОБЩЕМ виде. Иногда вполне допустимо ЧАСТНОЕ решение задачи общего вида Улыбаюсь А в данном конкретном случае - задача поставлена конкретно, а решение явно более общее, чем постановка. Работает для массивов ЛЮБЫХ типов. Улыбаюсь Чем это не решение?
Цитата
2. А шутка про ферма - действительно хорша - мне понравилось, но видимо отсутствие смайликов напугало - впредь буду писать.... Улыбаюсь Улыбаюсь Улыбаюсь
Дык розыгрыш без серьезной рожи - уже не розыгрыш Улыбаюсь хотя смайлики там были - не удержался, сочинял - и хихикал Улыбаюсь
« Последнее редактирование: 23-05-2005 16:01 от Михалыч » Записан

Поживем - увидим... Доживем - узнаем... Выживу - учту  Улыбаюсь
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #47 : 23-05-2005 16:45 » 

2. Я говорил о том, что если код в чем либо не компилируется - то решение неверное. Это мое ИМХО и я его менять не буду.
gcc хороший компилятор, но не авторитет, как и ни один из вышеприведенных.
В некоторых компилится, в некоторых нет.
Студия НЕТ и 6-ка не собрала, но 2003 уже собирает.
С какого момента мы используем темплейты, для решения???

Гром, в решении задачи используется фича С++, которая в старых (до 2003 года) компиляторах Майкрософт была реализована неверно.  См. http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dndeepc/html/deep05282002.asp
Тот факт, что решение не компилируется двумя компиляторами из-за ошибки в компиляторах, не отменяет само решение.

Далее, задача сформулирована несколько некорректно. Если подогнать задачу к решению Улыбаюсь то надо реализовать функцию определения числа элементов в объекте типа массив (array type).  В языке С++ есть два вида массивов -- массивы Си, являющиеся просто указателями, и типы массивы: int[2], float[5].  Предложенное решение не может определить число элементов в массиве Си, но успешно работает для массивов С++.

В языке Си есть аналогичная ситуация: если переменная объявлена как int x[5], sizeof(x)/sizeof(x[0]) даст число элементов в массиве x.  Если переменная x инициализирована как int * x = malloc(5*sizeof(int)), то sizeof(x)/sizeof(x[0]) в компиляторах Майкрософт на пентиуме даст 1 вне зависимости от фактического числа элементов.
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
LP
Помогающий

ru
Offline Offline

« Ответ #48 : 23-05-2005 18:32 » 

В языке Си есть аналогичная ситуация: если переменная объявлена как int x[5], sizeof(x)/sizeof(x[0]) даст число элементов в массиве x. Если переменная x инициализирована как int * x = malloc(5*sizeof(int)), то sizeof(x)/sizeof(x[0]) в компиляторах Майкрософт на пентиуме даст 1 вне зависимости от фактического числа элементов.

npak, только я не понял зачем это все особо оговаривать, как некое исключение.
Вроде бы и так понятно что если sizeof(x)/sizeof(x[0]) применяется для массива, то он вернет размер этого массива, а если x это указатель, то возвращен будет размер указателя деленный на размер экземпляра типа на который он указывает. И не только на компиляторах Microsoft.
« Последнее редактирование: 23-05-2005 18:35 от LP » Записан

Если эта надпись уменьшается, значит ваш монитор уносят
Михалыч
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #49 : 24-05-2005 00:48 » 

Господа! И дамы!  Улыбаюсь
Давайте вернемся в САМОЕ начало этой истории. Если уж на то пошло, то задача была поставлена - определеннее некуда.
int x[5] = {1,2,3,4,5};
char y[] = "123456789";
Два массива - всего 2 и причем заданного типа... И просьба написать функцию для определения размера именно этих массивов...Я понимаю, конечно (сам такой), желание найти общее решение в любой задаче. Но перестаньте уже пинать LP. И задача-то некорректно поставлена, и решение-то не стандартное...  Улыбаюсь Была конкретная задача, и предложено ее более общее решение. Чего еще надо? И без того ни у кого из нас, присутствующих на ее обсуждении не возникла мысль о ТАКОМ решении. Так давайте это признаем и успокоимся. Все остальное обсуждение - почти одни эмоции. Главное - результат, а он получен... Мне нравится (IMHO)
« Последнее редактирование: 24-05-2005 01:02 от Михалыч » Записан

Поживем - увидим... Доживем - узнаем... Выживу - учту  Улыбаюсь
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #50 : 24-05-2005 08:10 » 

Вроде бы и так понятно что если sizeof(x)/sizeof(x[0]) применяется для массива, то он вернет размер этого массива, а если x это указатель, то возвращен будет размер указателя деленный на размер экземпляра типа на который он указывает. И не только на компиляторах Microsoft.

Это я к тому, что в языках Си и С++ есть два вида массивов: собственно массивы (int x[5]) и указатели (int *x).  Для массивов первого вида можно сделать решение в духе Си при помощи sizeof, и в духе С++ с помощью шаблонов.  Но для (int *) ОБА решения неприменимы.
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Страниц: 1 [2]  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines