
今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ランキング
-
const_castのつかいどころを教...
-
【gcc・cygwin】multiple defin...
-
静的でないメンバ関数の呼び出...
-
戻り値を返す関数の前に(void)...
-
gcc: incompatible pointer type
-
C++にてtemplateで受け取った任...
-
既定のコンストラクタがありま...
-
見た目は同じソースなのにエラ...
-
こんなコンパイルエラーがでます。
-
C# KeyDownイベントでショート...
-
int main()、void main()、void...
-
C#でラジオボタンを設定に記録...
-
多重定義が起きている?--lnk20...
-
GDI+の使用方法について
-
Objective-CとCの結合について
-
一定時間ごとにプログラムを起...
-
C言語 int main(void) main()
-
コンパイルエラー: LNK2001
-
コールバックって・・・
-
アドレスを指定して関数を呼び...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
静的でないメンバ関数の呼び出...
-
【gcc・cygwin】multiple defin...
-
戻り値を返す関数の前に(void)...
-
多重定義が起きている?--lnk20...
-
C++にてtemplateで受け取った任...
-
const_castのつかいどころを教...
-
既定のコンストラクタがありま...
-
C# Controls.Addで動的に配置し...
-
(void)0 はどんな意味ですか
-
C#でラジオボタンを設定に記録...
-
ウインドウの移動禁止
-
Notepad++の関数リスト表示の変...
-
Delphiの定数とローカル変数の...
-
typedef unsigned int UINT;が...
-
int main()、void main()、void...
-
C言語 extern について
-
void*型の配列について
-
VC++でGetKeyboardStateがうま...
-
_beginthreadにて発生するコン...
-
gcc: incompatible pointer type
おすすめ情報