こんにちは.私は,大学でアプリケーションソフトをつくる作業を研究の一環としてやっています.C言語でコードを書いているのですが,計算処理の高速化を
実現したいと切に願っております.

例えば,以下のように2つの関数main とTest,があるとします.
そのとき,Testは計算結果を返さないとします.


#define MAX 100


void Test(i,j data);

int main(void)
{
double data[MAX][3]
for (i = 0; i <= MAX; i++ ){
for (j = 0; j <= MAX; j++){
//
Test(i,j data);
}
}
return 0;
}


この場合,毎回Test関数を呼ぶたびにdata配列を指すポインタを
渡し,さらにTest()関数内に定義されているローカル変数用のメモリ領域も
確保されます.

ということは,処理を高速化するためには
なるべくTest関数内の変数を
できるだけへらせばいいのでしょうか?

みなさんがプログラムを組むときに留意されているテクニックを
教えて頂きたいです.
できればVC++ver6.0でのデバックツールをどのように
つかってバグフィクスしておられるのかうかがいたいです.
以上、よろしく御願い致します.

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

A 回答 (5件)

>この適材適所ともいうべき能力を身につけるには,


>やはり「経験」でしょうか?

アルゴリズム的なところは、計算量の問題ですから、
きちんと理詰めでいけば計算できるとは思いますし、
知識でもカバーできるとは思いますが。
何度もやっていれば、いちいち調べないでも
すぐに頭に浮かぶのが経験ですしょうか。

>大きいサイズの場合,グローバル変数として確保した方がよい
>ときいたことがあるのですが,これもなんともいえませんか?

言えないと思います。
おそらくスタック上に取られるauto変数だと、スタックサイズの制限により、
あまりに大きなエリアは取れれない可能性はありますが。

その場合でも、メモリをグローバルにするか、malloc()を使うか、また、場合によっては共有メモリを使うかとか、
場合によると思います。
もっとも、高速化より目的にあった・・の意味合いが強いとは思います。


>実際,関数を呼ぶときには,その呼ばれた関数内の変数も呼ばれる,
>すなわち,スタックの繰り返しですよね?
>ということは,あまり大きいサイズをつまないようにした方が
>いいと知識がない私は考えてしまうのですが…

初期化が必要がない変数なら,まとめて取れますから、
速度的には数は影響しないでしょう。
また、popも関数の戻りにスタックポインタを復元すれば
いいだけですから、通常は一命令でしょう。
たとえば、
f() { int a,b,c,d,e;
...
}
g() { int a;
...
}
では、手間は同一です。
って、実際はコンパイラ、CPUによるんでしょうが。


関数呼び出しの場合だと,手間がかかるのは
呼び出す前のレジスタの保存の方でしょう。

これはある程度,コンパイラの生成するコードと、
それを実行するCPUのアセンブラレベルの知識か、
それを調べることが必要でしょう。

ですが、やはりあまりすすめられないですね。
通常、それ以前の一般的な部分,アルゴリズムでの
高速化に及ばないですし。
処理の高速化は通常はアルゴリズムの改良です。
もし、処理にAPIやシステムコールが使われるなら,
重いAPIは極力使わないとかの工夫も含みます。


ところで、ダイアログの応答5秒とありますが、
本当に時間がかかる処理なら通常はマルチプロセスやマルチスレッドにすると思いますが。


ところで、配列をポインタにすることで高速化するという
話が出てますが,
その程度のことは割と以前からコンパイラの最適化ではやっていると聞いてます。
最適化のレベルにもよると思いますが、Cコンパイラの最適化としてはかなり初歩的な部分でしょう。
    • good
    • 0
この回答へのお礼

terra5 様,度重なるアドバイスありがとうございます.
>その場合でも、メモリをグローバルにするか、malloc()を使うか、また、場合に
>よっては共有メモリを使うかとか、
>場合によると思います。
>もっとも、高速化より目的にあった・・の意味合いが強いとは思います。

上記の意味は,リスト構造のような可変のデータをとりあつかうときは,
malloc()を使うといったところでしょうか?
しかし,「目的」に応じて,メモリーをグローバルにとる,または,
共有メモリにするといったアプローチは,私にとってちょっと
難しいところです.一例を指し示して頂けると分かりやすいのですが…

