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

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2009/02/10(火) 00:25:51
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。

【前スレ】
【初心者歓迎】C/C++室 Ver.63【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1231499251/

【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm

◆ソースのインデントについて
半角やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か に置換しておくことをお勧めします。
0153デフォルトの名無しさん2009/02/21(土) 17:46:34
>>152
超早いレス熱烈感謝あげ
typedef UINT (T::*mem_fn_t)();
が抜けていたんですか
mem_fn_tはstd::mem_fun_t関係のなんかと勝手に妄想してた
0154デフォルトの名無しさん2009/02/21(土) 17:55:31
>>141は医者か
0155150,1522009/02/21(土) 18:25:38
>>150
あいやーーー、俺、mem_fun_tは第一引数で渡すオブジェクトのポンタ
でオブジェクトを指定するっての忘れてたYo,orz
return mf(px); が正解だな

0156デフォルトの名無しさん2009/02/21(土) 18:44:46
C++で可変長引数の関数を作るときは、Cと同じように
#include <stdarg.h>
とやって、
va_list, va_arg
を使えばいいでしょうか?
0157デフォルトの名無しさん2009/02/21(土) 19:06:54
Cと同じでおk
ただし可変長引数の部分に非PODクラスを渡すことはできないから注意な
0158デフォルトの名無しさん2009/02/21(土) 20:25:07
↓がg++4なら通るけどVC9など通らない。
これって自分何か勘違いしてますか?VC9のバグってことはありませんか?

struct MyClass {
int value;
void set_value(int v) { value = v; }
int get_value(void) const { return value; }
};
vector<std::tr1::shared_ptr<MyClass> > v;
...vに適当に要素を入れる...
for_each(v.begin(), v.end(),
std::tr1::bind(&MyClass::set_value, std::tr1::placeholders::_1,
std::tr1::bind(&MyClass::get_value, std::tr1::placeholders::_1)));
// bindでintがint&に変えられないというエラー
0159デフォルトの名無しさん2009/02/22(日) 10:48:07
参照変数の初期化の右辺値で三項演算子使うのはマトモな所業の範疇?
0160デフォルトの名無しさん2009/02/22(日) 12:13:57
右辺値じゃなくて右辺だな。
A ? B : C の B と C が両方左辺値なら問題ないし、
const 参照なら右辺値でも問題ない。
0161デフォルトの名無しさん2009/02/22(日) 20:58:16
C++ コーディングスタンダードで、

int n;
if (cond) n = X;
else n = Y;

みたいにするなら、

int n = cond ? X : Y;

のほうがいいって書いてあったよな。
0162デフォルトの名無しさん2009/02/22(日) 21:38:05
cond次第だろ
0163デフォルトの名無しさん2009/02/22(日) 22:39:03
参照だとそもそも if-else が使えないから
? : を使わざるを得ないけどね。
0164デフォルトの名無しさん2009/02/23(月) 00:53:15
int n = Y;
if (cond) n = X;

変数には初期値いれとこうぜ
0165デフォルトの名無しさん2009/02/23(月) 01:06:47
俺のソースは>>161,164のすべてを気分で使い分けて、
ソースを読む人間を翻弄する
0166デフォルトの名無しさん2009/02/23(月) 09:12:42
テンプレートクラスのコンストラクタ引数にその実態クラスのstaticメンバを使用する記述は問題ない?

template<T> class BB{
BB(const T &);
static const T func(T a){retunr a + 1;};
};

int x = 0;
BB<int> i(i.func(x)); // BB<int> i(BB<int>::func(x)); と同じ意味になる筈
0167デフォルトの名無しさん2009/02/23(月) 20:33:23
質問ですが、例えば"net localgroup Administrators GroupX"というコマンドを
C++で実現するにはどうすればいいでしょうか?
一応自分なりに調べましたが、ShellExecute()やCreateProcess()を使うのは
個人的に美しくないかな、、、と思います。
知人に相談したら、vbsで
set objShell = WScript.CreateObject("WScript.Shell")
objShell.Exec "net localhost〜"
ってやればいいんじゃない、とアドバイスを受けましたが、
vbsは全くわかららず、正直、自分でメンテナンスできるとは思えません。
C++のライブラリ関数で実現する方法があったら教授お願いします。

C言語では組み込み系を少しやっていました。
最近、C++でちょっとしたwindows用のプログラムを作ることになりました。
C++は初心者レベルだと思います。
開発環境はwindows XP + Visual studioです。
よろしくお願いします。
0168デフォルトの名無しさん2009/02/23(月) 20:38:57
C++のライブラリにはないから、
APIをたたくしかないな。Win32スレに行ってみたら。
0169デフォルトの名無しさん2009/02/23(月) 20:40:47
>>167
プロセスを起動するのはOSの役割なのでOSのAPIを使う
って頭になれば問題ない
0170デフォルトの名無しさん2009/02/23(月) 20:43:22
>>167
騙されているぞ。
そのVBSのコードはShellExecuteを呼ぶのと同じだ。
0171デフォルトの名無しさん2009/02/23(月) 21:11:43
>>167です。
>>168-170 回答ありがとうございました。
C++のライブラリにはないのですね。
なんとなく、(いないとは思いますが)netコマンドを削除する人がいたら嫌だな
という浅い考えで、ライブラリを使いたいと思っていました。

>>168さんの忠告どおりWin32スレに行こうと思いますが、
もうちょっと自分でWin32を調べてからにしたいと思います。
正直、何をどう質問すればいいのか、というのがわからない状態ですので、、、
(結局、>>169さんの忠告どおり、割り切りそうな気がしますが)
>>170さん そうなんですか。まあ、知人もこっちのほうが簡単だよ、
っていう感じだったので、悪意はなかったと思います

