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

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


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

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

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

Выпуск № 1091
от 29.08.2008, 19:35

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

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


Вопрос № 142074: Уважаемые эксперты, в одном источнике увидел как написан макрос для определения смещения члена структуры в байтах. <div style="margin:15px; margin-top:10px"><div><b><font color="gray">Код:</font></b></div><pre style="margin: 0px; padding: 6px; bor...
Вопрос № 142102: Здравсвуйте эксперты, сейчас изучаю СИ пишу на turbo C не могу нигде найти как обьявить булевскую переменную...
Вопрос № 142105: Здравсвуйте эксперты, такой вот код: main() { float x,y; printf("x="); scanf("%e",&x); y=sqrt(x); printf("y= %e ",y); y=x*x; printf("y= %e ",y); } выдает т...
Вопрос № 142107: Здравсвуйте эксперты, такой вот код: main() { float x,y; printf("x="); scanf("%e",&x); y=sqrt(x); printf("y= %e ",y); y=x*x; printf("y= %e ",y); } выдает т...
Вопрос № 142120: Здравствуйте экперты, а как очистить в turbo c экран, как в Паскале при помощи clrscr...
Вопрос № 142124: здравствуйте эксперты, при вычеслении корня из отрицательного числа, программа не выдает ошибка, однака пишет об это уже в рабочем окне, можно это как-то убрать?...

Вопрос № 142.074
Уважаемые эксперты, в одном источнике увидел как написан макрос для определения смещения члена структуры в байтах.
Код:
#define offsetof(type, mem) ((size_t) ( (char *)&((type *) 0)->mem - (char *)((type *) 0)))