>通常、それ以前の一般的な部分,アルゴリズムでの
>高速化に及ばないですし。
>処理の高速化は通常はアルゴリズムの改良です。

アルゴリズムの改良ですか…うーーん,がんばって改良してみます.
といっても,ここの関数の処理ルーチンについて再検討から始めたいと思います.

>ところで、配列をポインタにすることで高速化するという
>話が出てますが,
>その程度のことは割と以前からコンパイラの最適化では
>やっていると聞いてます。
>最適化のレベルにもよると思いますが、
>Cコンパイラの最適化としてはかなり初歩
>的な部分でしょう。

このようなコンパイラに関する知識も乏しいので,勉強ですね.

terra5様はじめ,さまざまな方から意見を賜り,息詰まっていたキモチに
モチベーションが戻りました.ここで改めてお礼を述べたいと思います.
有り難う御座いました.なにかまた不明瞭な点があったらこの掲示板を
利用させて頂くのでそのときは,どうか宜しく御願い致します.
では.

お礼日時:2001/08/15 11:08

terra5さんが百点満点の回答をして下さったので、後は蛇足と知りつつ、付け加えさせていただきます。


大学の研究の一環ということですので、長時間かけて解を出すようなプログラムもあるのでしょうね。
例えば60分で答を出すプログラムがあったとします。データをスタックに置くかヒープに置くか、
配列のアドレス計算や関数呼び出しのオーバーヘッドをどうやって減らすか、といったようなことを
一所懸命に考えてプログラムを修正したとします。そうした高速化では、55分くらいで処理が終わる
ようにできれば、ある意味で大成功だと思うのです。が、aki2001さんはそれで満足できますか?

それよりも、もっと根本的に処理を見直すことです。例えば、ご質問のプログラムではMAX×MAX=10000回
Test関数が呼び出されています。もし、ある条件の時にはTest関数を呼ぶ必要は無いということを見つけ
られれば、処理時間はぐっと短縮できる可能性があります。
例えば、jがiより大きい場合だけで良かったんだということになれば、
 for(i=0;i<=MAX;i++){
  for(j=0;j<=MAX;j++){
  if(i<j){
  Test(i.j,data);
  }
  }
 }
で良いわけです。Test関数の呼び出しは半分近くに減ります。
 for(i=0;i<MAX;i++){
  for(j=i+1;j<=MAX;j++){
  Test(i,j,data)
  }
 }
とすれば、もう少し速くなります。
terra5さんの「適切なアルゴリズム」の一つの例と考えて頂いて良いと思います。
(もちろん、適切かどうかは実際の状況によります。)

あと、前の回答で余計なことを書いてしまったかなと反省しているのですが、
double (*pdata)[3]; はdouble三つの要素から成る配列へのポインタです。
あとは int *p; とした場合に *p と p[0] が同じデータを示すということから類推して下さい。
くれぐれも見ずらいコーディングにならないように。

この回答への補足

ranx様,ご返事ありがとうございます.

>aki2001さんはそれで満足できますか?
すみません,やはり処理の高速化にこだわりたいです.
人間はダイアログのOKなどを押して5秒以上たつと
おそいと感じるようなのです.
実際自分のアプリはintractiveなスピードではないです(泣).
私の研究は処理の高速化に大きく関わっています.
ある人にいわせると「クソプログラム」といわれます.
従って,どうしてもそのスタック、ヒープの効率的な使用法、
または、関数のオーバーヘッド等について御教示して頂きたいのです.
もちろん自分でも勉強しますが,ネットサーフィンなどで
情報の取捨選択に時間を費やすよりも
できればranx氏が参考にしている適切なURL等を
教えて頂ければと思っているのですが….
「楽してるんじゃないか!」といわれそうですけれど…



****************************************************************
Test関数が呼び出されています。もし、ある条件の時にはTest関数を呼ぶ必要は無いということを見つけ
られれば、処理時間はぐっと短縮できる可能性があります。
例えば、jがiより大きい場合だけで良かったんだということになれば、
 for(i=0;i<=MAX;i++){
  for(j=0;j<=MAX;j++){
  if(i<j){
  Test(i.j,data);
  }
  }
 }
で良いわけです。Test関数の呼び出しは半分近くに減ります。
 for(i=0;i<MAX;i++){
  for(j=i+1;j<=MAX;j++){
  Test(i,j,data)
  }
 }
