• ベストアンサー

newとunsignedについて

S117の回答

  • ベストアンサー
  • S117
  • ベストアンサー率40% (18/45)
回答No.4

デバッガがunsigned shortをwchar_tと見なしているのではないでしょうか。そのために、unsigned shortのポインタからワイド文字列を読み取って表示しているものと思われます。 デバッグ時の追跡を容易にするためにメモリを特定のパターンに初期化するので、プログラム上初期化されていない箇所を文字列として参照するとそういうことになります。 試しに手元のVC++2008 Express Editionを使ったら再現しました。 対策は別のデバッガを使うか、無視するの二択です。

llringoll
質問者

お礼

丁寧なご回答に,わざわざ再現までしていただきありがとうございます. wchar_tという型はわかりませんが,そういう仕様であると理解するしかないのですね. 現状,一応きちんとデータも取れて動作しているので,無視する方向で行きたいと思います. ありがとうございました!

関連するQ&A

  • unsigned char の配列で途中で0を含む時のstrlen

    表題のようにunsigned char a[10]; の配列で、文字列ではなくデータとして扱っている時、どうしても途中で0が混じります。そこでstrlen(a) を取ると途中までの長さの値しか取れません。 sizeof(a) としてもunsigned char のsize=4 になるだけです。 この回避策はあるでしょうか。

  • C++/CLIの構造体のコンストラクタについて

    C++/CLIの構造体のコンストラクタについて C++/CLIで、固定サイズの配列を持つ構造体を、次のようにコーディングして使っています。 value struct AAA { public:   array<unsigned short>^ m1;   AAA(unsigned short dummy)   {     m1 = gcnew array<unsigned short>(4);   } }; AAA ^struct0 = gcnew AAA(0); この方法で正常に動作するのですが、2点ほど気になる点があります。 (1) コンストラクタAAA(unsigned short dummy)を実装しなくても済む方法がないか? (2) この方法では、struct0を、ネイティブヒープ領域に割り当てられない (AAA *struct0 = new AAA(0))でコンパイルエラー) (1)と(2)は関連する気もするのですが、これらを解決する方法はあるのでしょうか?

  • new int[変数]で確保しても良いんですか?

    Javaでの配列の確保の方法です。 int size = 100; int[] array = new int[size]; のような確保の方法はどの環境・コンパイラでも思い通りの動作をしてくれますか? C言語では、このような書き方で確保することはできなかったので、Javaでは可能なのか心配で質問しました。 「動的」という意味がまだ完全にわかっていないのですが、上記のような変数の確保は、動的とはいえないのですか?sizeの値をユーザーから受け取れば、確保する大きさはいつも違うようになると思うのですが・・・。 ちなみに下記のようなプログラムで配列の確保を使おうとしています。 static int[] toIntArray(String[] strs){   int[] array = new int[strs.length]; // ←ここで 確保しています。   for(int i = 0; i < strs.length; i++){    array[i] = Integer.valueOf(strs[i]).intValue();   }   return array; } 上記のプログラムはStringの配列からintの配列に変換することを目的にしています。

    • ベストアンサー
    • Java
  • バイナリの文字列を変換したい...

    Jpeg のExifを解析するスクリプトを書いてます あるバイナリの文字列を下記の形式に 変換する手段をどなたかご存知ないですか? (そもその下記の意味さえわからないですが) unsigned byte ascii strings unsigned short unsigned long unsigned rational signed byte signed short signed long signed rational single float double float よろしくお願い致します

    • 締切済み
    • PHP
  • 多次元配列とポインタ渡しについて

    多次元配列のポインタ渡しについて,自分で検索したのですがあまりにも様々で具体的な記述が無く質問させていただきました. 検索力不足もあるのでソースの提示だけでも結構ですので,ご回答お願いいたします. OS:Windows XP ソフト:VisualStudio.net2003(C++) C++プログラミング暦2ヶ月弱です. データを変換して多次元配列にデータを入れる自作の関数をつくりたいと考えています. 具体的には,a1からa2,b1からb2を10区間に分けてたデータを配列にしたいといったものです. 自分で記述した関数は以下の通りです. void Convert(float a1,float a2,float b1,float b2,unsigned short *Data){ int k; float a; float b; for(k=0;k<11;k++){ a = a1 + (a2 - a1) / 10; b = b1 + (b2 - b1) / 10; Data[k][1] = ( powf(2.0,16) * (a + 10.0) / 20; Data[k][1] = ( powf(2.0,16) * (b + 10.0) / 20; } } void main(){ float a = 10; float b = 20; unsigned short Data[11][2]; Convert(a1,a2,b1,b2,Data); ... } としています. ここでコンパイルすると, "5番目の引数をunsigned shortからunsigned short *に変換できません" となってしまいます. 配列の名前のみの部分はその配列の先頭アドレスを示すポインタであることから,自分では間違いがないと思っているのですが….

  • gcnew arrayによるメモリ確保について

    環境 Windows 7 (64 bit) RAM 16.0GB Visual Studio 2008 ※プロジェクトの設定は64bit C++/CLIにおいて、 int SIZE = 1438*1438*998; array<short>^ a = gcnew array<short>( SIZE ); がOutOfMemoryで終了してしまいます。 同様のことを、同じプロジェクトでテストコードとして short* a = new short[ SIZE ]; としてみると正常に動作するようです。 なお、実際のプロジェクトではSIZEはファイルから読み込みます。 開発されてから今まで(数年)、SIZEの値がこれほど大きくなることはありませんでした。 ・型指定をshortからcharにすればOutOfMemoryにならない ・しかしnewでの配列確保では正常に動作しているためメモリ不足とは考えにくい ・new演算子のサイズ指定はsize_t(=unsigned 64bit)だがarrayはint(signed 32bit)しか見当たらないのも気になるが、いずれにせよオーバーフローには一億近く足りない という具合で原因がわからずに困っています。 ・そもそも何が原因なのか ・可能な限り現在のコードを変更せずに(gcnew arrayのまま)解決するならどうするのがよいか を教えていただけないでしょうか。 また、原因に関しては信頼できる情報源を提示いただけると助かります。(英語可)。

  • Array.newが必要ないのはなぜですか?

    以下のようなクラス拡張をしてみました。 Class String def count_word Array.new(ary) ary = self.split(/\s/) return ary.size end end ここで、Array.new()のところでエラーになってしまいます。 感覚的に配列で受け取るようにするべきだと思っていたの ですが、この1行を外すと正常に動きます。 なぜ配列を生成するのがまずいのでしょうか?

    • ベストアンサー
    • Ruby
  • .NET C++で、構造体の配列をnewで作成しようとするとerror C2440のエラーとなってしまいます

    Visual studio2003 .NET C++で、構造体の配列を作成し、 改めて構造体の配列をサイズ指定して作成しようとすると、error C2440が出てしまいます。 ポインターで宣言したつもりはないのですが、ポインターから配列に変換できないといった項目のエラーなので、 なぜこのようなエラーが出るのかわからずにおります。 typedef __nogc struct TEST { // 省略 }; TEST struct_test __nogc[]; int int_num = 10; struct_test = new TEST __nogc[int_num]; // error C2440: '=' : 'TEST *' から 'TEST []' に変換できません。 ご指摘等ありましたらご回答いただけますと助かります。 よろしくお願いいたします。

  • new型の戻り値? new型のパラメータ?

    あらゆる応用が利くC++ではあるのですが、それによってひとつのやり方にも複数の方法が出てくるのはよくあること。そこで、new型のポインタにおいて戻り値として返せばいいのか、パラメータとして使えばいいのか悩んでおります。 [1] wchar_t *XXX(int size){   wchar_t *ret = new wchar_t[size]   //ポインタに対するいろいろな制御   return ret; } ↑このように、関数内部でnew型ポインタを宣言し、そのポインタのアドレスを外部のポインタに渡す。 [2] static wchar_t ret = new wchar_t; -------- void XXX(wchar_t *ret, int size){   //ポインタに対するいろいろな制御 } ↑関数を呼ぶ手前ですでにnew型ポインタを宣言しておく [1]のほうが、宣言をする手間を省くことができるような気がしますが、new型ポインタがいらなくなったときにdeleteするのをわすれてしまったりということが起きるかもしれないということも考えてしまい、どちらをがメジャーなのかよくわかりません。 皆様ならどういった方法をとりますか? また別な方法がありましたが教えてくださるとありがたいです。

  • 独習Java章末問題模範解答のソースコードがコンパイルできない

    時間のある方お答えください。 -問題- 次のプログラムを作成しなさい。配列を作成し、それを5個のCharacterオブジェクトで初期化します。その後、StringBufferオブジェクトを生成し、その文字列バッファに配列要素を付加します。最後に文字列バッファを表示します。 -模範解答- class CharacterArray { public static void main(String args[]) { // 配列を作成して初期化する Character array[] = new Character[5]; array[0] = new Character('A'); array[1] = new Character('B'); array[2] = new Character('C'); array[3] = new Character('D'); array[4] = new Character('E'); // 文字列バッファを作成する StringBuffer sb = new StringBuffer(); // 配列要素をバッファに付加する sb.append(array[0]); sb.append(array[1]); sb.append(array[2]); sb.append(array[3]); sb.append(array[4]); // 文字列バッファを表示する System.out.println(sb); } } となっているのですがエラーが16個も検出されてコンパイルできないのです。 どなたか上記ソースコードを訂正してコンパイルできるようにしてください。 /* Javaは訳の分からん概念が沢山あって、どうも直感的に理解しにくいですね。 もう眠い */

    • ベストアンサー
    • Java