ジャンル雑多なゲーム・ゲーム制作関連の色々な情報を取り扱っているブログ。最近はBlenderについてが中心。
[C, C++学習]UE4触ってみたのと、C, C++言語再学習ノート-1日目- –C言語、コンパイル方法~C言語の変数型、文字列、書式指定、型キャスト、printf()、scanf()、自作の関数にも付く型、voidとは

[C, C++学習]UE4触ってみたのと、C, C++言語再学習ノート-1日目- –C言語、コンパイル方法~C言語の変数型、文字列、書式指定、型キャスト、printf()、scanf()、自作の関数にも付く型、voidとは

UE4の軽い説明と感想、C, C++との関連性、C, C++言語思い出しながら、コンパイル方法から、書式指定や変数の型、表示する関数printf()と入力関数scanf()、オリジナルの関数の作成方法 —勉強しなおしの記録というか学習ノート-1日目-

Unreal Engin4すごい!(語彙力)ってなったので、少しいじりつつ、むかーしかじった事あるC,C++の学びなおしの学習ノート。

※2019年5月23日 加筆修正しました。
※2019年5月25日 この連載記事について説明と注意書きを追加しました。
※2019年5月27日 加筆修正しました。
※2019年6月11日 初心者向け記事へのリンクを追加しました。

この連載記事について諸注意

この連載記事は、他言語を触れる方(私がよく使うのでJavaScriptを主に想定しております)を主に対象とし、その方が違和感を感じたり、戸惑うんじゃなかろうかという、C,C++言語学習の+α的な内容となっております。なので、基本的には、他言語習得者の方がC言語学習で、本当にこれだけを参考にするには向きません。
あくまで、+αです添え物です

