Вопрос № 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-шки.
Кто мне подскажет как это реализовать, ато знаю Си только теоретически, а какие функции, какие библиотеки?..
И ещё очень буду благодарен за ссылки на хорошую документацию по именно программированию, а не теории синтаксиса Си.
Спасибо.
Отвечает: 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 работает с массивами строк, чисел и т.д., а как быть когда поиск производится в массиве структур, мне не достаточно возвращаемого указателя на элемент массива, мне бы получить номер элемента в массиве с тем чтобы впоследствии обратиться по этому номер уже в массиве структур.
я сейчас расплачусь! ;.(..
Говорю используй #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