とすれば、もう少し速くなります。
terra5さんの「適切なアルゴリズム」の一つの例と考えて頂いて良いと思います。
(もちろん、適切かどうかは実際の状況によります。)
****************************************************************
たしかに上記考え方は,重要であると思います.
アルゴリズムとデータ構造をどのように構築するかとなやんでばかりで
ソースコードをかく手がとまってしまう.といった日々が私の場合多いです.
また,やっと考えたデータ構造でも処理がおそくふんだりけったりです.

****************************************************************
あと、前の回答で余計なことを書いてしまったかなと反省しているのですが、
double (*pdata)[3]; はdouble三つの要素から成る配列へのポインタです。
あとは int *p; とした場合に *p と p[0] が同じデータを示すということから類推して下さい。
****************************************************************
わかりました.ポインタ重要なのでこの際きちんとまなび直します.

御手数をお掛けしますが,御叱咤でもかまいません,アドバイスを
よろしく御願い致します.

補足日時:2001/08/14 19:12
    • good
    • 0

高速化するには、まず今やりたい処理を再検討することです。


現在:データ個数分ループ->関数で1データ処理
ここで問題なのは、1データ処理単位ずつで関数呼び出しが存在することです。関数呼び出しのオーバーヘッドがありますので、高速化のためには、「複数データ高速一括処理」ルーチンの作成の必要があります(引数は、配列のポインタ?)。さらにデータを配列から持ってくる場合にabc[i]のような引っぱり方をすると遅くなる(iからデータ列の存在するアドレス計算を内部的にやっている為)ので最初からポインタ計算型でコーディングするといいでしょう(ranxさんの(2)のようなかんじ)。
<さらに>
本当に限りなく高速化したいのなら、VCでアセンブラ表示に変更してC->アセンブラ(マシン語)へどう落ちるかのチェックが必要です。CPUのマニュアルには、そのマシン語がどのくらいの時間で実行されるか記述してあるので、これから逆算できます。

この回答への補足

papataku 様,お返事ありがとうございます.

>関数呼び出しのオーバーヘッドがありますので、
>高速化のためには、「複数データ高速一括処理」ルーチンの作成の必要があります


関数呼び出しのオーバーヘッドとは具体的には,PC内部でどのようなことが
起きるのでしょうか?
上記のように,i,jのfor文内があればTest()関数は,メモリ上では,pushするpopを繰り返すことで
呼ばれ,処理の遅延を招くのでしょうか??

また,「複数データ高速一括処理」というのをもう少し具体的に例を挙げて御教示して頂けませんでしょうか?

>(引数は、配列のポインタ?)。
はい,そうです.
2次元配列 data[MAX][3] の先頭アドレスを指すポインタをTest関数に渡しています.

>さらにデータを配列から持ってくる場合にabc[i]のような引っぱり方をすると遅くなる(iからデータ列の存在するアドレス計算を内部的>にやっている為)ので最初からポインタ計算型でコーディングするといいでしょう(ranxさんの(2)のようなかんじ)。

うーーん,ここがちょっと私の技量では,分からなくて頭をひねってしまうところなのです.
もう少し勉強してみます.

>本当に限りなく高速化したいのなら、VCでアセンブラ表示に変更して
C->アセンブラ(マシン語)へどう落ちるかのチェックが必要です.

papatakuさんがおっしゃるアセンブリ表示とは,
VCでデバックツールをメニューから選択すると表示される16進数表示のメモリダンプですか?

>CPUのマニュアルには、そのマシン語がどのくらいの時間で実行されるか記述してあるので、これから逆算できます。

できれば逆算の仕方がのっているURLを教えて頂きたいのですが…


長々と,書いてすみません.また,こんなタコ(タコよりひどいかも…)に
適切なしかも丁寧な解説ありがとうございます.
まだわからない消化しきれていない箇所が多々ありますので
どうか宜しく御願い致します.

補足日時:2001/08/14 15:50
    • good
    • 0

ケースによりますが、小手先の高速化は


不要と思います。
最近のコンパイラの最適化はかなり優秀らしいのと、
CPUの速度の速いこともあって、下手な細工は
プログラムの可読性の低下を招くだけですし、
最適化のさまたげになるようなコーディングなら、
却って悪化します。

