MY備忘録

色んな分野の勉強初心者.

小旅行に行きまして, 酒を飲みまして,

  • たまには温泉でも
    • 飯がとても美味しいんですよ
    • で, 今回持ち込んだお酒
  • ってだけです

たまには温泉でも

いつもの面子3名と温泉旅行に行っておりました. 理由は特にありません, 行きたいね~そだね~って感じです. 強いて言えば, 早目の卒業旅行?

続きを読む

C++の国際標準規格と最近見ているpage

C++言語の標準規格

ふと, C++言語の標準規格ってなんだろうと思いまして, 少し調べたところ, ISO/IEC 14882がそれにあたりそうですね. 1998年に策定されたのがC++98, 2011年でC++11, 2014年でC++14, 2017年でC++17ってところですかね. C++20が策定中だとかなんだとか.

ISOはInternational Organiation for Standardization(https://www.iso.org/), IECはInternational Electrotechnical Commission(http://www.iec.ch/)の略称ですね.

で, pdfが落ちてないかなぁ, と思ったわけですが, 有料ですよね, 知ってました(https://www.iso.org/standard/68564.html).

公式の規格書を読みたかったのですが, しばらくはhttps://cpprefjp.github.io/さんにお世話になりそうです.

 

で, どうして規格なんて知りたいかと申し上げますと, C++の標準が知りたかったわけでございます. 何かしらのapplicationを製作するなら, OS(Operating System)への依存性が低い, いわゆるmulti-platformなものを目指して作成すべきなのかなぁと少しばかり思ったわけです. OS依存性が高い 低いのそれぞれの利点をしっかりと洗い出さないと, なんとも言えない話だとは思いますけれども.

現在, multi-olatform開発の必要性が迫っている, という訳でもないのですが.

 

現在, Microsoft社のVisual Studio Community 2017(https://visualstudio.microsoft.com/ja/free-developer-offers/)を使用してC++言語programの開発を行っているわけですが, やはり, 他のOSで試した時に, どのような動作をするのかというのは心配だったりします. この構造体は他のOSの標準libraryでも定義されているのか, などですね.

classや構造体を標準libraryから使う際には調べるようにはしていますけれども...

binary file読み込みで, 定数byteずつの読み込みとか, 結構気を遣いそうです... 私はとりあえずint32_t型とか使ってますけど.

 

最近読み始めたところ

https://www.jpcert.or.jp/sc-rules/c-pre00-c.htmlを, 暇なときに少し読んでいます.

incidentに関する団体かしら? とはいえ, secureなcodeを書けるように意識はしたいなぁ, とちょくちょく読んでいます.

そういえば, scanf()が危険な理由とか, その対策とか完全に理解してないなぁ...

GLFWとGLEWでwindowを作成してみる

初めまして

続かないかもしれないけれども, 興味本位で始めてみました. 完全に自分の備忘録です.

今回使っていくlibrary

自分の研究で少しばかり触ってから, 少々好きになってしまったので, やり方とか忘れないようにmemo.

OpenGL(Open source Graphics Library)

 OpenGL(https://www.opengl.org/)は, 計算機上でgraphics表示するためのAPI(Application Programming Interface)のことを指すらしいです. softwareの構成要素同士のinterfaceってことですか, 調べましたけどよく分かりません. graphics hardwareを制御するsoftwareと, 自分で記述したprogram等の仲介役ってことですかね...

こんな私ですから, こいつを直接弄るなんて無理です. しかもOpenGLの特徴の1つにplatformに依存しないことがよく挙げられます. platform毎にprogramming…? いやいやいやいや, 面倒くさい.

ということで, GLFWGLEWを使うことにしました.

GLFW(open source Graphics Library FrameWork)

GLFW(https://www.glfw.org/)は, その名の通りです. 公式home pageでは, 以下の様に説明しています.

 GLFW is an Open Source, multi-platform library for OpenGL, OpenGL ES and Vulkan development on the desktop. It provides a simple API for creating windows, contexts and surfaces, receiving input and events.

windowやcontextの作成や入力やeventの受付をやってくれるってことですね, 多分.

こいつを使って, 色々書いてみたいと思っております. glut(https://www.opengl.org/resources/libraries/glut/)? 知らない子ですね... Qt(https://www.qt.io/)もありかなって思ったんですけど, 敷居が高そう...でもいつかは手を出したいと思います.

GLEW(open source Gpahics Library Extention Wrangler library)

GLEW(http://glew.sourceforge.net/)は, graphics hardwareの拡張機能を使用するためのもの, らしいです. これもよく分かりません, graphics hardwareのすべての機能がそのままでは使えないので, GLEWをかませることで使えるようにするってことですかね. 以下, 公式home pageからの引用です.

The OpenGL Extension Wrangler Library (GLEW) is a cross-platform open-source C/C++ extension loading library. GLEW provides efficient run-time mechanisms for determining which OpenGL extensions are supported on the target platform. OpenGL core and extension functionality is exposed in a single header file. GLEW has been tested on a variety of operating systems, including Windows, Linux, Mac OS X, FreeBSD, Irix, and Solaris.

codeを書いてみる

とはいえ, C++言語も完全初心者です, 多分. めちゃくそcodeになってそう...

取り敢えず, applicationを表すclassを作りたいと思います.

Application.hpp
#pragma once

/*Use glm/ext.hpp*/
#define GLM_ENABLE_EXPERIMENT

#include <iostream>
#include <fstream>
#include <string>
/*Use OpenGL*/
#include "lib/glew.h"
/*Window Manager*/
#include "lib/glfw3.h"
/*Mathmatics Library*/
#include "./lib/glm/glm.hpp"
#include "./lib/glm/ext.hpp"

#pragma comment(lib, "opengl32.lib")
#pragma comment(lib, "./lib/glew32.lib")
#pragma comment(lib, "./lib/glfw3.lib")

/*Default Window Size[px]*/
#define DEFAULT_WIDTH 1440
#define DEFAULT_HEIGHT 810
/*Window Max Size[px]*/
#define WIDTH_FULL 1920
#define HEIGHT_FULL 1080

class Application{
public:
	/*constructor*/
	Application();

/*member*/
public:
	/*Window Handle*/
	GLFWwindow *window_;

/*method*/
public:
	void Start();
	void Run();
	void End();
private:
	void InitHint();
	void SetCallback();
	void LoadIconImage(std::string file_name);
};
Application.cpp
#include "Application.hpp"
extern void ErrorCallback(int error, const char *description);

/*constructor*/
Application::Application(){
}

void Application::Start(){
	/*GLFW Initialization*/
	if(glfwInit() != GLFW_TRUE){
		throw(std::runtime_error("Failure to Initialize GLFW."));
	}

	/*Hint Setting*/
	InitHint();

	/*Create Window*/
	window_ = glfwCreateWindow(
		window_width_,
		window_height_,
		"OpenGL Sample01",
		nullptr,
		nullptr
	);
	if(window_ == nullptr){
		throw(std::runtime_error("Failure to Make Window."));
	}
	glfwMakeContextCurrent(window_);
	glfwSwapInterval(1);

	SetCallback();
	
	/*Setting Window Size*/
	glfwSetWindowSizeLimits(window_, WIDTH_FULL / 2, HEIGHT_FULL / 2, WIDTH_FULL, HEIGHT_FULL);
	glfwSetWindowPos(window_, window_position_x_, window_position_y_);

	/*Setting Icon*/
	LoadIconImage(std::string("icon.bmp"));

	/*Setting Event*/
	glfwSetInputMode(window_, GLFW_CURSOR, GLFW_CURSOR_NORMAL);

	return;
}

void Application::Run(){
	while(glfwWindowShouldClose(window_) != GLFW_TRUE){
		/*Buffer Clear*/
		/*Double Buffer is Default in GLFW*/
		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

		/*GLFW Event Process*/
		glfwPollEvents();

		glfwSwapBuffers(window_);
	}

	return;
}

void Application::End(){
	/*Finish GLFW*/
	glfwDestroyWindow(window_);
	glfwTerminate();
	
	return;
}

void Application::MovingCamera(float x, float y){
	if(!draw_->GetDrawFlag()){
		cursor_speed_x_ = x - cursor_position_x_;
		cursor_speed_y_ = y - cursor_position_y_;
		cursor_position_x_ = x;
		cursor_position_y_ = y;

		draw_->MovingCamera();
	}

	return;
}

void Application::SetCallback(){
	glfwSetErrorCallback(ErrorCallback);

	return;
}

void Application::InitHint(){
	/*Setting about*/
	glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE);
	glfwWindowHint(GLFW_VISIBLE, GLFW_TRUE);
	glfwWindowHint(GLFW_DECORATED, GLFW_TRUE);
	glfwWindowHint(GLFW_FOCUSED, GLFW_TRUE);
	glfwWindowHint(GLFW_AUTO_ICONIFY, GLFW_TRUE);
	glfwWindowHint(GLFW_FLOATING, GLFW_FALSE);
	glfwWindowHint(GLFW_MAXIMIZED, GLFW_FALSE);

	/*Setting about Buffer Bit*/
	glfwWindowHint(GLFW_RED_BITS, 8);
	glfwWindowHint(GLFW_GREEN_BITS, 8);
	glfwWindowHint(GLFW_BLUE_BITS, 8);
	glfwWindowHint(GLFW_ALPHA_BITS, 8);
	glfwWindowHint(GLFW_DEPTH_BITS, 24);
	glfwWindowHint(GLFW_STENCIL_BITS, 8);
	glfwWindowHint(GLFW_ACCUM_RED_BITS, 0);
	glfwWindowHint(GLFW_ACCUM_GREEN_BITS, 0);
	glfwWindowHint(GLFW_ACCUM_BLUE_BITS, 0);
	glfwWindowHint(GLFW_ACCUM_ALPHA_BITS, 0);

	/*Setting about Monitor*/
	glfwWindowHint(GLFW_SAMPLES, 4);
	glfwWindowHint(GLFW_REFRESH_RATE, GLFW_DONT_CARE);
	glfwWindowHint(GLFW_STEREO, GLFW_FALSE);
	glfwWindowHint(GLFW_SRGB_CAPABLE, GLFW_TRUE);
	glfwWindowHint(GLFW_DOUBLEBUFFER, GLFW_TRUE);

	/*Setting about Context*/
	glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_API);
	glfwWindowHint(
		GLFW_CONTEXT_CREATION_API,
		GLFW_NATIVE_CONTEXT_API
	);
	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
	glfwWindowHint(GLFW_CONTEXT_ROBUSTNESS, GLFW_NO_ROBUSTNESS);
	glfwWindowHint(
		GLFW_CONTEXT_RELEASE_BEHAVIOR,
		GLFW_ANY_RELEASE_BEHAVIOR
	);
	glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GLFW_TRUE);
	glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GLFW_FALSE);
	glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
	glfwWindowHint(GLFW_CONTEXT_NO_ERROR, GLFW_FALSE);

	return;
}

void Application::LoadIconImage(std::string file_name){
	/*Icon Image*/
	GLFWimage image;


	uint16_t file_type = 0u;
	uint32_t file_size = 0u;
	uint16_t reserve1 = 0u;
	uint16_t reserve2 = 0u;
	uint32_t offset = 0u;

	uint32_t header_size = 0u;
	int16_t width = 0;
	int16_t height = 0;
	uint16_t plane_num = 0u;
	uint16_t color_bit_num = 0u;
	uint32_t compression = 0u;
	uint32_t data_size = 0u;
	int32_t horizontal_resolution = 0;
	int32_t vertical_resolution = 0;
	uint32_t palette_num = 0u;
	uint32_t important_color_num = 0u;

	std::ifstream input(file_name, std::ios::in | std::ios::binary);
	if(input.fail()){
		throw(std::runtime_error("Failure to Open Icon File."));
	}

	input.read((char *)(&file_type), sizeof(unsigned __int16));
	input.read((char *)(&file_size), sizeof(unsigned __int32));
	input.read((char *)(&reserve1), sizeof(unsigned __int16));
	input.read((char *)(&reserve2), sizeof(unsigned __int16));
	input.read((char *)(&offset), sizeof(unsigned __int32));

	input.read((char *)(&header_size), sizeof(unsigned __int32));

	input.read((char *)(&width), sizeof(__int32));
	input.read((char *)(&height), sizeof(__int32));
	input.read((char *)(&plane_num), sizeof(unsigned __int16));
	input.read((char *)(&color_bit_num), sizeof(unsigned __int16));
	input.read((char *)(&compression), sizeof(unsigned __int32));
	input.read((char *)(&data_size), sizeof(unsigned __int32));
	input.read((char *)(&horizontal_resolution), sizeof(__int32));
	input.read((char *)(&vertical_resolution), sizeof(__int32));
	input.read((char *)(&palette_num), sizeof(unsigned __int32));
	input.read((char *)(&important_color_num), sizeof(unsigned __int32));

	image.width = int(width);
	image.height = int(height);

	unsigned char *color_palette = nullptr;
	color_palette = (unsigned char *)malloc(sizeof(unsigned char) * 256 * 4);

	for(int i = 0; i < 256; ++i){
		input.read((char *)(&color_palette[i * 4]), sizeof(unsigned char) * 4);
	}

	unsigned char *color = nullptr;
	color = (unsigned char *)malloc(sizeof(unsigned char) * image.width * image.height);

	
	for(int i = image.height - 1; i > -1; --i){
		for(int j = 0; j < image.width; ++j){
			input.read((char *)(&color[i * image.width + j]), sizeof(unsigned char));
		}
	}

	image.pixels = (unsigned char *)malloc(sizeof(unsigned char) * image.width * image.height * 4);

	for(int i = 0; i < image.width; ++i){
		for(int j = 0; j < image.height; ++j){
			image.pixels[i * 4 + j * image.width * 4 + 0] = color_palette[color[i + j * image.width] * 4 + 2];
			image.pixels[i * 4 + j * image.width * 4 + 1] = color_palette[color[i + j * image.width] * 4 + 1];
			image.pixels[i * 4 + j * image.width * 4 + 2] = color_palette[color[i + j * image.width] * 4 + 0];
			image.pixels[i * 4 + j * image.width * 4 + 3] = 255u;
		}
	}

	/*Window Setting*/
	glfwSetWindowIcon(window_, 1, &image);
	input.close();
	free(color_palette);
	free(color);
	free(image.pixels);

	return;
}
Main.cpp
#include <exception>
#include <stdexcept>
#include "Application.hpp"

Application application_global;

void ErrorCallback(int error, const char *description){
	std::cerr << "Error: " << description  << std::endl;
	return;
}

nt main(int argc, char **argv){
	try{
		application_global.Start();

		application_global.Run();

		application_global.End();
	}
	catch(std::logic_error &error){
		std::cout << error.what() << std::endl;
		return(EXIT_FAILURE);
	}
	catch(std::runtime_error &error){
		std::cout << error.what() << std::endl;
		return(EXIT_FAILURE);
	}
	catch(std::bad_typeid &error){
		std::cout << error.what() << std::endl;
		return(EXIT_FAILURE);
	}
	catch(std::bad_cast &error){
		std::cout << error.what() << std::endl;
		return(EXIT_FAILURE);
	}
	catch(std::bad_alloc &error){
		std::cout << error.what() << std::endl;
		return(EXIT_FAILURE);
	}
	catch(std::bad_exception &error){
		std::cout << error.what() << std::endl;
		return(EXIT_FAILURE);
	}
	
	return(EXIT_SUCCESS);
}

実行結果

windowが作成出来ました.

f:id:johjoh_pk:20180910234231p:plain