![]() 分類: 技術的な話 日付: 2020年05月10日公開 Mocoゲームでは Android は Java で書いており、iOS は大部分は C言語(厳密にはC++)で書いています。 C言語は Java から自動変換しています。 C言語と Java は深いレベルではいろいろ違いがあり自動変換は無理ですが、基本的な機能で書いている限りは同じ言語構文なので、自動変換は割とできます。 それでもやはり別言語なので苦労しますし、それが不具合の原因にもなります。 これまでの経験上問題になりやすいのは以下のようなものです。 1. 配列の要素数に関すること。Javaは配列は配列名から配列の要素数を .length で簡単に取得できますが、C言語はできません。また、Javaでは要素数以上のアクセスを行うと例外が出て落ちますが、C言語は必ずしも落ちません。そのメモリーの場所に何が入っているか次第です。 要素数の取得には、sizeof を使うとか番兵(配列の最後に特定の値を入れてそれで配列長を出す)を使うとかいろいろ方法がありますが、昨日iOSの「がちんこカーリング」で不具合が起きたと書きましたが、それは番兵に関するものです。 ずばり番兵を入れ忘れていたのですが、たまたま番兵を検出(要素数をある程度なら超えても大丈夫)できるようなメモリー状態なら落ちないし、そうでないなら落ちるというものです。 これは気づきにくい不具合です。正常に動作するときはしますから。 2. 配列の値は初期化されない。 Java では int[] arr = new int[5]; の場合、arr の初期値は全て0ですが、C言語では int arr[5]; の初期値は全て不定です。これは「= {}:」などを移植時に付け足すようにすれば大丈夫です。 3. 配列を返す関数は要注意。 Javaでは int[] func() { int[] arr = new int[5]; return arr; } は問題ないですが、 C言語では int* func() { int arr[5]; return arr; } は駄目です。これはスタックのアドレスを返すので正常に動作することもありますがやっては駄目です。 int* func() { static int arr[5]; return arr; } とすれば大丈夫ですが、まだ要注意事項があります。それは呼び出しで int[] a = func(); int[] b = func(); というような呼び出しは Java では可能ですが、Cで int* a = func(); int* b = func(); はまずいです。なぜなら、aとbは同じアドレスを指す(実質同じもの)からです。 mallocを使えば大丈夫ですが、今度は開放を忘れるとメモリリークになってしまいます。 なんか配列に絡むものばかりですが、言語の基本的な機能としては配列は結構異なる部分があると思います。 それでも Java からC言語への自動変換はまだ楽な方だと思います(文字列の複雑な処理の自動変換は難しく、これは手動で書いている部分もありますが)。 逆にC言語から Java への移植を行う必要があるのなら、自動変換は無理だったかもしれません。 ポインターを使っていたりや参照渡しなどを行っていると、自動変換するのは非常に厳しいです。 アプリゲーム紹介 Mocoゲーム作成で比較的人気の無料ゲーム がちんこフリーキック&続編 を公開中です。Google Play 及び App Store でダウンロード可能です。 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ⇒ より最新のブログ ⇒ より以前のブログ
|
最新エントリー![]()
⇒ より以前のブログ コンテンツ分類 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() カレンダー ![]() 2025年04月 ⇒ ブログカレンダー |