powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / упростить код, убрать простыню однотипного кода
13 сообщений из 13, страница 1 из 1
упростить код, убрать простыню однотипного кода
    #39067897
Фотография MMM_Corp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.

Пытаюсь переписать работу с OpenGL на вызов динамически их функций, получается, но както очень многословно. Вопросы внутри кода. Спасибо! Чистый С.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
#include <windows.h>
#include "dgl.h"

HINSTANCE hModule = NULL;

// здесь можно както попроще писать, подобных вызовов буде много
typedef void (WINAPI *LPFNGETSTRINGLENGTH1)(GLenum mode);
void glBegin(GLenum mode){
	(LPFNGETSTRINGLENGTH1)(mode);
}


void loadmethod(void, PWSTR){
	// как здесь прописать универсально вот это: 
	/*
			LPFNGETSTRINGLENGTH1 glmethod = (LPFNGETSTRINGLENGTH1) GetProcAddress(hModule, "glBegin");
		if (glmethod != NULL){
			// loaded, can work now
			MessageBox(0, "Load glBegin ok", "ok", MB_ICONINFORMATION);						
		}
		else {
			MessageBox(0, "Error load glBegin !", "Error", MB_ICONERROR);
		}
	*/
}




BOOL dglInit(){
	char* CDLLName = "opengl32.dll";

	hModule = LoadLibrary(CDLLName);

	//DIRECT3DCREATE9 Direct3DCreate9;
	//Direct3DCreate9 = (DIRECT3DCREATE9) GetProcAddress(library,"Direct3DCreate9");

	if (hModule != NULL){
		LPFNGETSTRINGLENGTH1 glmethod = (LPFNGETSTRINGLENGTH1) GetProcAddress(hModule, "glBegin");
		if (glmethod != NULL){
			// loaded, can work now
			MessageBox(0, "Load glBegin ok", "ok", MB_ICONINFORMATION);						
		}
		else {
			MessageBox(0, "Error load glBegin !", "Error", MB_ICONERROR);
		}
	
	}
	// TODO: del
	else 		
		MessageBox(0, "Error load opengl32.dll !", "Error", MB_ICONERROR);
	return hModule != NULL;
}
...
Рейтинг: 0 / 0
упростить код, убрать простыню однотипного кода
    #39067907
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я тебе не советую тут ничего упрощать. Одна иницилизация. Скучно.
Ты напиши хотя-бы тысячи четыре строк и
потом приходи в форум со ссылкой на git или svn и посмотрим
что можно рефакторить и как.

Сама по себе OpenGL с точки зрения ее API достаточно умная библиотека и лаконичная.
Если ты ее будешь правильно (без избыточных пере-инициализаций) использовать
то это успех.
...
Рейтинг: 0 / 0
упростить код, убрать простыню однотипного кода
    #39067916
Фотография MMM_Corp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

я пока что склоняюсь к тому чтобы взять на питоне написать скриптик который сделает эту скучнейшую работу автоматом, всетаки 350 перелопатить руками вообще не интересно...
...
Рейтинг: 0 / 0
упростить код, убрать простыню однотипного кода
    #39067920
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MMM_CorpПытаюсь переписать работу с OpenGL на вызов динамически их функций ...
Зачем это надо?
...
Рейтинг: 0 / 0
упростить код, убрать простыню однотипного кода
    #39067922
Фотография MMM_Corp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

чтобы скрыть таблицу импорта напр. это не я сам себе такую задачку придумал, такой у нас подход к всяким импортам что мало чуток выходит за рамки обязательного для программы, кроме того это может быть полезно когда хотим чтото одно использовать напр. DirectX, OpenGL, OpenGL glut и т.д..... в общем надо
...
Рейтинг: 0 / 0
упростить код, убрать простыню однотипного кода
    #39067926
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда пиши скрипт для генерации cpp. Быстрее будет для 350 функций.
...
Рейтинг: 0 / 0
упростить код, убрать простыню однотипного кода
    #39067946
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MMM_Corpmayton,

я пока что склоняюсь к тому чтобы взять на питоне написать скриптик который сделает эту скучнейшую работу автоматом, всетаки 350 перелопатить руками вообще не интересно...
Ты пришёл в фан-сектор С++ чтобы спросить о скриптике на Питоне? Щас тебя закидают шапками.

Для автоматизации рутины есть препроцессор. #define/#ifdef/#endif/#else. Попробуй его.
...
Рейтинг: 0 / 0
упростить код, убрать простыню однотипного кода
    #39067967
Зимаргл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton,

Научно доказано, что питон - тормоз )
...
Рейтинг: 0 / 0
упростить код, убрать простыню однотипного кода
    #39067970
Фотография MMM_Corp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ребята, все что мне нужно это взять с стандартного gl.h и переделать его на динамический вызов функций, это все....

но вот как это сделать это уже другой вопрос, да хоть на ночь поставил бы хоть самый тормознутый перл какойто или еще что... главное не долбить руки об клаву на переводе 350 функций на динамический вызов. Если знаете как ускорить процесс, или как решить быстро подобную проблему - велком. За этим и пришол. Предложите варианты получше чем как-то автоматизировано нагенерить нужный код средствами православного С... я ж не против, но изза нехватки опыта в сишке пока не знаю как это сделать. Как идея витает - написать скриптик на питоне напр. или на делфи который нагенерит нужный код. Препроцесинг не очень понятно как мне здесь поможет, не приходит в голову ничего честно говоря, открыт для идей.
...
Рейтинг: 0 / 0
упростить код, убрать простыню однотипного кода
    #39067982
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MMM_Corpглавное не долбить руки об клаву на переводе 350 функций на динамический
вызов. Если знаете как ускорить процесс, или как решить быстро подобную проблему -
велком.
Копипаст - очень сильная вещь. Скопировать объявления функций, вставить в начало каждой
"typedef ", в середину - "(* T" и ")" и... всё, готово. Остаётся только простенький макрос
с объявлением переменной и получением адреса.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
упростить код, убрать простыню однотипного кода
    #39090682
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MMM_CorpПытаюсь переписать работу с OpenGL на вызов динамически их функций,Например можно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
#define LEN(array) (int)(sizeof(array) / sizeof(array[0]))

