Вопрос № 88360: Ищу книги Архангельского А.Я. Справочное руководство C++ Builder 6
Книга1 и Книга2. E-mail: ait1@stavre.elektra.ru. C Уважением, Князев А.Н....Вопрос № 88420: Здраствуйте, уважаемые эксперты!
Мне надо было решить 10 задач по программированию. 8 я решил, а две не могу. Помогите пожалуйста решить 2 задачи. Очень надо. Желательно сегодня. Очень жалательно. Вот тексты заданий:
вычислите значения м...Вопрос № 88435: Здравствуйте!
Подскажите пожалуйста принцип работы с функцией с неограниченным количеством параметров.
Например ф-я, что в приложении: мой способ получения след указателя не подходит - поправьте пожалуйста.
Спасибо...
Вопрос № 88.360
Ищу книги Архангельского А.Я. Справочное руководство C++ Builder 6
Книга1 и Книга2. E-mail: ait1@stavre.elektra.ru. C Уважением, Князев А.Н.
А в бумажном варианте купить ее можно на books.ru или ozon.ru
Ответ отправил: Терсков Сергей (статус: 10-ый класс)
Ответ отправлен: 24.05.2007, 10:25 Оценка за ответ: 4 Комментарий оценки: Рекомендуемая Терсковым Сергееммне пригодилась.Но нужно ,именно,Справочное руководство.
Вопрос № 88.420
Здраствуйте, уважаемые эксперты!
Мне надо было решить 10 задач по программированию. 8 я решил, а две не могу. Помогите пожалуйста решить 2 задачи. Очень надо. Желательно сегодня. Очень жалательно. Вот тексты заданий:
вычислите значения многочленов
P= a[n]*x^n + a[n-1]*x^(n-1) + ... + a[1]*x + a[0],
Q= a[0]*x^n + a[1]*x[n-1] + ... + a[n-1]*x + a[0], используя формулу Горнера. Коэффициенты многочленов заданы в виде вектора A = {a[0],a[1],...,a[n]}.
========================
И вторая
Дана матрица A[N][M]. Получите Y = X[1]*X[N] + X[2]*X[N-1] + ... + X[N]*X[1], где X[i] - наибольший элемент в строке с номером i матрицы A
Хотя бы объясните мне смысл второй задачи. Я его вообще не понял(
Помогите пожалуйста.
Отправлен: 24.05.2007, 16:49
Вопрос задал: Scart (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: kool
Здравствуйте, Scart!
Что касается второго вопроса, то там все просто -
найти наибольший из элементов в каждой из строк матрицы,
получим N элементов (поскольку у матрицы всего N строк),
X[i]- максимальный элемент i-ой строки матрицы.
Ну а потом считаем сумму по формуле: сумм.(X[i]*X[N-i+1]);i=1,...,N.
Удачи!
--------- I am.
Ответ отправил: kool (статус: Студент)
Ответ отправлен: 24.05.2007, 20:21 Оценка за ответ: 5 Комментарий оценки: Да, спасибо, разобрался со второй задачей.
Вопрос № 88.435
Здравствуйте!
Подскажите пожалуйста принцип работы с функцией с неограниченным количеством параметров.
Например ф-я, что в приложении: мой способ получения след указателя не подходит - поправьте пожалуйста.
Отвечает: Виктор Пырлик
Здравствуйте, Наумов Сергей Александрович / snov!
можно вот так...
Приложение:
--------- Надо пребывать господа, пребывать! Иначе ничего не получится!
Ответ отправил: Виктор Пырлик (статус: 3-ий класс)
Ответ отправлен: 24.05.2007, 20:16 Оценка за ответ: 4 Комментарий оценки: я не исключаю такой вариант, но я просил помочь с моей ошибкой "double* next_per = per + 4;", а не кардинально другой вариант, но все равно спасибо
Отвечает: John Paramol
Здравствуйте, Наумов Сергей Александрович / snov!
Принцип работы функции с неограниченным количеством параметров заключается в последовательном обращении к содержимому стека.
Попытаюсь объяснить подробно.
Такие функции имеют тип вызова __cdecl (его можно явно не указывать). Это означает, что параметры должны передаваться в функцию через стек, справа налево, причем количество параметров может быть не фиксировано.
Функция может получить доступ ко всем незаданным параметрам, через указатель на последний заданный параметр. Так как параметры хранятся в стеке последовательно, то, чтобы получить указатель, например, на следующий за последним параметр, нужно считать следующие 8 байтов (для типа double) за ним. Т.о. выражение &per+1 будет указывать на следующее 8-байтное вещественное значение. Или на другое, например, целое значение, если мы будем вызывать функцию к примеру так: Func(1,1.5,(int)5);
В приложении рабочий пример.
Для того, чтобы Вы лучше разобрались в этом, рассмотрим принцип работы стандартной ф-ии printf. Не вдаваясь в подробности, лишь основной принцип.
Первый параметр задан, как указатель на строку. Ф-ия сканирует эту строку посимвольно до символа конца строки. Если встречается символ '%', а за ним стоит один из определенных создателями ф-ии символов подстановки, например 'f', то функция берет из стека следующие за первым параметром 4 байта, переводит в текст, считая, что в них содержится вещественное число одинарной точности и подставляет на место этих символов. Если далее встречается, например, символ '%' и 'd', то ф-ия берет уже за этими 4 байтами следующие
4 байта и преобразует в текст в десятиричном виде, считая что в них содержится целое число. И так далее.
Думаю, принцип ясен.
Удачи.
Приложение:
--------- 1=2, at values 1 large enough
Ответ отправил: John Paramol (статус: 8-ой класс)
Ответ отправлен: 24.05.2007, 20:22 Оценка за ответ: 5 Комментарий оценки: Огромное спасибо! то что нужно
Отвечает: Ilkras
Здравствуйте, Наумов Сергей Александрович / snov!
точно! не подходит.
вы взяли переменную и манипулируете ей.
вместо этого надо взять адрес этой переменной - параметр, размещен в стеке и манипулировать им. при этом надо помнить, что стек "растет вниз".
таким образом берем указатель на параметр per - это адрес параметра. вычитаем 4 байта и получаем адрес следующего параметра и т.д.
это принцип, а работать лучше со стандартной библиотекой. можно посмотреть реализацию функции printf. ниже приведен пример из MSDN.
va_list - это char *
va_start - присваивает первому аргументу адрес второго
va_arg - продвигает пойнтер (первый аргумент) на длину второго аргумента.
что важно помнить:
1) надо иметь способ определить количество параметров функции, поскольку некакой метки конца списка параметров нет
2) надо знать типы параметров, чтобы правильно находить следующие параметры
еще раз советую почитать текст функции printf, заодно поймете как опасно ей пользоваться :) ее можно найти в инсталяции Visual Studio crtsrcprintf.c или в интернете.
удачи
Приложение:
Ответ отправил: Ilkras (статус: 10-ый класс)
Ответ отправлен: 25.05.2007, 01:18