
今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です。
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です。
この回答への補足
たびたびすいません。ほんとありがとうございます。bobさんの回答があってほんとに参考になります。私一人では力及ばず苦戦しているものですから・・・実はこのプログラムはログ出力用のプログラムなんですよ。何百行もCのソースから呼び出されて文字列がおくりこまれているわけなんですがその度にボタンを押すような仕様にはしたくないからCのほうから呼び出そうとしているわけなんですね。オブジェクトの実体がないとゆうことなんですがつくればCからよびだすことは可能なんでしょうか?Cのソースのほうが何度も呼び出されるんですが上のソースだとその度にボタン押さないと出力できないなんてことにはならないんでしょうか?よく分からないんですいません。
補足日時:2001/07/27 13:17No.2
- 回答日時:
outputにwarningが出るということはヘッダにも関わってきそうですね。
ところで、+(void) testesはもしかして-(void) testesだったりということはありませんか?どう違うのかっていわれると私もあんまよくわかってないんでなんとも言い難いのですが、私が以前作ったプログラムのパターンからいくとこのケースでは - の方のような気がするので。
なんか当てずっぽうで申し訳ない。
この回答への補足
自分もそう思い、-にしてみたんですがそうすると
{
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の意味はよくわからないんですが・・
No.1
- 回答日時:
私も初学者であんまし分かっていないので気の効いたコメントはできませんが、とりあえずこのケースでは
{
NSString *aaaa;
[aaaa StringWithCString : cccc ];
[test testes : aaaa ];
}
でどうでしょう?
aaaaをとっておく必要がなければ
[test testes: [NSString stringWithCString : cccc] ];
だけでも平気かも知れません。
この回答への補足
ヘッダのほうがおかしいんでしょうか?ヘッダはこんな感じで
#import <Cocoa/Cocoa.h>
@interface test: NSObject
{
IBOutlet id output;
}
+(void) testes :(NSString *)aaaa;
@end
testのなかのNSTextViewのテキストフィールドにoutretをむすんであるのですが
どうでしょう?
ご忠告ありがとうございます。しかしこれでもまだwarningがとれず画面に表示されません。instance variable’output’accessed in class methodなどというwarningがでてしまいmainのCのプログラムは走るのですが画面のほうがうまくいきません。どうしたらいいでしょう?昨日からこの問題で10時間以上かけていてもうちょっと疲れました。いいアドバイスをお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
既定のコンストラクタがありま...
-
静的でないメンバ関数の呼び出...
-
アドレスを指定して関数を呼び...
-
C++でオーバーロードに関するバ...
-
stddef.hって何?
-
gcc: incompatible pointer type
-
C#でテンキーの操作は可能でし...
-
C言語 ① 5秒間 1秒間隔で点滅を...
-
__threadを使うコードで、分割...
-
DLLの関数呼び出しで引数がある...
-
(void)0 はどんな意味ですか
-
4桁7セグでダイナミック点灯
-
C# KeyDownイベントでショート...
-
LEDで電光掲示板に「A B C D E...
-
C で、関数の中から、別の関数...
-
自作DirectShow Filterのinter...
-
【gcc・cygwin】multiple defin...
-
CTabCtrl:TABインデックス単位...
-
コンパイルエラー: LNK2001
-
「Aに対するBの割合」と「Aに対...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
既定のコンストラクタがありま...
-
静的でないメンバ関数の呼び出...
-
【gcc・cygwin】multiple defin...
-
戻り値を返す関数の前に(void)...
-
const_castのつかいどころを教...
-
多重定義が起きている?--lnk20...
-
C++にてtemplateで受け取った任...
-
C# Controls.Addで動的に配置し...
-
(void)0 はどんな意味ですか
-
C# KeyDownイベントでショート...
-
gcc: incompatible pointer type
-
Notepad++の関数リスト表示の変...
-
C#でテンキーの操作は可能でし...
-
[Visual C++ 6.0] コンパイル(...
-
C言語 ① 5秒間 1秒間隔で点滅を...
-
関数ポインタについて
-
void*型の配列について
-
C言語 プロトタイプ宣言
-
pictureboxの画像を削除するには?
-
カノニカルモードの設定について
おすすめ情報