• 締切済み

locale::idとid型について

objective-cでなんでも入れられるid型がありますが、cocos2dの環境下でc++から呼び出したいときにidにあう型がありません。一応std::local::idというのを見つけたのですが void DBClassBridge::updateColumn(string table, string field, locale::id input, string where, string target) { [DBClass_objc updateColumn:[[[NSString alloc] initWithCString:table.c_str() encoding:NSUTF8StringEncoding] autorelease] field:[[[NSString alloc] initWithCString:field.c_str() encoding:NSUTF8StringEncoding] autorelease] input:(id)input //ここでエラー where:[[[NSString alloc] initWithCString:where.c_str() encoding:NSUTF8StringEncoding] autorelease] target:[[[NSString alloc] initWithCString:target.c_str() encoding:NSUTF8StringEncoding] autorelease]]; } 以下のようなエラーが出ます。 Cannot convert 'locale::id' to 'id' without a conversion operator やはりデータ型があっていないっぽいです。 objective-cのid型にはどのデータ型を用いればいいのでしょうか?またはlocal::idからidへとどう変換すればいいのでしょうか? 知っている方、是非お願いします。

みんなの回答

回答No.1

これはDBClass_objcクラスやupdateColumnメソッドがどういうものなのかを 説明しないと本来答えられませんが、雰囲気的にはデータベースレコードを 更新するためのメソッドでinputパラメータは、fieldパラメータで指定し たフィールド名の更新値を指定するものだろうと推測して回答します。 まず、Objective-Cのid型に近いのはC++ではvoid *です。 (参考) http://wisdom.sakura.ne.jp/programming/objc/objc9.html id型というのは、要するにオブジェクトならなんでもありの型で その中に入っているオブジェクトを使うには実際にその中に入っている オブジェクトクラスにキャストしてアクセスします。 void *型は、ポインタならなんでもありの型です、 そのポインタが指している領域にアクセスするには、実際にその中に入っている 構造体ポインタの型にキャストしてアクセスします。 id型のオブジェクトキャストは、不適切なキャストを指定すると エラーになるのでメモリ破壊にはなりませんが、 void *のキャストは、どんなキャストでも強制的にやって しまうので、間違えると、簡単にメモリ破壊を引き起こす とても危険な処理です。 で、inputを(void *)型として定義すればそれでOKじゃなくて 実際にはその中に入っているC++オブジェクトのクラスに キャストした後、Objective-C用のクラスに変換して使用する 必要があります。 (例:void *→stringにキャスト→NSStringに変換→DBClass_objcのinputに指定) こういう汎用型のパラメータを受け付けるメソッドを 作るのではなく、string型のinputを受け付けて、 それをNSStringに変換して引き渡す等、格納したいオブジェクトの クラス毎に別のメソッドを作った方がたぶん安全だと思います。

関連するQ&A

  • objective-cとC++の連携

    cocos2dを使ってobjective-cの関数を呼び出したい場合、返り値がstringなどvoidでないときどう記述すればいいのでしょうか? //DBClassBridge.h string DBClassBridge::getStringColumn(string table, string field, string where, id target) { [DBClass_objc getStringColumn:[[[NSString alloc] initWithCString:table.c_str() encoding:NSUTF8StringEncoding] autorelease] field:[[[NSString alloc] initWithCString:field.c_str() encoding:NSUTF8StringEncoding] autorelease] where:[[[NSString alloc] initWithCString:where.c_str() encoding:NSUTF8StringEncoding] autorelease] target:(id)target];   //return ?? } returnのあとに何か入れる感じですかね? わかる人いたら是非お願いします。

  • 【Objective-C】文字列の連結でいい方法ありませんか?

    Objective-Cで文字列、NSStringの連結をするのに、stringByAppendingString:を使って以下のように書きました。 NSString *str1 = @"AAA"; NSString *str2 = [str1 stringByAppendingString: [NSString stringWithCString: "BBB" encoding: NSUTF8StringEncoding]]; しかし、この冗長なコードを何度も書くのは大変です。 そこで、マクロを使って以下のように整理してみました。 #define AS(A,B) [(A) stringByAppendingString:([NSString stringWithCString: B encoding: NSUTF8StringEncoding])] NSString *str2 = AS(str1,"BBB"); 少しはマシになりましたが、できれば+演算子を使って、以下のような、直感的にもわかるコードにしたいです。 NSString *str2 = str1 + "BBB"; NSStringクラスの+プラス演算子を書き換えて、(メソッドオーバーライド) NSString *str2 = str1 + "BBB"; の様ななコードを書く事はObjective-Cで、できるのでしょうか? 以上、ご指導のほど、宜しくお願いいたします。

  • Objective-C文字列からC言語文字列に変換したいのですが、どう

    Objective-C文字列からC言語文字列に変換したいのですが、どうすればよいでしょうか? C言語からObjective-cなら NSString *cToOc = [[NSString alloc] initWithCString:"結果" encoding:NSUTF8StringEncoding]; NSLog(@"%@", cToOc); でよいのですが、その逆が知りたいです。 あとこの cToOcは以下のように解放しないといけないのでしょうか? [cToOc release];

  • csvデータの添付メール送信について

     xcode6, iOS8, object C の初心者です。
 
iPodtouch の傾斜センサーを使用して、 int angle_ar[] に値を50個ほど
格納したものを、 csvData[ ] にカンマ区切りで入れ(csvデータ),
取得したNSStringをNSdataに次の2行にて変換しました。 (当相談室にて解決済み)
 ファイル保存はせず、データを直接、メール添付にて自分宛に送ろうとしています。 NSString* str = [NSString stringWithCString: csvData encoding:NSUTF8StringEncoding];
NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding];
 ここまでは、デバッガーで内容を確認しました。

 しかし、下記プログラムの
[controller setMessageBody:@"incl_data" isHTML:NO ];
まで行ったところで、(最終行) 
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
 // main.m
 // i_Scol-face_r

 #import <UIKit/UIKit.h>
 #import "AppDelegate.h"
 
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));

