Objective-CとCの結合について

このQ&Aのポイント
  • Cの関数から文字列をもらってObjective-Cでウィンドウに表示させる方法。
  • initWithCStringとstringWithCStringの使い方がわからない。
  • Objective-CとCの結合でおかしい箇所やwarningについて。
回答を見る
  • ベストアンサー

Objective-CとCの結合について

今Cの関数から文字列をもらってObjective-Cでウィンドウに表示させようとしているのですが、initWithCStringとかstringWithCStringの使い方がよくわかりません。今具体的にいうと #import "test.h" @implementation test +(void) testes:(NSString *)aaaa { [ output setStringValue : aaaa ]; } @end void Output_window(char *cccc) { NSString *aaaa; aaaa = [aaaa initWithString:aaaa]; [test testes : aaaa]; } こんなソースを書いてます。*ccccはCの文字列でoutputはoutletです。Output_windowをCソースのほうで呼び出して文字列をもらっています。どこがおかしいんでしょうか?指摘していただけませんか?最後の行でwarningが出るんですがそこだけがおかしいのかよくわかりません。Objective-Cをはじめて一週間程度ですので文法のことがいまいちよくわからないのでよろしくお願いします。 環境はMacOSX、ProjectBuilderとInterfaceBuilderでcocoaです。

質問者が選んだベストアンサー

  • ベストアンサー
  • bob
  • ベストアンサー率50% (52/103)
回答No.3

そっか、testはclassの名前だから、単に[test testes : aaaa ]; だとオブジェクトの実体がないですね。 ここは方針をちょっと変えて、Objective-Cの方からCソースの方にアクセスする形式にする必要がありそうです。多分こちらの方がCocoaプログラミングの定石だと思われます。実際、GUIのアップデートのタイミングはGUI側からしか制御できないですし。 こんな感じかな? // // test.m // #import "test.h" char *GetOutput_CStrings( void ); // もちろん実際にはヘッダファイルから @implementation test - (void) testes { [ output setStringValue : [NSString stringWithCString : Get_Output_CStrings()] ]; } @end // // ???.c // #define Buffer_Size 256 char *Get_Output_CStrings( void ) { static char cccc[Buffer_Size]; : : : return cccc; } で、例えばなんかのボタンを押した時にtestesが呼ばれるようにすればOKです。

akira398
質問者

補足

たびたびすいません。ほんとありがとうございます。bobさんの回答があってほんとに参考になります。私一人では力及ばず苦戦しているものですから・・・実はこのプログラムはログ出力用のプログラムなんですよ。何百行もCのソースから呼び出されて文字列がおくりこまれているわけなんですがその度にボタンを押すような仕様にはしたくないからCのほうから呼び出そうとしているわけなんですね。オブジェクトの実体がないとゆうことなんですがつくればCからよびだすことは可能なんでしょうか?Cのソースのほうが何度も呼び出されるんですが上のソースだとその度にボタン押さないと出力できないなんてことにはならないんでしょうか?よく分からないんですいません。

その他の回答 (2)

  • bob
  • ベストアンサー率50% (52/103)
回答No.2

outputにwarningが出るということはヘッダにも関わってきそうですね。 ところで、+(void) testesはもしかして-(void) testesだったりということはありませんか?どう違うのかっていわれると私もあんまよくわかってないんでなんとも言い難いのですが、私が以前作ったプログラムのパターンからいくとこのケースでは - の方のような気がするので。 なんか当てずっぽうで申し訳ない。

akira398
質問者

補足

自分もそう思い、-にしてみたんですがそうすると { NSString *aaaa; [aaaa StringWithCString : cccc ]; [test testes : aaaa ]; ←----ここで } こっちのほうでwarningがでるんですよね。2つ。 :::cannot find use class (factory) method. :::return type for 'testes',default to id. 多分クラスの中のメソッドが呼び出せてはいないみたいなんですよね。 2行目のwarningの意味はよくわからないんですが・・

  • bob
  • ベストアンサー率50% (52/103)
回答No.1

私も初学者であんまし分かっていないので気の効いたコメントはできませんが、とりあえずこのケースでは { NSString *aaaa; [aaaa StringWithCString : cccc ]; [test testes : aaaa ]; } でどうでしょう? aaaaをとっておく必要がなければ [test testes: [NSString stringWithCString : cccc] ]; だけでも平気かも知れません。

akira398
質問者

お礼

ご忠告ありがとうございます。しかしこれでもまだwarningがとれず画面に表示されません。instance variable’output’accessed in class methodなどというwarningがでてしまいmainのCのプログラムは走るのですが画面のほうがうまくいきません。どうしたらいいでしょう?昨日からこの問題で10時間以上かけていてもうちょっと疲れました。いいアドバイスをお願いします。

akira398
質問者

補足

ヘッダのほうがおかしいんでしょうか?ヘッダはこんな感じで #import <Cocoa/Cocoa.h> @interface test: NSObject { IBOutlet id output; } +(void) testes :(NSString *)aaaa; @end testのなかのNSTextViewのテキストフィールドにoutretをむすんであるのですが どうでしょう?

関連するQ&A

  • C(char *s1)の文字列をObjective-Cの文字列(NSS

    C(char *s1)の文字列をObjective-Cの文字列(NSString *s2)にするにはどうしたらよいのでしょうか? char s1[] = "abc"; NSString *s2 = [[NSString alloc] initWithUTF8String:s1];  // (A) NSLog(@"s2=[%s]", s2); 結果がabcかなと思っていましたが、読めない変な文字が表示されました。 (A)を NSString *s2 = [NSString stringWithFormat:@"%s", s1]; に変えても同じでした。 s1のC文字列は日本語を含まないアルファベットの文字列なのになぜ?と 困っています。 Objective-Cの初心者で申し訳ありません。

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

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

  • MacOSでObjective-cの変数について

    お世話になっております。 Windows用にVBで作ったプログラムを、Mac用にも作ることになりました。 Objective-cでVBと同じ動きをするように作りたいのですが、クラス変数が分からないので困っています。 最初に文字列の変数に値を代入してタイマーに渡したいのですが、先頭付近に「NSString *moji」と「int kazu」を宣言すると、数値は参照出来ますが文字列は参照出来ません。 「static NSString *moji」等いろいろ試しましたがエラーで止まってしまいます。 文字列をタイマーから参照するためにはどのように文字列を宣言すれば良いか、ご存知の方が居られましたらご教授をお願いいたします。 お手数をお掛け致しますが、よろしくお願いいたします。

  • Objective-Cで、スレッドを作成したいのですが引数をどのように

    Objective-Cで、スレッドを作成したいのですが引数をどのように定義するのか構文がわかりません。 [NSThread detachNewThreadSelector:@selector(test) toTarget:self withObject:self]; // A - (void)test { NSLog(@"スレッド実行"); } ですが、 - (void)test(NSString *msg) { NSLog(@"スレッド実行 msg=[%@]", msg); } の場合のAの書き方です。

  • 【Objective-C】プロパテイについて

    Objectiv-Cの勉強を始めたばかりの者です。 プロパテイの機能を理解する為に以下のようなプログラムを書きました。 例1)まずは、プロパテイを使わない例です。 ーーーーーーー data.h ーーーーーーー #import <Foundation/NSObject.h> #import <Foundation/NSString.h> @interface Data : NSObject { NSString* str; } - (void)setStr:(NSString* )arg; - (NSString*)retStr; @end ーーーーーーー data.m ーーーーーーー #import "Data.h" @implementation Data - (NSString*) retStr{ return str; } - (void)setStr:(NSString*) arg{ [arg retain]; [str release]; str = arg; } @end ーーーーーーー main.m ーーーーーーー #import <stdio.h> #import "Data.h" int main(void) { Data* data = [[Data alloc] init]; [data setStr:@"aaa"]; NSLog(@"%@",[data retStr]); return 0; } 例2)次に、プロパテイを使って例1を書き換えてみました。 ーーーーーーー data.h ーーーーーーー #import <Foundation/NSObject.h> #import <Foundation/NSString.h> @interface Data : NSObject { NSString* str; } @property (retain) NSString* str; @end ーーーーーーー data.m ーーーーーーー #import "Data.h" @implementation Data @synthesize str; @end ーーーーーーー main.m ーーーーーーー #import <stdio.h> #import "Data.h" int main(void) { Data* test = [[Data alloc] init]; test.str = @"hoge"; NSLog(@"%@",test.str); return 0; } 例2を実行した結果、以下のように出力されました。 2010-02-05 22:17:50.696 data[1583:903] *** __NSAutoreleaseNoPool(): Object 0x100001068 of class NSCFString autoreleased with no pool in place - just leaking 2010-02-05 22:17:50.698 data[1583:903] hoge @propertyのオプションを(retain) ではなく、(assign)に変更すると、 2010-02-05 22:30:02.271 data[1619:903] hoge と出力されて、期待した結果が得られるのですが、なぜretainではダメなのでしょう? また、assignでも例1のようなメモリ管理は自動的に行われているのでしょうか? 以上、ご指導の程、よろしくお願いいたします。

  • 【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で、できるのでしょうか? 以上、ご指導のほど、宜しくお願いいたします。

  • PHPのsubstr関数をC++とObjective-C++に置き換え

    PHPのsubstr関数をC++とObjective-C++に置き換える方法 ・PHP $s = "abcdefg"; $t = substr($s, 3, 2); というPHPのソースから C++と Objective-C++に変更したいのですが どう記述すればよいのでしょうか? ・C++ char s[] = "abcdefg"; ??? ・Objective-C++ iOSは3.2です。 NSString *s = @"abcdefg"; ???

    • ベストアンサー
    • Mac
  • cocoa objective-c の return と * の意味がわかりません。

    objective-c の参考書を何冊か購入して 勉強しているのですが、本に載っていないようで ネットでもいくら探しても(探し方が悪いのか)行き当たらないので困ってしまいました。 先に進めなくなってしまいましたので教えていただきたく 投稿しました。 以下のコード(Project Builder起動直後のMyDocument.m)で return self; の return と - (NSString *)windowNibName の * です 使用法を教えていただけたら助かります。 よろしくお願いします。 #import "MyDocument.h" @implementation MyDocument - (id)init { self = [super init]; if (self) { message and return nil. } return self; } - (NSString *)windowNibName { return @"MyDocument"; } - (void)windowControllerDidLoadNib:(NSWindowController *) aController { [super windowControllerDidLoadNib:aController]; } - (NSData *)dataRepresentationOfType:(NSString *)aType { return nil; } - (BOOL)loadDataRepresentation:(NSData *)data ofType:(NSString *)aType { return YES; } @end

  • objective-cにはCのような関数はない?

    c言語とobjective-cを並行して勉強しています。 c言語では機能をまとめるために関数を定義できますよね。 ----- void display(int a){ printf("%d" , a); } int main(void){ display(10); } --- これでdisplayという関数に10という引数を渡して表示させることができますよね? objective-cの場合は例えば以下のように書くことがわかり、コンパイルも通りました。 - (void)display{ NSlog(@" TEST "); } しかし・・・・呼び出すことができませんね。。。 objective-cの場合は[ インスタンス メソッド名 ]; のような呼び方なのですよね。 メソッドだけを呼び出すことはできない、ってことなのでしょうか・・・? 色々検索してみたのですが、 @implement~@endで囲んでクラスにして インスタンスを作って、メソッドを呼ぶ方法ばかりで、 上記のC言語の例のような、単純な関数定義→呼び出しの方法を見つけることができませんでした。 上記のようなC言語の例はよくあると思うのですが、 これと同じことがobjective-cで、できるともできないとも、書いてないように思います。 例えば上のc言語と同じ動作をobjective-c に移植するとどうなるのでしょうか・・・?というか、不可能、ということでしょうか・・・?

  • Objective-Cのメモリ管理について

    iPhoneのUIBarButtonItem(右上のボタン)を押すと、xamppのPHPで作ったwebサーバーにPOSTを送り、送ったPOSTの内容で異なるデータをiPhoneに返す仕組を作っていたら、Objective-Cのメモリ管理でつまづきました。 どうすれば以下のソースにあるNSString *strがメモリ解放されないかを知りたいです。 【ソース】 - (void)connection:(NSURLConnection*)connection didReceiveData:(NSData*)data { //PHPのデータ char* p = (char*)[data bytes]; NSString *str = [[NSString alloc] initWithUTF8String:p]; NSLog(@"str_RETAIN:%d",[str retainCount]); ←問題の箇所 NSRange rng; rng = [str rangeOfString:@"比較したい文字列"]; if(rng.length > 0) ...以下、strに関係する部分はないので省略 } この時、NSStringでalloc,initWithUTF8Stringを呼び出した後のNSLogのretainCountは呼び出すたびに常に1が出るようにしたいのですが、なぜか0になったり1になったりしてしまいます。 コンソール画面で何度も試しましたが、0になったり1になったりするのに法則性がなく、最初0で次押すと1,1,1,0,1,1,0とか、最初1,0,1,0,0,1,1,1,1,1...など、乱数のような状況になってます。 なので、0になった場合は、セットした値が無くなってしまっていて、次の部分文字列の比較(rng = [str rangeOfString:@"比較したい文字列"];)の部分で正しい動作ができなくなってしまってます。 送られてくるPHPのデータ(char *)は特に問題なさそうです。 後、サーバーに接続出来ない場合は、別の処理でエラー判定が出来るようになっているので、最初からデータがないという事はないです。 分かる方いましたら、ご回答お願いします。