Вопрос № 98659: Здравствуйте, господа эксперты Ж)
Моя программа - редактор карт для будущей игры. Карты она хранит в двумерном массиве. На месте каждой клетки - рисунок местности. Но мне очень нужно, чтобы клетки прорисовывались не как в шахматах :
0 0 0 0<...Вопрос № 98702: Накопилось много вопросов:
1.
typedef void (*f)(); // А что, я так понял что я так понял эта строчка работает всегда правильно даже если напишем typedef void (WINAPI* f)()
//и как вообще надо объявлять такие вещи
main()
{<br...Вопрос № 98729: Здравствуйте!
Ответьте, пожалуйста, на простой вопрос (для вас). Как на С++ вывести значок подключения к интернету после успешной отработки функции RasDial(...)?
С уважением, Владимир....Вопрос № 98740: Здравствуйте! В приложении текст программы, рекурсивно распечатывающей строку "TRAM-PAM-PAM...". Объясните пожалуйста, как разворачивается эта рекурсия и почему результат программы -"...MAP-MAP-MART"...Вопрос № 98743: Доброе время суток эксперты.
Начал программировать на C++ в BSD 2006. Раньше программировал на Delphi. А теперь решил изучить и C++.. Программы такие маленькие. Н вот в чем загвоздка. Мне не понятно как переводить из одного типа в другой.
На...
Вопрос № 98.659
Здравствуйте, господа эксперты Ж)
Моя программа - редактор карт для будущей игры. Карты она хранит в двумерном массиве. На месте каждой клетки - рисунок местности. Но мне очень нужно, чтобы клетки прорисовывались не как в шахматах :
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
а вот так:
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
Чтобы вам было проще, прилагаю код функции, распечатывающей поле:
Если я правильно Вас понял, Вы хотите покрыть игровое пространство не квадратами, а шестиугольниками (тогда к любой ячейке будут примыкать 6 соседних). Если так, то посмотрите ответы на вопрос 54322 - там эта тема уже обсуждалась.
--------- Сомневайся во всём! Реальность часто бывает не такой, как мы о ней думаем.
Ответ отправил: Delph (статус: 7-ой класс)
Ответ отправлен: 17.08.2007, 09:54
Попробуйте в массив [8][4] записывать данные в виде:
10101010
01010101
10101010
01010101
где 1 - карта, 0 пробел.
Тогда массив будет заполняться примерно так:
int a[4][8];
for (int i = 0; i<4; i++){
for (int j = 0; j<8; j++){
if ( ((j%2)!=0) && ((i%2)!=0) ){
a[i][j] = 1;
} else if (((j % 2) ==0) && ((i%2)==0)){
a[i][j] = 1;
} else a[i][j] = 0;
}
}
Вместо 1 подставляете нужный битмап и координаты.
Правильно заданный вопрос это уже половина ответа!!!
--------- Жить вредно - от неё умирают
Ответ отправил: Maxim V.G. (статус: 3-ий класс)
Ответ отправлен: 18.08.2007, 17:47 Оценка за ответ: 5
Вопрос № 98.702
Накопилось много вопросов:
1.
typedef void (*f)(); // А что, я так понял что я так понял эта строчка работает всегда правильно даже если напишем typedef void (WINAPI* f)()
//и как вообще надо объявлять такие вещи
main()
{
//...........
f funk;
funk=(f)GetProcAddress(dll,"funksion");
//.........
}
2.Если загрузивший dll екзешник закрыть и в его коде убрать FreeLibrary то dll останется в памяти?
а если dll dll находилась в NTFS потоке main.exe:my.dll то что случиться при закрытии main.exe? dll выгрузится или нет?
3. extern "C" _declproc(dllexport) void funk()
почему-то когда я смотрел примеры то везде вышеупомянутая строчка была прототипирована в хедере а затем тело описано в cpp
складывается впечатление что хедер обязателен так ли это
4.extern "C" _declproc(dllexport) void funk()
объявив так функцию я делаю её доступной для все программ
Отправлен: 17.08.2007, 09:04
Вопрос задал: Tatarin (статус: 2-ой класс)
Всего ответов: 3 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: Delph
Здравствуйте, Tatarin!
Отвечу на Ваш второй вопрос. При открытии любой dll-библиотеки устанавливается счётчик приложений/других_библиотек, использующих данную. Каждый LoadLibrary увеличивает счётчик на 1, а FreeLibrary - уменьшает. Когда счётчик уменьшится до нуля, библиотека выгружается из памяти. Если FreeLibrary не вызывается, то не происходит и уменьшения счётчика, следоватеьно библиотека останется в памяти даже после того, как закрыто единственное вызвавшее её приложение.
--------- Сомневайся во всём! Реальность часто бывает не такой, как мы о ней думаем.
Ответ отправил: Delph (статус: 7-ой класс)
Ответ отправлен: 17.08.2007, 09:27 Оценка за ответ: 5 Комментарий оценки: Спасибо за понятный ответ
Отвечает: Aristos
Здравствуйте, Tatarin!
1. Таким способом объявляется указатель на функцию. Синтаксис следующий:
typedef ret_type(call_conv *pf_name)(args);
ret_type - тип возвращаемого значания
call_conv - правила вызова функции (порядок и способ передачи агрументов и т.д.)
args - список типов аргументов функции
pf_name - имя объявляемого типа, указателя на функцию.
Дальше с ним можно работать как с любым другим типом, и указателем.
В приложении пример использования.
2. Действие LoadLibrary/FreeLibrary распространяется только на текущий процесс, поэтому при завершении приложения динамическая библиотека будет выгружена. Про NTFS потоки ничего сказать не могу.
3. Заголовочный файл не обязателен при создании библиотеки.
_declproc(dllexport) позволяет обойтись без .def файла, описывающего экспортируемые функции.
extern "C" - позволяет избежать декорирования имени, свойственного С++. Декорирование имени (name mangling) - искажение имени, позволяющее компилятору различать одноименные функции. Например, при перегрузке - void f(int) и void f(double).
4. Да. К объявленной таким образом функции можно будет получить доступ способом как в вопросе 1.
Приложение:
Ответ отправил: Aristos (статус: 3-ий класс)
Ответ отправлен: 17.08.2007, 14:44
Отвечает: kool
Здравствуйте, Tatarin!
1. typedef void (WINAPI* f)() - объявление f как типа указателя
на ф-цию типа WINAPI x(); Так что здесь все правильно без ереси!
2. нет не останется, если была в его адресном пространстве.
3. Так удобней, чтоб не запутаться.
4. Они и тка все доступны. Странный вопрос.
Удачи!
--------- I am.
Ответ отправил: kool (статус: Практикант)
Ответ отправлен: 17.08.2007, 18:54 Оценка за ответ: 5 Комментарий оценки: Краткость сестра таланта
Вопрос № 98.729
Здравствуйте!
Ответьте, пожалуйста, на простой вопрос (для вас). Как на С++ вывести значок подключения к интернету после успешной отработки функции RasDial(...)?
С уважением, Владимир.
Отправлен: 17.08.2007, 13:27
Вопрос задал: Vasvladal (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: Новиков Андрей Викторович
Здравствуйте, Vasvladal!
Все зависит от того куда надо вывести в значек.
Если надо вывести значек в статус баре то вам поможет
Здравствуйте! В приложении текст программы, рекурсивно распечатывающей строку "TRAM-PAM-PAM...". Объясните пожалуйста, как разворачивается эта рекурсия и почему результат программы -"...MAP-MAP-MART"
Приложение:
Отправлен: 17.08.2007, 16:59
Вопрос задал: Rockie (статус: 2-ой класс)
Всего ответов: 3 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Sema
Здравствуйте, Rockie!
Судя по коду ты уходишь на самый низ рекурсии (то бишь доходишь до последнего элемента массива)
а только потом начинаешь вывод на экран.
ссответственно получается вывод наоборот
поменый местами вывод символа экран и рекурсивный вызов
Ответ отправил: Sema (статус: 3-ий класс)
Ответ отправлен: 17.08.2007, 17:05 Оценка за ответ: 5 Комментарий оценки: Ребята, этот код не надо исправлять и я тоже понимаю что рекурсия сначала "доходит до конца, а потом разворачивается". Мне интересен сам механизм.. Ведь не все рекурсивные ыункции так делают. Возможно есть ссылки где можно почитать именно про такого рода "сворачивания-разворачивания".
Отвечает: kool
Здравствуйте, Rockie!
Просто строка напечатана в обратном порядке,
чтобы было понятнее работа рекурсии.
Сначала рекурсивный вызов Display доводит
указатель строки str до ее конца, а потом с этого
конца опять же по рекурсии начинается распечатка.
Удачи!
--------- I am.
Ответ отправил: kool (статус: Практикант)
Ответ отправлен: 17.08.2007, 18:54 Оценка за ответ: 5
Отвечает: Попов А.С.
Здравствуйте, Rockie!
В приложении исправленный листинг
Приложение:
Ответ отправил: Попов А.С. (статус: 2-ой класс)
Ответ отправлен: 18.08.2007, 09:37 Оценка за ответ: 5
Вопрос № 98.743
Доброе время суток эксперты.
Начал программировать на C++ в BSD 2006. Раньше программировал на Delphi. А теперь решил изучить и C++.. Программы такие маленькие. Н вот в чем загвоздка. Мне не понятно как переводить из одного типа в другой.
Например ф-ия MoveFileA(); (WINAPI)
Не как не могу разобраться.
MoveFileA( ExtractFilePath( ParamStr( 1 ) ) + 'Update_New.exe', ParamStr( 1 ) );
Хочу так вызвать. Но тут компилятор начинает стращно ругаться по поводу типов. И выводит такую ошибку [C++ Error] Remove.cpp(20): E2129 Character constant too long (or empty)
Это че такое??? Как побороть? Как вызвать эту ф-ию напишите мне нормально пожалуйста я хоть посмотрю...
Отвечает: Aristos
Здравствуйте, Уваров Андрей Александрович!
Дело в том, что работа со стороками в С/С++ отчается от Pascal/Delphi.
1. Строковая константа выгдядит "string", а не 'string'. Кроме того, она оканчивается нулевым символом (об этом позаботится компилятор). 'A' таким образом определяются отдельные символы.
2. Строки не являются интегральными типами, поэтому для них не определены операции канкатенации (сложения). Необходимо пользоваться вспомогательными функциями.
3. Для удобства можно пользоваться классом std::string, стандартной библиотеки stl. Для этого класса определены операции над строками.
Примерный код в приложении.
Приложение:
Ответ отправил: Aristos (статус: 3-ий класс)
Ответ отправлен: 17.08.2007, 18:11 Оценка за ответ: 5 Комментарий оценки: Большое спасибо! Очень помогли... В Pm все решилось )))
Отвечает: Новиков Андрей Викторович
Здравствуйте, Уваров Андрей Александрович!
Я могу Вам сказать, что ход мыслей у Вас верен. Однако строку лучше формировать отдельнно.
CString str=ExtractFilePath( ParamStr( 1 ) );
str+="Update_New.exe"
MoveFileA( str.GetBufer(1), ParamStr( 1 ) );