C++の構造体(二次元配列)をNSUsedefaultに読み込み/保存したい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
西野

C++の構造体(二次元配列)をNSUsedefaultに読み込み/保存したい

#1

投稿記事 by 西野 » 8年前

C++,Objective-Cの質問となります。
ネットで調べたり本を見てみたり、してみたのですが
中々良いサイトが見つからなく、こちらで質問させて頂きました。

以下のような二元配列で用意された、構造体の変数をNSUserDefaultに読み込み/保存したいです。

コード:


#define TBL_WIDTH 20
#define TBL_HEIGHT 10

typedef struct{
	int a;
	int b;
	int c;
}GAME_DATA;

static GAME_DATA Game[TBL_HEIGHT][TBL_WIDTH];

色々と調べてみると、「C++ → Objective-C」に
変換する際にNSValue型に変換しなければならないようで
試してみたのですが、プログラムが強制終了してしまいます。

考えているのは
NSMutableArrayに格納 → NSData型に変換 → NSUsedefaultに保存
といったステップです。

Objective-Cの部分がよく理解出来ておらず、
これでない方が良い場合、そちらに変更したいです。

コード:


void TestLoad(){

    for(int y=0; y<TBL_HEIGHT; y++){
        for(int x=0; x<TBL_WIDTH; x++){
			Game[y][x].a = ***;
			Game[y][x].b = ***;
			Game[y][x].c = ***;
		}
	}
	
}

void TestSave(){
    
    NSMutableArray *array = [[NSMutableArray alloc] init];

    for(int y=0; y<TBL_HEIGHT; y++){
        
        NSMutableArray *temp =  [[NSMutableArray alloc] init];
        
        for(int x=0; x<TBL_WIDTH; x++){

            GAME_DATA item;
            item.a = Game[y][x].a;
            item.b = Game[y][x].b;
            item.c = Game[y][x].c;
            
            NSValue *value = [NSValue value:&item withObjCType:@encode(GAME_DATA)];
            [temp addObject:value];
        
        }
        
        [array addObject:temp];
        
        [temp release];
        
    }
    
    GAME_DATA Game; 
	// この部分
    //[[[array objectAtIndex:0] objectAtIndex:0] getValue:&Game]];
    
    NSLog( @"test save %d", Game.a  );
    
    [array release];
    
    //
    // NSValue *value = [NSValue value:&rgba withObjCType:@encode(RGBA)];

}

このような質問となってしまい申し訳御座いませんが、
何卒アドバイスを頂けないでしょうか。

naohiro19
記事: 256
登録日時: 13年前
住所: 愛知県

Re: C++の構造体(二次元配列)をNSUsedefaultに読み込み/保存したい

#2

投稿記事 by naohiro19 » 8年前

SWIGでインターフェースファイル(sample.i)を作成し、

コード:

//sample.i
%module sample

%{
#include "sample.h"
%}

コード:

#pragma once

#define TBL_WIDTH 20
#define TBL_HEIGHT 10
 
typedef struct{
    int a;
    int b;
    int c;
}GAME_DATA;
 
static GAME_DATA Game[TBL_HEIGHT][TBL_WIDTH];
あとはコマンドラインから
swig.exe -objc sample.i
とすることでObjective-Cのソースコードが自動的に生成されるのでそれをプロジェクトに追加すれば使えるようになります。

西野

Re: C++の構造体(二次元配列)をNSUsedefaultに読み込み/保存したい

#3

投稿記事 by 西野 » 8年前

返信ありがとうございます!
こちらよくわからないのですが、UserDefaultに保存ができるようになるということでしょうか?
C++は拡張子をmmにして問題なく乗っけられているのですが、
C++ → objective-cの連携がうまくいってなくて。。。

閉鎖

“C言語何でも質問掲示板” へ戻る