C での配列の取り扱い

C での配列の取り扱い

C で配列使う時は注意が必要!

と、このブログでも以前に書いたが、やってもうた…

まあ、実際には未遂だったんだが。

 

しかし、エグいのは構造体のメンバーに vector_float3 を代入するような場合で、こう書かないとエラーが出る。

structObj[0].position=(vector_float3){0.5, -0.5, -0.5};

単に {0.5, -0.5, -0.5} と書いたのではダメのようだ。

配列の要素が数個なら後で代入してもそれほど手間ではないが、10 以上になったら宣言と同時に初期化しておかないと実用的ではないように思う。

また、構造体をグローバルで使いたい場合は、諦めた方が賢明かもしれない。

メソッドの中で static const で定義し、ポインタ使ってメソッド間で受け渡すしかないような気がする。

Metal で複数のオブジェクトを描画する

見出しのことをやろうとすると難しくないか?

というのが最近の問題意識。

二つのポリゴンというような意味ではなく、一つはポリゴン、もう一つは 3D Texture というように描画原理が異なるもののような場合。

大抵のサンプルが一つの描画原理でしか取り扱っていないからなあ。

どうしたものやら。

 

 

Mac アプリとメニュ

Mac アプリでメニュの実装をする場合、一番簡単なのは AppDelegate に書いてしまうこと。

https://qiita.com/imk2o/items/436839153530dbcb7ed1

やり方は上記記事を参考にしてほしい。

デフォルトメニューの First Responder の担当オブジェクトは AppDelegate になっているのだから、First Responder に testaction という responder を登録し、AppDelegate に以下の実装をしておけば、実行してくれる。

- (IBAction)testaction:(id)sender
{
    NSLog(@"test action");
}
AppDelegate.m

図がわかりやすい。

 

Objective-C 豆

Objective-C の豆知識なぞ。

class というキーワードはないが @class はある

よく「Objective-C は C をクラスなどが使えるように拡張した言語」と紹介されるが、クラスを明示するようなキーワードはなかったりする。

Hoge クラスを定義したければ、もちろん

@interface Hoge: NSObject
@end

@implementation
@end

などととする。

ただし @class というディレクティブは実用的なコードには使われる。

これもかなりクセのあるシロモノで、いわゆる前方宣言というやつの一種だ。

Objective-Cのクラスの前方宣言がないと困ること

#import と @class の使い方について

あたりを参照。

 

(続く)

 

nullptr -> new -> delete in C++

ネタに困ったら、ポインタ話。

以前にポインタを習得するには、概念だけではなく、malloc -> free のような実用的なコードも重要、みたいな話はした。

じゃあ、C++ では?ってことで、nullptr -> new -> delete の簡単なサンプル。


#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    
    char *test = nullptr;
    
    //test = new char[100];
    
    if(test == nullptr){
        NSLog(@"test is nullptr");
    }else{
        NSLog(@"test is not nullptr");
    }
    
    delete test;
 
    return 0;
}

このままだと test is nullptr が、コメントアウトを外せば test is not nullptr が表示されます。

しかし、C に比べるとぐっと取り扱いが簡単になったね。