今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です。

このQ&Aに関連する最新のQ&A

A 回答 (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:17
    • good
    • 0

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の意味はよくわからないんですが・・

補足日時:2001/07/27 11:35
    • good
    • 0

私も初学者であんまし分かっていないので気の効いたコメントはできませんが、とりあえずこのケースでは



{
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をむすんであるのですが
どうでしょう?

補足日時:2001/07/27 10:49
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/07/27 09:14

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q画像の結合

png jpg gif 形式の画像があります。これらを切り貼りして、一枚の画像を作りたいのですが、下記の条件を満たすフリーウェアで良いものを教えてください。

  1、png jpg gif 形式対応
  2、切り抜き、結合機能
  3、文字入れ、モザイクなどの簡単な画像処理
  4、動作が軽快

フォトショップエレメンツは手元にあるのですが、重すぎて使い物になりません。

Aベストアンサー

こんばんわ。フリーでも幾つかありますよ。

JTrimなんてどうでしょう?
http://www.woodybells.com/jtrim.html

標準ではgif形式に対応してませんが、Susieプラグインに対応してるので、
gifプラグインを入手すれば使えるようになります。

http://www.digitalpad.co.jp/~takechin/download.html
ここから、Plug-in package ver0.08をダウンロードしてください。
gifプラグインが含まれてます。

他にも
http://ringonoki.net/tool/paint/1-paint.html
辺りから探してみてください。ペイントソフトの中にはフォトレタッチつまり画像編集用として十分使えるものも幾つかありますので。

Qvoid main(void){...}だとDosWindowが開くので

わざわざWindowsアプリにして以下のようにするしかないのでしょうか?

LONG WINAPI WinProcedure(HWND hW,UINT wM,UINT wP,LONG lP)
{
//ここに宣言を置く
switch(wM)
{
case WM_CREATE:
//ここに処理を置く
return 0;
default:
return(DefWindowProc(hW,wM,wP,lP));
}
}
WINAPI WinMain(HINSTANCE hI,HINSTANCE,LPSTR,int nCS)
{
WNDCLASSwc;
HWNDhW,hPW;
MSGms;

wc.lpszClassName="goo";
wc.lpfnWndProc=(WNDPROC)WinProcedure;
wc.hInstance=hI;
wc.style=CS_HREDRAW|CS_VREDRAW;
wc.cbClsExtra=NULL;
wc.cbWndExtra=NULL;
wc.hIcon=LoadIcon(NULL,IDI_EXCLAMATION);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName=NULL;
RegisterClass(&wc);
hW=CreateWindow
(
"goo",
"教えて!goo",
WS_OVERLAPPED,
0,
0,
640,
456,
NULL,
NULL,
hI,
NULL
);
ShowWindow(hW,nCS);
UpdateWindow(hW);
while(GetMessage(&ms,NULL,NULL,NULL))
{
TranslateMessage(&ms);
DispatchMessage(&ms);
}
return (ms.wParam);
}

もっと簡単にDosWindowが開かないようにする方法はないのでしょうか?
もしないとすると上記記述でもっと簡単にできないでしょうか?

わざわざWindowsアプリにして以下のようにするしかないのでしょうか?

LONG WINAPI WinProcedure(HWND hW,UINT wM,UINT wP,LONG lP)
{
//ここに宣言を置く
switch(wM)
{
case WM_CREATE:
//ここに処理を置く
return 0;
default:
return(DefWindowProc(hW,wM,wP,lP));
}
}
WINAPI WinMain(HINSTANCE hI,HINSTANCE,LPSTR,int nCS)
{
WNDCLASSwc;
HWNDhW,hPW;
MSGms;

wc.lpszClassName="goo";
wc.lpfnWndProc=(WNDPROC)WinProcedure;
wc.hInstance=hI;
wc.style=CS_HREDRAW|CS_VREDRAW;
wc...続きを読む

Aベストアンサー

ウィンドウを開く必要がないなら、mainをWinMainに変更するだけで良いのでは? ウィンドウクラス登録、ウィンドウ作成、メッセージループ、ウィンドウプロシージャは全て不要な気がしますが。

WINAPI WinMain(HINSTANCE hI,HINSTANCE,LPSTR,int nCS)
{
  //処理内容

  return 0;
}

Q自作GIFのアイコンがWEB上できれいに表示されないのは?

自作でアイコン用ボタンのGIF(ボタンの形に文字をのせて結合させてGIFにした単純なもの・・アドビイラストレータで作成)を自分のWEB上にアップしてみると文字がややつぶれたり、ボタンの周りに薄いピンクの線が見えたりします。当然アップする前の状況は上記ソフトでWEB用に変換し、きれいなのですが。
 アップしたいサイズは横50・縦20くらいのボタンです。よいやり方を教えてください。

Aベストアンサー

外してたらすみません.

掲載されるアイコンのピクセル数に指定はありませんか?
Webページで表示する際のHTML記述でサイズを指定されている場合があります,
このサイズと元絵のサイズが合っていないと
変換されます.
写真画像等なら目立ちませんが,
コントラストがはっきりした画像は
大抵汚くなります.

表示されるサイズに合わせて作っておくと変に変換されずに済みます.

Qvoid (*signal(int signum, void (*handler)(int)))(int);

の解釈を教えてください
最後の「(int)」については詳しくお願いします

Aベストアンサー

signalが

(1)1つ目の引数の型:int
(2)2つ目の引数の型:引数がintで戻り値がvoidである関数へのポインタ
(3)戻り値の型:引数がintで戻り値がvoidである関数へのポインタ(2と同じ)

を満たす関数である事を宣言しています。最後の(int)はsignalの戻り値の
関数ポインタがint型の引数を持つ事を示しています。

「引数がintで戻り値がvoidである関数へのポインタ」の型をHANDLERと表すと

HANDLER signal(int signum, HANDLER handler);

となります。

QWebでgif画像が表示されません。

基本的なことだと思いますが、教えてください。
http://www.cgi-down.com/cgi/g_counter.php
上のCGIのカウンターをためしに設置しようとしてみて
画像が×印で表示されてうまくいかず、以下のようにindex.htmlに
<img src="../cgi-bin/image/0.gif">
<img src="127.0.0.1/cgi-bin/image/0.gif">
などと実際にGIF画像を表示させてみようとしたのですがそれでもうまくいきません。
場所は以下のようになっていて
Linux上のファイラー上ではGIF画像は正しく表示されています。
# ls /var/www/html/index.html
/var/www/html/index.html
# ls /var/www/cgi-bin/image/
0.gif 1.gif 2.gif 3.gif 4.gif 5.gif 6.gif 7.gif 8.gif 9.gif Thumbs.db

httpd.confでは
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
としておりExecCGIも有効にしています。
よければ教えてください。

基本的なことだと思いますが、教えてください。
http://www.cgi-down.com/cgi/g_counter.php
上のCGIのカウンターをためしに設置しようとしてみて
画像が×印で表示されてうまくいかず、以下のようにindex.htmlに
<img src="../cgi-bin/image/0.gif">
<img src="127.0.0.1/cgi-bin/image/0.gif">
などと実際にGIF画像を表示させてみようとしたのですがそれでもうまくいきません。
場所は以下のようになっていて
Linux上のファイラー上ではGIF画像は正しく表示されています。
# ls /var/www/html/index.htm...続きを読む

Aベストアンサー

よく考えたらScriptAliasディレクティブですよね。

>ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"​

ScriptAliasで指定した/var/www/cgi-binディレクトリ配下にあるファイルはスクリプトファイルだと判断され、画像ファイルも実行しようとしてエラーになるようなので、/var/www/cgi-binディレクトリとは別の場所に画像ファイルを置いてそちらを参照するようにするのはどうでしょうか?

Qtry{}catch(){}とデストラクタの関係を教えてください。

try-catchでメモリ確保を含むクラスをスローした場合、デストラクタはどの時点で働くのか、教えてください。たとえば、↓の使いかたは大丈夫でしょうか?

【1】
try{
 throw(CError(100, "エラー情報"));
}catch(CError& err){
 //ここでerrを参照しても問題ないのでしょうか?
}

【2】
try{
 CError err(100, "エラー情報");
 throw(err); // (1)
}catch(CError& err){
 //ここでerrを参照しても問題ないのでしょうか?
 //まだデストラクタはちゃんと動作するのでしょうか?
 //catchが呼び出し元のメンバであったりしても大丈夫なのでしょうか?
}

宜しくお願いします。

Aベストアンサー

【1】【2】どちらの場合も問題がありません。
コンパイラが必要に応じてerrオブジェクトのコピーを作成します。
デストラクタが呼び出されるタイミングはコンパイラに依存するところもあると思いますが、
例えばVC7.1では【2】は以下のように動作します。
(1) errオブジェクトのコンストラクタが呼び出される
(2) CErrorクラスのテンポラリオブジェクト(以下a)のコピーコンストラクタが呼び出される。
(3) errオブジェクトのデストラクタが呼び出される
(4) catch文まで到達
(5) aオブジェクトのデストラクタが呼び出される。

VC7.1では、【1】は以下のように動作します。
(1) errオブジェクトのコンストラクタが呼び出される
(2) catch文まで到達
(3) errオブジェクトのデストラクタが呼び出される。

コンパイラがオブジェクトのコピーを省略しているようです。

QGIF画像の著作権

JPEG,BMPはOK

GIFは著作権にうるさいからと良く聞きますが、
どういう使い方をすると著作権にかかわるのでしょうか?


1.GIFを表示したホームページ
2.タイトルにGIFを表示しただけのコンピューターソフト
3.GIF自体を使える(GIF編集)コンピューターソフト

※GIFを使ってどのようなものを
作った辞典で著作権なのでしょうか?

Aベストアンサー

著作権とは、画像などの著作物を作成した人の持つ権利です。

GIFという画像形式は、著作権ではなく特許権(画像を圧縮・表示する技術)で守られていて、会社がその管理を厳重にしていて、その形式のファイルを扱うことができるソフトに関しては、ライセンス料(利用料)を要求しているので、いろいろと煩くなっています。

ライセンス料を支払っているソフトを使って画像を作成したり、表示したりすることは何の問題もありません。

Qエラー「invalid conversion from `void (*)()' to `void (*)(int)'」

皆様、よろしくお願いしたします。RedHat9上で
次のような「鬼ごっこのプログラム」server.cをコンパイルしています。

$ g++ -o server server.c
server.c: function 内の `void session_init(int, char, int, int, char, int,
int)':
server.c:134: invalid conversion from `void (*)()' to `void (*)(int)'

というエラーが出てしまいます。
134行というと
「 signal(SIGINT, die);」
なのですが何が間違っているんでしょうか?

Aベストアンサー

die の宣言を
void die(int sig);
にしたのであれば, session_loop の中で die を呼出すときにも引数は必要ですよ.

また, 最後の die の定義のところでも引数を取るようにしていますよね? ←念の為.

Q画像形式のGIFについて教えてください。

画像形式のGIFについて教えてください。

GIFには、GIF32、GIF64、GIF128

と言うのがありますが、この中で、一番高画質なのは、どの形式ですが。

あと、イラストレーターで保存する場合、

ディザあり、なし、を選択できますが、

高画質で保存する場合、あり、なし、どちらを選択すればよいのでしょうか。

Aベストアンサー

■GIFには、GIF32、GIF64、GIF128と言うのがありますが、この中で、一番高画質なのは、どの形式ですが。この中で、一番高画質なのは、どの形式ですが。
>>このなかで一番色の多いのが128色です。


■ディザあり、なし、を選択できますが高画質で保存する場合、あり、なし、どちらを選択すればよいのでしょうか。
>>低画質で保存して見難いときは、ディザで新聞写真のようにドット化して保存します。

Q「void ( *signal(int sig, void (*func)(int)) ) (int)」の (int)

signal関数の書式についてですが、

  void ( *signal(int sig, void (*func)(int)) ) (int);

最後に付く(int)は一体何でしょうか?
このような関数の書式ははじめて見ました。
UNIX系の何かでしょうか。
回答よろしくお願いします。

Aベストアンサー

typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t sighandler);
より後半部分のtypedefを置き換えると
sighandler_t signal(int signum, void (*sighandler)(int));
つぎに戻り値の部分のtypedefを置き換えると
void (*signal(int signum, void (*sighandler)(int)))(int);
となります。
(
sighandler_t signal(int signum, void (*sighandler)(int));
の「signal(int signum, void (*sighandler)(int))」をAと置き換えて
sighandler_t A;
からtypedefを置き換えると
void (*A)(int);
となり、Aを戻すと
void (*signal(int signum, void (*sighandler)(int)))(int);
となる。
)

typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t sighandler);
より後半部分のtypedefを置き換えると
sighandler_t signal(int signum, void (*sighandler)(int));
つぎに戻り値の部分のtypedefを置き換えると
void (*signal(int signum, void (*sighandler)(int)))(int);
となります。
(
sighandler_t signal(int signum, void (*sighandler)(int));
の「signal(int signum, void (*sighandler)(int))」をAと置き換えて
sighandler_t A;
からtypedefを置き換...続きを読む


人気Q&Aランキング