頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


二次元配列を使ってみた

NSArrayじゃなくてfloat array[10]みたいな配列で二次元配列を使うってお話だよ。

こういう細かい動作確認を繰り返してると俺は何か根本的に間違えているんじゃないかな?ホントはNSArrayでもNSNumberを介さない方法やそもそもNSArrayじゃないけど数値をダイレクトに扱える配列なんかがあるんじゃないのか?って思っちゃうけど、まあいいや。まずは二次元配列を作って表示させてみたよ。

{
    float *twoDimArray[2];//二次元配列
    
    float array0[10] = { 1.23f , 2.34f };
    float array1[10] = { 3.45f , 4.56f };
    
    twoDimArray[0] = array0;
    twoDimArray[1] = array1;
    
    //---(A)
    NSLog(@"twoDimArray[0][0]=%f",twoDimArray[0][0]);
    NSLog(@"twoDimArray[0][1]=%f",twoDimArray[0][1]);
    NSLog(@"twoDimArray[1][0]=%f",twoDimArray[1][0]);
    NSLog(@"twoDimArray[1][1]=%f",twoDimArray[1][1]);

    //---(B)
    float *array;
    array = twoDimArray[0];
    NSLog(@"array[0]=%f",array[0]);
    NSLog(@"array[1]=%f",array[1]);
}
(A)のようにすれば確かに各要素にアクセスできる、と。
(B)のように一つの配列まるごとの参照をベースにしてもアクセスできる。

実際使う時には二次元配列から一つの配列を取り出してメソッド(関数)へ投げることが多いかな。こんな感じで:
{
    [self show2DArray:twoDimArray[0]];
    [self show2DArray:twoDimArray[1]];
}

-(void)show2DArray:(float *)array
{
    NSLog(@"array[0]=%f",array[0]);
    NSLog(@"array[1]=%f",array[1]);
}
もらう方は単に配列をもらうから前と同じだね(メソッド(関数)への引数にNSArrayじゃない配列を使う)。

あまりないかもしれないけど二次元配列をまるごとメソッドに投げる場合:
{
    [self show2DArrayAll:twoDimArray];
}

-(void)show2DArrayAll:(float **)array
{
    NSLog(@"array[0][0]=%f",array[0][0]);
    NSLog(@"array[0][1]=%f",array[0][1]);
    NSLog(@"array[1][0]=%f",array[1][0]);
    NSLog(@"array[1][1]=%f",array[1][1]);
}
*(アスタリスク)が二つ並んでいると気持ち悪いけど、とりあえずこれで動く。

同じようにC言語の関数っぽく書いてみるとこんな感じ:
{
    show2DArrayAll_C(twoDimArray);
}

//void show2DArrayAll_C(float** array)
void show2DArrayAll_C(float *array[])
{
    NSLog(@"---show2DArrayAll_C---");
    NSLog(@"array[0][0]=%f",array[0][0]);
    NSLog(@"array[0][1]=%f",array[0][1]);
    NSLog(@"array[1][0]=%f",array[1][0]);
    NSLog(@"array[1][1]=%f",array[1][1]);
}
呼ばれる側の引数部分は
float** array
で受けても動くんだけど
float *array[]
って書いた方がなんだか理解しやすいよね、、、って思うのは俺だけかな。


AdMobで自社広告をだしてみた

iOSアプリ内のAdMobの広告スペースに自社広告をだしてみたってお話だよ。

頭と尻尾はくれてやる! 突然iAdが表示されなくなった件
↑でもちょろっと書いてるけど、二つの無料iOSアプリで広告をだしてるんだ。
広告を出す順番はまずiAdで、表示できるiAdの広告がなければAdMobを表示する、ってまあよくあるパターンだよね。

ところでAdMobの場合、自社広告ってことで自分のアプリ内に自分の他のアプリの広告を無料で表示させることができるんだ。もう一度言うよ、無料だよ!
なんだかそういうのがあったよねえ、でほったらかしだったんだけど、今回試しにこの自社広告に挑戦してみたんだ。

ちなみに広告内容は双方のアプリのダウンロードが目的なので、片方のアプリにもう片方のアプリの紹介をして、リンク先がApp Storeアプリだよ。

AdMobのサイト内で
サイト及びアプリケーション/自社広告
ってところからスタート。
ごにょごにょしてるウチに、、、といっても実際に表示されているのを確認できたのは翌日だけど、とりあえず表示させることはできたよ。簡単じゃないかーっ!もっと早く導入していればよかったな。

AdMobの自社広告表示中のスクリーンショット

↑表示されているところの画像。
アプリ名が英語表記になっちゃうのが残念だな。

注意することは、「広告グループの表示回数の目標」って項目はキャンペーン期間中の回数なんだな。最初1日あたりかと思って入力してたよ。
ちゃんとヘルプに「表示回数の目標(配信を希望する合計表示回数)を指定してください。 表示回数はキャンペーン期間全体で分散されます。」ってあったよ。読むものはちゃんと読まないとだめだね。


突然iAdが表示されなくなった件

突然iAdの広告が表示されなくなったというお話だよ。

