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

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

ru
Offline Offline

« : 21-05-2005 14:45 » 

Вот вам задачка для разминки Ага

Код:
#include <iostream>
using namespace std;

//[implementation of sz]

int main() {
int x[5] = {1,2,3,4,5};
char y[] = "123456789";
cout << sz(x) << " " << sz(y);
return 0;
}

Необходимо реализовать sz.
sz - это нечто, что принимает в качестве параметра массив,
а возвращает его размер. Так приведенная выше прога должна выдавать:
5 10
Дефайны и sizeof использовать нельзя.

PS Если вы знаете интересные задачи - выкладывайте их сюда!!! Ага
Записан

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

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


« Ответ #1 : 21-05-2005 16:03 » 

Эта задача очень сильно будет зависеть от реализации компилятора и менеджера памяти. Поэтому будет иметь множество решений, зависяших от конкретной среды разработки. И даже от условий разработки. Думаю что в дебаг и релиз моде того же MSVC построение менеджера памяти другое. По крайней мере когда я чуть копался, в дебаг моде, то заметил, что он хранит таблици с данными о каждой динамической переменной.
Записан

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

ru
Offline Offline

« Ответ #2 : 21-05-2005 16:30 » 

На самом деле решение предельно просто Ага
И оно будет работать на любом нормальном компиляторе С++.
Если что могу дать подсказку Ага
Записан

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

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


« Ответ #3 : 21-05-2005 19:24 » 

Вот реальный дамп памяти, который я получил ради интереса, когда пустил на дебаг твой пример. Скажу только что переменная x имеет адрес 0x0012fe18,  переменная y имеет адрес 0x0012fe0c
Цитата
0012FE0C  31 32 33 34 35 36 37 38 39 00 CC CC 01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 
0012FE27  00 05 00 00 00 CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC 

И как ты выудиш отсюда информацию, о том хотябы какой тип имеют массивы, неговоря уже о длине массива.
Записан

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

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

« Ответ #4 : 21-05-2005 20:57 » 

Я много видел статей о том, что нельзя в функцию передать массив без размера, т.к. в фуекции потом не реально будет узнать размер массива если он потребуется.

Цитата
sizeof использовать нельзя.
Нельзя, т.к. он полюбому вернет только размер указателя, а не размер массива. Смысла от использования sizeof'а здесть не большой.

Код:
  char y[] = "123456789"; 
Здесь я бы предложил идти по элементно (т.е. увиличивать адрес указателя на единицу), пока не встретим  '\0', который и будет означать конец массива.
Код:
int x[5] = {1,2,3,4,5};
Рискну предположить, что невозможно Жаль.


Записан

ещё один вопрос ...
Михалыч
Команда клуба

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

« Ответ #5 : 22-05-2005 05:44 » 

Есть, есть еще интересные задачки Улыбаюсь
Вот, например...  Вот такой я вот
Кто составит алгоритм, доказывающий, что для любого ЦЕЛОГО N > 2 уравнение
pow(A, N) + pow(B, N) = pow(C, N)
не имеет положительных ЦЕЛЫХ решений A, B  и C.  Отлично
« Последнее редактирование: 22-05-2005 06:29 от Михалыч » Записан

Поживем - увидим... Доживем - узнаем... Выживу - учту  Улыбаюсь
LP
Помогающий

ru
Offline Offline

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

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

Если эта надпись уменьшается, значит ваш монитор уносят
LP
Помогающий

ru
Offline Offline

« Ответ #7 : 22-05-2005 07:01 » 

Цитата
Смысла от использования sizeof'а здесть не большой.

Это чтобы исключить такие возможности:
Код:
#define sz(xx) sizeof(xx)/sizeof(xx[0])
Хотя, наверное, запрета одних только дефайнов хватило бы...

Михалыч, не надо меня подкалывать Улыбаюсь
Записан

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

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

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

