1. Mocoゲーム >
  2. Mocoゲームブログ >
  3. 基本的なレベルでのC言語(C++)とJavaの違い・移植時の苦労点


Mocoゲームブログ

ゲーム作成の悲喜こもごも… 開発状況やアプリ(無料ゲーム多数)に関すること、携帯電話やスマホのこと、公式ストア(Google Play, App Store)でのアプリ公開のこと、プログラミングのこと、更新情報などをアップしています。ガラケー時代からかれこれ15年以上継続しているブログです。Android(java)や iPhone開発(Xcode, Objective-C, C++ によるiOSアプリ開発)に関する技術的なことも時々アップしています。
ツイートする

基本的なレベルでのC言語(C++)とJavaの違い・移植時の苦労点

分類: 技術的な話
日付: 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 でダウンロード可能です。



関連ブログ

 Google と Apple 新型コロナ濃厚接触の可能性知らせるアプリのこと
 Windows 10 このファイルを変更するには アクセス許可を得る必要があります 対処法 (adb.log, cygwin)
 iOSアプリ開発:returned unexpected error 1 が厄介&対応方法
 Androidで発生するけどiPhoneでは発生しない、またはその逆の不具合

前後のブログ

 2020年05月13日 今のキャリアのショップの営業状況
 2020年05月12日 Android (Java) アプリで落ちる3大落ちる原因
 2020年05月11日 算数は大丈夫だったけど、理科は駄目だった
 2020年05月10日 基本的なレベルでのC言語(C++)とJavaの違い・移植時の苦労点
 2020年05月09日 iOSでがちんこカーリングに不具合があったのを修正&C言語の難しさ
 2020年05月08日 C言語が5年ぶりの1位?
より最新のブログ
より以前のブログ
ブログTOP Mocoゲーム 今日は何の日
最新エントリー

2024年03月19日iPhone に Gemini?
2024年03月18日メールで「返信不要です」は失礼だとは思わない
2024年03月16日漢字で致しますはNG?
2024年03月15日最近のホームページはさすがに広告多すぎ?
2024年03月14日英文字企業、単語の読み方 NVIDIA等
2024年03月13日「カイロス」発射失敗
より以前のブログ

コンテンツ分類

 AI(人工知能)の話 (32)
 YouTuberと動画サイト (67)
 いろいろ (358)
 いろいろレビュー (26)
 アプリの事 (357)
 アプリストアの話 (258)
 アプリ公開情報 (364)
 アプリ更新/修正情報 (227)
 クイズいろいろ (40)
 ゲーム全般 (649)
 スプラトゥーン (185)
 スポーツの話 (189)
 スマートフォンの話 (551)
 タブレットの話 (96)
 テレビの話 (25)
 ネットの話 (75)
 パソコンの話 (88)
 フォームへの返答 (39)
 プログラミングの話 (89)
 ページの事 (134)
 ページ更新情報 (171)
 ポケモンGO(位置ゲー) (113)
 メルマガの事 (20)
 家電の話 (44)
 開発情報 (334)
 技術的な話 (89)
 携帯の話 (645)
 時事的な話題 (139)
 将棋の話 (32)
 独り言 (83)

カレンダー

     2024年03月     
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
ブログカレンダー


Follow @MocoGames
ツイッターフォローお願いします。
(C)Mocoゲーム 2005-