struct func_ref_t {
  const char* name;
  FARPROC func;
};

HINSTANCE _open_gl_lib = NULL;
struct func_ref_t _open_gl_funcs[] = {
  /* 0 */ {"glEnable", NULL},
  /* 1 */ {"glDisable", NULL},
  /* 2 */ {"glBegin", NULL},
  /* 3 */ {"glEnd", NULL},
};

void load_open_gl_lib() {
  int i;

  assert(_open_gl_lib == NULL);
  _open_gl_lib = LoadLibrary("opengl32.dll");
  if (_open_gl_lib == NULL)
    error("Cannot load library 'opengl32.dll'.");

  for (i = 0; i < LEN(_open_gl_funcs); i++) {
    assert(_open_gl_funcs[i].func == NULL);
    _open_gl_funcs[i].func = GetProcAddress(_open_gl_lib, _open_gl_funcs[i].name);
    if (_open_gl_funcs[i].func == NULL)
      error("Cannot import OpenGL function '%s'.", _open_gl_funcs[i].name);
  }
}

void unload_open_gl_lib() {
  int i;

  for (i = 0; i < LEN(_open_gl_funcs); i++) {
    _open_gl_funcs[i].func = NULL;
  }

  if (_open_gl_lib != NULL) {
    FreeLibrary(_open_gl_lib);
    _open_gl_lib = NULL;
  }
}

void dglEnable(GLenum cap) {
  typedef void (__stdcall * f)(GLenum cap);
  assert(strcmp(_open_gl_funcs[0].name, "glEnable") == 0);
  (*(f)_open_gl_funcs[0].func)(cap);
}

void dglDisable(GLenum cap) {
  typedef void (__stdcall * f)(GLenum cap);
  assert(strcmp(_open_gl_funcs[1].name, "glDisable") == 0);
  (*(f)_open_gl_funcs[1].func)(cap);
}

void dglBegin(GLenum mode) {
  typedef void (__stdcall * f)(GLenum mode);
  assert(strcmp(_open_gl_funcs[2].name, "glBegin") == 0);
  (*(f)_open_gl_funcs[2].func)(mode);
}

void dglEnd() {
  typedef void (__stdcall * f)(void);
  assert(strcmp(_open_gl_funcs[3].name, "glEnd") == 0);
  (*(f)_open_gl_funcs[3].func)();
}



MMM_CorpЧистый С.Почему? Вполне можно писать на C++, но использовать его как better C, или как C with Classes. Тогда функции-обёртки (dgl*) можно сделать inline, и их крошечный overhead станет вообще нулевой.

MMM_Corpглавное не долбить руки об клаву на переводе 350 функций на динамический вызов.Очень маловероятно, что у вас в коде будут использоваться 350 разных OpenGL-функций. Добавляйте функции-обёртки по мере необходимости. Заодно сильно сэкономите на количестве вызовов GetProcAddress при инициализации OpenGL.

MMM_Corp
Код: plaintext
1.
2.
//DIRECT3DCREATE9 Direct3DCreate9;
//Direct3DCreate9 = (DIRECT3DCREATE9) GetProcAddress(library,"Direct3DCreate9");

Ваша вера в OpenGL не сильна :).

maytonMMM_Corpmayton,

я пока что склоняюсь к тому чтобы взять на питоне написать скриптик который сделает эту скучнейшую работу автоматом, всетаки 350 перелопатить руками вообще не интересно...
Ты пришёл в фан-сектор С++ чтобы спросить о скриптике на Питоне? Щас тебя закидают шапками.Да ладно, когда script генерирует C++-код -- это нормальный подход.
...
Рейтинг: 0 / 0
упростить код, убрать простыню однотипного кода
    #39091942
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пётр Седов,
при вызове функций, нет проверки на инициализацию. Т.к. инициализация по отношению к вызову функций не атомарна, то потенциально есть ошибка это.

(круглый)
...
Рейтинг: 0 / 0
упростить код, убрать простыню однотипного кода
    #39093278
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolobok0при вызове функций, нет проверки на инициализацию.Да, можно проверять, что функции dgl* вызываются между load_open_gl_lib и unload_open_gl_lib:
Код: plaintext
1.
2.
3.
4.
5.
6.
void dglEnable(GLenum cap) {
  typedef void (__stdcall * f)(GLenum cap);
  assert(strcmp(_open_gl_funcs[0].name, "glEnable") == 0);
  assert(_open_gl_funcs[0].func != NULL);
  (*(f)_open_gl_funcs[0].func)(cap);
}



MMM_Corp, если используете только Visual C++, то можете в книге «Programming Applications for Microsoft Windows» (Джеффри Рихтер) почитать раздел «Delay-Loading a DLL», вдруг вам подойдёт.
Microsoft Visual C++ 6.0 offers a fantastic new feature to make working with DLLs easier: delay-load DLLs. A delay-load DLL is a DLL that is implicitly linked but not actually loaded until your code attempts to reference a symbol contained within the DLL.
Также, при работе с DLL крайне советую бесплатную программу Dependency Walker . Она делает как статический анализ, так и динамический (запускает указанную программу и отслеживает вызовы LoadLibrary/GetProcAddress).
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / упростить код, убрать простыню однотипного кода
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]