Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


Новое направление Портала RusFAQ.ru:
MosHoster.ru - Профессиональный хостинг

Народное голосование ПРЕМИИ РУНЕТА-2007!
Голосуем за RusFAQ.ru >>

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 912
от 20.11.2007, 13:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 478, Экспертов: 72
В номере:Вопросов: 6, Ответов: 9


Вопрос № 109405: Добрый день уважаемые экспетры.подскажите пожалуйста что означает запись: 1. template <class X> double oper(char s) {... 2. X a1=(X)4; (притом переменная а1 никак в коде програмы не обьявлена) Большое спасибо!!!...
Вопрос № 109470: Здравствуйте! Подскажите как из фукнции получить массив?. Т.е. я в функции заполняю массив d[6]={1,2,3,4,5,6}, а затем я хочу вызвать функцию в программе, получить из нее массив и вывести на экран. Как одно значение вывести я знаю return x - напрмер,...
Вопрос № 109479: Здравствуйте, снова возникла проблема :). Подскажите кто сможет. Есть функция: float *ver (float *xr, float *a, float *b) { ... return P; } где xr - двумерный массив, a, b, P - одномерныетмассивы; Пытаюсь вызвать в програм...
Вопрос № 109480: Привет всем! Не могу понять, почему программа останавливается и не выполняется до конца... Может в синтаксисе вывода матрицы на экран ошибки? Среда - С++ Borland 3.1 Спасибо всем, кто ответит!...
Вопрос № 109482: Добрый день уважаемые эксперты. Столкнулся с проблемами в выполнении программ. Надеюсь на вашу помощь. Смысл обоих программ понятен но довести их до ума пока что не получается :( пример №1 Нужно вывести на экран эту фигуру . Ширина и высота ...
Вопрос № 109499: Здравствуйте эксперты! Подскажите плиз как сделать, чтобы эта линия не исчезала. Я понимаю, что я ее убиваю и она ессно исчезает, а как иначе сделать тогда? C++ Builder 5. Мне здесь уже советовали "Объявляете перем...

Вопрос № 109.405
Добрый день уважаемые экспетры.подскажите пожалуйста что означает запись:
1. template <class X> double oper(char s) {...

2. X a1=(X)4; (притом переменная а1 никак в коде програмы не обьявлена)

Большое спасибо!!!
Отправлен: 14.11.2007, 16:50
Вопрос задал: Макс Коваленко Юрьевич (статус: 1-ый класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Garmash Dima
Здравствуйте, Макс Коваленко Юрьевич!
1.Здесь функция - так называемый шаблон. данна запись мне не совсем понятна:
в параметрах функции должен присутствовать тип X.
например:
template <class X> double oper(char s, X d) {...
то есть если вы передадите в функцию целое значение, то заместо X подставится int. в общем тот, который вы передадите в функцию.
2. Это ,должно быть, написано внупри функции- это и есть объявление. если вы передадите в функцию целое значение, то заместо X подставится int. в общем тот, который вы передадите в функцию.
тоже самое и с классами можно делать. купите книгу по программированию потолще;)
надеюсь ответил.
---------
Шизофрения это нормально
Ответ отправил: Garmash Dima (статус: 2-ой класс)
Ответ отправлен: 14.11.2007, 17:04
Оценка за ответ: 5
Комментарий оценки:
большое вам спасибо. обязательно куплю =)


Вопрос № 109.470
Здравствуйте! Подскажите как из фукнции получить массив?. Т.е. я в функции заполняю массив d[6]={1,2,3,4,5,6}, а затем я хочу вызвать функцию в программе, получить из нее массив и вывести на экран. Как одно значение вывести я знаю return x - напрмер, а как массив?
Отправлен: 15.11.2007, 02:32
Вопрос задала: Mart (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Argus98
Здравствуйте, Mart!
можно вывести адрес первого элемента массива, например, если у нас есть массив a[5], мы можем написать return a; или return &a[0]; две записи эквивалентны, а потом, когда вызываем функцию, пишем, например, b = func(); если func возвращает адрес массива float a[5], то b должна быть float*. функция при этом тоже должна быть float*.
вообще лучше не возвращать массив, а передавать в качестве аргумента указатель на него. поэтому лучше сделать его как элемент структуры, в которой также хранить информацию о его размерах. либо если вы ещё не знаете про структуры, делать такую функцию void func(float *a, int m, int n); где мы передаём указатель на массив float* a, и размеры по горизонтали и по вертикали int m, int n.
Ответ отправил: Argus98 (статус: 2-ой класс)
Ответ отправлен: 15.11.2007, 02:49
Оценка за ответ: 5

Отвечает: Титов Михаил Анатольевич
Здравствуйте, Mart!

В Си имя массива фактически является константным, то есть неизменяемым, указателем. Его значение - адрес первого (с индексом 0) элемента массива. Следовательно для того чтобы получить массив из функции, нужно вернуть этот адрес. Выглядеть может примерно так:

int d[6];
int *func(); // функция с типом возвращаемого значение - указатель на int

int main(void) {
int *p, i;
....
p = func();
for(i = 0; i<6; i++) printf("%d ", p[i]);
...
}

int *func()
{
for(i = 0; i<6; i++) d[i] = i;
return d;
}

Но код совершенно беcсмысленный по следующей причине. Обратите внимание, что мы использовали внешний массив! Делать вот так

int *func2()
{
int e[6];
for(i = 0; i<6; i++) e[i] = i;
return e;
}

нельзя! Автоматические переменные, т.е. объявленные и определенные внутри функции (более строго - внутри блока {}), недействительны после выхода из функции (блока). Значение указателя p = func2() будет недействительным. То что в реальности эти значения могут какое-то время существовать сути дела не меняет, это уже просто технические детали.
Для статических переменных-массивов такая конструкция вполне может быть использована:

int *func3()
{
static int f[6];
for(i = 0; i<6; i++) f[i] = i;
return f;
}

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

Правильный (общепринятый) принцип работы с массивами в функциях состоит в том, чтобы передавать в функцию в качестве параметров указатель на начало массива и количество элементов массива. В таком случае специально возвращать из функции какое то значение уже необязательно. Но возможно. Часто бывает полезно вернуть указатель на начало массива или на конец массива, на последний обработанный элемент и т.п. Пример в приложении.

Другой способ - использовать в качестве возвращаемого значения структуру с полем типа массив менее гибок и на практике применяется редко.

Литература: K&R п. 5.3

Приложение:

Ответ отправил: Титов Михаил Анатольевич (статус: 3-ий класс)
Ответ отправлен: 15.11.2007, 04:38
Оценка за ответ: 5

Отвечает: Ross
Здравствуйте, Mart!

Еще вы можете выделить внутри функции область памяти и вернуть на нее указатель:
char* func()
{
char *RetArr = new char[100];

//---запишем в 0 элемент 1
RetArr[0] = 1;
}
Тогда данные, записанные в такой массив не будут уничтожены при выходе из функции и освобождение памяти ложится на программиста. Т.е. нужно вызвать оператор delete, когда данные больше не нужны:

char *DataPtr = func();
//---чтото делаем с массивом
delete [] DataPtr;
---------
Доступно только то, что видимо (c) Б. Керниган
Ответ отправил: Ross (статус: Студент)
Ответ отправлен: 16.11.2007, 01:02
Оценка за ответ: 4


Вопрос № 109.479
Здравствуйте, снова возникла проблема :). Подскажите кто сможет.
Есть функция:
float *ver (float *xr, float *a, float *b) {
..
return P;
}
где xr - двумерный массив, a, b, P - одномерныетмассивы;
Пытаюсь вызвать в программе по нажатию на кнопку:
float xr[5][6]={{1,2,3,4,5,7},{1,7,4,8,3,7},{3,5,2,2,1,7},{2,3,1,2,1,5},{4,5,7,8,9,5}};
float a[5]={0,0,0,0,0};
float b[5]={6,6,6,6,6};
void __fastcall TForm1::Button5Click(TObject *Sender)
{
Label2->Caption=FloatToStr(ver(xr, a, b)[q]);
q++;
}
Выдает ошибку:
[C++ Warning] Unit1.cpp(132): W8004 'l' is assigned a value that is never used
если входыми параметрами сделать не xr, a, b, то все работает без пробем...а вот массив не получается никак кинуть в функцию....подскажите, пожалуйста.
Отправлен: 15.11.2007, 06:11
Вопрос задала: Mart (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Lemeshev Konstantin
Здравствуйте, Mart!
То что вы написали ([C++ Warning] Unit1.cpp(132): W8004 'l' is assigned a value that is never used) - это не ошибка, а предупреждение - означающее, что переменная l обявлена, ей присвоено значение, но больше она не используеться.
А значит либо ее вообще можно удалить, либо где-то ошибка в алгоритме.

А чтобы функция, принимала двумерный массив, то есть 2 варианта.

1. Формировать двумерный массив динамически.
Напиример так (массив размером 1х1)
float **xr=new float*[1];
xr[0]=new float[1];
xr[0][0]=1;

И изменить прототим фукнкции на следующий float *ver (float **xr, float *a, float *b)
2. Оставить задание массива как есть. Но оствить последнюю размерность постоянной, сменив прототип на следующий

float *ver (float xr[][6], float *a, float *b)
Ответ отправил: Lemeshev Konstantin (статус: 5-ый класс)
Ответ отправлен: 15.11.2007, 07:20


Вопрос № 109.480
Привет всем!
Не могу понять, почему программа останавливается и не выполняется до конца... Может в синтаксисе вывода матрицы на экран ошибки? Среда - С++ Borland 3.1
Спасибо всем, кто ответит!

Приложение:

Отправлен: 15.11.2007, 06:24
Вопрос задал: LexXx (статус: Практикант)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Sov
Здравствуйте, LexXx!
В самом начале вашей программы есть цикл
Дрпустим я ввел матрицу размера 2
j=j-1;//тогда j=1
i=1;
for (b[1][t]=a[1][t]; j!=0; j--)//после выполнения тела цикла jуменьшится на 1
{
if (a[i][j]>a[i][j+1]) b[i][j]=a[i][j+1];
else b[i][j]=a[i][j];
j=j-1;//да еще здесь вы уменьшаете на 1. j становится равным -1 и 0 никогда не будет равно
};
Ответ отправил: Sov (статус: 8-ой класс)
Ответ отправлен: 15.11.2007, 09:17


Вопрос № 109.482
Добрый день уважаемые эксперты. Столкнулся с проблемами в выполнении программ. Надеюсь на вашу помощь. Смысл обоих программ понятен но довести их до ума пока что не получается :(
пример №1
Нужно вывести на экран эту фигуру . Ширина и высота задается пользователем.
*************
* *
* *
* *
* *
* *
*************
сама программа понятна, но вот как сделать так чтобы в этой фигуре внутри не было символов как на рисунке. подскажите что я не дописал или как дописать чтоб получилось именно так.

пример №2
При помощи цикла показать на экран календарь текущего месяца на ноябрь.
по идее если просто перебрать for-ом диапазон + табуляция будет что то похожее на календарь, но остается вопрос как сделать отступы или может тут непосредственно не помешали дни(пон, втор и т. д) ?
хотя бы уже разобраться с отступами, а дни по идее и не нужны.
точно знаю что программу можно решить посредством вложенных двух циклов и оператора break но вот именно как пока понять не могу.
Примеры моих попыток есть в приложении.

Приложение:

Отправлен: 15.11.2007, 07:07
Вопрос задал: Белоусов Алексей Леонидович (статус: 1-ый класс)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Sov
Здравствуйте, Белоусов Алексей Леонидович !
В первой программе можно просто использовать разные циклы
Во второй для вывода можно используется манипулятор setw и флаг left
(или вместо setw можно написать
cout.width(3);
cout<<i;
)

Приложение:

Ответ отправил: Sov (статус: 8-ой класс)
Ответ отправлен: 15.11.2007, 09:07
Оценка за ответ: 5
Комментарий оценки:
большое спасибо за советы и решение программ!!!

Отвечает: Mihail Yarlykov
Здравствуйте, Белоусов Алексей Леонидович !
Две программки для ваших задач

Приложение:

---------
Нет ничего невозможного!

Ответ отправил: Mihail Yarlykov (статус: 4-ый класс)
Ответ отправлен: 15.11.2007, 09:13
Оценка за ответ: 5
Комментарий оценки:
большое спасибо за решение программ!!!!! В форуме отобразилась фигура не совсем та что вводил я первоначально, но вы сообразили что именно я хотел и сделали так как надо. Спасибо !!!!!


Вопрос № 109.499
Здравствуйте эксперты!

Подскажите плиз как сделать, чтобы эта линия не исчезала.
Я понимаю, что я ее убиваю и она ессно исчезает, а как иначе сделать тогда?
C++ Builder 5.

Мне здесь уже советовали
"Объявляете переменную типа TLineSeries компонентом класса TDrawForm:
class TDrawForm
{
//code
private:
TLineSeries m_Line;
};"

Ну а если я заранее не знаю сколько мне надо будет таких линий, и не только линий. Если бы я заранее знал, я бы их просто в чарте на форме сразу создал и никаких проблем :)
Весь смысл в том, чтобы в рантайме их создавать.

Приложение:

Отправлен: 15.11.2007, 09:27
Вопрос задал: Муратов Радик Анатольевич (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Fenixk19
Здравствуйте, Муратов Радик Анатольевич!
Вы могли бы создавать динамический массив типа std::vector<TLineSeries*> и помещать туда все вновь созданные линии. Удалять можно с помощью какого-то специального действия со стороны пользователя, или тупо в деструкторе объекта TDrawForm. Подробнее смотрите информацию по поводу стандартного шаблона vector.
Ответ отправил: Fenixk19 (статус: 3-ий класс)
Ответ отправлен: 18.11.2007, 01:54
Оценка за ответ: 5


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Техподдержка портала, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.62.2 от 20.11.2007
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное