トップページ⇒tech
1001コメント288KB

【初心者歓迎】C/C++室 Ver.13【環境依存OK】

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。

【歴代スレ】
1:http://pc5.2ch.net/tech/kako/1059/10590/1059041347.html
2:http://pc5.2ch.net/tech/kako/1067/10671/1067189450.html
3:http://pc2.2ch.net/test/read.cgi/tech/1069719929/ (消滅?)
4:http://pc2.2ch.net/test/read.cgi/tech/1073473867/ (消滅?)
5:http://pc5.2ch.net/test/read.cgi/tech/1077102238/ (dat落ち)
6:http://pc5.2ch.net/test/read.cgi/tech/1082182233/(dat落ち)
7:http://pc5.2ch.net/test/read.cgi/tech/1086373839/(dat落ち)
8:http://pc5.2ch.net/test/read.cgi/tech/1091264964/(dat落ち)
9:http://pc5.2ch.net/test/read.cgi/tech/1094494997/l50
10:http://pc5.2ch.net/test/read.cgi/tech/1097416187/
11:http://pc5.2ch.net/test/read.cgi/tech/1099190154/
12:http://pc5.2ch.net/test/read.cgi/tech/1101100031/
【ラウンジ】質問、回答が長い時はココを使うと見やすい
http://do.sakura.ne.jp/%7Ejunkroom/cgi-bin/megabbs/lounge/index.html

関連スレは>>2-5ぐらい
0446デフォルトの名無しさん05/01/27 21:22:17
>>445
NT系ではエスケープシーケンスは使えない。
0447デフォルトの名無しさん05/01/27 21:34:02
GetProcAddressに自モジュールハンドルを渡して文字列経由で関数呼び出しをしたいのですがリンク時に
エントリポイント '_mainCRTStartup' は 12 バイトの引数を持つ __stdcall ではありません。イメージは動作しない可能性があります
と警告が出て実行すると有効なWin32アプリでないといわれてしまいます. リンクオプションに/DEF:"test.def"を追加しています.
EXPORTS mainCRTStartupを加えてみたり__stdcallをmainCRTStartupの宣言に加えてみたりしたのですがだめでした
以下ソースコードです
#include <windows.h>
#include <iostream>
typedef void (*func_t)();
void Hello()
{
  std::cout << "Hello" << std::endl;
}
int main()
{
  HMODULE this_exe = GetModuleHandle(NULL);
  func_t hello= (func_t)GetProcAddress(this_exe,"Hello");
  hello();
  return 0;
}
以下test.defです
LIBRARY test
VERSION 1.0
EXPORTS Hello

ttp://hp.vector.co.jp/authors/VA023539/tips/dll/006.htmにdefファイルを作れば__declspec(dllexport)がいらないと
書いてあったのでできるだけdefファイルを使いたいです
0448デフォルトの名無しさん05/01/27 21:41:37
>>447
「_mainCRTStartup' は 12 バイトの引数を持つ __stdcall ではありません。」
というのはつまり普通のDLLだとDllMainを呼ぶべきところがEXEファイルだと
DllMainにあたる関数が_mainCRTStartupであり、_mainCRTStartupは引数を1つも取らないから変なことになる。

ちゃんとDLL作って試せ。
044944505/01/27 22:11:13
>>446
うーむ、そうですか。初心者としてこの機能が使えないのは痛い・・・
重ねてすみませんが、代替機能(画面消去・カーソル移動)などありますか?

0450デフォルトの名無しさん05/01/27 22:29:28
http://afterbeatclub.hp.infoseek.co.jp/frame.html
広めて下さいorz
0451デフォルトの名無しさん05/01/27 22:39:41
>>449
共にありません。
0452デフォルトの名無しさん05/01/27 22:40:24
450:デフォルトの名無しさん:05/01/27 22:29:28
http://afterbeatclub.hp.infoseek.co.jp/frame.html
広めて下さいorz
0453デフォルトの名無しさん05/01/27 22:42:06
452:デフォルトの名無しさん:05/01/27 22:40:24
450:デフォルトの名無しさん:05/01/27 22:29:28
http://afterbeatclub.hp.infoseek.co.jp/frame.html
広めて下さいorz
045444705/01/27 22:48:18
exeとは別にdllを作りexeからdllを呼び出し成功しました.
確かにdefファイルを使えば__declspec(dllexport)をつけてない関数をよびだせました.
文字列経由で関数呼び出しの件なのですがとりあえずdefファイルをあきらめ
extern "C" __declspec(dllexport) void Hello(){...}としたら自exeの関数を呼び出せました
しかしdefファイルをリンクオプションに付け加えると448さんの言うとおりDllMain( 12 バイトの引数を持つ __stdcall)が
ないため起動不可のexeになってしまいます.えせDllMainをつけても実行されませんでした.
defファイルはdllを作るときにしか使ってはいけないのでしょうか
defファイルを使いつつエントリポイントをmainCRTStartupにしても呼び出せる方法はありますか?
0455デフォルトの名無しさん05/01/27 23:24:41
>>454
test.defの
 LIBRARY test
がいらない。

参考
http://www.microsoft.com/japan/developer/library/vccore/_core_library.htm
045644705/01/27 23:46:40
おお 動きました. ありがとうございました
0457デフォルトの名無しさん05/01/28 01:32:28
急に悪いんだけど、おまいらアイコン作るときどんなツール使ってる?
普通にVC?それともなんか別のツール使ってる?
何かお勧めのツールあったら教えてくれ
0458デフォルトの名無しさん05/01/28 01:55:59
D-Pixedにico出力フィルタ入れて使ってる
0459デフォルトの名無しさん05/01/28 02:12:27
テキストエディタで書いて、IrfanViewで表示してCopy&Paste
0460デフォルトの名無しさん05/01/28 04:00:08
他のプログラムからコンソールに出力される文字列を、自作プログラム中の変数に入れるには
どうすればいいですか?
0461デフォルトの名無しさん05/01/28 04:48:56
パイプでいいのでは?
A>B

0462デフォルトの名無しさん05/01/28 05:23:14
>461
すみません、書き方が悪かったです。
サーバプログラムAがあって、AからはSTDOUTにログが出力されます。
Aから出力されるログを、リアルタイムに自作プログラムBで受け取るということを行いたいのですが
無理でしょうか?
0463デフォルトの名無しさん05/01/28 05:25:17
パイプでいいのでは?
A>B
0464デフォルトの名無しさん05/01/28 05:26:23
間違った。
A|B
0465デフォルトの名無しさん05/01/28 05:38:10
>462
パイプについて調べてみます。ありがとうございました
0466デフォルトの名無しさん05/01/28 09:38:16
STLのvectorからchar*に変換したいんですが、どうすればいいんでしょうか。
vectorの内容をchar*の外部ライブラリの関数に渡したいんです。
0467デフォルトの名無しさん05/01/28 09:39:09
vectorの型は何ですか?
vector<T>のT
0468デフォルトの名無しさん05/01/28 09:50:19
>>449
あるよ。
コンソールAPIで調べれ。
GetConsoleなんとか、SetConsoleなんとか。
0469デフォルトの名無しさん05/01/28 09:52:05
>>467
froat*です。
どうもすいません。
0470デフォルトの名無しさん05/01/28 09:52:59
>>469
プログラムやめろ
047146605/01/28 09:53:44
>>467
char型です。
0472デフォルトの名無しさん05/01/28 09:54:41
>>471
&vec[0]
0473デフォルトの名無しさん05/01/28 09:56:44
Null-terminated じゃないっしょ
0474デフォルトの名無しさん05/01/28 09:58:23
push_back('\0');


&vec[0]


pop_back();

047546605/01/28 10:00:16
なるほど!
ありがとうございました。
0476デフォルトの名無しさん05/01/28 11:07:12
そういう真似が必要となる状況について詳しく
0477デフォルトの名無しさん05/01/28 11:54:16
全部で、3000個程の小数を書き込んだ(1行ずつ改行した)、
テキストファイルから、最大値を求めたいです。
ネットで、「n個の最大値を入力して求める」プログラムを見つけましたが、
とても3000個は入力できません。
どうか、そのプログラムを教えて下さい。
0478デフォルトの名無しさん05/01/28 12:01:31
しかもマルチだったか
0479秘密K殺隊員8号05/01/28 12:09:08
>477
無断多重投稿の現行犯で逮捕する!
0480デフォルトの名無しさん05/01/28 12:15:14
>>479
申し訳ありませんでした。
掲示板の決まりを知りませんでした。
別の所で、「宿題」のスレッドに書くように
教わったので、今からそちらに書かせていただきます。
失礼しました。
0481デフォルトの名無しさん05/01/28 12:21:41
>>460
環境によってやりかた変わるんだけど。
0482デフォルトの名無しさん05/01/28 15:52:10
ヌルポインター!
0483デフォルトの名無しさん05/01/28 16:54:26
ガッインター!
0484デフォルトの名無しさん05/01/28 23:48:55
ロングダブル!
0485デフォルトの名無しさん05/01/29 03:57:49
セミダブル!
0486デフォルトの名無しさん05/01/29 04:42:45
アンサイントイント!
0487デフォルトの名無しさん05/01/29 11:17:42
もしかしてアンサイン「ド」じゃなくてアンサイン「ト」が正しい発音なの?
0488デフォルトの名無しさん05/01/29 12:06:27
>>487
dでいいよ。
0489デフォルトの名無しさん05/01/29 16:18:18
アンサインドダブル!
0490デフォルトの名無しさん05/01/29 16:18:45
ダウト!!!
0491デフォルトの名無しさん05/01/29 20:33:23
谷原「カミングダウト」
0492デフォルトの名無しさん05/01/30 13:58:24
ホクト!
0493デフォルトの名無しさん05/01/30 14:25:27
アンサインドホクト!
0494デフォルトの名無しさん05/01/30 14:32:19
Gackt!
0495デフォルトの名無しさん05/01/30 16:06:47
質問です。VC.Net2003 を使っています。

//myapp.h内に記述
class A
{
public:
static int get_a(){return a;}
private:
static int a;
};

int A::a;

という構成のヘッダを使ってプロジェクトをコンパイルしようとすると、LNK2005(シンボルの重複定義が行われている?)というエラーが発生します。
そこで、#pragma message("INC")とプリプロセッサを記述して、インクルードされた回数を確認したところ、複数回インクルードされているようなのです。
#pragma once/#ifndef myapp_inc~形式も試したのですが、変化がありませんでした。
myapp.hは、他のヘッダファイルからも参照されています。
これは、普通の事なのでしょうか。
入門中なので、正常な範囲なのか、異常なのかがわかりませんorz
よろしくお願いします。
0496デフォルトの名無しさん05/01/30 16:24:05
>>495
int A::a; は定義。定義はプログラム中で一回だけでなければいけない。
この定義が書かれたヘッダを複数のソースファイルでインクルードすると、
定義が繰り返されるので、結果としてエラーになる。
0497デフォルトの名無しさん05/01/30 16:56:14
>>496
ありがとうございます。
#pragma onceや#ifndef~の内側なら問題ないかな、と思っていたのですが、だめだったのですねorz
ということは、class b{static const int b=1;};とかもダメかな、と思って試してみたら、問題なし・・・
つまりは、同じクラス定義はオブジェクト上に複数存在することができて、静的なメンバ変数とかのインスタンスが複数あると、まずいということなのでしょうか・・・
staticなメンバ関数とかは・・・と考えると、泥沼にはまりそうです。
奥が深い...orz
0498デフォルトの名無しさん05/01/30 16:59:11
最近の入門者は、いきなり#pragma onceや#ifndef~なんて使うのか
0499デフォルトの名無しさん05/01/30 17:05:52
>>497
記銘忘れました。>>497は>>495の発言です。

>>498
オライリーのC++クイックリファレンス片手に、Modern C++ Design読んでる程度ですorz
0500デフォルトの名無しさん05/01/30 17:34:36
>>497
static constは整数型のときだけenumや#defineから置き換えられるよう、そういう風にクラス内で初期化できる。
(その場合cppファイルに定義を書く必要はなくなる)
0501デフォルトの名無しさん05/01/30 20:12:15
>>499
きみみたいな優秀な新人がうちにも欲しいよ
0502デフォルトの名無しさん05/01/30 20:22:17
>>501
俺が行ったげる。



やべ、新人でも優秀じゃねえや
0503デフォルトの名無しさん05/01/30 20:27:43
俺はもっと優秀だよ
0504デフォルトの名無しさん05/01/30 22:53:13
>>497
ようするにヘッダファイル内で実体を作っちゃダメ。
型とか関数とかの宣言だけにしとけばいい。
マクロでごまかして変則的な作りにすることはできるけど、
あまりオススメできない。
0505デフォルトの名無しさん05/01/30 23:17:16
そんなあなたに__declspec(selectany)
0506デフォルトの名無しさん05/01/30 23:47:07
質問です。
以下のようなコードを書いたところ、
"構造体または共用体中にサイズが 0 の配列があります。"
とエラーが出ました。
原因はfunc()で宣言された"A<N-1> a;"で、
順次N-1のクラスを展開(?)していくことになり
最終的にN=0のものを展開してint array[0];としてしまうことにあるようです。

template <int N>
class A{
private:
int array[N];
/* 中略 */
public:
/* 中略 */
int func(){
A<N-1> a;

if(N==1)
return0;

/* a使ったなんらかの処理。途中a.func()等の値を使う*/

return hoge;
}
}

テンプレートを使った再帰的な処理をしたかったのですが
なにかよい書き方は無いのでしょうか。
ご教授お願いします。
環境はVC++5.0とg++です。
0507デフォルトの名無しさん05/01/31 00:15:05
>>506
何したいのか今いちわからないけどこんな感じ?
テンプレートの特殊化がコンパイラによっては通らないかも
template <int N>
class A{
private:
int array[N];
/* 中略 */
public:
/* 中略 */
int func(){
cout << N << endl;
A<N-1> a;
/* a使ったなんらかの処理。途中a.func()等の値を使う*/
return a.func ();
}
};
template <>
class A <1>{
private:
int array[1];
/* 中略 */
public:
/* 中略 */
int func(){
cout << "1" << endl;
return 0;
}
};
050849505/01/31 10:04:45
>>500,>>504
ありがとうございます。
多重インクルードの回避の方法があり、それを適用しているにもかかわらず、定義が複数回行われてしまう、ということが不思議でしたが、そういうもんなんだと理解することにします。
コンパイラオプションで、ソースだけ出力、アセンブリだけ〜等をして、解析できるスキルがあればいいんですが、とても・・・orz
C++、奥深いです。
0509デフォルトの名無しさん05/01/31 10:09:25
>>508
プリプロセッサはコンパイラの前段階で実行されるのー にゃんにゃん
0510デフォルトの名無しさん05/01/31 10:16:11
たぶん、というか間違いなく、
#includeによって何が行われるかと、
分割コンパイルというのがどういうものなのかを
正確には理解していない。

アセンブラがどうこう言い出す時点で、極めて先行き不安。
0511デフォルトの名無しさん05/01/31 10:22:37
わー、英雄にゃんにゃんだ!にゃんにゃんが来たからもう安心だー>>509
0512デフォルトの名無しさん05/01/31 10:28:44
>>511
キミたちのプログラミングの平和はボクが守るよー にゃんにゃん
051349505/01/31 10:28:59
>>509-510
includeは単なるテキスト置換で、ルートとなるcppファイルからツリー状にヘッダが展開されてって、結果として得られたクラス定義等がつまってるcpp??をアセンブリに変換して・・
実際のインスタンスは、cppに書いてあるから単一だけど、ヘッダでのクラス定義等は重複しうる。
で、最終的なリンクにおいて、未定義な部分と結合される・・・
って感じで理解してるんですが、だめですかorz
どっかのサイト斜め読みしたうろ覚えな記憶で・・・ あ。
そっか、最終的に結合されるときは、差分だけを結合するわけじゃなくて、機械的な結合だから、ヘッダ内に何らかの実体があると複数回、それが存在することになって・・・・
という脳内補完が降臨したんですが、いいのでしょうか・・・
0514デフォルトの名無しさん05/01/31 10:34:49
--test1.c--
int main() { return 0; }
--test2.c--
int main() { return 0; }

この2つを合わせて実行ファイルを作ろうとするとエラーになる。
それと同じ。
0515デフォルトの名無しさん05/01/31 10:35:19
では問題、
a.hに
void func();
static int a;
と書かれているとして、
a.cpp,は
#include <iostream>
#include "a.h"
int main() {std::cout << a; func(); std::cout << a; return 0;}
b.cppは
#include "a.h"
void func() {a = 1;}
だったとしよう。

さぁどうなる。
0516デフォルトの名無しさん05/01/31 10:44:20
簡単なことをわざわざ難しく考えてなんとかしようとする人を
俗に「センスがない」と言う。

ちょっと前に別スレで
sprintf一発で済むところをstrcatを組み合わせて
ごちゃごちゃやっている人がいたが、それと同じ。
ポインタを難しいものと考える人もこの部類か。

もちろん、「センスのなさ」は
ある程度は「慣れ」でカバーできる。
051749505/01/31 10:47:31
>>515
なんか僕への問題っぽいですね。ありがとうございます。
初期化されてないaが出力されてから、1が出力される・・・・?
0518デフォルトの名無しさん05/01/31 11:21:13
>>517
グローバル変数は、静的かどうかに関わらず0に初期化される。
静的変数は、コンパイル単位ごとにスコープを持つ。
従って、0が出力されてから、0が出力される。

仮にstatic int aではなくてただのint aなら、同じ名前のオブジェクトがそれぞれのコンパイル単位に存在し、
それらがグローバルスコープを持つためにリンケージエラーが起きるはず。
0519デフォルトの名無しさん05/01/31 12:23:54
>>499
そのレベルでModernなんか読んだら大変なことにならないか?
0520デフォルトの名無しさん05/01/31 15:39:12
>>513
>includeは単なるテキスト置換で、ルートとなるcppファイルからツリー状にヘッダが展開されてって、結果として得られたクラス定義等がつまってるcpp??をアセンブリに変換して・・
>実際のインスタンスは、cppに書いてあるから単一だけど、ヘッダでのクラス定義等は重複しうる。
>で、最終的なリンクにおいて、未定義な部分と結合される・・・
>って感じで理解してるんですが、だめですかorz
その理解で大体正しい。
関数や変数の定義は一つの翻訳単位(#includeが処理された後のソースファイルのことね)
にしか存在してはいけない。
一方、型(struct, class, enum, typedef)・inline関数・templateの定義は複数の翻訳単位に
出現しても良い。
例外として>>500が指摘していることがある。

>そっか、最終的に結合されるときは、差分だけを結合するわけじゃなくて、機械的な結合だから、ヘッダ内に何らかの実体があると複数回、それが存在することになって・・・・
>という脳内補完が降臨したんですが、いいのでしょうか・・・
うん。

>>519
あの本はtemplateの知識さえあれば読めるんじゃないか?
0521デフォルトの名無しさん05/01/31 15:53:57
スレちがいな気もするんですが
C、C++とかWindowsプログラミングに出てくるマクロについて詳しく知りたいんですが
どうしたらいいでしょうか?
そもそもマクロが何なのかもわからない状態で、本とか読んでても#define N 100ぐらいしか説明が無いので
行き詰まってます。
0522デフォルトの名無しさん05/01/31 16:00:09
>>521
MSDNやPlatformSDKのドキュメント
それで出てこなければヘッダをgrepしとけ
0523デフォルトの名無しさん05/01/31 16:00:38
そんな程度で良いんじゃない?
0524デフォルトの名無しさん05/01/31 16:01:25
プリプロセッサマクロについて知りたいならまともなC/C++の解説書読め。それで解決する
0525デフォルトの名無しさん05/01/31 16:03:04
>>521
あと、#ifとか#if definedとかと組み合わせて使えれば普通は十分かと。
折れはそれで40年間不便なかった。
0526デフォルトの名無しさん05/01/31 16:32:30
>522-525
即レスありがとうございます。
MSDN読んで足りなかったときは専門書読んでみます。
0527デフォルトの名無しさん05/01/31 16:43:04
メンバ関数ポインタなんですが、
VC++.net2003ではコンパイルして動くみたいなんですが
gcc バージョン 3.4.0だとコンパイルエラーで怒られます。
gccでメンバ関数ポインタは使えないんですか?

#include <iostream>
using namespace std;

class CTest
{
public:
void func();
void funcCall();
};
void CTest::func()
{
void (CTest::*fp)() = funcCall;
(this->*fp)();
}
void CTest::funcCall()
{
cout << "hogehoge" << endl;
}
int main(void)
{
CTest t;
t.func();
return 0;
}
0528デフォルトの名無しさん05/01/31 16:49:16
漏れの脳内コンパイラによると
>void (CTest::*fp)() = funcCall;
ん?何これ意味ワカンネ
だとさ
052950605/01/31 18:45:58
>>507
ありがとうございました。
テンプレートの特殊化というものを知りませんでした。
おかげでひとつ利口になれました。
下はテンプレートの特殊化でぐぐって見つけたページですが
C++って本当に奥が深いのですね・・・
ttp://www.fides.dti.ne.jp/~oka-t/cpp-labyrinth.html
0530デフォルトの名無しさん05/01/31 18:50:53
>>527
自己解決
void (CTest::*fp)() = funcCall; を
void (CTest::*fp)() = &CTest::funcCall;
に変更したらうごきますた。
0531デフォルトの名無しさん05/01/31 19:03:09
>>529
Modern C++ Design
楽しいよ
0532デフォルトの名無しさん05/01/31 19:12:53
>>528
クラス CTest のメンバ関数 (引数なし、戻り値なし) を指すポインタ fp に
funcCall を突っ込む。

…で >>527 よ。
エラーの位置と内容くらいは書こうや。
0533デフォルトの名無しさん05/01/31 21:40:01
ここで出てくる質問の多くって、エラーメッセージ読めば一発で見当がつくようなのが多いんだよな。
……なんでお前らエラーメッセージを読まないんだ!
0534デフォルトの名無しさん05/01/31 21:48:54
>>533
英語だからだろうよw
0535デフォルトの名無しさん05/01/31 22:36:48
いや、初心者なら普通VC++使うからエラーは日本語だろ('A`)
しかしなんなんだろうね。ものすごくナチュラルに無視してるんだと思うけど。
0536デフォルトの名無しさん05/01/31 22:39:14
エラーメッセージを読んでも意味が分からないとか?
0537デフォルトの名無しさん05/02/01 04:10:34
心のフィルタがかかってて目に入らないんだと思う
そういう人はそもそもプログラミングには向いてない
0538デフォルトの名無しさん05/02/01 09:33:58
>>537
フィルタがかかってるのはオマエ
0539デフォルトの名無しさん05/02/01 10:49:08
>>536
慣れないとさっぱり意味判らん、てのはあるだろうね。
それはまあしょうがないにしても、コードだけ見せて
「どこかがおかしい」としか言わないってのは
(初心者かどうかとは関係なく)
人にモノを訊ねる態度じゃないよなぁ、と思う。
0540デフォルトの名無しさん05/02/01 12:17:37
>>538
都合の悪い評価に対して何も言い返せないからって
そんなに頭の悪い切り返しに走らなくても…(^_^:
0541デフォルトの名無しさん05/02/01 12:21:50
>>539
ソースを晒さず「どうしたら良いですか?」よりはまし。

テンプレートがらみのエラーメッセージは
慣れてないとホントに呪文にしか見えんしな。
0542デフォルトの名無しさん05/02/01 12:37:02
すみません、初心者なんですが、何から始めれば良いかわかりません。
何をすればいいのでしょうか?
0543デフォルトの名無しさん05/02/01 12:40:29
>>542
回線切って首釣る
0544デフォルトの名無しさん05/02/01 12:54:05
>>542
コンピャイラをインスツールする。
0545デフォルトの名無しさん05/02/01 15:29:55
アサートとかアサーションってなんなんでしょうか?

論理エラーをチェックする関数らしいんですが
■ このスレッドは過去ログ倉庫に格納されています