επιστημη(@episteme) の回答履歴
- マルチスレッド環境での配列使用について
現在、C++を利用してマルチスレッド環境の開発を行っています。 マルチスレッドで排他的に変数を扱う場合、クリティカルセクションや ミューテックスを使用することで、排他制御をおこなうことができますが、 このように、配列の要素ごとに排他制御を行うことは可能でしょうか? たとえば、 int ary[10]; のような配列があれば、a[0]~a[9]まで要素をそれぞれ排他制御によって データの矛盾を避けたいと考えています。 パフォーマンスの関係上、できるだけ、配列全体をロックするのは避けたいと 思っています。 どうぞよろしくお願いします。
- たくさんの数の平均を求める方法について
どうもこんにちは 研究でシミュレート用のプログラムを書いています 大量の数を入力し、その平均値を求めるコードを書いているのですが、 誤差ができるだけ小さくなる方法はないでしょうか 入力する数はdouble型の実数値あるいはint型の整数値で、 個数は1億程度です。 最初は1つずつ足していたのですが、整数型の場合はオーバーフローしてしまい、実数型の場合も徐々に加算する値が相対的に小さくなり、誤差が大きくなっていきました。 100万個ずつに区切って平均を求め、それを後で合計する方法も考えましたが、あまりきれいな方法になりません なにかいい方法はないでしょうか
- 整数を引数にもつテンプレートクラスについて
テンプレート引数に整数を使えると 聞いたので以下のようなクラスを 作りました。 template <int w, int h> class MyClass { double a[w][h]; MyClass(); }; temlate <int w, int h> void MyClass<w, h>::MyClass(void) { for(int i = 0; i < w; i++) { for(int j = 0; j < h; j++) { a[i][j] = 0; } } } ここでMyClass<2, 4> mc;などと呼び出してコンパイルすると undefined reference to `Matrix<2, 4>::Matrix()` とエラーが表示されます。 何が間違っているのでしょうか?
- 整数を引数にもつテンプレートクラスについて
テンプレート引数に整数を使えると 聞いたので以下のようなクラスを 作りました。 template <int w, int h> class MyClass { double a[w][h]; MyClass(); }; temlate <int w, int h> void MyClass<w, h>::MyClass(void) { for(int i = 0; i < w; i++) { for(int j = 0; j < h; j++) { a[i][j] = 0; } } } ここでMyClass<2, 4> mc;などと呼び出してコンパイルすると undefined reference to `Matrix<2, 4>::Matrix()` とエラーが表示されます。 何が間違っているのでしょうか?
- エラーについて
Cプログラミングについての質問です.よろしくお願いします. 以下のヘッダファイル(param.h header.h),および,mainファイル(以下はそのファイルの一部)が正しくコンパイルされるということなのですが,linuxでエラーがでます. エラー内容は error:redifinition of typedef 'gtype_t' error:previous declaration of 'gtype_t' was here です. <param.h> #define F_X pow((x),2)-2 /*探索する関数.関数への入力はx,関数からの出力はy*/ #define G_Y 1/(1+fabs(y)) /*関数の出力に対しての適合度.適合値は高いほどよいものと扱われる,f(x)=0が最良*/ #define GRAY 1 /*グレイ表現なら1,バイナリ表現なら1*/ /*GAのパラメータ群*/ #define MAX (0) /*扱う実数の最大値*/ #define MIN (255) /*扱う実数の最小値*/ #define LENGTH (8) /*遺伝子のコード長*/ #define POP (8) /*個体数*/ #define CODE_MAX 1 /*各遺伝子コードの最大値.これが1ならコードは0か1になる.ビット文字列の場合は1*/ #define GAP 0.7 /*一回の生殖で子供と入れ替わる割合*/ #define ELITE_RATE 0.8 /*そのまま残る数のうち,エリートの割合*/ #define P_MUTATE 0.13 /*突然変異率.LENGTHの逆数程度が良い.*/ #define P_CROSS 1.0 /*交叉確率*/ #define GENERATION 5 /*GAを計算する世代数*/ #define SELECTION_METHOD 1 /*1はルーレット,2はトーナメント*/ #define TOURNAMENT_SIZE 5 /*トーナメントサイズ.トーナメントのときだけ意味がある*/ /*出力*/ #define PRINT_GROUP 1 #define PRINT_FITNESS 1 <header.h> typedef int* gtype_t; typedef struct ga_individual* individual_t; struct ga_individual{ gtype_t gtype; /*遺伝子型 int配列の先頭ポインタ*/ double ptype; /*表現型*/ double fitness; /*適合度*/ individual_t next; /*線形リストでの次の個体*/ int rank; /*線形リストの中での順位(ソート後)*/ int parent1; /*交叉での親1のインデックス*/ int parent2; /*交叉での親2のインデックス*/ int cross_point; /*交叉したポイント*/ }; typedef struct ga_population* ga_population_t; struct ga_population{ individual_t genes; /*個体の線形リスト先頭へのポインタ*/ double *pselect; /*適合度の配列*/ int mutate_count; /*突然変異回数の合計*/ double max_fitness; /*適合度の最大値*/ double min_fitness; /*適合度の最小値*/ double avg_fitness; /*適合度の平均値*/ int population_size; /*集団の個体数*/ int code_length; /*遺伝子長*/ int code_max; /*各遺伝子座の最大値,ビットストリングの場合は1*/ }; <main> /*実数とバイナリ・グレイ表現への変換*/ /*与えられた実数に近い,ビットストリング型のgtypeを作る.*/ /*GRAY=1指定される時はグレイ表現に変換*/ /*最後の桁まで計算した後に残る端数切り捨て*/ typedef int* gtype_t; void encode_gtype(double value,gtype_t gtype,int code_length,double min,double max) { double gap = max-min; double remain_value = value-min; /*値のうち,遺伝子によって表現されている部分*/ double value_of_code; /*その桁の遺伝子が表現する値*/ int position = 1; int pre_code = 0; int i = 0; int tmp; /*グレイ表現変換用,一時保管変数*/ while (i<code_length){ value_of_code = gap/pow(2,position); if(remain_value >= value_of_code){ gtype[i] = 1; remain_value -= value_of_code; } else{ gtype[i] = 0; } /*グレイ表現への変換 バイナリ表現と,元のバイナリを右に1シフトしたもののXORをとる*/ if(GRAY == 1){ tmp = gtype[i]; gtype[i] = (pre_code) ^ (gtype[i]); pre_code = tmp; } position++; i++; } return; } 以上です. よろしくお願い致します.
- 構造 他のクラスの構造体を別のクラスで使いたい。
C#で以下のようにCls1で定義している構造体をCls2の引数に使いたいのですが 定義されていないエラーになります。 Cls2で再定義すると、同じものが2つできて修正するときに困りそうです。 プログラムの構造について、何か良い方法がありましたら教えてください。 namespace A { class Cls1 { public struct Kumi { public string name; public int age; } private test(){ Kumi k; k.name = "太郎"; k.age = 5; Cls2 c2 = new Cls2(); c2.Write(k); } } } 別のクラスファイル namespace A { class Cls2 { public Write(Kumi k){ } } }
- 値渡しと参照渡しについて
テンプレートについて調べているときに以下のような使用例がありました。 例)template<class T> T max(const T& a, const T& b) { return ( a > b ) ? ( a ) : ( b ); } これの説明に、「引数を参照にすることで、インスタンスを渡した場合の処理時間の短縮になる」と書かれていたのですが、どうして処理時間が短縮されるのでしょうか? また、実際に目で見える形で証明する方法はありますでしょうか。 ちなみに自分はC++についてはまだ初心者です。 どうか皆様のアドバイスをよろしくお願い致します。
- 締切済み
- C・C++・C#
- know_smthg
- 回答数2
- Visual C++ error なんで?
将来プログラマーを目指して勉強中の中学生です。 おとといC言語を始めてやさしいCを半分ぐらい読み 数当てゲームを作ってみようと思い今製作中なのですが(ランダムに数字を出すとかはできない)どうしてもエラーがでてしまうのです。 googleなどでエラーを調べてもどうしても解決につながらないので、本当は自力で見つけてバグを直さなくてはいけないのはわかっているのですが、ここで質問させていただきます。 ※ソース見にくいかもしれませんがすいません。 この数当てゲームは、100から999までの数字で入力された数字が、あらかじめ用意されている答えより小さいか大きいかを判断して 答えに近づいていくゲームです。 ------------------ソース--------------------------- /*数当てゲーム*/ //9/13日:作成開始 //9/13日:全角の空白には注意!!!エラー発生。問題解決 //9/14日:エラー #include <iostream>//本当は<stdio.h>でやっています。 int main (void) { int anser,tasu1; anser=749; printf("数当てゲームです。私があらかじめ用意しておいた数を当てる単純なゲームです。答えは100から999での間です。\n"); printf("では100から999までの数字を入力してください。\n"); scanf("%d", &tasu1); //tasu1に入力された数字を格納 if(tasu1 == anser){ printf("正解です!おめでとうございます。\n");//入力された数字がanserと一致したときここを処理 } else if(tasu1>anser){ printf("答えは入力された数字より小さいです。\n");//tasu1がanserより大きい場合ここを実行 } else if(tasu1<anser){ printf("答えは入力された数字より大きいです。\n");//入力された数字がanserより小さいときにここを処理 } else if(tasu1<100){ printf("入力された数字が許容範囲を超えています。\n");//入力された数字が100未満のときここを処理 } else if(tasu1>999){ printf("入力された数字が許容範囲を超えています。\n");//入力された数字が999より大きいときここを処理 } else{ printf("入力された数字が不正です。\n");//それ以外はここを処理 } return 0; } 見にくいですが、どうぞ回答よろしくお願いします。
- std::ifstreamについて
#include <iostream> #include <fstream> int main( int argc, char** argv ) { if( argc == 1 ) return -1; std::ifstream ifs( argv[1] ); if( ifs.is_open() == false ) return -1; return 0; } C++で上記のようなコードを書いてコンパイルし、出来上がった実行ファイルにアスキーフォーマットのテキストファイルをドロップしたのですが、どうしてもファイルの展開が成功しません。 確認したところ、一応argv[1]には正しいフルパスのファイル名が入っていました。 なぜファイルの展開に失敗するのでしょうか? よろしくお願いします。 /* WindowsXP Professional32bit Core2Duo 2.44GHz VisualStudio2005 Academic Edition VisualStudio2008 Academic Edition */
- 空間上の二点を結ぶ直線上に任意の点が存在するかどうかの関数
Cの初心者です。 空間上に存在する2点間を結ぶ直線上に任意の点が存在するかどうかの 関数を作りたいのですがどのような公式を用いて評価すればいいのか分かりません。 どなたかご教示ください。 引数 始点 A(x,y,z) 終点 B(x,y,z) 直線上に存在するであろう任意の点 C(x,y,z) 関数のイメージ boolean isOnLine (Ax, Ay, Az, Bx, By, Bz, Cx, Cy, Cz); 配列でもよいです。 返り値 True、 False ( 0 or 1 ) よろしくお願いします。
- ベストアンサー
- C・C++・C#
- noname#100609
- 回答数8
- 空間上の二点を結ぶ直線上に任意の点が存在するかどうかの関数
Cの初心者です。 空間上に存在する2点間を結ぶ直線上に任意の点が存在するかどうかの 関数を作りたいのですがどのような公式を用いて評価すればいいのか分かりません。 どなたかご教示ください。 引数 始点 A(x,y,z) 終点 B(x,y,z) 直線上に存在するであろう任意の点 C(x,y,z) 関数のイメージ boolean isOnLine (Ax, Ay, Az, Bx, By, Bz, Cx, Cy, Cz); 配列でもよいです。 返り値 True、 False ( 0 or 1 ) よろしくお願いします。
- ベストアンサー
- C・C++・C#
- noname#100609
- 回答数8
- artoolkit導入
artoolkit導入してるときに行きずまりました。visual studio2008使ってます。 工学ナビの通りにやって、サンプルプログラムのsimplelite.exe を実行すると「MSVCP71D.dllが見つからない」とエラーが出て実行できません。どうしたらいいんでしょう?
- ソフトウェア開発を外注するのですが…
外注先の企業さんによると、 ・開発環境:Visual Studio 2005 ・開発言語:C# ・ソフト形式:アプリケーション(.exe) だそうです。 そこで質問なのですが、「勉強のためコンパイル前のC#のファイルもいただきたい」というのは、場違いな要求でしょうか?
- ベストアンサー
- C・C++・C#
- xenotactic
- 回答数3
- 数値の比較演算について
int x = 0; if(x >= 0 && x <= 1) { x = 'a'; } if(x >= 2 && x <= 3) { x = 'b'; } 以下ある程度同様のif分岐 ※自作プログラムより一部抜粋及び改変 C言語を始めたばかりなのですが上記のようなif分岐を行い、%cでxを表示するのですが、xの値が0にもかかわらず、aではなく別の記号が表示されてしまいます。 自分では直前にprintfでxの値が変わっていないか確認し、%dでどのような数値になっているかも確認しました。 どこが悪いのか直接的な答えでなくとも、ヒントだけでも構いませんのでご教示していただけないでしょうか?
- シェルのプログラム
以下の項目を実現するプログラムを作っています。 コマンドプロンプトを表示し、キーボードからコマンドを文字列として入力する。入力した文字列を調べ、forkして子プロセスを作る子プロセスで、調べたコマンドをexecする、親プロセスは子プロセスの終了を待って、始めに戻るというプログラムです。自分なりにあれこれ作ったのが下のです。 #include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/wait.h> void read_command(char *command, char *p) { static char buf[100]; fgets(buf, 100, stdin); sscanf(buf, "%s %[\n]", command,p); } int main(void) { pid_t pid; int status; char command[100], p[100]; while (1) { printf("command>"); read_command(command, p); pid = fork(); if (pid < 0) { printf("forkできません\n"); continue; } if (pid != 0) { wait(&status); } else { execve(command, p, 0); } } return 0; } 子プロセスと親プロセスでのforkの仕方が分かりません。 実行したら下のような結果になるようにしたいのですが、できません。 どなたか、教えてください。 $./sh command> ls a.out ・・・・・・
- びるだーとこんぱいらー
プログラミングを初めてやろうというものです。 Vidual Studio 2008 Express EditをDLしてプログラミングを していこうと思っているんですが、ビルダーとかコンパイラー とかはすでについてたりするんですか? 何かよく分かりません。
- 締切済み
- C・C++・C#
- noname#163877
- 回答数1
- vc 2008 C&C++ コンパイル時について
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 「1>str_cpy.obj : error LNK2005: _main は既に Cprog.obj で定義されています。 1>str_cpy.obj : error LNK2005: "int __cdecl main(void)" (?main@@$$HYAHXZ) は既に Cprog.obj で定義されています。」 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー というようなエラーが出た時の対処法はありませんか?これは同プロジェクト内でmainを二回以上使うなということですよね? これじゃ同じプロジェクト内で二つ以上のCファイルは作れないことになりませんか? どなたか解決法があればお願いします。
- ベストアンサー
- C・C++・C#
- tomato1414
- 回答数1
- 画像の大きさと2次元配列
C++で ビットマップの一つ一つのピクセルの色を取得したいんですが、 画像を読み込んでHBITMAPにしてBITMAPにして、 COLORREF color[bitmap.bmWidth][bitmap.bmHeight]; と宣言するとエラーになってしまいます。 具体的には 『定数式が必要です。』や『サイズが 0 の配列を割り当てまたは宣言しようとしました。』です。
- 画像の大きさと2次元配列
C++で ビットマップの一つ一つのピクセルの色を取得したいんですが、 画像を読み込んでHBITMAPにしてBITMAPにして、 COLORREF color[bitmap.bmWidth][bitmap.bmHeight]; と宣言するとエラーになってしまいます。 具体的には 『定数式が必要です。』や『サイズが 0 の配列を割り当てまたは宣言しようとしました。』です。