Цитата
Код:
#define sz(xx) sizeof(xx)/sizeof(xx[0])
Что это простите за выражение за херня такая.
sizeof(xx)/sizeof(xx[0] - результат должен  быть в любом случае единица или почти в любом (хотя немогу представить это почти).
Народ, либо поддержите меня, либо наставьте на путь истинный.
LP, давай свое мудреное решение, не верю я в его существование, я слишком много раз читал о том, что размер массива не определить.
Записан

ещё один вопрос ...
nikedeforest
Команда клуба

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

« Ответ #9 : 22-05-2005 08:34 » 

Михалыч, ты же проффесионал, скажи свое веское слово.
зы: Ничего, что на "ты" ?
Записан

ещё один вопрос ...
Михалыч
Команда клуба

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

« Ответ #10 : 22-05-2005 11:24 » 

Михалыч, ты же проффесионал, скажи свое веское слово.
зы: Ничего, что на "ты" ?
Лестно, конечно... Я такой же профессионал, как и многие в этом форуме Улыбаюсь
Т.е. Я ЛИЧНО не считаю себя крутым профессионалом

Ну, в качестве идеи последовательного перебора (а-ля  Улыбаюсь  nikedeforest)
для ДАННОГО КОНКРЕТНОГО случая
int x[5] = {1,2,3,4,5};
крайне маловероятно, что следующим за 5 значением будет 6  Отлично
так что можно и этот массив просчитать.
А вааще - выходные сегодня... Голове думать ну совсем лень...
Хотя, почему-то мне сдается, что решение либо лежит на поверхности и простое как манная каша, причем настолько, что даже в голову не приходит, либо его не существует  Отлично
Автор!!! Решение в студию на всеобщее обсуждение!  :vzhik:

Цитата
Михалыч, не надо меня подкалывать Улыбаюсь
Никаких подколов  Отлично
Наидешь решение - бегом в комитет по Нобелевским премиям Улыбаюсь
« Последнее редактирование: 22-05-2005 11:31 от Михалыч » Записан

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

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

« Ответ #11 : 22-05-2005 12:01 » 

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

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


« Ответ #12 : 22-05-2005 12:48 » 


Михалыч - не надо подкалывать людей :)

Выражения a^x + b^x = c ^x это теорема Ферма. Она доказана несколько лет назад и имеет решение для всех X>0. Статья об этом тихо промелькнула на страничках интеренета и сгинула - нет пророка в своем отчестве.
Задача предлагаемая LP несмотря на его утверждение - не имеет решения п одвум причинам.

1. Если заранее не определить тип массива - типа int char и т.д. то изначально непонятно какой размер и в каких единицах искать.
Скажем я могу посчитать, что задача решается для размера в байтах, а на деле нужно размер в элементах массива, что собственно далеко не одно и то же.

2. Очень простая функция memset по сути делает требуемое товарищем, она принимает массив в виде указателя и выставляет ему значение в все байты одно и то же.
Т.е. его задача в идеале, взять указатель - определить его ращзмер (даже не в элементах) в байтах, и проинитить в нужное число.

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


Логика же говорит, что получить параметром массив разного типа можно только одним путем, путем приведения его в тип войд поинтер.
Тогда мы легко одной и той же функцией как в задачке примем и массив чар и целочисленный массив. В этом случае все данные нами могут быть рассмотрены как поток побайтовых данных не имеющий явного признака окончания.
Даже предложенная ссылка на \0 не имеет никакого смысла, так как выведенный массив не будет ее содержать. Массив чаров не заполняется функцией работы со строками и в его конце символа 0 не будет, ибо его туда никто не клал.

Соответственно не имея параметра ни тип данных ни длину определить его длину невозможно... НЕ ИМХО - это ЗАКОН ЯЗЫКА С.

Второй вывод отсюда. ЛП предлагает частную задачу в которой массив задан последовательным перечислением индексов. Т.е. x[i] == i всегда и предполагает умным следующее решение, if (a[i] != i) return i-1;

Это и будет одна строка, которая ЯКОБЫ принесет решение проблемы для частного случая. Глупо предполагать, что такое решение имеет место быть. Во первых чаще всего при наличии такой вот гармоничности, при замене main на другую функцию - переменные станут локальными и могут оказаться в стеке слегка смещенными или инициироваться похоже, что приведет к факту, что несуществующий элемент i  может оказаться как раз равен индексу и значение окажется невереным.

