掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.28633

unsigned char[255]の型をconst char*にするには?(キャスト以外)
投稿者---C言語初心者(2006/10/30 19:24:17)


前にも似た様な投稿をしました。
その時はキャストで何とかなり、解決したのですが、
どうやらキャストを使い続けているとアプリケーション実行中にクラッシュが発生する様です。
キャスト以外でunsigned char[255]の型をconst char*に変更する方法はありますか?
使用環境はMAC OS9のコードウォリアー3.2?です。
(環境はあまり関係ないとは思いますが…)


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:unsigned char[255]の型をconst char*にするには?(キャスト以外) 28636 とろり 2006/10/30 20:04:23
<子記事> Re:unsigned char[255]の型をconst char*にするには?(キャスト以外) 28638 かずま 2006/10/30 20:22:59
<子記事> Re:unsigned char[255]の型をconst char*にするには?(キャスト以外) 28639 yoh2 2006/10/30 21:13:38


No.28636

Re:unsigned char[255]の型をconst char*にするには?(キャスト以外)
投稿者---とろり(2006/10/30 20:04:23)


こんにちは。

変数の型を変えることをキャストと言います。なので、

>キャスト以外でunsigned char[255]の型をconst char*に変更する方法はありますか?



キャスト以外でunsigned char[255]の型をconst char* に『キャスト』する方法はありますか?

と言っているわけで。。。


>その時はキャストで何とかなり、解決したのですが、
>どうやらキャストを使い続けているとアプリケーション実行中にクラッシュが発生する様です。

前のコードがどのようなものか知らないので何とも言えませんが、
プログラムの内容を理解せずに、むやみにキャストしていませんか?

エラーや警告を消す為にキャストを乱発すると、アプリは予期しない動作をしたりします。


この投稿にコメントする

削除パスワード

No.28637

Re:unsigned char[255]の型をconst char*にするには?(キャスト以外)
投稿者---とろり(2006/10/30 20:13:04)


>変数の型を変えることをキャストと言います。

自分で自信がなくなってきたので、調べてみたら、どうやら
"明示的"型変換のことをキャストと呼ぶらしいですね。

アプリがクラッシュする(落ちるということで良いよね?)のは変換によって領域を壊している可能性大なので、
どのみち、プログラムの見直しが必要でしょう。


この投稿にコメントする

削除パスワード

No.28640

Re:unsigned char[255]の型をconst char*にするには?(キャスト以外)
投稿者---C言語初心者(2006/10/30 21:45:06)


自作のプログラムは何度も読み直していますが、
なんて言うか、もう、今はまさにスランプ状態です;_;
何が何でもパスカル文字列をC言語char*に変換したいのですが…


この投稿にコメントする

削除パスワード

No.28638

Re:unsigned char[255]の型をconst char*にするには?(キャスト以外)
投稿者---かずま(2006/10/30 20:22:59)


> キャスト以外でunsigned char[255]の型をconst char*に変更する方法はありますか?

あります。
    unsigned char a[255];
    void *vp = a;
    const char *cp = vp;
しかしこれは、
    const char *cp = (const char *)a;
と書いたのと同じです。


> どうやらキャストを使い続けているとアプリケーション実行中に
> クラッシュが発生する様です。

そんなはずはありません。
    cp += 365;
    *cp = 'a';
のように、元の配列の範囲外をアクセスしたのではありませんか?


この投稿にコメントする

削除パスワード

No.28641

Re:unsigned char[255]の型をconst char*にするには?(キャスト以外)
投稿者---まかープログラミング初心者(2006/10/30 21:48:42)


ありがとうございます。とりあえず教えて頂いた方法で試してみます。
キャストを利用するとクラッシュする点については、
何故かが分からないからこそ困っているという具合です。
処理系依存なのかコードウォリアーのバグなのか…
しかし自分は決して挫折しませんw!
一番肝心な処理が上手く行かずにちょっと呆然状態ですが…


この投稿にコメントする

削除パスワード

No.28643

Re:unsigned char[255]の型をconst char*にするには?(キャスト以外)
投稿者---まかープログラミング初心者(2006/10/30 22:06:36)


やってみました…が、駄目でした…。
しかし、一つ分かったことがあります。
キャストや関数での変換、その他諸々の処理関係なく、
パスカルの文字列をC言語の文字列に変換する操作が全てクラッシュの原因になっているようです。
色々試しましたが、やはり原因はそこに一存してるっぽいです…
と、なると、処理系依存度が高いと思われます…一体どうすれば…


