今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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【gcc・cygwin】multiple defin...
-
ウインドウの移動禁止
-
C# Controls.Addで動的に配置し...
-
多重定義が起きている?--lnk20...
-
戻り値を返す関数の前に(void)...
-
関数ポインタについて
-
既定のコンストラクタがありま...
-
(void)0 はどんな意味ですか
-
H8マイコンのシリアル通信につ...
-
DLLの関数呼び出しで引数がある...
-
マルチメディアタイマーの使用方法
-
TimerProc コールバック関数を...
-
コンパイルエラー
-
int main()、void main()、void...
-
C#でトーンカーブの作成
-
C言語 extern について
-
VC++でGetKeyboardStateがうま...
-
C++にてtemplateで受け取った任...
-
アルディーノ初心者です。 下記...
-
ドラッグしたときにマウスカー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【gcc・cygwin】multiple defin...
-
C++にてtemplateで受け取った任...
-
戻り値を返す関数の前に(void)...
-
静的でないメンバ関数の呼び出...
-
多重定義が起きている?--lnk20...
-
既定のコンストラクタがありま...
-
C# Controls.Addで動的に配置し...
-
int main()、void main()、void...
-
void*型の配列について
-
(void)0 はどんな意味ですか
-
gcc: incompatible pointer type
-
C# KeyDownイベントでショート...
-
C言語 ① 5秒間 1秒間隔で点滅を...
-
Notepad++の関数リスト表示の変...
-
コールバックって・・・
-
マルチメディアタイマーの使用方法
-
_beginthreadにて発生するコン...
-
C#でラジオボタンを設定に記録...
-
VC++でGetKeyboardStateがうま...
-
typedef unsigned int UINT;が...
おすすめ情報