まずVC++6.0を使うような環境なら、そのレベルの
心配はまず不要でしょう。


>ということは,処理を高速化するためには
>なるべくTest関数内の変数を
>できるだけへらせばいいのでしょうか?

一概には言えません。
例えば、ローカル変数はまとめて確保しますから、
手間としてはよほど大きいサイズをとらないと
変化しません。
逆に、変数が局所的であるほど最適化が有効に
働きますから、変数の使い方によっては
かえって高速の場合もあります。

高速化はまず適切なアルゴリズムとデータ構造です。
これが悪いとその程度のことは無意味です。

バグを無くすにはまず読みやすいプログラミングです。
    • good
    • 0
この回答へのお礼

terra5様,お返事ありがとうございます.

>一概には言えません。
>例えば、ローカル変数はまとめて確保しますから、
>手間としてはよほど大きいサイズをとらないと
>変化しません。
>逆に、変数が局所的であるほど最適化が有効に
>働きますから、変数の使い方によっては
>かえって高速の場合もあります。

この適材適所ともいうべき能力を身につけるには,
やはり「経験」でしょうか?

>高速化はまず適切なアルゴリズムとデータ構造です。
>これが悪いとその程度のことは無意味です。

大きいサイズの場合,グローバル変数として確保した方がよい
ときいたことがあるのですが,これもなんともいえませんか?

実際,関数を呼ぶときには,その呼ばれた関数内の変数も呼ばれる,
すなわち,スタックの繰り返しですよね?
ということは,あまり大きいサイズをつまないようにした方が
いいと知識がない私は考えてしまうのですが…

>バグを無くすにはまず読みやすいプログラミングです。
うーーん,↑非常に大切ですよね.
それと,最低限のコメント文の併記ですよね.ついつい忘れがちです.

なにかと丁重なアドバイスを頂きありがとうございました.
今後とも宜しく御願い致します.
では.

お礼日時:2001/08/14 15:33

ケースバイケースで何とも言えないと思いますけどね。


(高速化より構造化・プログラム見易さが重要な場合もあるし。)
とりあえず、お尋ねのプログラムについて言えば、
(1) Test()をマクロ化する。
  関数呼び出しのオーバーヘッドを減らせます。ただし、Test()の内容によっては
 できない場合もあるでしょうし、コーディングに気をつけないとバグの元になる
 場合もあります。
(2) i,j のいずれかがdata配列の引数として使われるのなら、
  double (*pdata)[3], (*plast)[3];
  のような変数を作って
  for(pdata=data[0],plast=pdata+MAX;pdata<=plast;pdata++){
   for (j=0;j<=MAX;j++){
   Test(pdata, j);
   }
  }
  のようにする。
いずれにしても、Test()内の処理で時間を食っているなら、そちらの高速化の方が
重要になりますね。
    • good
    • 0
この回答へのお礼

さっそくのアドバイスありがとうございます.
>高速化より構造化・プログラム見易さが重要な場合もあるし
そうですね,コーディングが見やすいとの指摘も最もですね.
double (*pdata)[3], (*plast)[3];
ところで↑は,double型の配列のポインタ配列ですか!???
記述して頂いたコードを見る限り私が書いたコードは
2次元を扱っていますが,ranx様の場合,data[0]としておりますが….
すみません、もう少し御指導御願い致します.

お礼日時:2001/08/14 12:27

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

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

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

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

Q初心者がまず始めるプログラミング言語はなにはおすすめ?

こんにちは。
プログラムについてほぼまったくの初心者です。
シューティングゲームやファミコンの頃のようなマリオ系アクションがつくりたいです。また、就職時や特技として履歴書に書ける、役に立つプログラミング言語が学びたいです。
使っているOSはXPです。
C言語というものの初歩の初歩を本で学んだんですが、とても難しく感じ、途中で挫折してしまいました。
たくさんあるプログラミング言語の中から、初心者にもわかりやすくて、また、他のプログラミング言語への勉強にもなるようなプログラミング言語はあるでしょうか?
おねがいします。

Aベストアンサー

