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

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


Информационный Канал Subscribe.Ru

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

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

Выпуск № 268
от 12.12.2005, 21:42

Администратор:Калашников О.А.
В рассылке:Подписчиков: 250, Экспертов: 42
В номере:Вопросов: 5, Ответов: 9


Вопрос № 30948: 1) Где и как правильно надо в приложениях с использоанием MFC объявлять глобальные переменные ? Почему так косячит конструкция: #ifndef <name> // || if !defined(<name>) без разницы что #define <name> ... #endif <...
Вопрос № 30949: Здравствуйте, эксперты! Дело в том, что никак не найду инфу как с помощью Си создать определённый графический файл. Необходимо просто "нарисовать" любую буковку с помощью матрицы.типа 00100 01010 10001 и закинуть это тво...
Вопрос № 30963: Здраствуйте. Подскажите как в picturebox запихать файл изображений, bmp, jpg или gif. P.S. Не смейтесь я только учусь. Спасибо всем ответившим....
Вопрос № 30982: Уважаемые эксперты спасибо всем, кто откликнулся на проблему с быстрым поиском (qsort, bsearch), однако хотел еще уточнить следующее: попробовал использовать для поиска bserch, работает. Но у меня вот какая проблема данная функция как и qsort работае...
Вопрос № 30998: Здравствуйте уважаемые эксперты. У меня к вам такой вопрос. Сделал программу про ханойские башни, в ней на экран выводятся действия пользователя, например переставь диск с 1 на 2, переставь диск с 1 на 3 и так далее, причсем кол-во действий зав...

Вопрос № 30.948
1) Где и как правильно надо в приложениях с использоанием MFC объявлять глобальные переменные ? Почему так косячит конструкция:
#ifndef <name> // || if !defined(<name>) без разницы что
#define <name>
...
#endif

Она же специально создана для того, чтобы компилятор по 10 раз не компилил один и тот же файл, но у меня почему я только ошибки вижу link error <exp> already defined in <...>.obj. Причем самый прикол в том, что если создать отдельный файл *.h и подключать его только к одному из *.cpp все компилится нормально, как только подключаем к двум и более *.cpp вылезают ошибки.

Я уже замучился. Если с функциями еще нормально катит, добавляю их в файлы, где определяется InitInstance, то строкам это не помогает, он все равно найдет ошибки в файлах obj при линковке. String Table использовать не предстволяется возможным. У меня много вкладок, и все организовано с помощью массивов, а туда массив не запихнуть. Где и как правильно нужно объявлять переменные, чтобы они были видны, желательно во всей программе ?

2) И как можно получить доступ из объетка класса вкладки к переменной или функции, которая находится в объекте главного диалога, который создается при InitInstance. На одном из форумов прочитал про AfxGetApp(), но у меня что-то AfxGetApp() не видит переменных, да и вообще он видит только стандартные функции, а не мои. Как можно получить к ним доступ ?
Отправлен: 06.12.2005, 23:02
Вопрос задал: RedDevil (статус: 2-ой класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Zitz
Здравствуйте, RedDevil!

1) Ну переменные на то и глобальные, что бы их объявлять где хочешь только не локально ;), например объяви его перед первы вхождением в первую функцию которая его использует...
Ну а можешь сразу после этой каки:
ifndef <name> // || if !defined(<name>) без разницы что
#define <name>
...
#endif
Не знаю в чем тут у тебя проблема, но если ты хочешь чтобы лист подрубался один раз, то объяви внем статик, а потом проверяй его... раз уж это непонятно...
Но вообще то в том месте где у тебя многоточее идет тело листа и с точки зрения логики все верно: если недефайн то читаем, елсе идем на эндиф...
2) Чтобы получить доступ к глобалу из другого листа надо поставить перед ним эстерн, например:
в диалоге хочу получить доступ к стандартному глобалу C[имя]App theApp, так для этого еще раз его объявляю как глобал в этом листе только добавляю:
extern C[имя]App theApp;
Вот так-то...
Что касается доступа к переменным диалога, то я не знаю как правильно, но в таких случаях делаю так:
C[имя_класса_диалога]Dlg * dlg;
dlg=(C[имя_класса_диалога]Dlg *)AfxGetApp()->m_pMainWnd;
Т.к. обычно эти указатели указывают на одно и тоже (простите за тавталогию)...
ну а потом соответственно:
dlg->Моя_переменная++;
ну или что-то в этом духе...
Успехов!
Ответ отправил: Zitz (статус: 2-ой класс)
Отправлен: 07.12.2005, 12:47


