• 締切済み

C++のコードの書き方

プログラミング勉強中のものです 疑問に思ったところがあるので教えてください 入門サイトなどで勉強したところによると main関数の中で変数や配列の宣言をしていたのですが 他人のコードを見るとmain関数の外で宣言してる人を多く見かけますが 外に書くのが主流なのでしょうか? またその利点はなんでしょうか? よろしくおねがいします

  • elly2
  • お礼率28% (2/7)

みんなの回答

  • KEIS050162
  • ベストアンサー率47% (890/1879)
回答No.5

詳しい解説は既出の回答と下記を参照してください。 https://9cguide.appspot.com/20-02.html 要はその関数内だけで使用するか、他の関数でも共用するか(ファイルを分けた場合も含む)の違いです。 どっちが便利、というよりプログラムの構造上、共用のエリアが不可欠かどうか、ということでしょう。 基本的にC言語は、関数(引数を与えて、結果を出力させる)で記述するものなので、無用に共用の変数を使うべきではないと思います。 プログラムを設計するに辺り、プログラムのすべてで共通に使用する必要がある変数エリアと、そうではないエリアを明確に分けた上で、記述してみてください。そういう例題があるとよいですがパッと思い浮かばないので、先のリンクの例題集など参考にしてみてください。 変数の配置(メモリの配置)って、プログラムの設計の結構重要な要素です。 ご参考に。

  • OKWavexx
  • ベストアンサー率7% (29/378)
回答No.4

>外に書くのが主流なのでしょうか? どちらともいえません >またその利点はなんでしょうか? 外に書いて共用すれば他で同じことを書かなくてよい

回答No.3

ファイルAで、「配列を宣言」 ファイルBと、ファイルCが「ファイルAで宣言した配列を使う」 とした場合、BとCにその配列を入れても確かに動きますが、 メンテナンスの時、BとC同時にメンテナンスが必要になってしまいますね。 まして、これが大規模で、その配列を 100人が参照していたら?と考えると、 mainではなく、外に置くべきと考えるべきですね! それと、実体の場所 abc=50; // これは起動時にすでに実体化している。 main() { abc=50; // こちらはmainの中にいるときだけ実体化している } の違いもありますよ。これは即値ですが、 大きなサイズの配列変数だったら、各変数に入るたびに 実体を作ってしまうので、オーバーヘッドが生まれますからね。 ただ、質問者さんの場合は今はmainなので、 子関数を作り出すとこの意味が恐らく勝手にわかると思うので、 あまり深く考えなくても今は大丈夫かもしれないと 感じましたね。 前回の質問も見てますが、なんとなく覚えるの早そうな 質問者さんに感じてるので、ちょっと楽しみです!。

回答No.2

グローバルエリアに変数を宣言すると、メモリーダンプを見る時に場所が探しやすいというのがあるわ。 関数の内部に宣言すると、スタックかヒープ領域に確保されるので、関数を抜ければ消えてしまう。 異常終了時にもどうしても値を確認しておきたい変数があるときはグローバル領域に確保しますな。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.1

それはその変数がどこまで見えていいか(変数のスコープ)によります。 main関数の、という風に断っているということは、質問者さんは main関数だけからなるコードを書かれているということなのでしょうか。 だとすれば、まずは機能ごとに適切に関数を分けて、 各関数で使う変数は他から見えない(変数の受け渡しは引数で行なう) ように設計してみてはどうでしょう。 各関数で使う変数が他から見えないことの利点は、 その変数の値を他から不用意に書き換えられることがないということです。 関数の外で定義した変数は、どの関数からも見えますので、 コードのバグか何かでいつの間にか内容が書き換わっているという 発見しづらいバグにつながるおそれがあると思います。