> C言語というものの初歩の初歩を本で学んだんですが、とても難しく感じ、途中で挫折してしまいました。

 厳しいですね。C言語の初歩程度でへこたれているようでは「就職時や特技として履歴書に書ける、役に立つプログラミング言語」のマスターはおぼつかないでしょう。が,C言語が初心者向きでないのもまた事実です。

 私としては,初心者には Python をお奨めします:

  ‐汚いプログラムが書きにくいような文法になっており,ああも書ける,こうも書けるといった,初心者を戸惑わせる文法事項が少ない
  ‐綺麗なプログラムを書かないと気持ち悪くなるという,良い習慣が身につく
  ‐文法が比較的単純
  ‐処理系が無料で手に入る
  ‐世界的に広く使われている
  ‐オブジェクト指向もできる

 その後で,JavaScript に進んでみてはいかがでしょうか。毛色の異なるいろいろな言語に慣れておく必要があり,将来,Java, C#, C, C++ などの言語に進むためにも。

 また,視野を広げるために Scheme, Common Lisp や ML, OCaml, Haskell, Erlang など関数言語のたぐいや,Perl や Ruby, sed, Awk などのスクリプト言語の本にも目を通されることをお勧めします(いずれも世界的に有名で,処理系が無料で手に入ります)。

 それから Java や C# などに取り組めば良いと思います。そして,C や C++ も勉強しておく必要があります。

 私自身は,仕事の都合でCOBOLとアセンブラを先に勉強し,かなり後になってC言語を勉強したので,C言語のポインタのどこが難しいのか分かりませんでした(C言語のポインタは簡単です(^^;)。ただし,アセンブラは余力があるときに限り取り組めばよいでしょう(でも,CASL関連の本には目を通しておくべき)。

> C言語というものの初歩の初歩を本で学んだんですが、とても難しく感じ、途中で挫折してしまいました。

 厳しいですね。C言語の初歩程度でへこたれているようでは「就職時や特技として履歴書に書ける、役に立つプログラミング言語」のマスターはおぼつかないでしょう。が,C言語が初心者向きでないのもまた事実です。

 私としては,初心者には Python をお奨めします:

  ‐汚いプログラムが書きにくいような文法になっており,ああも書ける,こうも書けるといった,初心者を戸惑わせる文法事項が少...続きを読む

Qint main()、void main()、void main(void)、int main(void)

今日、大学でC言語の講義の時間、先生が、

#include <stdio.h>

void main(void){

}

と宣言してプログラムを書くと教えていました。
main関数には、
main()
void main()
void main( void )
int main()
int main( void )

と、人によりいくつかの描き方があったりします。
どれが本当は正しいのでしょうか?
void mainはすべきではないとなんかの本で読んだのですが・・。

Aベストアンサー

通称C89という以前の言語規格(現行コンパイラの多くが準拠)では、下記のいずれかが正しい。
int main(int argc, char *argv[])
int main(void)

但し、最新のC言語規格(通称C99)では、
<ISO/IEC9899:1999>
or in some other implementation-defined manner.
</ISO/IEC9899:1999>
となっているので、処理系が戻り値のvoidを認めていればvoidも可。
# 組込み系などで戻り値を使わない環境もあるためでしょうか。

なので、コンパイラのマニュアルで戻り値のvoidにしていい/しろと書いてない限り、
voidは言語仕様的には正しくない。(でも動くものもある)

Q初心者が選ぶべきプログラミング言語は?

初心者が選ぶべきプログラミング言語は?

プログラミングの勉強を始めようと思っている超初心者です。この手の質問はこちらでもかなり検索すればヒットしますが、いまいち良くわからないのであえて質問します。

私のような初心者がプログラミングをはじめるときどの言語を選んだらよいでしょうか?
重視することは「将来性があって」「有用性のある」「標準的な」言語です。
言語選びにはしたいことの明確なビジョンがないといけないと言われますよね
私の目的はwindowsのフリーソフトのようなツールを作りたいことを第一目標にしています
後々は勉強の具合により目的も変えてゆきたいと思っていますが・・・

今現在の理解では・・・
基礎はCで、ビジネスではJavaで、WebはPHP、ぐらいしか解りません。どれもプログラミングの共通点を
有していて勉強すればある程度は共通知識を身につけられることも言われてはいますが
言語選びを間違えたくないなと思いまして。

Cをすこし勉強したときいつwindowsアプリのようなウィンドウをつくれるかももわかりませんでした。
現在自分ができることといったらExcelでVBAを組んで(かなり低レベルですが)自動化させる程度です。


ビジネスの世界、SEなどのプログラマーの世界で今注目されている言語や花形言語など、現在業界のオーバービューも知りたいです、詳しい方どうぞよろしくお願いします。

※個人的にはRubyが面白そうで、いろんなことができそうだなと思っています。

初心者が選ぶべきプログラミング言語は?

プログラミングの勉強を始めようと思っている超初心者です。この手の質問はこちらでもかなり検索すればヒットしますが、いまいち良くわからないのであえて質問します。

私のような初心者がプログラミングをはじめるときどの言語を選んだらよいでしょうか?
重視することは「将来性があって」「有用性のある」「標準的な」言語です。
言語選びにはしたいことの明確なビジョンがないといけないと言われますよね
私の目的はwindowsのフリーソフトのようなツールを作りたい...続きを読む

Aベストアンサー

私は10数年Windows用のクライアントソフトを開発していますが・・・

>重視することは「将来性があって」「有用性のある」「標準的な」言語です。



>私の目的はwindowsのフリーソフトのようなツールを作りたいことを第一目標にしています

が、合致しません。

WindowsというクライアントPC 用のアプリ開発自体が、「将来性がなく」「標準的でない」方向にあると思います。エンジニアの求人情報を調べればわかります。


それから、身につけたい技術の選び方として、「言語」はあまり意味がないです。
C言語をマスターしたからといって、WindowsやiPhoneで思い通りにソフト開発ができるわけじゃないです。

なので、最初は「どのプラットフォームの開発を身につけたいか」を決めた方が適切なアドバイスがもらえると思います。

Windows?iPhone?Webアプリ? SaaS系?などなど

プラットフォームが決まれば、今習得すべき言語は(本人の希望によらず)勝手に決まってしまいます。AndoroidならJavaとか。

「将来性」はともかく、Windowsアプリを作りたいのであれば、.NET Framework で VBでもC#でもお好きな方を使って開発するのが一般的ですが、それでもハード性能を100%使い切るばりばりの3Dゲームソフトを作りたいなら Win32API & C++ & DirectXでどうぞ、という感じです。その前にWindowsで3Dゲームを作ること自体が今となっては疑問です。XBOX + XNAの方がいいかもしれません。
将来性をもってゲームを作りたいなら、AndroidやiPhone で OpenGLアプリを勧めたいですね。

という感じで、言語を選ぶこととプラットフォームを選ぶことは別で、多くの場合プラットフォームが決まれば最適な言語をマスターするしかないということです。

私は10数年Windows用のクライアントソフトを開発していますが・・・

>重視することは「将来性があって」「有用性のある」「標準的な」言語です。



>私の目的はwindowsのフリーソフトのようなツールを作りたいことを第一目標にしています

が、合致しません。

WindowsというクライアントPC 用のアプリ開発自体が、「将来性がなく」「標準的でない」方向にあると思います。エンジニアの求人情報を調べればわかります。


それから、身につけたい技術の選び方として、「言語」はあまり意味がないです。
C言語を...続きを読む

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僕は高校生なんですがプログラミング言語を将来のために学びたいと思っています。まだ初心者なので調べた結

僕は高校生なんですがプログラミング言語を将来のために学びたいと思っています。まだ初心者なので調べた結果RubyかPythonのどちらかにしようと思うのですがどちらがいいでしょうか?
なるべく多くの意見を参考にしたいです。

Aベストアンサー

入門書とか入門サイトとか少し読んでみて、直感的に「なんとかなりそう」と思った方。
悩んでないで、直感を信じてとにかく始めることです。


プログラムは大きく
・やろうとしていることをどうやって実現するか?
・それをプログラミング言語でどうやって記述するか?
の2つの要素があります。

前者の「やり方」は、言語によろ違いが少ないので、一度身に付くと、言語が変わっても応用が効きます。
後者の「書き方」は(多少似たところはあるものの)言語毎に違うので、「やり方」程は応用が効きません。

「最初の言語」はどうしても「やり方」「書き方」の両方を学習しなければなりません。
ですが、次からは「書き方」中心の学習になるので、「最初の言語」ほどは苦労しないはずです。


なので、とにかく早く始めて、「やり方」を身に付けていきましょう。
直感がはずれて、「この言語は無理」と感じたとしても、「次の言語」へは1から始めるよりははるかに楽になっているはずです。

Qint i,j; \n i=0,j=5;

int i,j;
i=0;
j=5:
と書いてあるソースは普通ですが、
int i,j;
i=0,j=5:
と書いてあるソースもあります。
後者はC++の正しい書式ですか?

カンマ演算子というのは後者のカンマのことですか?

Aベストアンサー

 正しい書式です。

i=0,j=5;
 における、「,」をカンマ演算子といいます。2項の演算子です。カンマで区切られた演算を「左から順番に」実行し、最後の演算を結果として返します。
 したがって、例の文であれば、i=0を実行し、次にj=5を実行。そして、j=5の結果の5を結果として返します。
 ・・・
 が、本来的には、あまり、例のような使い方はしませんね。よく見られるのは、次のような場合です。

 for (i=0,j=0 ; i < 50 ; ++i,++j) {

 のような形でよく見られます。for文の各式は、一つの式でなければならないので、こんな書き方をするわけです。初期化と更新部が一つにまとまり、ループが読みやすくなるのが利点かな。

QC言語でプログラミングできるソフト(初心者)

大学1年で今年から始めてプログラミング(C言語)を学ぶものです。
今のところif文やfor文、関数などの基本をかじった程度なのですが
なんとか自分の家のパソコンでプログラミングを行いたいので、
何か良いソフトのようなものはないでしょうか?(有料でも構いません)

実際に文などが書けて、コンパイルし、結果を出力してくれるものです。
パソコン自体がまだ初心者なので、できればで良いのですが、分りやすいものをお願いします<m(__)m>

Aベストアンサー

#4さんも書かれてますが、大学であればunixかLinuxの環境だと思います。
なので、私もcygwinをお勧めします。windows上にuinxの環境を構築できて、gccという無料のコンパイラが利用できます。
それにunixやlinuxの環境構築の良い勉強になります。

簡単な導入の仕方がありますので試してみてください。
http://www.twcu.ac.jp/~osada/comp2a/cygwin.html
こちらも参考に。
http://programnet.hp.infoseek.co.jp/coloum/colum.html

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オブジェクトのデストラクタが呼び出される。

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

Q初心者におススメのプログラミング言語は何ですか?

C C++ Java などの言語がありますが、中でも初心者(素人)が始めるにあたって一番おススメの言語は何ですか。

 教えてください。 よろしくお願いします。

Aベストアンサー

JavaScriptがオススメです。
理由は
1)ネット上に情報がたくさんある
2)開発環境の構築が容易
3)実行環境の構築が容易
4)実行時の動作がグラフィカルなので「達成感」がある
特に4は重要です。