どうもありがとうございました。
0172デフォルトの名無しさん2009/02/23(月) 22:04:01
コンソールアプリケーションで実用的なプログラムってありますか?
C++で学んだことを生かす練習のためにもなにか作りたいのですが・・
0173デフォルトの名無しさん2009/02/23(月) 22:10:57
>>172
コンパイラ&リンカ
0174デフォルトの名無しさん2009/02/23(月) 22:41:03
>>173
ありがとうございます
自分の力じゃ無理そうなのでアルゴリズムから作っていこうと思います
0175デフォルトの名無しさん2009/02/24(火) 10:15:53
圧縮アルゴリズムおもろいよ
0176デフォルトの名無しさん2009/02/24(火) 15:37:21
構造体A(メンバchar a , int b)をsizeofした値を求めろって問題は
5と8どちらを答えるべきなんですかね。
パディングも含めた値が実際の答えなのでしょうか?
0177デフォルトの名無しさん2009/02/24(火) 15:43:08
intのサイズすら環境依存でFA
0178デフォルトの名無しさん2009/02/24(火) 16:17:40
>>176
答えはsizeof( A )だろ
0179デフォルトの名無しさん2009/02/24(火) 19:12:55
>>178
お前まぢ頭いいな
0180デフォルトの名無しさん2009/02/24(火) 19:43:18
('A`)に見えた
0181デフォルトの名無しさん2009/02/24(火) 19:44:54
sizeof に目がなくて
0182デフォルトの名無しさん2009/02/24(火) 20:08:55
sizeof('A`)だと8なのでやはり8が答えみたいですね
ありがとうございました。
0183デフォルトの名無しさん2009/02/24(火) 22:27:13
>>182
俺の環境では5になるんだが
0184デフォルトの名無しさん2009/02/24(火) 23:19:58
>>182 環境依存
#include<stdio.h>

#define MACRO(type) printf("sizeof(%s)=%d\n", #type, sizeof(type))

#pragma pack(push, 1)
struct pack1{
char a;
int b;
};
#pragma pack(pop)

#pragma pack(push, 2)
struct pack2{
char a;
int b;
};
#pragma pack(pop)

#pragma pack(push, 4)
struct pack4{
char a;
int b;
};
#pragma pack(pop)

int main(void){
MACRO(struct pack1);
MACRO(struct pack2);
MACRO(struct pack4);
return 0;
}
0185デフォルトの名無しさん2009/02/25(水) 01:13:18
なんと…
処理系依存なのでどれも正解ということですか!
コードまでご丁寧にありがとうございました。
0186デフォルトの名無しさん2009/02/25(水) 09:51:49
処理系というか、自分で決められるといった方が正しい
0187デフォルトの名無しさん2009/02/25(水) 11:38:22
#include <stdio.h>
#include <string.h>

struct address{
char name[20];
char jusyo[21];
int age;
};

int main(void)
{
struct address abc;

int s = 1;
if(s = 1){
char name[30];
char jusyo[70];
int age;

printf("名前? "); scanf("%s", &name);
printf("住所? "); scanf("%s", &jusyo);
printf("年齢? "); scanf("%d", &age);

abc.age = age;
strcpy(abc.name, jusyo);
}
return(0);
}
C言語を学習しています。
上プログラムでキーボードから日本語を入力し出力させたいのですが、どうすればいいのでしょうか?
Cygwinを使っています。
0188デフォルトの名無しさん2009/02/25(水) 11:47:00
printf使えば良い
0189デフォルトの名無しさん2009/02/25(水) 11:47:45
>>187
やったことないけど
http://pinoki.la.coocan.jp/wiki/?Cygwin%2FInstall%2F%C6%FC%CB%DC%B8%EC%B2%BD
0190デフォルトの名無しさん2009/02/25(水) 12:08:46
>>187
cygwin自体が日本語の入出力をできない状態なら>189へ。
gccのコンパイルオプションについて知りたいならcygwinスレへ。
まぁ、動くかどうかは兎も角scanf()の使い方も間違っているわけだが。
使わないに越したことはないが、scanf("%29s", name)とするのが無難。
0191デフォルトの名無しさん2009/02/25(水) 12:11:18
構造体のメンバとローカル変数の配列サイズが違うじゃん。それは拙いっしょ。
0192デフォルトの名無しさん2009/02/25(水) 15:13:30
1>LINK : warning LNK4098: defaultlib 'LIBCMT' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。
1>libcpmtd.lib(xdebug.obj) : error LNK2019: 未解決の外部シンボル __malloc_dbg が関数 "void * __cdecl operator new(unsigned int,struct std::_DebugHeapTag_t const &,char *,int)" (??2@YAPAXIABU_DebugHeapTag_t@std@@PADH@Z) で参照されました。
1>libcpmtd.lib(xdebug.obj) : error LNK2019: 未解決の外部シンボル __free_dbg が関数 "void __cdecl operator delete(void *,struct std::_DebugHeapTag_t const &,char *,int)" (??3@YAXPAXABU_DebugHeapTag_t@std@@PADH@Z) で参照されました。
1>C:\Documents and Settings\\デスクトップ\Game\ActionGame\/GameAppli\ActionGame.exe : fatal error LNK1120: 外部参照 2 が未解決です。

#include <fstream>

をインクルードすると上記のエラーが出ます

どうすればいいのですか;;
0193デフォルトの名無しさん2009/02/25(水) 15:24:46
プロジェクトのプロパティ→C/C++→コード生成→ランタイムライブラリ
を、どれか正しいものに変更する

なんか他の外部ライブラリ使ってるだろ?
0194デフォルトの名無しさん2009/02/25(水) 15:26:17
デバッグ版とリリース版のオブジェクトが混在しているように見える
いったんすべてのオブジェクトを削除してビルドしなおせばいい

ほかから持ってきたライブラリ結合してるならリンクオプションをそれにあわせる
0195デフォルトの名無しさん2009/02/26(木) 06:44:15
staticメンバ関数を利用するメリットってあるんでしょうか?
01961952009/02/26(木) 06:51:07
すいません
スレ移動します
0197195 ◆Ci3UmwhFqY 2009/02/26(木) 07:18:27
>>196 は他人です
0198デフォルトの名無しさん2009/02/26(木) 10:37:07
何でメリットがないと思ったのか、それが知りたい。
0199デフォルトの名無しさん2009/02/26(木) 12:19:36
つnew, singleton
0200デフォルトの名無しさん2009/02/26(木) 12:23:18
コールバック関数のポインタを取るCスタイルのAPIへなんとかしてクラスを配送したいときに
0201デフォルトの名無しさん2009/02/27(金) 02:01:54
質問です。

class Foo { void Bar(void* ptr); };
void Foo::Bar(void* const ptr) {}

VisualC++2008 にてこの様なクラスを作ったところ、コンパイルエラーも警告も出ずにコンパイルが通りました。
疑問に思ったのは Foo::Bar の引数を、void* から void* const に変えてもエラーが出ない事です。

これは文法的に正しいんでしょうか?それともVC++の独自拡張だったりするんでしょうか。
0202デフォルトの名無しさん2009/02/27(金) 02:10:38
文法的にOK
0203デフォルトの名無しさん2009/02/27(金) 02:21:40
>>201

class Foo { void Bar(int ptr); };
void Foo::Bar(int const ptr) {}

が問題ないのと同じこと。
0204デフォルトの名無しさん2009/02/27(金) 02:51:20
>>202-203
仮引数にconstをつけるのは実装と宣言で違っても文法的に問題無いのですね。
勉強になりました、ありがとうございました。
0205デフォルトの名無しさん2009/02/28(土) 05:09:10
とても基本的なことなのですが、
符号なし整数の変数で与えられた数 N - 1 から 0 まで順番に処理をするループは、どう書くのが一般的ですか。
for (size_t i = N - 1; i >= 0; --i) だとダメですよね。

自分が考えた書き方は、
const size_t N = ...;
for (size_t i = N; i > 0; --i) hoge(i - 1);
for (size_t i = 0; i < N; ++i) hoge(N - i - 1);
for (size_t i = N - 1; i != ~0; --i) hoge(i);
ですが、どれも使われるのでしょうか。
0206デフォルトの名無しさん2009/02/28(土) 05:13:20
size_t i = N;
do { --i; hoge(i); } while (i > 0);
02072062009/02/28(土) 05:14:35
ああ、書いてから気づいたけど >>206 は N が初めから 0 だったらダメだね
0208デフォルトの名無しさん2009/02/28(土) 05:36:00
T i = M; //M = N - 1ということで
do {
hoge(i);
} while (i-- != 0);
これだと、MがT型の最大値でも対応できるはず。
0209デフォルトの名無しさん2009/02/28(土) 06:46:33
>>205
普通に for (size_t i = N - 1; i >= 0; --i) を使ってるけど
size_tを使う理由が分からない
0210デフォルトの名無しさん2009/02/28(土) 08:29:35
>>209
メモリのサイズを意味するときはsize_tを使うようにしてる
64ビット環境だとunsigned long longになるのかな
0211デフォルトの名無しさん2009/02/28(土) 11:52:40
>>209
> i >= 0;

↑は符合無しだと常に真だろ。
0212デフォルトの名無しさん2009/02/28(土) 11:53:48
何か問題でも?
0213デフォルトの名無しさん2009/02/28(土) 11:54:56
for (i = 0; i > N; ++i) {;} // ループ中に前後の値が影響しない場合。
if (N > 0) for (i = N - 1; i >= 0; --i) {;} // ループ中に前後の値が関わってくる場合。
while 系をカウントループに使うのは愚策と考える。
0214デフォルトの名無しさん2009/02/28(土) 12:02:05
>>212
やめられない、とまらない
0215デフォルトの名無しさん2009/02/28(土) 12:33:44
while(N-->0)は普通に使うだろ
--が矢印に見えるから「Nを0にするまで」って視覚的にわかりやすいじゃん
0216デフォルトの名無しさん2009/02/28(土) 12:39:17
その考えはなかった
0217デフォルトの名無しさん2009/02/28(土) 12:43:37
>>215
そんな餌にクマー
まあでも>>205の要求にあってるしシンプルでわかりやすいな
0218デフォルトの名無しさん2009/02/28(土) 13:16:49
>>215
ああ、意外と面白い使い方かも・・・

視覚的にわかり易く書かない場合は
>0は書かなくても大丈夫か
0219デフォルトの名無しさん2009/02/28(土) 14:09:16
有名だろ、それ
0220デフォルトの名無しさん2009/02/28(土) 14:16:21
ぶっちゃけ初めて見た
0221デフォルトの名無しさん2009/02/28(土) 14:20:36
ソース自体は見た事があるような気もするけど、考え方は初めて見た。
0222デフォルトの名無しさん2009/02/28(土) 16:14:42
減少していくのに減少していく方向が空いてるのはなんとなく怖いなぁ
0223デフォルトの名無しさん2009/02/28(土) 17:18:11
>>215
while(N-->0) って見た目が素敵だな
0224デフォルトの名無しさん2009/02/28(土) 17:23:55
AAのプログラム言語とかなら、見た目で分かりやすいかもな・・・
0225デフォルトの名無しさん2009/02/28(土) 17:39:46
befungeのことですね!!
0226デフォルトの名無しさん2009/02/28(土) 17:41:03
面白そうだけど絶対コーディングしにくいな
ほぼ記号だろw
0227デフォルトの名無しさん2009/02/28(土) 20:31:33
さすがショートコーディングスレ。
ためにな・・・って、あれ?
0228デフォルトの名無しさん2009/03/01(日) 18:45:19
繰り返し処理のことを何ていいますか?
専門的にお願いします。
0229デフォルトの名無しさん2009/03/01(日) 18:49:47
反復処理とか繰り返し処理とか
0230デフォルトの名無しさん2009/03/01(日) 20:00:35
繰り返し処理のことを何ていいますか?
専門的にお願いします。
0231デフォルトの名無しさん2009/03/01(日) 20:01:14
反復処理とか繰り返し処理とか
0232デフォルトの名無しさん2009/03/01(日) 20:38:29
>>210
メモリのサイズを入れる型ってsize_t以外になんかなかった?
0233デフォルトの名無しさん2009/03/01(日) 20:50:58
繰り返し処理のことを何ていいますか?
専門的にお願いします。
0234デフォルトの名無しさん2009/03/01(日) 20:55:57
ループ処理じゃね?w
反復も繰り返しだろうけど、お前は違い分からないだろう
0235デフォルトの名無しさん2009/03/01(日) 21:26:00
ぶっちゃけC/C++の話じゃないからスレ違い
0236デフォルトの名無しさん2009/03/01(日) 21:29:11
>>234>>231>>229
もうちょっとかっこいい言い方あるだろ
それを教えろ
0237デフォルトの名無しさん2009/03/01(日) 21:31:09
>>236
死ねハゲ
0238デフォルトの名無しさん2009/03/01(日) 21:31:47
反復処理とか繰り返し処理とか
0239デフォルトの名無しさん2009/03/01(日) 21:47:20
リピート
0240デフォルトの名無しさん2009/03/01(日) 22:14:30
>>228-231
見事な繰り返し処理
>>232は空気嫁
0241デフォルトの名無しさん2009/03/01(日) 22:19:39
>>232
ssize_tとか、でもCでもC++でも標準ではないけど。
0242デフォルトの名無しさん2009/03/01(日) 22:24:27
>>232
ptrdiff_tのこと?ポインタ同士の引き算の型だからちょっと違うが
0243デフォルトの名無しさん2009/03/01(日) 22:34:14
>>241 >>242
そうだな。size_tでよかった。
0244デフォルトの名無しさん2009/03/03(火) 05:50:11
まだ初心者なのですが、batファイルをC++builder6で
ボタンを押したら実行するようにしたいので

ShellExecute(Handle,"open",ファイル名.c_str,NULL,NULL,SW_SHOW);

と書いたのですが、うまくいきません・・・どなたか教えてくださいOTL
0245デフォルトの名無しさん2009/03/03(火) 06:13:52
>>244
何故、どう巧くいかないのか書かないのですか?
0246デフォルトの名無しさん2009/03/03(火) 06:28:56
実行はされるのですが(コマンドプロントが一瞬表示される)
バッチファイルの中身自体が実行されません;;
0247デフォルトの名無しさん2009/03/03(火) 06:39:59
batの最後に

pause

入れとけ
0248デフォルトの名無しさん2009/03/03(火) 07:00:46
>>247
ありがとうございます。

やってみたところ指定されたパスがありませんとのことでした。
普通にbatファイルを起動すると何も問題がないのですが・・・
原因などわからないでしょうか?
0249デフォルトの名無しさん2009/03/03(火) 07:08:14
ファイルパスをちゃんと指定すればいいじゃん・・・
0250デフォルトの名無しさん2009/03/03(火) 07:12:19
できました!
こんな時間に、質問に答えてくださりありがとうございました
大変助かりました。
0251デフォルトの名無しさん2009/03/03(火) 18:34:32
以下のような感じで「*」の前後にスペースが
入っている場合もポインタの宣言なんでしょうか?

static unsigned int * ADDR;

スペースが、後だけのもは参考書にも紹介されていますが
前後両方ともスペースのものは見つかりませんでした。

よろしくお願いいたします。
0252デフォルトの名無しさん2009/03/03(火) 19:01:49
vector<string> * const (&u)[buf]; // こんな感じですか?
■ このスレッドは過去ログ倉庫に格納されています