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

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


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

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

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

Выпуск № 976
от 25.01.2008, 09:30

Администратор:Калашников О.А.
В рассылке:Подписчиков: 480, Экспертов: 59
В номере:Вопросов: 2, Ответов: 3

Нам важно Ваше мнение об этой рассылке.
Оценить этот выпуск рассылки >>


Вопрос № 119350: Уважаемые эксперты! подскажите пожалуйста, что означает следующая задача: ----------------------------------------------------------------------------- постройте случайную последовательность плотность распределения которой принимает значе...
Вопрос № 119363: Уважаемые эксперты, кто бы объяснил: int x[2][2]; ... x[1][1]==*(*(x+1)+1) Это катастрофа, этого не может быть! Понятно, что при int **x; x= new int* [2]; for (int i=1; i<2; i++) { x[i]= new int [2]; ...

Вопрос № 119.350
Уважаемые эксперты!
подскажите пожалуйста, что означает следующая задача:
-----------------------------------------------------------------------------
постройте случайную последовательность плотность распределения которой принимает значение 1/4 на отрезке [0;2] и 1/2 на отрезке [4,5].
-----------------------------------------------------------------------------
как мне это реализовать используя функцию rand языка Си. У меня компилятор Borland C3.1++
Отправлен: 19.01.2008, 22:37
Вопрос задал: Warobushek (статус: 1-ый класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Хватов Сергей
Здравствуйте, Warobushek!

Это означает, что с вероятностью 1/2 будут возвращаться равномерно распределённые (1/2 - потому что его длина 2) значения в первом диапазоне, и 1/2 - во втором.

Приложение:

Ответ отправил: Хватов Сергей (статус: Студент)
Ответ отправлен: 20.01.2008, 11:34
Оценка за ответ: 3
Комментарий оценки:
за ответ по теории спасибо, но вот код программы не работает((:
--функция rdouble не возвращает число в диапазоне [0..range]
--где используется функция dpfun?
--что означает inline ??


Вопрос № 119.363
Уважаемые эксперты, кто бы объяснил:
int x[2][2];
...
x[1][1]==*(*(x+1)+1)
Это катастрофа, этого не может быть! Понятно, что при
int **x;
x= new int* [2];
for (int i=1; i<2; i++)
{
x[i]= new int [2];
}
}
элеметов типа int - 4 и int* - 2, и в етом случае хоть x[1][1], хоть *(*(x+1)+1) одно тоже.
Отправлен: 20.01.2008, 00:57
Вопрос задал: Usernoname (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Verena
Здравствуйте, Usernoname!
Тут всё действительно в пределах нормы. Дело в том, что в памяти двумерный массив и одномерный хранятся абсолютно одинаково, язык только добавляет внешний интерфейс для скрытия сложной адресации. У Вас есть некий массив по адресу х, и этот адрес как бы указывает на первый столбец (или строку - не важно) двумерного массива. Но, при этом, он является указателем на первый элемент массива (т.е. элемент x[0][0] в адресации си). Когда Вы разыменовываете один адрес (т.е. пишете *х), то эта переменная продолжает указывать на первый элемент массива (для нас это как бы первый элемент первого столбца (строки). В памяти всё это выглядит примерно так:
x[0][0] x[0][1] x[1][0] x[1][1]
На элемент x[0][0] указывает *x, на элемент x[1][0] - *(х+1), соответственно если прибавить ещё один *(*(х+1)+1), то мы окажемся на x[1][1].
А в Вашем примере из минифорума Вы распечатываете один и тот же адрес - адрес первого элемента в массиве (т.е. расположенного первым в памяти).
Надеюсь, Вам стало понятнее :)
---------
Эта история - не для истории, понимаешь?
Ответ отправила: Verena (статус: Студент)
Ответ отправлен: 21.01.2008, 21:33

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

Отвечаю с учетом вашего вопроса в минифоруме.
После объявления

int x[2][2];

переменная x трактуется компилятором как указатель на массив из двух элементов типа int каждый, а не просто как указатель на указатель на int, то есть это не то же самое, что

int **y;

разница проявляется при арифметических операциях с указателями (адресная арифметика) и трактовке выражений с указателями-массивами.

Пусть sizeof(int) равно 4. Тогда выражение (y + 1) даст значение на 4 больше, чем y. Выражение (x + 1) будет иметь значение на 8 большее, чем x. То есть к x прибавиться объем, занятый одной строкой массива, то есть двумя элементами int. Компилятор четко отслеживает размер объекта на который ссылается указатель и при арифметических операциях с указателем использует это значение. Поэтому "выражение (x+1) смещает указатель на" 2 * sizeof(int).

Далее, что делает компилятор, когда встречает выражение *(*(x+1)+1) ? Вы пишите:

"... но ведь *(*(x+1)+1) фактически означает: перейти по адресу (x+1), прибавить к тому что находится по етому адрсу, полученное значение трактовать как адрес, по которуму обращаемся за результатом! "

Это ровно так бы и было, если бы х был обявлен как указатель на указатель на int (int **x). Но это не так!, x объявлен как двухмерный массив. Поэтому "*(*(x+1)+1) фактически означает:" прибавить к x размер одной строки массива, взять полученный результат, прибавить к нему размер одного элемнта массива, "полученное значение трактовать как адрес, по которуму обращаемся за результатом!"

Я думаю, что теперь вас не должно смущать, что

printf("%p", x);
printf("%p", *x); //==

выдают одинаковые результаты. Первый оператор - это адрес начала массива, второй - адрес начала первой строки массива. Эти ведь один и тот же адрес, верно?
Ответ отправил: Титов Михаил Анатольевич (статус: 5-ый класс)
Ответ отправлен: 24.01.2008, 04:53


Вы имеете возможность оценить этот выпуск рассылки.
Нам очень важно Ваше мнение!
Оценить этот выпуск рассылки >>

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

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

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

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

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


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


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

В избранное