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