Thread 1: EXC_BAD_ACCESS (code=1, address=0x3239) と表示され、
}
}
 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

 内容をたどってみると、

libobjc.A.dylib'objc_msgSend:
3行目、
ldrh.w r12, [r9, #0xc] Thread 1: EXC_BAD_ACCESS (code=1, address=0x3539) 

あたりで止まってしまっています。

どなたか、解決策、ご教示頂けましたら、幸いです。

宜しくお願い致します。

 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

- (IBAction)buttn_mail:(id)sender {
 char *value_chr;

 for (int i=0; i <=jcount_m; i++) { 
 sprintf(value_chr, "%d", angle_ar[i]);
    strcat(csvData, value_chr);
strcat(csvData, ",");
 }

 MFMailComposeViewController* controller = [[MFMailComposeViewController alloc] init];

 // 取得したNSStringをNSdataに変換 
// NSData* data = [csvData dataUsingEncoding:NSUTF8StringEncoding]; エラー発生のため、下記に修正

 NSString* str = [NSString stringWithCString: csvData encoding:NSUTF8StringEncoding];
 NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding];

 // mimeTypeはtext/csv
 [controller addAttachmentData:data mimeType:@"text/csv" fileName:@"export.csv"];
 [controller setSubject:@"data_ mail" ];
 [controller setToRecipients:[ NSArray arrayWithObject:@"xxx@xxx.ac.jp" ] ];
 [controller setMessageBody:@"incl_data" isHTML:NO ];

 }

  • iPhoneアプリ開発 ファイル書き込み

    iPhoneアプリ開発につきまして、質問させて頂きます。 csvファイルへのデータの出力を試みているのですが上手くできません。 プログラムとログ内容を以下に記述しました。 「abc」と予め書いてある「hoge.csv」ファイルに「stringaaaaaaaaaaa」を書き込み保存しておきたいのですが、上手くいきません。 ログ内容を見る限り、「abc」が読み込めているので、パスは合っていると思っています。また、writeToFileをしてから読み込むと「stringaaaaaaaaaaa」が読み込めるため、どこかには書き込めているような気がします。 しかし、毎回同じ処理をしても、最初に読み込まれるのは「abc」です。「hoge.csv」をテキストエディタで読み込んでも表示されるのは「abc」です。 また、iPhoneシミュレーターで実行した結果は以下のログ内容なのですが、iPhone実機で動作させると、writeToFileを行ったあとでも「abc」が出力されます。 何か原因を思い当たる方、教えて頂ければ幸いです。 - (void)viewDidLoad { [super viewDidLoad]; [self setTitle:@"Stress Application"]; printf("viewdidload"); NSString *text = [[NSString alloc] initWithFormat:@"stringaaaaaaaaaaaaaaa"]; NSString *_path = [[NSBundle mainBundle] pathForResource:@"hoge" ofType:@"csv"]; //atomicallyは補助ファイルを使ってファイルの破損を防止するかどうか NSLog(@"%@",[NSString stringWithContentsOfFile:_path encoding:NSUTF8StringEncoding error:nil]); [text writeToFile:_path atomically:YES encoding:NSUTF8StringEncoding error:nil]; NSLog(@"%@",[NSString stringWithContentsOfFile:_path encoding:NSUTF8StringEncoding error:nil]); NSLog(@"%@",text); } <ログ内容> 2012-10-31 12:35:10.187 ThinkGearTouch[17182:1a903] FinishLaunching viewdidload2012-10-31 12:35:10.204 ThinkGearTouch[17182:1a903] abc 2012-10-31 12:35:10.212 ThinkGearTouch[17182:1a903] stringaaaaaaaaaaaaaaa 2012-10-31 12:35:10.212 ThinkGearTouch[17182:1a903] stringaaaaaaaaaaaaaaa

  • Objective C(iPhone SDK)でテキストファイルから一

    Objective C(iPhone SDK)でテキストファイルから一行毎データを読み出す方法を教えてください. つい最近Objective-Cを始めた初心者です. サーバ上にあるテキストファイルを読み込み,一行ごとデータを取り出し,その一行ずつ取り出したデータをTableViewの項目として表示したいと思っています.現在コンパイルが出来ているのは, NSString* text; NSString* path = @"(URL)test.txt"; NSError* error; text = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error]; までです.また,読み込むテキストファイルの内容は 0001 0002 0003 0004 [EOF] となっています.このデータの一行ずつを配列に格納する方法を教えてください,よろしくお願いします.

  • [iPhone]改行をファイル出力する方法

    [iPhone]改行をファイル出力する方法 改行を含む文字列をファイル出力するにはどうするといいのでしょうか。 ファイル出力をNSString→NSData経由で行なっていますが、改行コード(\n)が改行されず、文字として'\n'が出力されてしまいます。 現在のコードは ------------- NSMutableString* mstr = [[NSAutoreleasePool alloc] init]; for (int i=0; i<3; i++) { NSString* str = [NSString stringWithFormat:@"%@,%@\n",@"aaa", @"bbb"]; [mstr appendString:str]; } NSData* out_data = [mstr dataUsingEncoding:NSUTF8StringEncoding]; [out_data writeToFile:@"/user/test.csv" atomically:YES]; [ファイルの内容] aaa,bbb\naaa,bbb\naaa,bbb\n ------------- '\n'を'\r'や'\n\r'にしても、改行されません。 どの様にコーディングするとよいのでしょうか、宜しくお願いします。

  • Objective-C[NSMutableStringクラスについて]

    Objective-C[NSMutableStringクラスについて] はじめまして。 NSMutableStringクラスで宣言したインスタンスをどこからでも呼び出したいと思い 以下のコードを作りました。 NSMutableString extern *Mixbox; -(IBAction)TestTime:(id)sender{ NSString *Time=@"ただいまの時間\n "; NSDate *date=[NSDate date];//時間の設定 NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease]; [formatter setDateFormat:@"yyyy:MM:dd::hh:mm:ss"]; NSString *str = [formatter stringFromDate:date]; [Mixbox appendString:str]; [Mixbox appendString:Time]; self.flowView.text=(@"%@",Mixbox); } ビルドするとエラーになります。 どこからでもインスタンスを呼び出したい場合どのようにすれば良いのでしょうか? 回答をお願いします。

  • NSUserDefaultsに構造体を保存する方法

    NSUserDefaultsに構造体を保存する方法をお教えください。 下記のコードで一度実行したあと停止し、行コメントを解除しブロックコメントを有効にして再び実行すると整数のint型は出力できましたが、文字列のchar型は出力できませんでした。文字列をuserDefaultに保存し出力する方法をお教えください。 -(void)viewDidLoad{ typedef struct{ int id; char *names; }member; NSUserDefaults *userdefaults = [NSUserDefaults standardUserDefaults]; // /* //構造体をバイト列としてデータ型に変換してユーザデフォルトに保存する member memberStruct; memberStruct.id = 2; memberStruct.names = "あいうえお"; NSData *data = [NSData dataWithBytes:&memberStruct length:sizeof(member)]; [userdefaults setObject:data forKey:@"strct"]; [userdefaults synchronize]; // */ //取り出し NSData *data2 = [[NSData alloc]init]; data2 = [userdefaults objectForKey:@"strct"]; member memberStruct2; memberStruct2 = *(member *)data2.bytes; int i = memberStruct2.id; char *names2 = memberStruct2.names; NSString *string = [NSString stringWithCString:names2 encoding:NSUTF8StringEncoding]; NSLog(@"i = %i",i); NSLog(@"names2 = %@",string); }

  • Iphoneシミュレータでtxtファイルを作成する

    Iphoneシミュレータでtxtファイルを作成する 現在、Iphoneシミュレータ(3.1.3)上でプログラムを書いているのですがうまく動きません。 動作の内容はファイルを作成して、そこに文字列を書き込むだけです。 具体的にコードをはらせていただきますと、 NSArray* paths; NSString* path; paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); path = [paths objectAtIndex:0]; path = [path stringByAppendingPathComponent:@"text.txt"];   NSString *str = @"hello";   [str writeToFile:path atomically:YES encodidng:NSUTF8StringEncoding error:nil]; このようなコードを書いております。 コンパイルは正常に通るのですが、実行してみると最後のwriteToFileの行までくると強制的におちてしまいます。 どこがおかしいのでしょうか?ご指導よろしくおねがいします。

専門家に質問してみよう