Вопрос № 30.949
Здравствуйте, эксперты!
Дело в том, что никак не найду инфу как с помощью Си создать определённый графический файл. Необходимо просто "нарисовать" любую буковку с помощью матрицы.типа
00100
01010
10001
и закинуть это творение в файл(Можно BMP)
А также обрабатывать подобным образом другие BMP-шки.
Кто мне подскажет как это реализовать, ато знаю Си только теоретически, а какие функции, какие библиотеки?..
И ещё очень буду благодарен за ссылки на хорошую документацию по именно программированию, а не теории синтаксиса Си.
Спасибо.
Отправлен: 06.12.2005, 23:25
Вопрос задал: Russkin Alexey (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Ujin Antikvar
Здравствуйте, Russkin Alexey!

Могу дать хороший книги по Си как по теории Си так и по программированию на Си. Пиши мне на мыло и я тебе их вышлю.

Приложение:

---------
"Будущее принадлежит тем, кто верен своей мечте" - Элеонора Рузвельт

Ответ отправил: Ujin Antikvar (статус: 4-ый класс)
Отправлен: 06.12.2005, 23:34

Отвечает: Лучников Юрий Владимирович
Здравствуйте, Russkin Alexey!

Думаю вам стоит обратиться к описанию формата того же bmp.
НАсчет литературы, очень качественная подборкапо адресу:
ponteley.al.ru
Ответ отправил: Лучников Юрий Владимирович (статус: 4-ый класс)
Отправлен: 06.12.2005, 23:35

Отвечает: Raptor1
Здравствуйте, Russkin Alexey!
Если интересует именно С, то почитай про форматы графических файлов, а если сойдет для WIN32, то:
CBitmap m_bmpPict;
LPDWORD lpBuffer;
BITMAP b;
b.bmHeight=100;
b.bmWidth=100;
b.bmBitsPixel=32;
b.bmType=0;
b.bmPlanes=1;
lpBuffer=new DWORD[100*100];
b.bmBits=lpBuffer;
for(i=0;i<100*100;i++)
{
lpBuffer[i]=0x2233ff00;
}
m_bmpPict.CreateBitmapIndirect(&b);
delete [] lpBuffer;
Ответ отправил: Raptor1 (статус: Студент)
Отправлен: 08.12.2005, 23:05


Вопрос № 30.963
Здраствуйте. Подскажите как в picturebox запихать файл изображений, bmp, jpg или gif.
P.S. Не смейтесь я только учусь.
Спасибо всем ответившим.

Приложение:

Отправлен: 07.12.2005, 03:57
Вопрос задал: Yarking (статус: 1-ый класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: estiGi
Здравствуйте, Yarking!
Тебе не кажется, что вопрос немного не туда? Все таки С++ и C# - вещи немножечко так разные...
Ну а специально для тебя роем МСДН -
PictureBox.Image Property - это объект класса Image
У класса Image есть метод FromFile. Экспериментируй. Вроде ничего сложного.
Я предпологаю, что будет примерно так:
pictureBox1.Image = Image.FromFile ("C:\image.jpeg");
Проверять меня немножко влом, ты уж извини... :)
Ответ отправил: estiGi (статус: 9-ый класс)
Отправлен: 07.12.2005, 04:18
Оценка за ответ: 5


Вопрос № 30.982
Уважаемые эксперты спасибо всем, кто откликнулся на проблему с быстрым поиском (qsort, bsearch), однако хотел еще уточнить следующее: попробовал использовать для поиска bserch, работает. Но у меня вот какая проблема данная функция как и qsort работает с массивами строк, чисел и т.д., а как быть когда поиск производится в массиве структур, мне не достаточно возвращаемого указателя на элемент массива, мне бы получить номер элемента в массиве с тем чтобы впоследствии обратиться по этому номер уже в массиве структур.
Отправлен: 07.12.2005, 14:02
Вопрос задал: Воробьев Дмитрий Владимирович (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Zitz
Здравствуй, высокоуважаемый!

я сейчас расплачусь! ;.(..
Говорю используй #include <algorithm>, там все функции поиска, замены, сортировок и т.п.
И причем они шаблоны, т.е. им все равно какой аргумент целое, строка, структура...
Все равно ведь ищешь структру по какому либо параметру!
Вот смотри пример:
есть структура - Персона. Допустим данный сайт решил использовать ее чтобы хранить
сведения о всех зарегистрированных пользователях... Ну там имя, эдентификатор и мыло.
А потом пользователь входит набивает свое имя и подключается, что происходит в данном
случае - массив сортируется по полю имя, запускается бинарисерч которая возращает
зарегистрирован такой чувак или нет, если нет то просят зарегится...
Но вот чувачек зарегин и ему нужен доступ к своим данным (что бы мыло к примеру поменять)
так вот тут запускается финд который возращает указатель на структуру...
Тоже самое если ищешь по эдентификатору, только указатель на структуру используется, чтобы
вывести остальные данные... Если тобой кто-то заинтересовался по аЙДи.

Если же тебя и это не устраивает, то предлагаю написать тебе собственный алгоритм
бинарного поиска специально для твоего проекта, кстати алгоритм не такой уж и сложный!
Вот только с кусортом попаришься...

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

Приложение:

Ответ отправил: Zitz (статус: 2-ой класс)
Отправлен: 08.12.2005, 17:20


Вопрос № 30.998
Здравствуйте уважаемые эксперты.
У меня к вам такой вопрос. Сделал программу про ханойские башни, в ней на экран выводятся действия пользователя, например переставь диск с 1 на 2, переставь диск с 1 на 3 и так далее, причсем кол-во действий зависит от кол-ва дисков из которых состоит башня. Так вот в чем проблема мне нужно добавить в эту программу счетчик действий, так что бы выводилось вот такое: 1: переставь диск с 1 на 2, 2: переставь диск с 1 на 3 и т.д.. Но загвоздка заключается в том что если например дисков 50 то тогда кол-во действий равно 1125899906842623. Это число не поместится не в один из целочисленных типов. Знаю что можно решить при помощи массива, но вот как это сделать несоображу.
Ниже код самой программы, куда нужно добавить счетчик.
Не судите строго я тока учусь.

Приложение:

Отправлен: 07.12.2005, 18:40
Вопрос задал: Grubby (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Лучников Юрий Владимирович
Здравствуйте, Grubby!

Попробуйте использовать тип двойной точности Double (правда представление чисел будет в экспоненциальной форме) или применить теорию длинных чисел.
Информацию по данной теории можно найти по ссылке: http://algolist.manual.ru/maths/longnum.php
Ответ отправил: Лучников Юрий Владимирович (статус: 4-ый класс)
Отправлен: 07.12.2005, 18:50
Оценка за ответ: 5
Комментарий оценки:
Мне не нужно представление чисел в экспоненциальной форме, в том то и дело =(

Отвечает: PROD
Здравствуйте, Grubby!
1) не совсем понимаю каким образом расчитывается значение n, изначально когда piramida(n, '1', '3', '2'); вызывается из void main () значение n не определено, по сути там или 0 или какое то случайное число (что черевато глюками в будующем)
2) пожалейте того кто будет работать с вашей программой - на то чтоб переложить 50 дисков уйдет вся жизнь и еще детям останется :)
3) чтоб сохранить такое большое число можно воспользоватся double или long double, например. единственная трудность в том что там значения сохраняются не совсем целыми (например вместо 1 можете получить 0.99999999) так что придется помучится с округлением.
при помощи массива эту проблему можно решить несколькими путями. например разрезать значение по разрядам , допустим нам надо сохранить число 1`234`567`890 в массив int i[3];
long n=1234567890;
i[0]=n/1000000; // это будет 1234
n=n%1000000; // это будет 567890
i[1]=n/100; // это будет 5678
n=n%100; // это будет 90
i[2]=n; // это будет 90
ну а возвращать в обратном порядке:
n=i[0]*1000000+i[1]*100+i[2];
по идее должно работать
Ответ отправил: PROD (статус: 1-ый класс)
Отправлен: 07.12.2005, 20:42
Оценка за ответ: 5
Комментарий оценки:
Я там в коде немного перепутал там после запроса ввода кол-ва дисков ответ (кол-во дисков) записывается не в переменную disc а в переменную n.
А так за ответ спасибо, хоть и не совсем то что нужно. Заранее не известно какое кол-во дисков выбирет пользователь, он может выбрать 1 диск или 5, в этом случае твой способ не прокатит.

Отвечает: Raptor1
Здравствуйте, Grubby!
Интересно, на каком компе у тебя отработает алгоритм в котором шагов 2^50-1. У меня в одной программе 2^32 перебирается несколько часов (около 6). Т.е. у тебя будет работать порядка 91 года, ну считая сложность в 100 раз меньшей, год. А вообще если число не влезает в разрядную сетку используй тип с плавающей точкой double, или целый __int64.
Ответ отправил: Raptor1 (статус: Студент)
Отправлен: 08.12.2005, 23:06


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

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

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

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

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


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


© 2001-2005, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Яндекс Rambler's Top100 hotlog_js="1.0"; hotlog_r=""+Math.random()+"&s=314124&im=101&r="+escape(document.referrer)+"&pg="+ escape(window.location.href); document.cookie="hotlog=1; path=/"; hotlog_r+="&c="+(document.cookie?"Y":"N"); hotlog_js="1.1";hotlog_r+="&j="+(navigator.javaEnabled()?"Y":"N") hotlog_js="1.2"; hotlog_r+="&wh="+screen.width+'x'+screen.height+"&px="+ (((navigator.appName.substring(0,3)=="Mic"))? screen.colorDepth:screen.pixelDepth) hotlog_js="1.3" hotlog_r+="&js="+hotlog_js; document.write("HotLog")

Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.cplus
Архив рассылки
Отписаться
Вспомнить пароль

В избранное