Вопрос № 146364: Привет всем! Подскажите плиз как сделать чтобы у статической переменной адрес (в виртуальной памяти) был кратен 16? Спасибо за ответы....Вопрос № 146366: Ещё раз здравствуйте уважаемые эксперты. Я вчера вам уже задавал вопрос под номером 146208. Я благодарен вам за оказанную ранее помощь. Условие задачи полностью аналогично. Но у меня возникла проблема другого рода. <br...Вопрос
№ 146373: Здравствуй realbustard!!! Спасибо за программы! Все просто ок! Подскажи пожалуйста я правильно делаю или нет? Рекурсия. Вычислить значение функции с помощью рекурсивной формулы y=45+sinx+ sin2x+sin3x+...sin15x; x=2,76...
Вопрос № 146.364
Привет всем! Подскажите плиз как сделать чтобы у статической переменной адрес (в виртуальной памяти) был кратен 16? Спасибо за ответы.
Отправлен: 07.10.2008, 18:07
Вопрос задал: kool (статус: Практикант)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 7)
Отвечает: Хватов Сергей
Здравствуйте, kool!
Стандартом не оговорено, и в каждом компиляторе по-разному.
Я знаю (не помню для кого) #pragma pack(16) int var; #pragmа pack() // без этого режим останется даже после конца include-файла, что приведёт к тяжёлым последствиям для gcc: int var __attribute__ ((aligned (16)));
Ответ отправил: Хватов Сергей (статус: Практикант)
Ответ отправлен: 07.10.2008, 18:29 Оценка за ответ: 4 Комментарий оценки: Для Виндовос у var адрес не кратен 16. Проверка простая - int *i=&var;
Отвечает: Sk0rp
Здравствуйте, kool! Можно еще Microsoft Specific для VC++ использовать (непортабельно)
typedef __declspec(align(32)) struct { int a; double b; } S; int n = 50; // array size S* p = (S*)aligned_malloc(n * sizeof(S), __alignof(S));
Ответ отправил: Sk0rp (статус: 6-ой класс)
Ответ отправлен: 07.10.2008, 18:48 Оценка за ответ: 4 Комментарий оценки: вместо такого огорода можно воспользоваться динамической памятью, тем более не удалось проверить его работоспособность и найти описание aligned_malloc и __alignof. Большие сомнения что эта конструкция будет работать как надо?
Вопрос № 146.366
Ещё раз здравствуйте уважаемые эксперты.
Я вчера вам уже задавал вопрос под номером 146208.
Я благодарен вам за оказанную ранее помощь.
Условие задачи полностью аналогично.
Но у меня возникла проблема другого рода.
А именно:
Теперь мне нужно создать условия с помощью оператора if, которое бы позволяло вывести сообщение об ошибке, с подробной информацией о ней и завершить работу программы в том случае если список не был создан пользователем. И как избавиться от не
понятных цифр. Допустим если выбрать 3 пункт программы.
То есть если даже мы не создали список на экран выводится какие то непонятные вещественные числа.
Откуда они беруться и как сделать так чтобы они не выводились на экран в том случае если список пуст или его элементы равны 0.
Отвечает: Sk0rp
Здравствуйте, Орлов Михаил Степанович! Во первых стоит все-таки прописать конструктор по умолчанию для struct ilist как показано ниже struct ilist { ilist() : next(0) {} float num; ilist *next; };
это полезно, что бы не было объектов с ведущими в никуда указателями. а проверка на пустой список у вас тривиальна, нужно проверять на ноль указатель на голову. см приложение.
Приложение:
Ответ отправил: Sk0rp (статус: 6-ой класс)
Ответ отправлен: 07.10.2008, 19:11 Оценка за ответ: 5 Комментарий оценки: Ваш ответ выше всяких похвал.
Вы просто гений.
Спасибо за помощь.
Я очень рад что вы мне помогли.
Вы даже не представляете сколь была необходима мне ваша помощь.
Вопрос № 146.373
Здравствуй realbustard!!! Спасибо за программы! Все просто ок! Подскажи пожалуйста я правильно делаю или нет?
Рекурсия. Вычислить значение функции с помощью рекурсивной формулы
y=45+sinx+ sin2x+sin3x+...sin15x; x=2,76
Приложение:
Отправлен: 07.10.2008, 19:09
Вопрос задал: Shah-ilya (статус: Посетитель)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: Виктор Пырлик
Здравствуйте, Shah-ilya!
"Рекурсия" - это когда вызывает функция сама себя.. например код на С
double f(int i, double x) { static double y = 0; if(i == 0)
return y; y += sin(i*x); return f((i-1),x);
} /* главная функция*/ int main(int argc, char** argv) { int i = 0; double y = 0,x = 0; printf("
Введите i: "); scanf("%i",&i); printf("
Введите x: "); scanf("%lf",&x); y = f(i,x)+45; printf("
Результат: y(%.2lf) = %.3lf при i = %i
",x,y,i); return 0; }
а вот на языке С++
Код:
#include <iostream> #include <math.h> using namespace std; // Рекурсия. Вычислить значение функции с помощью рекурсивной формулы // y=45+sinx+ sin2x+sin3x+...sin15x; x=2,76 double
f(int i, double x) { static double y = 0; if(i == 0) return y; y += sin(i*x); return f((i-1),x);
} //главная функция int main(int argc, char** argv) { int i = 0; double y = 0,x = 0; cout << "Введите i: "; cin >> i; cout << "Введите x: "; cin >> x; y = f(i,x)+45; cout << endl <<"Результат: y(" << x <<") = &
quot; << y << " при i = "<< i<< endl; return 0; }
--------- не получается там - где не пробуют
Ответ отправил: Виктор Пырлик (статус: Профессионал) Россия, Екатеринбург Тел.: 89043822027 ICQ: 490191733 ---- Ответ отправлен: 07.10.2008, 20:18 Оценка за ответ: 5 Комментарий оценки: Спасибо большое, Виктор. Радует что на этом сайте действительно помогают, в отличии от других сайтов. Спасибо!
Отвечает: realbustard
Здравствуйте, Shah-ilya! Ваше решение верно, только вы используюте не рекурсивную ф-ю, а итеративный метод, т.е. используюте цикл. Рекурсивная ф-я - это ф-я, которая вызывает сама себя. В данной задаче это выглядит так: f(i-1,x)+sin(i*x). Происходит подсчет значения при i==15 , а потом ф-я вызывает себя при i=(i-1) , т.е. 14 и так до 1.
Вообще рекурсивные ф-ии опасны и кроме того, требуют много памяти и по-возможности их желательно не применять. Удачи на сессии!!!
Приложение:
--------- Учись так, как-будто собираешься жить вечно; живи так, как-будто завтра умрешь (Отто фон Бисмарк)
Ответ отправил: realbustard (статус: 4-ый класс)
Ответ отправлен: 07.10.2008, 20:46 Оценка за ответ: 5 Комментарий оценки: Спасибо большое realbustard!
Как раз таки удача на сессии и понадобится. Если я не ошибаюсь Вам повысили статус?! Так держать! Хорошо что есть такие люди как Вы!