ですので、なおさらのこと、本当のプログラミング初心者には向きません。ほかのC, C++言語(以外でも)プログラミング言語学習サイト・ページへご移動ください。(というより、本当にC, C++言語がどういう言語かすらよくわからずに学習しようとしている方もいたら、とりあえずプログラミングで何がしたいかの目的に合った言語選びをやり直してみてください。とりあえずなんかゲームが作りたいなら、Unityとか、ツクール系とか、私が良く使うものでphina.jsとかもあるので、そちらとも比べてみてください(^_^;)

でも、「UE4が本当に本気で取り組んでみたい!」っていうので、このページに飛び込んできてくださったのでしたら、とりあえずUE4でプログラミングいらない程度でできることいっぱいあるので、触ってみてください。その上で「プログラミングで色々UE4で作る何かの動きをなんやかんやしたい!」とおっしゃるのでしたら、私のおすすめのC言語学習サイトのページリンクを↓に貼っておきますので、そちらを見てみてください。

外部ページ:

後日追記:C言語(プログラミング言語全体含めて)初心者へ向けて、私の経験談も含めてプログラミング独学を始める時のポイント、気を付けて欲しいこと、気を付けた方が良いこと、(偉そうにしてすみません)語っている記事を書きました。よろしければこちらもご覧ください。

目次

UE4についてすごい!って思ったことをさらっといくつか述べてみる

カバー画像にもしましたけど、少し弄ってみました…すごいですほんとにすごいです( ゚д゚)

手取り足取り懇切丁寧に教えてくれるチュートリアル付き

チュートリアルがわかりやすい!ちゃんと場所を示しながら教えてくれるの!?手取り足取り過ぎるすごい!

Unreal Engin 4レベルエディタ画面スクショ

UE4本体についてるチュートリアル機能の外、公式サイトにて公開されているわかりやすいドキュメントに従って、作ってみるだけでも結構楽しかったですし、

外部ページリンク:UE4公式ドキュメント クイックスタートディレクトリ

ゲーム制作に関するいろんなことができる!しかも高性能・多機能・高品質!

ナニコレゲーム制作に必要な機能ほとんど全部入りじゃないですか、これ無料?本当にいいんですか?!

いくつも目的別にいろんなことができるエディタがあって、そこから、少し公式ドキュメントのチュートリアルに沿って色々してみましたという画像を並べてみました。下で紹介する以外にも、エフェクトを作れたり、メディア(サウンド)の操作、アセット編集、アニメーション編集するようなエディタなど、とにかく何でも入ってるようです。
(聞いたことがなくて私がよくわかってない機能のエディタもあって、まだ全然把握しきれてません。それくらい多機能なんです。)

  • 一つ目は、レベルエディタ。ゲームに関するオブジェクト全てをセットして管理するエディタですね。基本的にはこれを弄ってものを配置したり、動きをセットしたりするようです。(動きのプログラムはまた別にコードを書いたりします)
レベルエディタ画面スクショ
  • 二つ目は、マテリアルエディタ。(名前そのまま)3Dオブジェクトならお馴染みのマテリアルを作ることが出来るエディタみたいです。
マテリアルエディタ画面スクショ
  • 三つ目は、スタティックメッシュエディタ 。これに関してはちょっとよくわからないです…(^_^;)マテリアルをオブジェクトにセットしたくらいで、もうちょっと色々出来そうな気配はある気がするんですが…。
スタティックメッシュエディタ画面スクショ

C, C++学習と、UE4との関連性

C++でコードを記述して、ゲームを制作する

UE4はC++でゲームプログラミングするようですので、(アセット的なもの使えばそうでもないのかな?)C, C++を学習しなおします!(・ω・´)

学習ノート -暫くJavaScript使いやってて違和感というかつっかかったところメモ-

コンパイルの仕方なんて忘れたよ!どうやるんだっけ…

コマンドプロンプト画面スクショ

C++なら、空のプロジェクト作ってから、コード書いて、デバッグして、って感じでVisual Studio任せっきりで自動でやってくれるんですが、Cはファイル作ってコーディングした後、コマンドプロンプトでコンパイルして実行ファイル(.exe)を生成して、実行するっていうのをやらないといけないので(楽な方法あったら教えてくださいm(_ _)m)、調べました。
※ちなみに私はWindowsでVisual Studio 2019 Community使ってます。

参考させていただいた外部ページ:

sample.cファイルを用意

/*sample.c*/
#include <stdio.h>

void main(){
    printf("helloworld");
}

そのファイルをCドライブ直下にsampleフォルダを作って、中にイン

Cドライブ直下sampleフォルダの中にsample.cファイル

コマンドプロンプト起動して、cd(チェンジディレクトリ)

コマンドプロンプト起動して、以下のコードを入力すると、sample.cファイルが置いてあるsampleフォルダの場所に移動してくれます。

cd C:\sample
コマンドプロンプトにてCドライブ直下sampleフォルダに移動

cファイルをコンパイル(.exeファイルを作成)

続いて、以下のコードを入力すると同じ場所(sampleフォルダ)にあるsample.cというファイルを探し出して、コンパイル(.exeファイルを作ってくれます)。

cl sample.c
コマンドプロンプトにてsample.exeファイルを生成

exeファイル実行。

上手くいったら、sample.exeファイルが同じ場所(sampleフォルダ)に生成されるので、実行。

sample.exe
sample.exeファイルを実行し、”helloworld”表示
  • ちなみに、実行ファイルの状態にしたら、コマンドプロンプトに直接ドラッグしてエンター押せば、実行されます。
コマンドプロンプトへexeファイルドラッグして実行するgif

※後日、変数や書式指定などを別記事で詳しく書きましたので、よろしければこちらもご覧ください。

微妙に戸惑った書式指定

printf("名前:%s\n年齢:%d\nblood type:%c\n体重:%2.2f", "山田太郎", 22, 'A', 57.8);

上のコードの実行結果

名前:山田太郎
年齢:22
blood type:A
体重:57.80
書式入れるもの
%d整数
%f浮動小数点数
%c文字 ※文字列ではなく、「’」で囲った1文字の半角英数だけ。
%s文字列 ※「”」で囲われてるなら、なんでも入れられる。

参考にさせていただいた外部ページ:一週間で身につくC言語の基本|1日目

  • おまけでゼロで文字埋め(詰め?)するやつ
書式(例)詰め方結果
printf(“%4d\n”, 13);右詰め” 13″
printf(“%-4d\n”, 2);左詰め“2 “
printf(“%05d\n”, 3);ゼロ埋め“00003”
printf(“%-+14f\n”, 57.2);“+”表記と左埋め“+57.200000 “
※%fだと、0がいっぱいつく
printf(“%0.3f”, 22.4);小数点以下桁数指定“22.400”

参考にさせていただいた外部ページ:【C言語】printfで左詰め 右詰め ゼロ埋めを行う方法と豆知識

変数によって専用の型指定しないといけない

void main(){
    int a = 2;
    printf("%d\t", a);
    int b = 21; // エラーするから、変数の宣言は最初に関数の始めに。
    printf("%d", b);
}

JavaScriptだと何でも突っ込んで平気だけど、C,C++にはちゃんと文字なら文字の、整数なら整数の(桁数でも違う)データ型の指定しなきゃいけないですよ。

逆に「C, C++」→「JavaScript」して、初めてJS触ったときに、「は?intは?floatは?そんでもってcharは?は!?何でも受け入れてくれるvar※さんかっけえ!」と、大いに困惑しつつ興奮しました。
※当時はvar一択でしたが、今はlet, constに移行しつつある気がします。

それと、結構大事なこと。何か演算や、printf()などでの文字表示などを何かしらの処理をする前に、つまりは関数始めに変数の宣言をしておかなければいけないっていう点。宣言だけしてしまえば、あとから値は好きに変更出来ます。(はずなのですが、なぜか実行出来ちゃったりしました(?)多分環境がC++ベースだからと予想しています。C++だと、宣言はどこでもできるので。)

説明値の範囲
char1バイトの符号付整数。1バイトまでの文字(半角英数)1文字用。-128~127
unsigned char1バイトの符号なし整数。0~255
int2または4バイトの符号付整数。-32768~32767 または -2147483648~2147483647
short2バイトの符号付整数。-32768~32767
long4バイトの符号付整数。-2147483648~2147483647
unsigned2バイトまたは4バイトの符号なし整数。0~65535 または 0~4294967295
unsigned short2バイトの符号なし整数。0~65535
unsigned long4バイトの符号なし整数。0~4294967295
float4バイトの単精度不動小数点数有効桁数7桁
double8バイトの倍精度浮動小数点数有効桁数16桁

参考にさせていただいた外部ページ:

変数だけじゃなくて、定数でも書式があります

書式説明
‘a’1バイトの文字。(1文字だけの半角英数)
“ABC”文字列。何でも「”」で囲われてればOK
1234int型の整数。
0148進数の整数。(この場合、10進数だと12に相当)
0x3e16進数の整数。(この場合、10進数だと62に相当。ちなみに数字代わりのa~fは、小文字でも大文字でも良い)
35U符号なし整数。(数字の後ろの「U」は「u」でも良い)
27Llong型の整数。(数字の後ろの「L」は「l」でも良い)
45.3Ffloat型の単精度浮動小数点数(有効桁数7桁)。(数字の後ろの「F」は「f」でも良い)
47.195double型の倍精度浮動小数点数(有効桁数16桁)。

参考にさせていただいた外部ページ:データ型

違うデータ型の数値が衝突したら?暗黙的型変換

演算で異なるデータ型が衝突した場合、その式の中で入る範囲が広い方のデータ型に変換されるんです。

double型 > float型 > long型 > int型 > short > char

※ただし、広い方の型に入らなければさらに広い型に変換されることもあります。

一方での明示的な型変換(キャスト)

int num = 30;
printf("%f", (float)num);    //実行結果:30.000000

上の例ではint型のnumをfloat型にキャストして表示させています。こんな風に「(型)値」と書けば、明示的な型変換が出来ます。

ただし、ここでいくつか注意点。

  • signed(符号つき)→unsigned(符号なし)
short num = -1;
printf("%d",(unsigned short)num);    // 実行結果:65535

という具合に、-1→1のようにはなりません。ここでの実行結果がunsigned short型の範囲ギリギリの値になっているのにお気づきでしょうか?ビット演算で算出されるからこういった結果になるんです。面白いですよね!詳しい解説は下のページがわかりやすくて参考になるかと思いますので丸投げします。(参考になりましたm(_ _)m)

外部ページリンク:符号なし型⇔符号あり型をキャストするときの注意

  • 浮動小数点数→整数
float num = 4.261f;
printf("%d", (int)num); // 実行結果:4

狙ってやったのなら構わないのですが、浮動小数点数を整数にキャストすると、小数点以下は切り捨てられます。

  • 範囲の広い型→範囲の狭い型
short num = 2525;
printf("%d", (char)num);    // 実行結果:-35

型の範囲を超えた値を代入すると、桁あふれ(オーバーフロー)が起こります。あふれた分の上位ビットは切り捨てられ、残った分がビット演算で算出されます。

参考にさせていただいた外部ページ:

入力を受け付けるscanf()関数と、&変数名と、文字列の入力の注意点

int a;
printf("何か数値を入力してください: ");
scanf("%d", &a);
printf("%d", a);

scanf()関数ってあったなーってなってしみじみ。そしてついでに出てきた「&変数名」っていうの、ここからポインタがどうのでメモリの管理が何たらかんたらし始めてめちゃくちゃ混乱した思い出がよみがえりましたよ(´ω` )
そしてこれが、文字列の入力受付になると、↓みたいになります。

char a[12]; // 文字列は配列として変数に格納されているので、配列として変数を用意。
scanf("%s", a);
printf("%s", a);

「ん?&aじゃないの?」って疑問に思われたかと予想するのですが、理由の方は後日ポインタやる時にでも。

参考にさせていただいた外部ページ:一週間で身につくC言語の基本|第5日目

関数にも付く型、void main()について

JavaScriptだと、即時関数やら無名関数やら、(最近はアロー関数とかも出てきたけど)いろいろあれど、基本的に「function 関数名(引数, 引数){…}」っていう形なんですが、C言語だと、関数名の前には、「return」で返す値に伴って異なった変数型が付きます。メイン関数に使っていた「void」って実は何も返さないっていう意味だったりします。(javascriptにも一応void演算子あります。aタグのリンクを無効化するのに、「href=”javascript:void(0)”」みたいなことするみたいです。)

それから、関数は、main()関数の後に記述する場合、main()関数の前にプロトタイプ宣言というのをする必要があります。多分これは変数が関数はじめで宣言しなくちゃいけないのと同じようなものだと思います。

#include <stdio.h>

// プロトタイプ宣言
int cube(int);
void info_str(int, int);
void line();

void main(){
	int a[3] = { 3,5,11 };
	for (int i = 0; i < 3; i++) {
		info_str(a[i],cube(a[i]));
	}
}

// 立方体の体積を算出する関数
int cube(int len) {
	return len * len * len;
}

// 立方体の体積計算結果を表示する関数
void info_str(int len ,int leg){
	printf("一辺が%dの立方体の体積: %d\n", len, leg);
	line();
}

// 区切りのための線を表示する関数
void line() {
	printf("--------------------------------\n");
}

また、main()関数前に関数の記述を済ませてしまえば、プロトタイプ宣言はいりません。

#include <stdio.h>

// 区切りのための線を表示する関数
void line() {
	printf("--------------------------------\n");
}
// 立方体の体積を算出する関数
int cube(int len) {
	return len * len * len;
}

// 立方体の体積計算結果を表示する関数
void info_str(int len, int leg) {
	printf("一辺が%dの立方体の体積: %d\n", len, leg);
	line();
}

void main(){
	int a[3] = { 3,5,11 };
	for (int i = 0; i < 3; i++) {
		info_str(a[i],cube(a[i]));
	}
}

参考にさせていただいた外部ページ:一週間で身につくC言語|第6日目

読まなくても良いあとがき

実は私が一番初めに触ったプログラミング言語は、 (Cすっ飛ばして) C++だったりします。「なんか名前的にかっこいい!」というのと、たまたま何かで見かけたページが、C++のこと紹介していたからだった気がします。(安直というか、なんというか)それで始めたプログラミングで、まあ、まず環境構築でつっかかって、その次に、何とか動かせた後、「main()はプロジェクト毎に1つしかダメよ!」っていうの知らなくて、(どこかで見た誰かの解説の中の例えでmain()が同じプロジェクトに2つというのは、1つのPCにOSが2つみたいな感じってなコメントがあった気がします)、同じプロジェクト内にmain()2つ作って動かなくて死ぬほど混乱して「どうしたらいいのわかんないようわーん!」って感じで確か最初が一番(暗中模索の不安感と困惑具合という意味で)大変でした。

それでも、そこを乗り越えて、「HelloWorld!」って出たら「きゃー!!なんか動いたうわーい!」、「”3 + 5″」と「3 + 5」で表示が「3 + 5」と「8」で違うというので「わーなんで?なんで!すごーい!!!!」 っていう、よくわかってないながら、何かあればいちいち何か動かす喜びと興奮はなかなか得難い体験でした。(あそこまでいちいち喜怒哀楽してる人はいるのかどうか…多分少数だと思いますよ)

その経験がこうやって、後々のことにつながっていたりするので、(押しつけがましい勝手な思いかもしれませんが)、何かを始めてみる時に、(法に触れたり人に害を及ぼすようなよっぽどのことは別として!)とりあえず一歩踏み出して、実際にその何かに触れてみて欲しかったりします。

なので、もし、今からC, C++(以外でもphina.jsやJavaScriptや、多少わかるHTML、CSS、PHP、Processing、Perl)の事でわからなくて困っていることがある方には、できる限り、(環境構築からわかりません!でもOK)ヘボプログラマーな私、ほろほろりでよろしければ、手助けさせていただきたかったりします。

ご意見・ご感想・ご質問、また、ここ間違ってるよとか、もっといい方法あるよといったご指摘などございましたら、お手数ですがコメント欄やtwitterアカウントほろほろり(@_horo_horori)へお願いしますm(_ _)m

Pocket

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください