OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

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

  • すぐに回答を!
  • 質問No.109830
  • 閲覧数462
  • ありがとう数2
  • 気になる数0
  • 回答数3
  • コメント数0

お礼率 66% (6/9)

今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です。
通報する
  • 回答数3
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.3
レベル10

ベストアンサー率 50% (52/103)

そっか、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

お礼率 66% (6/9)

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

その他の回答 (全2件)

  • 回答No.1
レベル10

ベストアンサー率 50% (52/103)

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

{
NSString *aaaa;
[aaaa StringWithCString : cccc ];
[test testes : aaaa ];
}

でどうでしょう?

aaaaをとっておく必要がなければ
[test testes: [NSString stringWithCString : cccc] ];
だけでも平気かも知れません。
補足コメント
akira398

お礼率 66% (6/9)

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

お礼率 66% (6/9)

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


  • 回答No.2
レベル10

ベストアンサー率 50% (52/103)

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

ところで、+(void) testesはもしかして-(void) testesだったりということはありませんか?どう違うのかっていわれると私もあんまよくわかってないんでなんとも言い難いのですが、私が以前作ったプログラムのパターンからいくとこのケースでは - の方のような気がするので。

なんか当てずっぽうで申し訳ない。
補足コメント
akira398

お礼率 66% (6/9)

自分もそう思い、-にしてみたんですがそうすると
{
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の意味はよくわからないんですが・・
投稿日時 - 2001-07-27 11:35:11
このQ&Aのテーマ
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