この投稿にコメントする

削除パスワード

No.28639

Re:unsigned char[255]の型をconst char*にするには?(キャスト以外)
投稿者---yoh2(2006/10/30 21:13:38)


もう流れてしまっていますが、質問の内容から察するに、以前「まかープログラミング初心者」
という名前で投稿された方ですか?
# もしそうなら名前は固定してほしいなぁ

>使用環境はMAC OS9のコードウォリアー3.2?です。
>(環境はあまり関係ないとは思いますが…)

んじゃ環境に関係のありそうなあたりで。
パスカル文字列とC文字列との変換はきちんと行っていますか?

きちんと行っているなら、そもそもキャストが必要な場面がほとんどなくなるハズです。
そして単なるキャストで無理矢理コンパイルを通すとまず正常に動きません。


Macプログラミングについて知らない方が多数だと思いますので、一応解説しますと、
MacのAPIが扱う文字列は大抵パスカル文字列というものになっています。
そして、C文字列とパスカル文字列の違いは以下のようになっています。
(前回もちょっと書きましたが)

C文字列: '\0'で終端する。
(「hello」 -- { 'h', 'e', 'l', 'l', 'o', '\0' }、文字列リテラル表記は"hello")

パスカル文字列: 先頭にバイト数(先頭バイト自身は含まれず)が入る。(そして'\0'終端しない)
(「hello」 -- ( 5, 'h', 'e', 'l', 'l', 'o' }、文字列リテラル表記は"\phello")


この投稿にコメントする

削除パスワード

No.28642

Re:unsigned char[255]の型をconst char*にするには?(キャスト以外)
投稿者---まかープログラミング初心者(2006/10/30 21:53:24)


パスカルとCの配列はp2cstr()で行っています。
具体…というか実際のコードの部分を取り上げると、

GetDialogItem(aDlog, DIALOG2_CNAME_ID, &aDummyShort, &aHandle, &aDummyRect);
GetDialogItemText(aHandle, the_string);
p2cstr(the_string);//break;
see_string = (unsigned char*)the_string;
cname = (char*)see_string;//バク発見!というか、キャスト(一定の部分)やろうとするとバグる/コンパイル時は警告等はない
//printf("%s", cname);
break;

と、なっています。
ソースはコレです↓
http://up.spawn.jp/file/up47708.zip.html

それにしても悔しいです。一番肝心なやり取りの部分でスランプするなんて…
自分が考えたプログラムだと、パスカル文字列をCのchar*に置き換えられなければ話になりません…


この投稿にコメントする

削除パスワード

No.28644

Re:unsigned char[255]の型をconst char*にするには?(キャスト以外)
投稿者---RiSK(2006/10/30 22:31:44)


とりあえずキャストキャストと騒ぐのは止めてくださいね。

>パスカルとCの配列はp2cstr()で行っています。

p2cstrはどのように宣言されていますか?
どのような関数ですか?

ヘッダを探すなり,マニュアルを探すなりして,
ここに貼り付けてもらえますか?
char* Pascal2Cstr(Str255 the_string, unsigned char* see_string)
{
    
    p2cstr(the_string);
    see_string = (unsigned char*)the_string;
    
    return (char*)the_string;
    
}

ここでp2cstrにStr255型のオブジェクトを渡していますが,
ググったところchar*型のオブジェクトを渡しているソースがあったんで。


この投稿にコメントする

削除パスワード

No.28645

ググる <was:Re:unsigned char[255]の型をconst char*にするには?(キャスト以外)>
投稿者---RiSK(2006/10/30 22:40:51)


えっと,雑談というか補足というか。

>ググったところchar*型のオブジェクトを渡しているソースがあったんで。

もう,みなさんご存じだと思いますが,
Google Code Searchの方でググるってことです。

p2cstr - Google Code Search

便利〜!


この投稿にコメントする

削除パスワード

No.28667

Re:ググる <was:Re:unsigned char[255]の型をconst char*にするには?(キャスト以外)>
投稿者---まかープログラミング初心者(2006/11/01 19:23:15)


情報提供サンクスです。
処理中にクラッシュするという現象は何とか克服できました。
原因は分かったのですが、何故クラッシュしていたのかが分からず終いですが…

Google Code Searchっていうのは初めて耳にしました
ツールボックスの関数とか知らないのでプロトタイプを調べるのに重宝です

自分はかなりヘタレな初心者ですが、地道に頑張りたいと思います。