Во вторых построение решения на основе ОБРАЩЕНИЯ К НЕСУЩЕСТВУЮЩЕМУ ЭЛЕМЕНТУ МАССИВО - ЯВЛЯЕТСЯ ВОПИЮЩЕЙ БЕЗГРАМОНОСТЬЮ и недопустимо к употреблению вообще.

Говорить и перечислять причины вышесказанного даже не буду, силы на такое тратить - себя не уважать. Это азы работы с указателями....
« Последнее редактирование: 14-04-2006 21:12 от Алексей1153 » Записан

А птичку нашу прошу не обижать!!!
LP
Помогающий

ru
Offline Offline

« Ответ #13 : 22-05-2005 12:58 » 

Цитата
Что это простите за выражение за херня такая.
sizeof(xx)/sizeof(xx[0] - результат должен  быть в любом случае единица или почти в любом (хотя немогу представить это почти).
nikedeforest, sizeof для массива xx возвращает размер этого массива в байтах, а sizeof(xx[0]) размер
одного эл-та этого массива в байтах.

Цитата
я слишком много раз читал о том, что размер массива не определить.
А где читал если не секрет?

Цитата
Автор!!! Решение в студию на всеобщее обсуждение!

Вот решение:
Код:
template<class T,int size>
int sz(T (&arr)[size])
{
 return size;
}
Записан

Если эта надпись уменьшается, значит ваш монитор уносят
LP
Помогающий

ru
Offline Offline

« Ответ #14 : 22-05-2005 13:10 » 

Короче, фишка тут в том что никакой размер по существу никто и не определяет! Я ведь этого и не просил.
Я просил просто реализовать sz. Вся хитрость в том чтобы воспользоваться шаблоном функции принимающей ссылку на массив типа Т.
Записан

Если эта надпись уменьшается, значит ваш монитор уносят
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

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


« Ответ #15 : 22-05-2005 13:43 » 

Хых - начнем...
Итак - выдача компилятора...
Цитата
1. C:\Documents and Settings\alexanderm\My Documents\Temp\TempDlg.cpp(182) : error C2265: '<Unknown>' : reference to a zero-sized array is illegal
2. C:\Documents and Settings\alexanderm\My Documents\Temp\TempDlg.cpp(196) : error C2784: 'int __cdecl sz(T (&)[1])' : could not deduce template argument for ' (&)[1]' from 'int [5]'
3. C:\Documents and Settings\alexanderm\My Documents\Temp\TempDlg.cpp(196) : error C2784: 'int __cdecl sz(T (&)[1])' : could not deduce template argument for ' (&)[1]' from 'char [10]'


Строки на которые выходят ошибки....

1. int sz(T (&arr)[size])
2. Temp.Format("Array 1 = %d Array 2=%d",sz(x),sz(y));
3. = 2.

Вывод - не надо выкладывать непроверенные решения...

Пробуй еще раз...
« Последнее редактирование: 03-12-2007 20:00 от Алексей1153++ » Записан

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

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


« Ответ #16 : 22-05-2005 13:44 » 

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

Записан

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

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


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

Вставил для проверки твое решение, получил в моем компиляторе вот такие ошибки
Цитата
e:\c++\prob\cpp1.cpp(6) : error C2265: '<Unknown>' : reference to a zero-sized array is illegal
e:\c++\prob\cpp1.cpp(14) : error C2784: 'int __cdecl sz(T (&)[1])' : could not deduce template argument for ' (&)[1]' from 'int [5]'
e:\c++\prob\cpp1.cpp(14) : error C2784: 'int __cdecl sz(T (&)[1])' : could not deduce template argument for ' (&)[1]' from 'char [10]'

Сам код
Код:
#include <iostream>
using namespace std;

//[implementation of sz]
template<class T,int size>
int sz(T (&arr)[size])
{
return size;
}

int main() {
int x[5] = {1,2,3,4,5};
char y[] = "123456789";
cout << sz(x) << " " << sz(y);
return 0;
}
« Последнее редактирование: 03-12-2007 20:01 от Алексей1153++ » Записан

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

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


« Ответ #18 : 22-05-2005 13:51 » 

Гром, какая синхронизация. Улыбаюсь
Записан

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

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


« Ответ #19 : 22-05-2005 13:58 » 

Улыбаюсь Ну дык естественно, кстати - компилировал только для уточнения текста ошибок и так понятно, что С таких вольностей как передача непонятно как в параметре еще и размера заданного неянво без конвертации при вызове, даст страшные ошибки.

Кстати прикол еще вот в чем. ТЕоретически такая передача данных невозможно.
Всмотритесь на объявления типа передаваемого... там передается рефреренс, т.е. ссылка - поинтер на элемент массива взятого от индекса, который якобы должен там передаваться. Но когда я пишу сам массив к нему не прилагается элемент размера. Это раз.
Т.е. формально такая запись уже не может существовать.
Во вторых при объявлении возникает неоднозначность, ссылка на какой именно элемент идет ведь сайх переменная неопределена, а в данном случае это должно быть задано явно. Улыбаюсь
Записан

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

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


« Ответ #20 : 22-05-2005 14:08 » 

Как я уже говорил, такую задачу теоретически можно решить. Но это надо вплотную заниматься с менеджером памяти. В Релиз моде не копался. Но в дебаг моде VC хранит таблици для динамических переменных. Статику даже не знаю, хранит компилятор инфу или нет. На эти таблици наткнулся, когда трасировал прогу, которая вешалась в дебаг моде, в релиз моде все проходило на ура.
Записан

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

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


« Ответ #21 : 22-05-2005 15:21 » 

Finch - ты не прав. Не ИМХО.
Эта задача формально в условии любого типа данных решения не имеет.
Даже несмотря на частное решение со стрингом.
Строка по сути представленна тем же массивом с учетом последнего в строке символа \0.

Однако - если мне не изменяет память - контроль за совпадением длин с аллоцированным лежит все равно на пользователе...
Ибо при записи:
Код:
char Str1[100] = "......."; 100 simbols
char Str2[50];
strcpy(Str1,Str2);
Все сработает за милую душу, не смотря на фактическую проблему с размером, и только в процессе выполнения кода вывалится с exception.

А иногда даже проскочит, если не зацепит принципиальных данных.

strlen(Str2) после копирования вернет 100.
Т.е. формально длина строки будет нормально определятся только при условии постоянной проверки строк на совместимость перед копированием, с учетом 100% правильного распередления памяти.

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

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

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

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

Щас махач будет Улыбаюсь.
Во-первых:
Цитата
Даже предложенная ссылка на \0 не имеет никакого смысла, так как выведенный массив не будет ее содержать. Массив чаров не заполняется функцией работы со строками и в его конце символа 0 не будет, ибо его туда никто не клал.
Позволю себе не согласиться. Я предлагал этот способ для частного случая, а именно
Код:
char y[] = "123456789";
Если я не ошибаюсь, то при такой инициализации компилятор сам дописывает в конце /0. Поэтому в данном случае я считаю, что можно так поступить и даже можно сделать проще strlen(y);. Это должно работать 100%.
 Во-вторых:
Цитата
nikedeforest, sizeof для массива xx возвращает размер этого массива в байтах, а sizeof(xx[0]) размер
одного эл-та этого массива в байтах.
Опять же позволю себе не согласиться. sizeof(xx) вернет размер указателя. В качестве подтверждения, я несколько месяцев назад столкнулся с этим и создал на форуме тему с тупым названием что-то типа
Цитата
sizeof() ошибается?
Найди ее, там это обсуждалось.
Гром, ты кажется там пост свой оставлял, поэтому может вспомнишь.
Цитата
я слишком много раз читал о том, что размер массива не определить.

А где читал если не секрет?
Несколько источников, все не припомню, но недавно видел статью об этом (или ответ на вопрос в ФАКе) на RSDN, надеюсь, ты не будешь заставлять меня найти эти статьи Улыбаюсь.
Цитата
Соответственно не имея параметра ни тип данных ни длину определить его длину невозможно... НЕ ИМХО - это ЗАКОН ЯЗЫКА С.
Ну наконец-то, именно это я и хотел прочитать Улыбаюсь.

Цитата
Да и про конверсию позабыли...
А что такое конверсия ?
немного флуда:
Цитата
C:\Documents and Settings\alexanderm\My Documents\Temp\TempDlg.cpp(182) :
Гром, настоящее имя - Александр? Улыбаюсь.
Записан

ещё один вопрос ...
Михалыч
Команда клуба

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

« Ответ #23 : 22-05-2005 15:27 » 

Да ладно вам... Улыбаюсь
Уж и подколоть молодежь низзя Улыбаюсь
А вдруг и у нас свои Эндрю Уайлды появятся???
Записан

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

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


« Ответ #24 : 22-05-2005 15:39 » 

Гром знаеш в чем прикол той проги был. Я создал динамический массив строк. Заполнял его корректно. Но при чтении, читал на один символ больше. При удалении этого массива через delete [], у меня выскакивала ошибка, о том что я залез в чужую область. И эта ошибка выскакивала именно в Дебаг моде. Выяснил, что ошибка выскакивает при проверке этих самых таблиц. Значит он как-то фиксил, что я читал чужое Улыбаюсь .
nikedeforest
Цитата
Да и про конверсию позабыли...
А что такое конверсия ?
Это я так понял, Гром имел виду про приведение типов.

Цитата
Гром, настоящее имя - Александр? Улыбнись.
Это ты намекаеш на безопасность данных? В принципе многие знают, как и кого зовут в миру на этом форуме.
Записан

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

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

« Ответ #25 : 22-05-2005 15:51 » 

Опять же позволю себе не согласиться. sizeof(xx) вернет размер указателя. В качестве подтверждения, я несколько месяцев назад столкнулся с этим и создал на форуме тему с тупым названием что-то типа
sizeof() ошибается?
Не, если массив создан динамически и хх в sizeof(xx) - это указатель - то да, будет размер указателя.
А если массив задан статически - то извините - это будет размер массива...
Записан

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

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


« Ответ #26 : 22-05-2005 15:55 » 

Кстати Гром Теорема Ферма a^x + b^x = c ^x звучит чуть по другому, насколько я знаю. Нельзя найти целые a,b,c для x>2 чтобы данное равенство выполнялось.

Вот что я нашел в книге
Цитата
Но формулировка теоремы Ферма очень проста: требуется доказать, что уравнение x^n + y^n = z^n не имеет решения в целых числах при n больше 2.
http://chudesa.by.ru/FLT.htm
« Последнее редактирование: 22-05-2005 16:05 от Finch » Записан

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

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

« Ответ #27 : 22-05-2005 16:09 » 

Да, ладно... Не раздувайте вы шум вокруг Ферма...
Я ведь так просто (честно говоря) пробный камешек кинул в форум.
На предмет историко-математической грамотности подрастающей смены.
Хотя сам отнюдь не математик. И даже не программист по образованию.
Я просто инженер-физик. Программист-самоучка с почти 20-летним стажем внедрения программ на производстве.
Записан

Поживем - увидим... Доживем - узнаем... Выживу - учту  Улыбаюсь
LP
Помогающий

ru
Offline Offline

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


Цитата
Вывод - не надо выкладывать непроверенные решения
Я проверял решение на 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, пожалуйста, попробуйте проверить.
Записан

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

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

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

Дык... Обязателно проверю... Только завтра...
Самому не терпится. Но дома принципиально не держу ничего, касающегося работы...
А программирования мне и на работе хватает, как результат - дома ни одного компилятора.
А жаль. Наверно поставлю... Улыбаюсь
Записан

Поживем - увидим... Доживем - узнаем... Выживу - учту  Улыбаюсь
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 » 

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

Не вижу никакого криминала в объявлении вида
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