今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で質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) VBAで重複データを合算したい(時間) 1 2022/12/08 23:06
- C言語・C++・C# c言語 配列とポインタについて 3 2023/02/09 22:53
- Visual Basic(VBA) Selenium.ChromeDriverの使い方について 7 2022/09/22 06:43
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- その他(プログラミング・Web制作) awkの文字列比較はPOSIXロケールまたはCロケールにおいてバイナリ値の比較に使えるか gawkな 1 2023/04/22 09:21
- Excel(エクセル) エクセルでA列セル内で折り返すことなく、文字列を、B列C列・・・側に一行に 2 2022/07/23 02:02
- C言語・C++・C# c言語 コマンドライン引数 4 2023/02/09 18:47
- Excel(エクセル) フォルダ内のエクセルファイルを開かずにデータ採取する関数式 2 2022/12/22 22:15
- Excel(エクセル) Indirect関数について、Formulatextで抽出した数式を参照したい。 1 2022/12/15 11:16
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Notepad++の関数リスト表示の変...
-
多重定義が起きている?--lnk20...
-
戻り値を返す関数の前に(void)...
-
【gcc・cygwin】multiple defin...
-
クラスのメンバ変数を基準に並...
-
(void)0 はどんな意味ですか
-
C++にてtemplateで受け取った任...
-
OpenSSLのSHA1関連の関数はどこ...
-
switch文かif文か?
-
gcc: incompatible pointer type
-
pictureboxの画像を削除するには?
-
静的でないメンバ関数の呼び出...
-
LEDで電光掲示板に「A B C D E...
-
コールバックって・・・
-
C# KeyDownイベントでショート...
-
PowerShellにてツリービュー入...
-
ArduinoでMouse関数を使用して...
-
void main()って誰が最初?:AN...
-
_beginthreadにて発生するコン...
-
VC++でGetKeyboardStateがうま...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【gcc・cygwin】multiple defin...
-
C++にてtemplateで受け取った任...
-
既定のコンストラクタがありま...
-
戻り値を返す関数の前に(void)...
-
多重定義が起きている?--lnk20...
-
静的でないメンバ関数の呼び出...
-
int main()、void main()、void...
-
VC++でGetKeyboardStateがうま...
-
C# Controls.Addで動的に配置し...
-
マルチメディアタイマーの使用方法
-
void*型の配列について
-
gcc: incompatible pointer type
-
C# KeyDownイベントでショート...
-
CreateThreadのエラー
-
C++でオーバーロードに関するバ...
-
C/C++でのScene管理について
-
const_castのつかいどころを教...
-
C++ strlenに関して
-
4桁7セグでダイナミック点灯
-
LEDで電光掲示板に「A B C D E...
おすすめ情報