必要に迫られない勉強は、やる気を継続させる事が結構難しかったりします。
コマンドプロンプト上で実行するような言語の場合、せっかく苦労してプログラムを組んでも
動作結果が地味な事が多いため、動いた事に対する感動が薄くなります。
これが積み重なると、途中で投げ出す結果につながりかねません。
その点、JavaScriptのようにダイアログを出したり色を変えたりといった
動作をさせる言語であれば、やる気の低下を抑える事が出来ます。

もっとダイナミックな動きをさせたいのであれば、
Delphi(Pascal)、C#、VBなどを使うのもいいでしょう。
どれも無料版の開発環境を配布しています。

将来プロになる事を考えているのであれば現在よく使われているPHPや
今後よく使われることになると思われるPython、Rubyなどを勉強するのもいいかもしれませんが
1つのプログラミング言語を身に付ければ他の言語に移るのは割と楽ですので
最初は勉強のしやすさを基準に選ばれると良いかと思います。

JavaScriptがオススメです。
理由は
1)ネット上に情報がたくさんある
2)開発環境の構築が容易
3)実行環境の構築が容易
4)実行時の動作がグラフィカルなので「達成感」がある
特に4は重要です。

必要に迫られない勉強は、やる気を継続させる事が結構難しかったりします。
コマンドプロンプト上で実行するような言語の場合、せっかく苦労してプログラムを組んでも
動作結果が地味な事が多いため、動いた事に対する感動が薄くなります。
これが積み重なると、途中で投げ出す結果につながりかね...続きを読む

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);

となります。


人気Q&Aランキング

おすすめ情報