Поясните, пожалуйста, смысл: нулевой указатель здесь преобразуется к типу type ? Что это дает?
Отправлен: 24.08.2008, 08:07
Вопрос задал: Warobushek (статус: 1-ый класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Lang21
Здравствуйте, Warobushek!

Если бы по нулевому адресу находилась структура типа type ,
то все, наверное, было бы понятно:

(char*)(type*) 0 - адрес структуры, т.е. начала области памяти, отведённой под неё.
&((char*)((type*) 0 -> mem)) - адрес её элемента mem ,
и, соответственно, смещение вычисляется как разность этих адресов.

Компилятор интерпретирует содержимое памяти в соответствии с типом указателя.
Иначе говоря, он вычисляет положение элементов структуры на основании определения её типа,
и использует полученные адреса для доступа к элементам структуры.
При вычислении адресов неважно,что фактически находится в данной области памяти,
поэтому в макросе в качестве адреса структуры годится любой адрес, в том числе и нулевой.

Замечание.
Вместо (char*)(type*) 0 можно было бы написать просто (char*) 0 ,
но в выражении (type*)0->mem преобразование типа необходимо.
чтобы было известно, что 0 должен рассматр иваться как адрес структуры определённого типа.

Пример использования макроса в приложении.

Редактирование по просьбе эксперта.
--------
∙ Отредактировал: Janpit, Профессионал
∙ Дата редактирования: 24.08.2008, 11:27 (время московское)

Приложение:

Ответ отправил: Lang21 (статус: Студент)
Ответ отправлен: 24.08.2008, 10:43
Оценка за ответ: 5
Комментарий оценки:
жаль нет 6 баллов -(


Вопрос № 142.102
Здравсвуйте эксперты, сейчас изучаю СИ пишу на turbo C не могу нигде найти как обьявить булевскую переменную
Отправлен: 24.08.2008, 14:19
Вопрос задал: Tribak (статус: 10-ый класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 4)

Отвечает: Troyan
Здравствуйте, Tribak!
Цитирую:
"В Стандарте С89 определено пять фундаментальных типов данных:
char - символьные данные;
int - целые;
float - с плавающей точкой;
double - двойной точности;
void - без значения."
таким образом в стандартном Си нету переменной bool, которая появляется в дальнейших его расширениях.
Вместо него можно использовать тип char, занимающий один байт памяти. Сравнение при этом идет также, как и с обычной булевой переменной:
char a;
if (a) {}...
При этом значение логического выражение будет равно false только если переменная равна нулю. Во всех остальных случаях результатом будет true
---------
Цени законы своего сердца, иди на обгон! Будь человеком, не запачкай свою совесть!
Ответ отправил: Troyan (статус: Студент)
Ответ отправлен: 24.08.2008, 14:53
Оценка за ответ: 5


Вопрос № 142.105
Здравсвуйте эксперты, такой вот код:

main()



{
float x,y;
printf("x=");
scanf("%e",&x);
y=sqrt(x);
printf("y= %e ",y);
y=x*x;
printf("y= %e ",y);

}
выдает такое:
x=9
y= -3.27000e+04
y= 8.10000e+01

что я делаю не так, до этого всегда писал на Паскале сейчас пытаюсь на Си адапитироваться, функцию sqr похоже нет
подскажите пожалуйста
Отправлен: 24.08.2008, 15:22
Вопрос задал: Tribak (статус: 10-ый класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 7)

Отвечает: Dr_Andrew
Здравствуйте, Tribak!
Привожу тексты программ (см. приложение) как на "чистом" Си, так и на C++. Можно видеть, что ввод - вывод стредствами C++ проще, чем Си.
По пунктам.
Программа на C / C++ обычно начинается директивой препроцессора #include, приблизительно соответствующей uses в Паскале. В данном случае мы подключаем заголовочные файлы ввода-вывода (stdio.h для C и iostream.h для C++), а также math.h, в котором содержится объявление функции извлечения квадратного корня sqrt
В главной функции программы main (приблизительно соответствует begin - end Паскаля) объявляем переменные для хранения чисел с плавающей точкой (тип float) x и y. Идентификатором этих чисел в функциях printf и scanf Си является "%f". В C++ стандартные числа можно просто передавать в поток вывода / брать из потока с помощью объектов cin и cout.
Если Вы работаете в командной строке, то необходимости в getch() (приблизительно соответствует readln Паскаля) нет, но при желан ии можете раскомментировать строки #include <conio.h> и getch() - этот фрагмент кода работает в компиляторах фирмы Borland, включая Turbo C.

Приложение:

Ответ отправил: Dr_Andrew (статус: Студент)
Ответ отправлен: 24.08.2008, 20:50
Оценка за ответ: 5


Вопрос № 142.107
Здравсвуйте эксперты, такой вот код:

main()



{
float x,y;
printf("x=");
scanf("%e",&x);
y=sqrt(x);
printf("y= %e ",y);
y=x*x;
printf("y= %e ",y);

}
выдает такое:
x=9
y= -3.27000e+04
y= 8.10000e+01

что я делаю не так, до этого всегда писал на Паскале сейчас пытаюсь на Си адапитироваться, функцию sqr похоже нет
подскажите пожалуйста
Отправлен: 24.08.2008, 15:24
Вопрос задал: Tribak (статус: 10-ый класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 5)

Отвечает: Boriss
Здравствуйте, Tribak!
Вы. по-видимому, привели не весь код, но подключить math.h, явно забыли. В нем описана функция sqrt
Далее, выводить можно так, как в приложении - это слегка измененный Ваш код

Приложение:

---------
Вывод - то место в тексте, где вы устали думать

Ответ отправил: Boriss (статус: Профессор)
Россия, Саранск
Организация: Мордовский госуниверситет, Саранск, Факультет Электронной Техники
WWW: Программирование на Паскале
----
Ответ отправлен: 24.08.2008, 16:19
Оценка за ответ: 5


Вопрос № 142.120
Здравствуйте экперты, а как очистить в turbo c экран, как в Паскале при помощи clrscr
Отправлен: 24.08.2008, 18:33
Вопрос задал: Tribak (статус: 10-ый класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Boriss
Здравствуйте, Tribak!
clrscr(); и есть. Нужно подключить conio.h
Смотри слегка измененный пример прежний

Приложение:

---------
Вывод - то место в тексте, где вы устали думать

Ответ отправил: Boriss (статус: Профессор)
Россия, Саранск
Организация: Мордовский госуниверситет, Саранск, Факультет Электронной Техники
WWW: Программирование на Паскале
----
Ответ отправлен: 24.08.2008, 18:45
Оценка за ответ: 5
Комментарий оценки:
пасиб большое


Вопрос № 142.124
здравствуйте эксперты, при вычеслении корня из отрицательного числа, программа не выдает ошибка, однака пишет об это уже в рабочем окне, можно это как-то убрать?
Отправлен: 24.08.2008, 18:49
Вопрос задал: Tribak (статус: 10-ый класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Boriss
Здравствуйте, Tribak!
Так и должно быть, ведь программа "не знает", что ей предстоит вычислить такое
Проверяйте подкоренное выражение. В приложении измененный тот же пример

Приложение:

---------
Вывод - то место в тексте, где вы устали думать

Ответ отправил: Boriss (статус: Профессор)
Россия, Саранск
Организация: Мордовский госуниверситет, Саранск, Факультет Электронной Техники
WWW: Программирование на Паскале
----
Ответ отправлен: 24.08.2008, 19:16


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

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

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

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

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

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


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


© 2001-2008, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Техподдержка портала, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале

∙ Версия системы: 5.1 beta(win) от 11.08.2008

Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное