Quantcast
Channel: OKWAVE 閲覧数の多い質問(C・C++・C#/250)【本日】
Viewing all 50953 articles
Browse latest View live

多重定義が起きている?--lnk2005エラー:VC++

$
0
0
今つまずいている問題は、VC++2008環境下で、以下のような構造になっているプログラムにおいて、多重定義?されているのでコンパイルが通らないというものです。 ソースコードを載せることは大きすぎてできないので、問題となる部分の記述のみ抽出して書きます。 -------define.h---------- ・・・・(module.h内の関数に使われる型の定義など) --------------------------- -------module.h---------- #include "define.h" void mod_1(void){・・・} void mod_2(void){・・・} --------------------------- このように、2つのヘッダーファイルがあり、define.hをインクルードしてmodule.hを使うという構造です。 (一般的ではないようですが、module.h内にmod_1やmod_2の実体を書き込んでいます。) その中で、以下のようなcppソースファイルがあります。 -------Main.cpp---------- #include "module.h"   (他のMain.cpp内の関数の都合上、Main.cppでもmodule.hをインクルードしています。関係あるかもしれないと思い書きました。) int main(){ M(); N(); } ------------------------ -------M.cpp---------- #include "module.h" void M(void){ mod_1(); mod_2(); } ---------------------- -------N.cpp---------- #include "module.h" void N(void){ mod_1(); mod_2(); } ---------------------- とすると、コンパイルの結果は次のようになります。 1>N.obj : error LNK2005: "void __cdecl mod_1(void)" (?mod_1@@YAXXZ) は既に M.obj で定義されています。 1>N.obj : error LNK2005: "void __cdecl mod_2(void)" (?mod_2@@YAXXZ) は既に M.obj で定義されています。 多重定義や多重インクルードは起こしていないと思っていますが、M.cppとN.cpp内の定義が衝突する理由がわかりません。どなたか理由が思いつく方、教えていただけたら幸いです。お願いいたします!! ◆◆◆   ◆◆◆   ◆◆◆   ◆◆◆   ◆◆◆ ちなみに、たとえばMやNとまったく同じ「A.cpp」を作り、このように書いたとします。 -------A.cpp---------- #include "module.h" void A(void){ mod_1(); mod_2(); } ---------------------- そしてmain関数の中に、MやNと同様に『A();』を付け加えたとします。 すると、実行結果はこのようになります。 1>M.obj : error LNK2005: "void __cdecl mod_1(void)" (?mod_1@@YAXXZ) は既に A.obj で定義されています。 1>M.obj : error LNK2005: "void __cdecl mod_2(void)" (?mod_2@@YAXXZ) は既に A.obj で定義されています。 1>N.obj : error LNK2005: "void __cdecl mod_1(void)" (?mod_1@@YAXXZ) は既に A.obj で定義されています。 1>N.obj : error LNK2005: "void __cdecl mod_2(void)" (?mod_2@@YAXXZ) は既に A.obj で定義されています。 VC++はファイル名のアルファベット順にコンパイルするようですが、どちらにせよmain関数内で呼び出されていること以外何の関わりも無いはずのA、M、Nの中での出来事が、衝突する理由が、調べども思い当たりません。 お願いいたします。

リモートデスクトップの接続元IPアドレス

$
0
0
現在Windowsのログオン画面のカスタマイズを検討しております。 で、カスタマイズしたログオン画面がローカルからの起動されたのか リモートデスクトップからの起動かは「GetSystemMetrics(SM_REMOTESESSION)」を 用いて判別できました。 次にリモートデスクトップから起動された場合、接続元のIPアドレスを 判別したいのですが、IPアドレスを取得する方法はあるのでしょうか? 環境:OS=Windows7 Pro    :VisualStudio2005 (VC++ or VB)

テキストデータの読み込みについて

$
0
0
C言語のテキストデータの読み込みについてです。 C言語のプログラムについてです。 2444,1114,2807, 1984,2845,2086, 658.1,-1564.0,1239.7, -102.0,958.4,123.1, 12.7,6.0,82.7 2439,1110,2802, 1973,2865,2108, 658.8,-1563.7,1239.6, -102.0,957.1,121.9, 12.8,6.0,82.7 2441,1106,2806, 1967,2888,2124, 659.4,-1563.5,1239.5, -102.2,956.4,121.0, 12.8,6.1,82.8 2440,1109,2808, 1964,2896,2127, 660.0,-1563.3,1239.4, -102.7,956.2,120.7, 12.8,6.1,82.8 2441,1112,2807, 1981,2894,2120, 660.6,-1563.0,1239.4, -103.3,956.2,120.1, 12.8,6.1,82.8                                       ↑ 上の様なカンマとスペースで15個に区切られているtxtファイルがあるのですが、このtxtデータの10コ目と11コ目をを計算で使いたく、取り出したいと考えているのですがscanfを使いどのように取り出すことが出来るのか、また取り出したデータから数値を引くことを教えて頂きたいです。 つまり -102.0   958.4 -102.0   957.1 -102.2 と 956.4 -102.7   956.2 -103.3   956.2,             を取り出して計算に使いたいです。 そして1番上の数値だと、 -102.0と958.4 を読み込み、例えばそれぞれ100を引いた値を配列に入れたいです。 -102.0と958.4 → -202.0 と 858.4 のように取り出したいです。 教えて頂きたいです。お願いします。

マージソートの計算量について-O(n*logn)

$
0
0
マージソートの計算量はO(n*logn)ですが、なぜそうなのかが理解出来ません。要素数が2, 4, 8, 16, 32, 64...と増加すると二分割するのにかかる時間は1, 2, 3, 4, 5, 6..となり、n=2^x, x=lognとなるところまでは理解出来ました。しかし更にnをかける必要があるのはどうしてでしょうか。要素数が1になるまで分割した後に、小さい順番に比較しながら統合して行く作業があり、これにも当然ランニングタイムがかかるのはわかりますがなぜこの要素の比較コスト?が*nなのでしょうか。 またウェブで調べると、他にもT(n)=2T(2/n)+O(n)という別の説明もあり、こちらも理解出来ません。この説明は上の説明とはまた別の角度から説明しているものなのでしょうか。わかる人がいたら教えて下さい。

[C言語]三目並べ

$
0
0
三目並べのプログラムで、以下のようなコンピュータの思考ルーチンを作っている所なのですが、 /* 後手で先手に初めに真ん中に置かれたら角に置く */ /* 後手で先手に初めに角に置かれたら真ん中に置く */ この二つがうまくいかないようで困っています。どこか間違っているのでしょうか? void com( char te ) { int total,kado,aite,a,tate,yoko,ok = 0; /* 0 = 空 te = 1(○) → aite = 2(×) 1 = ○ te = 2(×) → aite = 1(○) 2 = × */ /* 勝てる場所を探す */ for ( tate = 0; tate < 3; tate++ ) { /* 横一列 */ if( brd[tate][0] == 0 && brd[tate][1] == te && brd[tate][2] == te ) { brd[tate][0] = te; return; } if( brd[tate][0] == te && brd[tate][1] == 0 && brd[tate][2] == te ) { brd[tate][1] = te; return; } if( brd[tate][0] == te && brd[tate][1] == te && brd[tate][2] == 0 ) { brd[tate][2] = te; return; } } for ( yoko = 0; yoko < 3; yoko++ ) { /* 縦一列 */ if( brd[0][yoko] == 0 && brd[1][yoko] == te && brd[2][yoko] == te ) { brd[0][yoko] = te; return; } if( brd[0][yoko] == te && brd[1][yoko] == 0 && brd[2][yoko] == te ) { brd[1][yoko] = te; return; } if( brd[0][yoko] == te && brd[1][yoko] == te && brd[2][yoko] == 0 ) { brd[2][yoko] = te; return; } } if( brd[0][0] == 0 && brd[1][1] == te && brd[2][2] == te ) { /* 斜め1 */ brd[0][0] = te; return; } if( brd[0][0] == te && brd[1][1] == 0 && brd[2][2] == te ) { brd[1][1] = te; return; } if( brd[0][0] == te && brd[1][1] == te && brd[2][2] == 0 ) { brd[2][2] = te; return; } if( brd[0][2] == 0 && brd[1][1] == te && brd[2][0] == te) { /* 斜め2 */ brd[0][2] = te; return; } if( brd[0][2] == te && brd[1][1] == 0 && brd[2][0] == te) { brd[1][1] = te; return; } if( brd[0][2] == te && brd[1][1] == te && brd[2][0] == 0) { brd[2][0] = te; return; } /* 相手の勝ちを阻止する */ aite = te % 2 + 1; for ( tate = 0; tate < 3; tate++ ) { /* 横一列 */ if( brd[tate][0] == 0 && brd[tate][1] == aite && brd[tate][2] == aite){ brd[tate][0] = te; return; } if( brd[tate][0] == aite && brd[tate][1] == 0 && brd[tate][2] == aite){ brd[tate][1] = te; return; } if( brd[tate][0] == aite && brd[tate][1] == aite && brd[tate][2] == 0){ brd[tate][2] = te; return; } } for ( yoko = 0; yoko < 3; yoko++ ) { /* 縦一列 */ if( brd[0][yoko] == 0 && brd[1][yoko] == aite && brd[2][yoko] == aite){ brd[0][yoko] = te; return; } if( brd[0][yoko] == aite && brd[1][yoko] == 0 && brd[2][yoko] == aite){ brd[1][yoko] = te; return; } if( brd[0][yoko] == aite && brd[1][yoko] == aite && brd[2][yoko] == 0){ brd[2][yoko] = te; return; } } if( brd[0][0] == 0 && brd[1][1] == aite && brd[2][2] == aite){ /* 斜め1 */ brd[0][0] = te; return; } if( brd[0][0] == aite && brd[1][1] == 0 && brd[2][2] == aite ) { brd[1][1] = te; return; } if( brd[0][0] == aite && brd[1][1] == aite && brd[2][2] == 0 ) { brd[2][2] = te; return; } if( brd[0][2] == 0 && brd[1][1] == aite && brd[2][0] == aite){ /* 斜め2 */ brd[0][2] = te; return; } if( brd[0][2] == aite && brd[1][1] == 0 && brd[2][0] == aite) { brd[1][1] = te; return; } if( brd[0][2] == aite && brd[1][1] == aite && brd[2][0] == 0) { brd[2][0] = te; return; } /* 後手で先手に初めに角に置かれたら真ん中に置く */ if ( te == 2 ) { for ( a = 0; a < 9; a++ ) { total += brd[a/3][a%3]; } kado = brd[0][0] + brd[0][2] + brd[2][0] + brd[2][2]; if ( total == 1 && kado ==1){ brd[1][1] = te; return; } } /* 後手で先手に初めに真ん中に置かれたら角に置く */ if ( te == 2 ) { for ( a = 0; a < 9; a++ ) { total += brd[a/3][a%3]; } if ( total == 1 && brd[1][1] == aite){ brd[0][0] = te; return; } } /* ランダム */ srandomdev(); do { a = random() % 9; tate = a/3; yoko = a%3; if ( brd[tate][yoko] == 0 ) { ok = 1; } } while ( ok == 0 ); /* 盤面に書き込み */ brd[tate][yoko] = te; }

エラーがどこかわからない

$
0
0
#include<stdio.h> #include<math.h> #define NUM 100000 int main(void){ int prime[NUM+1],i,j,Limit; for(i=2;i<=NUM;i++){ prime[i]=1; } Limit=(int)sqrt(NUM); for(i=2;i<=Limit;i++){ if(prime[i]==1){ for(j=2*i;j<=NUM;j+=i){ prime[j]=0; } } } for ( i=2;i<=NUM;i++) {  if (prime[i]){    printf("%d\n",i); } } }  これは100000未満の素数の総数を求めるプログラムなんですが、実行したらエラーが出てくるんです。何度も確認しても正しいはずなんですがエラー出てきて困っています。どこが間違っているでしょうか?

開始と終了を指定して、その間の日付を取得したい。

$
0
0
開始と終了を指定して、その間の日付を取得したい。 C#(VS2008)環境です。 開始日と終了日を指定して、日付のリスト(できれば曜日を含む)が 戻ってくるようなメソッドを作りたいと思っています。 単純に、今月の1日から20日まで、とかならループして作れそうに 思うんですが。 たとえば、2010/02/20を開始、2010/03/20を終了とするような、 月をまたぐような場合にどうしよう…と悩んでいます。 (2010/02/20、2010/02/21、2010/02/22…というようなリストがほしい) アドバイスいただけないでしょうか。

Linux バイナリ実行できない "cannot execute binary file”

$
0
0
表記ですが、Linuxサーバーに対して、Windowsクライアントから XWin環境にてユーザー"hoge"でログインを行い、 そのサーバー上でターミナルを立ち上げ /usr/local/gcc_work というフォルダを作り、その中で ---ここからーーー #include <stdio.h> int main(void) { printf("Hello,world\n"); return 1; } ーーーここまでーーー のような、hello.cを作成し、 $ gcc -c hello.c -o hello でバイナリを作成し $ ./hello とすると bash: ./hello: cannot execute binary file とのメッセージが出ます。 パーミッションの問題かと思いましたが、 [hoge@localhost gcc_work]$ ls -l 合計 8 -rwxrwxr-x 1 hoge hoge 876 5月 6 18:14 hello -rwxrwxr-x 1 hoge hoge 83 5月 6 18:13 hello.c のようになっていて、問題なく感じています。 スーパーユーザになって再度コンパイルしても同じでした。 くだらないところで躓いているのかもしれませんが、お気づきあらば 教授願います。

【VC++6.0(MFC)】CString型の変数から数字部分を取り出すには?

$
0
0
いつも大変お世話になっています。 VC初心者です。 現在、VC++6.0(MFC)でコーディングしております。 早速ですが、有識者の方がいらっしゃいましたら ご教授頂きたくお願いします。 ===質問=== CString型変数に以下のような数値を含む文字列から 数値部分だけを取り出すにはどうやってソースを 組めば宜しいでしょうか? ===例01=== CString cs1 = "2009年7月29日"; この文字列から "2009","7","29"を取得したい ===例02=== CString cs2 = "AM10:00:00 -0.4℃"; この文字列から "10","0","0","-0.4"を取得したい 以上、よろしくお願いします。

構造体のデータを丸ごとコピーしたい

$
0
0
C言語の構造体の勉強をしています。 構造体のデータを丸ごとコピーしたいのですが、今までは下記プログラムの★1の方法で1つ1つやっていました。 しかし変数が増えてきたのでできれば一度にコピーをしたいのですが、★2の方法では場合によってはゴミが含まれてしまいます。 そこで★3の方法で試すと今のところコピーできたのですが、これは安全なのでしょうか? ご存知の方がおられればお願いします。 また、もっといい方法があればご伝授いただけると助かります。 #include <stdio.h> #include <string.h> struct Sample{  int val1;  int val2; }; void test(Sample *p, int num){  Sample d;  switch(num){  case 1: //★1   d.val1 = p->val1;   d.val2 = p->val2;  break;  case 2: //★2   memcpy(&d, p, sizeof(Sample));   break;  case 3: //★3   d = *p;   break;  }  printf("val1:%d, val2:%d\n", d.val1, d.val2); } int main(){  Sample s;  s.val1 = 1;  s.val2 = 2;  test(&s, 1);  return 0; }

バイナリデータをテキストデータに変換

$
0
0
生データ(バイナリデータ)をテキストデータに変換するプログラムを教えてください。

モニタの電源がオフであるかどうか(Windows)

$
0
0
マウス・キーボード操作が指定時間なければ、モニタ(ビデオカード出力)をオフにするソフトを作っています。 (ゲームや動画鑑賞中でも強制的に) モニタをオフにするときに以下を実行しています。 PostMessage(-1, 274, 61808, 2) 現在マウスの座標を前回取得した値と比較して、変わっていたらカウントをリセットします。 またはGetAsyncKeyStateで押されたキーがあったらリセットします。 キーの方は、ときどき見知らぬキー番号が押されっぱなしになったりと困っているのですが、今回はこちらは置いておいておきます。 マウス座標は1秒間隔でチェックしているので、1秒以内に動いて元の位置に戻ってしまったとき、モニタのオフは解除されるのにもかかわらず、カウントをリセットできません。 かといって、これ以上間隔を狭めてバックグラウンド動作が重くなるのも困ります。 そこで、モニタオフのカウントに到達した以降、数分ごとにPostMessageを送り続けるということをやって、何らかの原因でモニタがウェイクアップしても、定期的に再度モニタをオフにするようなことをやっています。 また、キーでもマウスでもなく、別のアプリケーションがウェイクアップしてしまうこともあるようで、マウスチェック間隔やキー押しっぱなし問題が解決しても、定期的にモニタをオフにし続ける動作は必要だと思っています。 ここからが今回の問題でして、モニタがオフであるにもかかわらずPostMessageを送ってしまうと、次にマウスを動かしてモニタをウェイクアップさせても、なぜかすぐにオフになってしまう場合があります。 これを避けるために、PostMessageを送る前に、ちゃんとモニタがオンになっているかどうかを確認する方法を探しています。 環境はWindows XPと7です。 C・C++のカテゴリに書きましたが、実際の開発環境はVB6です。 なので、できればAPI関数かActiveXが知りたいですが、DLLでラップできればMFCなどでもかまいません。 しかし、VB6なのでウィンドウメッセージコールバックやCLI/.NETは扱えません。

同じソリューション内の別のプロジェクトのメソッド呼び出し

$
0
0
同じソリューション内の別のプロジェクトのメソッド呼び出し お世話になっております。 Visual Studio でC#で開発をしております。 初心者です。 同じソリューション内にある別のプロジェクトのメソッドを呼び出す方法は どの様にしたら宜しいのでしょうか。 下記の様に記述しましたら、 「静的でないフィールド、メソッド、またはプロパティ ~省略~ で、  オブジェクト参照が必要です」と言うエラーが出てしまいます。 何か根本的に間違っているのかも知れません。 何卒、ご教授頂きたく宜しくお願い致します。         記 呼び出し側 private void button1_Click(object sender, EventArgs e) {   呼び出し先のプロジェクト名.クラス名.メソッド名();  } 呼び出される側 namespace プロジェクト名 { public class クラス名 {    メソッド名()    {      処理内容     }   }  }

CFileDialogでフォルダだけを選択させる

$
0
0
 いままで組込みを中心にC/C++で業務を行ってきました。  今回、Windows7 SP1上でVC++ 2008のMFC環境で動作するツールを作成することになり  仕様としてCFileDialogなどのファイル選択画面でファイルではなく、フォルダのみを選択させるようにすることができないかと質問されましたが可能でしょうか?  あるいは別の方法があるでしょうか?

画像ファイルの幅と高さを取りたい。

$
0
0
C Sharp、.Net 2.0の環境で開発しています。 using (System.IO.FileStream fs = new FileStream(filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read)) { imagew = System.Drawing.Image.FromStream(fs).Width; //横幅 imageh = System.Drawing.Image.FromStream(fs).Height; //高さ } ※filePathに画像のパスを入れてます。 上記で画像ファイル(すべてjpg)の縦横の高さを取得しているのですが、 ファイルが大量にあると途中でOutOfMemoryExceptionが発生してしまい 困っています。 メモリ不足にならない、何か別のやり方があればご教授いただけないでしょうか。 宜しくお願いいたします。

WinSock32のTCP通信において、recvする前にどれだけの量がソケットにたまっているか調べる方法ってありますか?

$
0
0
タイトルのとおりなのですが、 WinSock32のTCP通信において、recvする前にどれだけの量がソケットにたまっているかを調べたいのですが、方法が見つかりません。 WinSock32の関数に用意されているのでしょうか? 関数名だけでもいいので教えていただけると助かります。 よろしくお願いいたします

マンセル⇔XYZ,RGB変換式或いは対応表

$
0
0
現在、リニアRGB、sRGB、Lab、XYZ、マンセルの表色系の 相互変換ソフトを制作しております。 マンセル以外の表色系については変換は成功いたしました。 しかし、マンセルとの変換については未だ成功しておりません。 マンセル⇔XYZ、RGB、Labの変換方法をご存知の方はお教えください。 できれば変換式の方が好ましいのですが、対応表でも構いません。 対応表の場合は、 マンセルにおける色差と他表色系の色差を埋める補間式も ご教授くだされば幸いです。

C言語で五目並べを作成しているのですが…

$
0
0
学校のC言語の授業で5×5マスの五目並べを作っています。 教科書を見ながら、がんばっていましたが行き詰ってしまったので、ヒントを下さい。 基本的なことしか習っていないので、あまり高度なことはできません。 行き詰った点 ・すでに置かれているマスには置けないようにすること。 ・縦、横、斜めのどれか5マス揃うと、勝利と表示されてゲームが終 了すること。 ・引き分けの表示の仕方 面倒とは思いますが、どうかよろしくお願いします。 ↓CPPファイル ttp://sugar310.dip.jp/cgi/upload/source/up21525.jpg ttp://sugar310.dip.jp/cgi/upload/source/up21527.zip

インスタンス参照でアクセスできない。代わりに型名?

$
0
0
画面上に、 名前を入力するTextBoxがひとつと、 顧客情報を入力するDataGridViewがひとつあり、 そのDataGridViewには、連番、名前、メールアドレスの3列, 20行のデータがあります。 この2つのコントロールから入力されたデータをDBに登録したり、 DBから読み込んだ値を表示しようとしています。 (ほかにもいろいろ処理するのですが。) データを一時的に保持しておくクラスを作ろうと考え、 わざわざインスタンスを作るまでもないと思ったので、 staic public なメンバを使用して、 以下のようなクラスを作ってみました。   class Data {    public class Customer    {     static public int no = 0;     static public string name = "";     static public string mailAddr = "";    }    static public string name = "";    static public Customer[] customers = new Customer[20];   } ところが、たとえば、   customers[0].no = 1; のようにしようとすると、   「インスタンス参照でメンバー 'Data.Customer.no' にアクセスできません。代わりに型名を使用してください。」 となります。 どういう意味でしょう? また、どうすれば static public の配列を持てるでしょうか? (そもそもこういうやりかたはしない?) よろしくお願いします。

Arduinoのプログラムのループ文

$
0
0
ESP-wroom-32のプログラムを勉強している時にループ文について気になることがあったのですが、 void mqttLoop() { Serial.print("mqttLoop() area01: "); if (!mqttClient.connected()) { connectAWSIoT(); } mqttClient.loop(); long now = millis(); if (now - lastMsg > 2000) { lastMsg = now; ++value; snprintf (msg, 75, "hello world #%ld", value); Serial.print("Publish message: "); Serial.println(msg); //mqttClient.publish("msg/comment", msg); Serial.print("mqttLoop() area02: "); } } void loop() { mqttLoop(); } void loop() という関数を宣言して、それをmqttLoop() 関数内で ”mqttClient.loop();” これを置くと、mqttLoop関数が無限ループ状態になっているのですが、これはArduinoの無限ループの特殊なやり方なのでしょうか? 自分がやっているC言語の無限ループだと while(1){.........} これが普通のやり方だと思うのですが、どうぞご教示の程よろしくお願い致します。
Viewing all 50953 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>