関連するQ&A

  • C言語のメモリ領域確保

    ポインタ変数ををmain関数で宣言し、関数test()にて必要分だけ領域確保してそのアドレスをmain関数のポインタ変数に渡して利用することは可能でしょうか。 (サイズのわからないテキストデータを、十分に大きな配列に入れるのではなく、関数でメモリを動的確保して無駄の無い配列に入れたい等) C言語ではやはり無理で、構造体のリストにするのが一番でしょうか。 初歩的なことで申し訳ありませんがどなたかお願いいたします。

  • ・関数内で宣言された変数の扱い(C入門本の説明で)

     以下C言語入門書の説明ですが!  いまいちわかりません?   ・関数内で宣言された変数の扱い 関数内で宣言した関数は、その関数内でのみ有効な変数になります。関数が異なれば、同じ変 数名で宣言することができます。例えば、main関数と(?)kansuu関数で、同じ(?)hennsuuという名 前の変数を宣言することができます。  int main() { int (A)hensuu = 0; (B)kansuuu(1); } int (C)kansuu(int hikusuu) { int (D)hensuu = 10; }  列のmain関数で宣言されている(?)hensuuと、さ(?)kansuu関数で宣言されている(?)hensuuは 同じ名前ですが、独立した異なるものです。(?)kansuu関数が実行されているときに、(?)hensuuの値 を変更しても、main関数で宣言されている(?)hensuuの値は変更されません。 また、(?)kansuu関数を実行している間だけ、(?)kansuu関数で宣言されている(?)hensuuが有効です。 (?)kansuu関数から呼び出し元でるmain関数に戻った際は、(?) kansuu関数で宣言した (?)hensuuはもう有効ではなくな、値を参照することもなくなります。     以上の説目で、   (A)hensuu、 (B)kansuuu、(C)kansuu、(D)hensuu  (アルファベット)を分かりやすいよう追加しました。   説明の   (?)にプログラムの(A)~(D)をつけたらどうなるか知りたいです。 (何となくわかるですが?)   よろしくお願いします。

  • Cの書式

    プログラミング初めたばかりの者です そこでCの書式について疑問に思ったことがあります。Cの書き方にはさまざまな書き方があるようですが一般的にはどのような書き方が好まれるのでしょうか? 例えば int main(void) { } なのか int main(void) { } なのか (i=0;i<5;i++) なのか (i = 0; i < 5; i++) なのか 最近の言語とかだと変数と演算子の間は空白を開けてる場合が多いようですがCでは開けない場合が多いようにも思います。 他人にコードを見せるわけではないのですが知識として覚えて置きたいと思っています。 くだらない質問ですがよろしくお願いします

  • コードをひとつにまとめることってできませんか?

    VBでは、Formごとにコードを書いていくことが一般的だと思いますが、それをFormにとらわれず書いていくことって可能でしょうか? 具体的には、Form1で宣言した変数をForm2でも使えたり、Form1で作った配列をForm2でそのまま使えたりといったことです。

  • どなたか、教えていただけませんでしょうか(C言語)?

    皆様のお知恵を拝借したく思いまして 投稿させていただきました C言語についての質問なのですが (1)文字配列の引数を一度mainからプロトタイプ関数へ渡し 関数で宣言して表示。 (2)さらにその関数内で、値を変更して mainで表示する 方法を教えていただきたく思いますので、宜しくお願い致します

  • Objective-CでCの関数に引数をわたしてあげたいのですが。

    NSArray *filetype = [ NSArray arrayWithObject : @"'TEXT'" ]; NSOpenPanel *opfile = [ NSOpenPanel openPanel ]; と書いた後に[opfile filename]にファイルパスが入っているとゆうことなんですが、これをchar型の変数に渡してCの関数に渡してあげたいのですがいろいろ試してみたんですがやり方がさっぱりわからず周りの人たちもObjective-Cはわからないので困っています。このあと aaaaa(char *file,int aaa); みたいな関数を呼びたいんですが初めにプロトタイプ宣言してそのまま呼んでも大丈夫なんでしょうか? わたくしObjective-C歴2日、C歴3ヵ月半の若輩者です。経験者のみなさんよろしくお願いいたします。 動作環境はMacOSX、ProjectBuilderのcocoaでやってます。 参考にしたサイトは「cocoaはやっぱり」で勉強してます。 本は「MacOSXプログラミング入門OBjective-C」を昨日買いました。 その他注意事項ありましたら言ってくださると助かります。

  • Variant型の宣言について

    教えてください。 もし整数型とString型混在のCSVデータをsplit関数で読み込んで 配列変数に格納する場合、その変数はVariant型で宣言しなければならないのでしょうか? 因にvbscript(クラシックasp)でのプログラミングです。

  • C#とCについて

    自分は、C#の勉強をしていてネットワークプログラミングについて勉強したいと思い、「猫でも分かるネットワークプログラミング」という本を読んでいるのですがこの本は解説がC++で書いてあります。 そこで聞きたいのですがC#とC++の関数と言うのは言語が違うのでまったく異なっているものなのでしょうか?この本はとても分かりやすいほんと聞いているので、もしも、二つの言語間の関数があまり違いがないのならば、自分でこの本のC++のコードをC#のコードに変換しながら勉強したいと思っています。

  • 配列と他の変数のメモリ領域重複の問題について質問

    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がでて結局出来ませんでした。 。 このような現象を起こさせない様にするため,、確実にメモリを確保するためにはどうすればよいのでしょうか。 この問題のために先に進めず、大変困っております。どうかご教授ください。 もう一つ、変数の生存期間について質問なのですが、ある関数内で宣言したローカル変数をカウンタとして使い、指定の回数だけ他の関数を繰り返し実行する場合、他の関数に飛んだ時もそのローカル変数は確実に生存しているのでしょうか。重ねてお願いします。 不足がございましたら補足しますのでお教え下さい。

  • C言語に関することについて教えてください

    学校の問題集にでてきた問題がわかりません、どうか教えてください 1 プログラムの役割、必要性について説明せよ 2 プログラムにおける変数と定数の役割を説明せよ。また、ローカル変数の有効な範囲について説明せよ。 3 C言語で使う変数が他について、宣言子と、printf関数、scanf関数それぞれにおいて対応する書式指定子を対応表にせよ。また、変数名を決める際に守るべき文法上の規則と、プログラマとして配慮すべき事項を説明せよ。 4 配列について、その役割と定義方法を説明せよ。 5 コンピュータにおける文字処理に必須なアスキーコードについて説明せよ。 6 C言語における文字列について、文字列定数、文字列変数を説明せよ。 7 C言語における繰り返し処理の文法(for,while,do~while)を、プログラムコード列を示して説明せよ。 8 C言語における条件判断の文法(if,else,else if)を、プログラム列を示して説明せよ。 9 繰り返し、条件判断において利用する論理式(等値演算子、関係演算子、論理演算子等で記迷する式)について、その記迷の方法を論理和、論理積も含めて説明せよ。 10 変数のアドレスについて説明せよ。また、ポインタについて、アドレスとの関連性を踏まえて、その役割と定義方法を説明し、具体的な使い方のプログラムコード例を示せ。 11 ポインタと配列の関係について、ポインタによる配列操作を列に説明せよ。 12 関数について、その役割と定義方法について説明せよ(戻りがた、関数名、引数リスト)。また、自作関数をそれらを利用するmain関数のプログラムコード例を示せ。 13 scanf関数の戻り値について、その内容を説明して、どのような際に利用すると便利か、プログラムコード例を示して説明せよ。 14 引数にポインタを利用する関数のプログラムコード例を示して、ポインタの必要性、重要性を説明せよ。 15 構造体について、その役割と定義方法を説明し、具体的な使い方のプログラムコード例を示せ。 16 ファイルポインタについて説明し、ファイル入出力の方法についてプログラムコード例を示して説明せよ。