「赤ちゃんの成長グラフLite」と「時計で遊ぼう」って二つの無料アプリにはiAdで広告を表示してるんだけどさ、時計〜の方だけが最近さっぱり表示されなくなったんだ。
リリース直後はちゃんと表示されていたのに。今でもリクエストは数えられてるんだけど、一切表示されていない(インプレッションがゼロ)みたいなんだ。
iTunes Connectのどこを見ても特に何もメッセージもないようだし、、、?

勝手な予想なんだけど、「時計で遊ぼう」がいつだったか某アプリ紹介サイトで紹介されて急にダウンロード数が増えたことがあったんだ。それを怪しいと解釈して広告の配信を停止したのかな、と。まあ真実はわからないんだけどね。


メソッド(関数)への返り値にNSArrayじゃない配列を使う

頭と尻尾はくれてやる! メソッド(関数)への引数にNSArrayじゃない配列を使う
↑この続きだよ。今回はメソッド(関数)の返り値にNSArrayじゃない配列を使うよ。

まずはObjective-Cっぽいメソッドの場合。
{
    float *array1 = [self makeArray1];
    NSLog(@"array1[0]=%f",array1[0]);
    NSLog(@"array1[1]=%f",array1[1]);
}

-(float *)makeArray1
{
    static float array[10];
    array[0]=1.23f;
    array[1]=2.34f;
    return array;
}
メソッド内での配列の宣言にstaticと書かないとダメみたい。staticだから次回このメソッドを呼び出すと前のが残っている、、、確かめると、確かに残ってる。なんだか気持ち悪いので次のようにする方が俺にはいいかも。
{
    float array2[10];
    [self makeArray2:array2];
    NSLog(@"array2[0]=%f",array2[0]);
    NSLog(@"array2[1]=%f",array2[1]);
}
-(void)makeArray2:(float *)array
{
    array[0] = 1.23;
    array[1] = 2.34;
}
単に呼び出し元で配列を宣言しといて、引数でメソッド側に渡してやり、そこで内容を記述するってだけなんだけどね。タイトルと違って返り値ないじゃないかって?細かいことはいいんだよ!

それじゃ次に、C言語の関数っぽく書くよ。
返り値に配列をもらう場合。
{
    float *array3 = makeArray3();
    NSLog(@"array3[0]=%f",array3[0]);
    NSLog(@"array3[1]=%f",array3[1]);
}

float *makeArray3()
{
    static float array[10];
    array[0] = 1.23;
    array[1] = 2.34;
    return array;
}
これも先ほどのと同様staticって付けないと動いてくれない。ローカル変数なんか返せるかボケ!ってとこなのかな。
これも同様に引数で結果が欲しい配列の入れ物だけを先に用意しておく方法もあり。
{
    float array4[10];
    makeArray4(array4);
    NSLog(@"array4[0]=%f",array4[0]);
    NSLog(@"array4[1]=%f",array4[1]);
}

void makeArray4(float array[])
//void makeArray4(float *array)//これも可
{
    array[0] = 1.23;
    array[1] = 2.34;
}
こんなレベルじゃ次のアプリのリリースはいつになるんだろうって感じだね、、、今までC言語をスルーしてきた報いだな、こりゃ。


メソッド(関数)への引数にNSArrayじゃない配列を使う

メソッド(関数)とのやりとりの引数、返り値に配列を使うにはどうすればいいんだろうってお話だよ。

配列といってもNSArrayじゃないんだ。ほら、NSArrayだと数値を入れるのにNSNumberを介さないとだめだから面倒だし、実際処理に時間がかかっちゃう場合があるんだよね。
だから最近は
float array[100];
みたいな感じの配列をよく使うんだ。ここでもこういう配列を関数の引数や戻り値としてやりとりしてみるよ。

まず、引数にこういう配列を使う場合。
メソッドをObjective-Cっぽく(?)書くとこんな感じで。
{
    float array1[3];
    array1[0] = 1.2f;
    array1[1] = 3.4f;
    array1[2] = 5.6f;
    float average1 = [self getAverage1ForArray:array1 nData:3];
    NSLog(@"average1 = %f",average1);
}

-(float)getAverage1ForArray:(float *)array nData:(int)nData
{
    float total = 0.f;
    for (int ii=0;ii < nData;ii++) {
        total += array[ii];
    }
    return total/nData;
}
メソッドへデータ数を教えてあげないといけないのがややめんどうだけどこれで実現はできる。

それじゃ次にC言語っぽく(?)書いてみるよ。
{
    float array2[3];
    array2[0] = 1.2f;
    array2[1] = 3.4f;
    array2[2] = 5.6f;
    float average2 = getAverage2(array2,3);
    NSLog(@"average2 = %f",average2);
}

float getAverage2(float array[] , int nData)
{
    float total = 0.f;
    for (int ii=0;ii < nData;ii++) {
        total += array[ii];
    }
    return total/nData;
}
こういうのだともらう側はfloat array[]って記述するように配列でもらってるんだぜってわかるよね。
ちなみに平均値計算部分は上下とも同じだね。

次は返り値に配列を使う場合を書こうかと思ったけど長くなったので今回はここまでにしとくよ。







Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad