ベストアンサー 全配列に0を入力 2007/05/26 22:39 c言語で配列を宣言した後に、ループを使わずに 配列全体に0を入力したいのですが、そのような方法はありますか。 あれば、どのようにすればよいか教えてください。お願いします。 みんなの回答 (12) 専門家の回答 質問者が選んだベストアンサー ベストアンサー jacta ベストアンサー率26% (845/3158) 2007/05/26 23:39 回答No.5 整数であればmemsetで0を埋めればよいのですが、浮動小数点数やポインタの場合、内部表現が0とは限らないので、次のような関数を使えば一応ループを回避できます。 void fill(int *array, size_t n) { if (n > 0) { *array = 0; fill(array + 1, n - 1); } } ここで、arrayの型は必要に応じて変更してください。 例えば、double型の配列ならdouble *arrayとしてください。 あるいは、もう一つの手として、あらかじめ全要素を0で初期化した配列を別に用意しておいてmemcpyでコピーするなら、どんな型でもOKです。 質問者 お礼 2007/05/27 01:16 回答ありがとうございます。 memsetでは計算したときに違った値を出してくるときがあったので助かりました。 回答ありがとうございました。 質問者 補足 2007/05/27 01:54 一応使えているのですがポインタの部分とsize_tの指定が、よく理解できないのでよければ、この文がどのように動いているのか解説してもらえないでしょうか。 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 その他の回答 (11) NNori ベストアンサー率22% (377/1669) 2007/05/26 22:47 回答No.1 C++でなくCならbzero(target,sizeof(target)) でできるかも。でもあんまし勧めん。 C++ではできるけど通用しない技だね。 0を入力することとメモリとして0を代入してしまうことが同じと言い切れるかどうかの問題なんだけど... 質問者 お礼 2007/05/26 23:13 回答ありがとうございます。 string.hをincludeしたのですが、bzeroを使えなかったのでこの方法はすみませんが、諦めさせてもらいます。 回答ありがとうございました。 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 12 カテゴリ [技術者向] コンピュータープログラミング・開発C・C++・C# 関連するQ&A 配列の書き方 C言語の配列の宣言で unsigned char aaa[256/8] という表現があるのですが、これはどういう意味でしょうか? Javaの配列の宣言方法のメリット? 1週間ほど前からJavaを独学している者です。 C言語をその前からやっていて、初心者レベル程度ならわかると思います。 そこで、質問です。 C言語の配列宣言: int array[10]; Javaの配列宣言: int array[] = new int[10]; 二つの言語とも、要素10個のarray1次元配列変数を宣言していると思います。 C言語の書き方はシンプルなので、納得がいきますが、Javaの方はどうしてこの形で宣言をするのかわかりません。(自分が言語製作者ならシンプルな書き方を採用します) だから、このような宣言の方法をとるということは何か理由があるのだと思います。 自分が思うところ、JavaはC言語より、柔軟で多機能だとおもうので、その影響で汎用性をますために、 長くなっているのかな~?と思っています。 こんごJavaの学習を進めていくと、例えば、 int array[] = new double[10]; //←エラーになりました みたいに型のちがう、宣言が出てきたりするのでしょうか? ちらっと、学習に使っている本をみたところ、動的配列の作成は別の操作で実現しているようなので、 「動的とは関係ないのかな?」と思っています。 長くなりましたが、Javaの配列宣言のメリットを教えてください。 配列を使わずに、変数名を動的にループで回したい 配列を使わずに、変数名を動的にループで回したい 大学の課題をやっている途中に思ったことなのですが……。 プログラム中に同じ型の変数p1,p2,p3があり、それぞれの変数にループで同じ処理を施したいと思っています。 しかし、「p(i)」や「("p" + i)」などと、変数どうしを別のものとして認識させようとしても、コンパイラから警告が出て上手くいきません。 配列を使えば、このような処理が出来ることはわかるのですが、使う変数名を指定されてしまっているために、今回は配列を使えません。 出来るか出来ないか、出来る場合は方法を知りたいです。 後、今回はC言語のプログラムで利用出来るかが自分にとっての問題なのですが、C言語以外のこのプログラミング言語なら出来る、とかの情報もこの機会に知りたいです。 お答え出来る範囲でいいので、もしよければ回答お願いします。 ネットワークエンジニアとは?技術職の未来を考える OKWAVE コラム 配列へのキーボード入力 次のような問題がわからなくて困っています。 まず、キーボード入力により配列の大きさを決め、 その後、先ほど入力した個数のデータをキ-ボードから入力するというものです。 これだけならわかるのですが、条件があって、入力は次のようにするとあります。 2 3 ←配列の大きさ(2行3列) 1 2 3 ←配列に入れるデータ 1行目 4 5 6 ←配列に入れるデータ 2行目 Cプログラミングを始めて間もない初心者です。どなたかよろしくお願いします。 配列数を取得するには C言語ははじめたばかりです。 例えば、以下のような配列数を取得するにはどうしたら いいのでしょうか? まさか for ループで'\0'が来るまで回すものか・・・ char test[] = {'あ', 'い', 'う', 'え', 'お'}; flaot配列の値格納について すみませんC言語の初心者ですが、教えて頂きたいことがあります。 floatの二次元配列に、すべて同じ値をセットしたいのですが この場合、for で配列分ループさせて値をセットするしか ないのでしょうか? memesetのように、セットする方法はないのでしょうか? 宜しくお願いします。 MIPSアセンブリ言語で配列を宣言するには? 現在MIPSアセンブリ言語を学習していますが、配列に相当するものの宣言の仕方を詳しく知りません。 int items[5] ={0,0,0,0,0}; (C言語の場合) のような配列をMIPSで用意するなら、 items: .word 0,0,0,0,0 としてやるなどすればよいことまではわかっていますが、もし配列の要素数が500だった場合、上で0を500個も書かなければならないのでしょうか。短く書ける方法はありませんか。 配列をループでたくさん宣言したいのですが、配列名や変数名を変数で宣言することはできませんか? お世話になっております。 タイトル通りの質問です。 日付がファイル名になっているCSVファイルが複数あるのですが、 それをそのまま「array20071020」などという名前の配列に、それぞれ入れて行きたいと思います。ループ処理でなければ出来ないと思うのですが、ループ処理内で配列を宣言していく方法はあるでしょうか。 配列の使い方分かりません //整数型の配列を10個準備する。 //ループ文を用いてキーボードから値を10個入力する。(for文を用いる) //入力した値を出力する。 //ループ文を用いて入力値の合計と平均値を求める。(while文を用いる) 以上の課題が出されました。 配列の使い方が分からないので上手くできません。 説明付だとうれしいです。よろしくお願いします。 配列について C言語には2次配列までしかないようなのですが3次配列のようなものはできないのでしょうか? 配列のファイル出力について fortranでできるファイルへの配列の出力をC言語でどのようにプログラムするか教えて頂きたいと思います。 2次元配列a(i,j)の出力はfortranでは以下のようなプログラムになります。 open(10,.省略...) ファイルを指定して開く do j=1,ny ループj write(10,'(100f10.3)') (a(i,j),i=1,nx) ループi+書き出し enddo ループjの最後尾 close(10) ファイルを閉じる 100f10.3というのは小数点3桁の実数で10カラムで表現したものが100個並ぶという意味です。これと同じことをやるC言語プログラムを教えて頂きたいのですが。私の手元にある本にはやり方が載っていません。 C言語にはfortranのような数字のカラムを指定するようなフォーマットの調整などできるのでしょうか。よろしくお願いします。 PHPにてクラスを配列にすることは可能でしょうか。 PHPにてクラスを配列にすることは可能でしょうか。 環境はPHP5です。 現在下記のようなクラスを作成しました。 class Ary_c { var $v1; // コンストラクタ function Ary_c() { $this->v1 = "test"; } } このクラスをC++言語などで出来るような、 クラスの配列として扱いたいのです。 C++だとたとえば10個の要素があるクラスの配列は Ary_c t[ 10 ]; みたいな感じで宣言できます。 こういったことをPHPでやることは可能でしょうか。 AIは使う人の年齢や市場にも影響する?人工知能の可能性 OKWAVE コラム C#での動的配列作成方法について はじめまして、 現在ASP.NET、C#で開発をしております。 そこで、質問です。 C#で二次元配列を作成し、データを格納します。 二次元配列は宣言時はサイズがわかってません。 ループで回った回数分、最初(第一要素数)の要素数が決定します。 二つ目の要素数の数は最初からきまっています(固定用素数)。 string[][] string[,] arraylist などがあると思いますが、上記の場合どういう風に配列を作成していったらいいのでしょうか? 動的にサイズを変更できる配列の作り方、データ格納方法、データ表示方法を教えてください。 よろしくお願いします。 C言語の配列番号が"0"から始まる理由 C言語の配列番号は"0"から始まりますが "1"からではなく"0"から始める理由を教えてください。 例えば char a[5]; と宣言した場合 配列a[]は a[1], a[2], ・・・, a[5] ではなく、 a[0], a[1], ・・・, a[4] である理由を教えてください。 Cなどで要素の数が固定できない配列はどうやって実現しますか? 配列について質問します。 BASIC系では配列は動的配列で要素の数が自由に変えられます。 ですが、C等では宣言時に配列の要素の数を決めておかねばならなかったと思います。 もし、C等で要素の数がわからないけど、配列を使いたい場合、どうすればいいのでしょうか? どのように実現するのでしょうか? 配列と同じ使い勝手なら配列でなくともかまいません。 今はVBAでプログラムを組んでいるので、動的配列を使えばすむのですが、いずれ他の言語に移植したいので、できるだけ使わないようにしたいと思っています。 よろしくお願いいたします。 VBA 配列計算について 配列の入力に配列の使用 配列に複数のセル値の合計値を設定したいと思っています。 求める合計値は複数あるため、出力も配列となります。 そこで下記のようにプログラムを考えたのですが、全て同じ値の配列として出力されてしまいます。 VBAではC言語のように配列の古い値に足していくことはできないのでしょうか? (sum()は0で初期化) (10個飛ばしのデータの合計値を算出) For i = 0 To 10 For j = 0 To 5 sum(i)= sum(i) + Worksheets(sheetname).Cells(10, 3).Offset(j * 10, 0).Value Next i Next j 出力配列例 全て同じ値になってしまいます・・・ 1.254 1.254 1.254 ・・・ 回避方法もしくはうまい計算方法などありませんでしょうか pythonの多次元配列へのデータ入力 pythonの多次元配列で以下のように、ループのカウンタのn,mで配列の位置を指定して代入することができないようです。このような場合どう処理するのでしょうか。 for n in range(1:10) for m in range(1:10) a[n][m]=f(n/m) なお、aについては使用の宣言はしておらず、メモリも確保されていません。fは別途用意されています。 また、a[2][3]=1.3 のように配列の場所を指定して代入するのもダメのようです。numpy.arrayとかで宣言するのかなと思うのですが。使用例が見つかりません。2次元配列だけでなく3次元配列だとどうなるかなと思うのですが。 科学技術計算はこんなのばっかりです。pythonはそのようなものに向くでしょうか。いろんなものがpython対応になってきているので速さの問題があっても器用な処理ができるのなら選択されることも多いと思いますが。 よろしくお願いします。 配列と他の変数のメモリ領域重複の問題について質問 dsPICで配列を使用する際、他の変数もその配列の存在するメモリ領域に配置されてしまいます。 プログラムにはC言語を用いています。環境は「MPLAB C30 v3.31」、「MPLAB LINK30 v3.31」「MPLAB v8.85」です。 状況としてはunsigned char型で要素数320の配列をグローバル宣言します。そしてmain関数やその他の関数内でローカル変数を宣言するとその変数が配列の中に存在することになってしまうというものです。色々試したところ、そのローカル変数をstaticで宣言するとそのような症状は出なくなりました。 この現象には、初期化をする関数内でカウンタとしてローカル変数を宣言し、for文で配列を0でクリアさせようとしたところ、MPLABSIMでデバッグすると永久ループしたことから気づきました。Watchを用いて確認したところ配列の中にそのカウンタ変数が配置されていたため最終的に自分自身を0でクリアしてしまうことで永久ループしてしまうことがわかりました。 なぜこうなるのかよくわかりません。この配列以外にはおおきな領域を必要とする変数は宣言していませんのでData memoryの容量的な問題ではないと思っています。staticで宣言すれば何とかなりますが、これでは無駄なメモリを消費してしまいます。また、絶対アドレス指定をする方法もありますが、「ignoring address attribute applied to automatic 変数名」というwarningがでて結局出来ませんでした。 。 このような現象を起こさせない様にするため,、確実にメモリを確保するためにはどうすればよいのでしょうか。 この問題のために先に進めず、大変困っております。どうかご教授ください。 もう一つ、変数の生存期間について質問なのですが、ある関数内で宣言したローカル変数をカウンタとして使い、指定の回数だけ他の関数を繰り返し実行する場合、他の関数に飛んだ時もそのローカル変数は確実に生存しているのでしょうか。重ねてお願いします。 不足がございましたら補足しますのでお教え下さい。 配列や連想配列について 言語一般の配列や連想配列について 最近どういう解釈をしていいのか わからなくなってしまいました。 仮にPerlで話をさせてもらいますと、 連想配列%FORMがあるとき、 個々の要素にアクセスする場合 例えば$FORM{'name'}などと記述しますが、 この$FORM{'name'}を みなさんはどのように解釈しているでしょうか? $FORM{' '}にキー nameを 代入しているようなイメージで、 「連想配列%FORMからキー'name'の値を取得する」 という考え方でしょうか? わたしは最近、 $FORM{'name'}はそれ自体が一つの変数という 考え方が出来るのではないかという気がしているのですが、 連想配列の実装から考えると この考え方は正しいのでしょうか? 以前、配列について同様の質問を したことがあります。 例えばC言語でint a[100]と宣言した場合は、 連続的なアドレスに確保されるため、 a[2]はaという名前のアドレスから a + 2 番目の場所という意味になるが、 言語によっては不連続なアドレスに 確保されるため、a[2]は一つの変数名として 考える必要がある・・ との回答でした。 ならば連想配列の場合も もし不連続なアドレスに確保されるならば、 $FORM{'name'} は一つの変数名と 考えたほうが正しいのではないかと 思ったからです。 連想配列の内部的な処理がどうなっているのか 教えて頂きたいです。 よろしくお願いします。 共用体の配列 [C言語] 今C言語のプログラムを組んでいたのですが、共用体の配列あるわけないと思いつつ共用体の配列を宣言したソースをコンパイルして見ました。そしたら普通にコンパイルできてしまったんです。びっくりしてその配列に値を代入したのですが、それはコンパイルエラーが出ました。共用体の配列なんてあるのでしょうか?回答よろしくお願いします。 注目のQ&A 「You」や「I」が入った曲といえば? Part2 結婚について考えていない大学生の彼氏について 関東の方に聞きたいです 大阪万博について 駅の清涼飲料水自販機 不倫の慰謝料の請求について 新型コロナウイルスがもたらした功績について教えて 旧姓を使う理由。 回復メディアの保存方法 好きな人を諦める方法 小諸市(長野県)在住でスキーやスノボをする方の用具 カテゴリ [技術者向] コンピューター プログラミング・開発 Microsoft ASPC・C++・C#CGIJavaJavaScriptPerlPHPVisual BasicHTMLXMLCSSFlashAJAXRubySwiftPythonパフォーマンス・チューニングオープンソース開発SEOスマートフォンアプリ開発その他(プログラミング・開発) カテゴリ一覧を見る OKWAVE コラム 突然のトラブル?プリンター・メール・LINE編 携帯料金を賢く見直す!格安SIMと端末選びのポイントは? 友達って必要?友情って何だろう 大震災時の現実とは?私たちができる備え 「結婚相談所は恥ずかしい」は時代遅れ!負け組の誤解と出会いの掴み方 あなたにピッタリな商品が見つかる! OKWAVE セレクト コスメ化粧品 化粧水・クレンジングなど 健康食品・サプリ コンブチャなど バス用品 入浴剤・アミノ酸シャンプーなど スマホアプリ マッチングアプリなど ヘアケア 白髪染めヘアカラーなど インターネット回線 プロバイダ、光回線など
お礼
回答ありがとうございます。 memsetでは計算したときに違った値を出してくるときがあったので助かりました。 回答ありがとうございました。
補足
一応使えているのですがポインタの部分とsize_tの指定が、よく理解できないのでよければ、この文がどのように動いているのか解説してもらえないでしょうか。