この投稿にコメントする

削除パスワード

No.28646

Re:unsigned char[255]の型をconst char*にするには?(キャスト以外)
投稿者---yoh2(2006/10/30 23:17:31)


Macプログラミングから離れて何年も経っているので、外しているかもしれませんが。

>ソースはコレです↓
>http://up.spawn.jp/file/up47708.zip.html

これ、見てみました。
C文字列への変換以前に、正しいパスカル文字列は得られています?

>GetDialogItem(aDlog, DIALOG2_CNAME_ID, &aDummyShort, &aHandle, &aDummyRect);
>GetDialogItemText(aHandle, the_string);
>p2cstr(the_string);//break;
>see_string = (unsigned char*)the_string;
>cname = (char*)see_string;//バク発見!というか、キャスト(一定の部分)やろうとするとバグる/コンパイル時は警告等はない
>//printf("%s", cname);
>break;

これ、おそらくSaveDlogDeta()の中だと思うのですが、この引数のaDlog、
NULLが入ったり、別の種類のダイアログが入ったりするような気が。
そうすると、パスカル文字列からして取得失敗するのでは?

| void main()
| {
|     DialogPtr aDlog = NULL;
|     ...
|     SaveDlogDeta(aDlog);
|     ...
| }
(省略コードでの見易さのため、ネスト調整しました)
で、main()では他に一切aDlogが使われず。

|     if(DialogSelect(&aEv, &aDlog, &aItem)){
|         ...
|         switch(aItem){
|         ...
|             SaveDlogDeta(aDlog);
|         ...
|         }
|        ...
|     }

アプリに2種類のダイアログがあり、DialogSelect()の結果、aDlogどちらにもなる
可能性があるのに、そのうち片方を仮定したコードになっている。

# あと、グローバル変数にローカル変数のアドレスを代入するのは危険かと。
# てか、グローバル変数多すぎ……


この投稿にコメントする

削除パスワード

No.28666

Re:unsigned char[255]の型をconst char*にするには?(キャスト以外)
投稿者---まかープログラミング初心者(2006/11/01 19:14:02)


ありがとうございますm(_ _ )m
まさにクラッシュの原因だった所は教えて頂いた所でした。
115行目のSaveDlogDeta(aDlog); をSaveDlogDeta(gDlog);
にしたら見事にクラッシュを回避できました。
ですが…今度は又、折角習得したパスカルの文字列に何か別の文字列が勝手に代入され
上書きされるという別の問題が…
まあ、そちらの方は自分で何とかしようと思います。

地道に頑張りたいと思います。


この投稿にコメントする

削除パスワード

No.28647

Re:unsigned char[255]の型をconst char*にするには?(キャスト以外)
投稿者---nop(2006/10/31 10:06:43)


まず、「キャストで落ちる」などと言うことは、
基本的にあり得ません。
その前後のコードに間違いがあったり、
領域の使い方を間違っているのではないでしょうか?

>p2cstr(the_string);//break;
>see_string = (unsigned char*)the_string;
>cname = (char*)see_string;//バク発見!というか、キャスト(一定の部分)やろうとするとバグる/コンパイル時は警告等はない

ざっとググってみたけど、下の感じでいいのでは?

 cname = p2cstr(the_string);


後は、the_stringに正しくパスカル文字列が格納されている事の確認を怠らないように。


この投稿にコメントする

削除パスワード

No.28668

Re:unsigned char[255]の型をconst char*にするには?(キャスト以外)
投稿者---まかープログラミング初心者(2006/11/01 19:30:10)


なんだか良く分からないままですが、
とりあえず、処理中にクラッシュするという現象は克服しました。
キャストがうんぬんというよりより、どうやら自分が作った関数に問題があったようです。
SaveDlogDeta(aDlog);をSaveDlogDeta(gDlog);かえたらちゃんと出来ました。
ですが、今度はp2cでパスカル文字列をchar*に置換した後、
勝手に別の文字列が入ってしまうという思いがけない現象が!
はっきり言ってかなりガックリ来ました。
何度もコード見直してますが、全く持ってどこがおかしいのか分かりません…
でもまあ、これは気を長くしてのんびり?やっていけっていうことなのかもしれません…


この投稿にコメントする

削除パスワード

No.28669

ラリホー
投稿者---nop研究者(2006/11/01 20:18:29)


 すごーいっ、符号無しの変数宣言ですか?
 やるねぇ〜っ、


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