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

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2005/10/10(月) 00:44:47
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。
【前スレ】
http://pc8.2ch.net/test/read.cgi/tech/1125743714/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0153デフォルトの名無しさん2005/10/11(火) 23:42:05
>>152
thisを渡したら。
0154デフォルトの名無しさん2005/10/11(火) 23:57:30
>>151
明らかにシンタックスエラーじゃないか
どんな糞コンパイラだよ
0155デフォルトの名無しさん2005/10/12(水) 00:03:57
>>151
あとC++じゃ関数の戻り値の型省略できない
0156デフォルトの名無しさん2005/10/12(水) 00:48:50
>>152
もっと冷静に150を読むんだ。

ナゾナゾだ。150のクラス(下の方のヤシな)で、最終的に
スレッドとして実行される関数はどーれだ?
答え: DWORD ThreadProc()。

じゃあもう一つナゾナゾだ。
ThreadProc() の中で、privateな変数は使えないか?
0157デフォルトの名無しさん2005/10/12(水) 01:45:03
何でクラス定義の中でメンバ関数を定義したらインライン化されるのですか?
もしかして基本的に関数の定義より先に関数の宣言をしないと、インライン化されるのですか?
0158デフォルトの名無しさん2005/10/12(水) 01:50:55
>>153
thisを渡してもダメでした
0159デフォルトの名無しさん2005/10/12(水) 01:52:53
>>157
別にインライン化されるとは限らない。
明示的に"inline"指定してもインライン化されるとは限らない。
ただコンパイラに「可能ならそうしてね」とお願いするだけ。
以上は仕様で決まっている話。
0160デフォルトの名無しさん2005/10/12(水) 01:53:11
コンパイラの都合上、インライン化するためにはクラス定義の中に
関数定義するのが一番楽なんじゃないの?
0161デフォルトの名無しさん2005/10/12(水) 01:54:19
>>157
C++なら関数の前に宣言を書かないと規格違反
>何でクラス定義の中でメンバ関数を定義したらインライン化されるのですか?
規格でそう定義されてるから
01621612005/10/12(水) 01:55:00
ああ絶対にじゃないよ
0163デフォルトの名無しさん2005/10/12(水) 01:58:43
157だけどみんなありがとう
0164デフォルトの名無しさん2005/10/12(水) 07:31:22
CreateWindowで作ったボタンを見えなくする方法は?
0165デフォルトの名無しさん2005/10/12(水) 07:32:32
CreateWindowで作ったボタンを見えなくする方法は?
0166デフォルトの名無しさん2005/10/12(水) 07:42:07
>>165
ShowWindow
0167デフォルトの名無しさん2005/10/12(水) 09:33:26
クラスと構造体の違いってアクセス制限できるかどうかでいいんですか?
0168デフォルトの名無しさん2005/10/12(水) 09:36:40
>>167
違う
デフォルトのアクセス制限がpublicとprivateの違いしか、
構造体とクラスにはない。
別に構造体でもアクセス制限はできる。
0169デフォルトの名無しさん2005/10/12(水) 15:00:25
>>168
そういや何で重複機能なのにclassとstructってあるんかな?
クラスのインターフェースたるpublic部分はクラス宣言の最初に来てる方が
見た目に分かりやすいしstructだけでも問題ないと思うんだけど
0170デフォルトの名無しさん2005/10/12(水) 15:07:39
>>169
D&EとARMを嫁
0171デフォルトの名無しさん2005/10/12(水) 15:11:27
>>170
D&Eには書いてなかったと思うが
ARM当たるよ
0172デフォルトの名無しさん2005/10/12(水) 15:58:36
環境に依存しないファイルロック方法はありませんか?
0173デフォルトの名無しさん2005/10/12(水) 16:04:55
ない
01741512005/10/12(水) 18:28:18
>>151です。
>>154
VC++.NET 2003 stdでし
Win32 コンソールにて

勉強してて、ふと思って書いてみたらエラーにならんかったもんで。
と、いうことはVC++は、コンパイラとしてはあまり良くないんですか?
それともVC++は、あまりにバカバカしいエラーなんで、あきれたのか?
0175デフォルトの名無しさん2005/10/12(水) 20:07:24
同じ環境でコンパイルしたら
fatal error C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
こんなエラーでたよ。
01761742005/10/12(水) 20:49:33
>>174-175

えぇ!?なぜ俺だけ?
ファイル−新規作成−プロジェクト−Win32−Win32コンソールプロジェクト
−−アプリケーションの設定−空のプロジェクト
でつくりました。スレ違いなのでこれ以上は書きませんが、なんでだろ?
0177デフォルトの名無しさん2005/10/12(水) 20:58:32
変数や定数の型を調べるにはどうすればいいのですか?
0178デフォルトの名無しさん2005/10/12(水) 21:11:58
>>177
んなこと言ってる時点で設計間違ってる。
RTTIについて勉強汁。
0179デフォルトの名無しさん2005/10/12(水) 21:12:42
>>177
そういうプログラムが必要になる自分の設計能力を疑うのが先。
0180デフォルトの名無しさん2005/10/12(水) 21:16:29
まあ一応やり方だけ。

C++なら
#include <typeinfo>
typeid(なんちゃら).name() で型名が返される、がどう返すかは処理系依存

#include <cstdio>
#include <typeinfo>
#include <string>
using namespace std;

class Hoge{};

int main() {
int i;
const double PI = 3.14159;
Hoge hoge;

printf("%s\n", typeid(i).name());
printf("%s\n", typeid(PI).name());
printf("%s\n", typeid(hoge).name());
printf("%s\n", typeid(string("hoge")).name()); // テンプレートクラスはテンプレートも展開されるのでたいへん

return 0;
}
0181デフォルトの名無しさん2005/10/12(水) 21:30:56
>>177
BOOST TYPEOF
0182デフォルトの名無しさん2005/10/12(水) 22:20:01
>>175
#include <stdafx.h>
後氏ね。
0183デフォルトの名無しさん2005/10/12(水) 23:07:15
>>182
#include "stdafx.h"
0184デフォルトの名無しさん2005/10/13(木) 00:10:43
ちょっと聞きたいんですけど、
  num = r1
if(r2 < num)
num = r2;
else if(r3 < num)
num = r3;
else if(r4 < num)
num = r4;
else if(r5 < num)
num = r5;
else print("hoge %d" , num);

のようなソースがあったとして、
例えばr3までnumが更新されて、r4で条件を満たさなくなった場合
r5 r6 は判定されなくなりますよね?
それをr2からr6まで判定して決めたいんですけど、どのように記述すればいいでしょうか?
0185デフォルトの名無しさん2005/10/13(木) 00:13:40
>>184
無理にif - else if で繋がず、if を繰り返すだけで医院で内科医?
0186デフォルトの名無しさん2005/10/13(木) 00:13:55
>>184
意味が分からん、とりあえずr1~r5の大小関係を書け
0187デフォルトの名無しさん2005/10/13(木) 00:17:36
r1からr6の最小値を求めるってことでいいのか?
0188デフォルトの名無しさん2005/10/13(木) 00:18:03
>>184
そのコードだとr2<numがtrueと判定された時点でr3からr5は判定されない
全部判定させたいなら>>185
01891842005/10/13(木) 00:41:16
>>185 >>188
ちょっとやってみます

>>186
r1〜r6はこの上で入力データーから計算で出すんですが
サンプルで順に(r1 r2 ・・・)
1100 850 850 1100 400 900
※このソースだとr2が出力されます。でもr5が欲しいです。

>>187
そういうことです。
0190デフォルトの名無しさん2005/10/13(木) 00:54:22
>>189
最小値なら、こうすりゃいいんじゃまいか?

int min = r1;
if (r2 < min) min = r2;
if (r3 < min) min = r3;
略
if (r6 < min) min = r6;

r1〜r6が配列にでも入っててくれればもっとすっきりした実装できるんだがな
01911842005/10/13(木) 01:04:44
物事はそう単純じゃないって気づきました。
実は問題を読み違えてて・・・
最少数も出力しなきゃなりません。(;´Д`)
num = r1;
if(r2 < num) {
num = r2;
printf("hoge2 %d", num);
}
if(r3 < num){
num = r3;
printf("hoge3 %d", num);
}
if(r4 < num) {
num = r4;
printf("hoge4 %d", num);
}
if(r5 < num) {
num = r5;
printf("hoge5 %d", num);
}
if(r6 < num) {
num = r6;
printf("hoge6 %d", num);
} else printf("hoge1 %d", num);
としたんですが、今度は条件を満たしたところすべてが出力されてしまいます・・。
しかもr1〜r6でprintfの内容が異なります。
どうすればいいでしょう・・・
01921842005/10/13(木) 01:07:41
>>190
すいません、配列までまだ進んでません・・・。
0193デフォルトの名無しさん2005/10/13(木) 01:14:00
>>191
struct min{
int num;
int name;
} min;

min.num = r1;
min.name = 1;

if (r2 < min.num) {
min.num = r2;
min.name = 2;
}
if (r3 < min.num) {
min.num = r3;
min.name = 3;
}
略
if (r6 < min.num) {
min.num = r6;
min.name = 6;
}

printf("hoge%d %d\n", min.name, min.num);

書いてから気づいたが、配列がまだなら当然構造体なんてやってないよな・・・
その場合は最初のstructで始まるブロック消して
int num, name;追加して、min.num, min.nameをそれぞれnum, nameに置換してくれ
01941842005/10/13(木) 01:25:18
多分、俺が悪いんですけど
hoge1、hoge2とかはたまたま例として書いただけで数字を変えればいいって内容じゃないんです・・・。
個別にあります・・。それでelse ifを考えたんですけど>>184のザマです。
ループですみません;
0195デフォルトの名無しさん2005/10/13(木) 01:31:49
>>194
名前が別についてるのか?
それならchar name[10];ぐらい宣言しといてstrcpyでって手もあるが配列やってないんだよな・・・
眠くて頭はたらんのでパス('A`)
0196デフォルトの名無しさん2005/10/13(木) 01:34:26
宿題スレ行って、問題文全部晒した方が早い。
01971842005/10/13(木) 02:27:17
>>196
宿題スレに書いてきました。
こちらにも全部書いてあります。
ここのスレの人どうもでした。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/984.txt
0198デフォルトの名無しさん2005/10/13(木) 04:39:00
配列使えないとちと苦しいな
num = r1; v=1;
if(r2 < num){ num = r2; V=2; }
if(r3 < num){ num = r3; V=3; }
if(r4 < num){ num = r4; V=4; }
if(r5 < num){ num = r5; V=5; }
if(r6 < num){ num = r6; V=6; }

if(v==1){ printf("hoge1 %d", num); /* その他色々な処理 */ }
if(v==2){ printf("hoge2 %d", num); /* その他色々な処理 */ }
 :
0199デフォルトの名無しさん2005/10/13(木) 06:24:33
Linux上でkill -HUPをsignal関数で捕捉することは出来ないでしょうか?
0200デフォルトの名無しさん2005/10/13(木) 07:40:33
できるんじゃない?
KILLでもSTOPでもないんだし。
02011992005/10/13(木) 11:26:37
>>200
ありがとうございます。もう少し詳しく教えていただけないでしょうか?
signal(SIGKILL,func)
とやっても、失敗(SIG_ERR)します。
0202デフォルトの名無しさん2005/10/13(木) 11:49:41
KILLシグナルは捕まえられないだろう(多分)。
>>199では HUPシグナルを捕まえたかったんじゃないのか?
02031992005/10/13(木) 11:54:46
HUPシグナルを捕まえる場合、SIGKILLではなく何を指定すればよいのでしょうか?
0204デフォルトの名無しさん2005/10/13(木) 12:14:37
( ゚д゚)カポーン
0205デフォルトの名無しさん2005/10/13(木) 12:20:03
$ man 7 signal
0206デフォルトの名無しさん2005/10/13(木) 16:38:11
qsort関数で構造体配列をソートするとき、double型の値で
ソートできるんですが?
0207デフォルトの名無しさん2005/10/13(木) 17:05:49
比較関数でdouble型での比較をすればいい。
0208デフォルトの名無しさん2005/10/13(木) 23:04:03
できない
0209デフォルトの名無しさん2005/10/14(金) 01:34:40
>>208
馬鹿発見
0210デフォルトの名無しさん2005/10/14(金) 01:56:43
>>209
じゃあ教えろ
0211デフォルトの名無しさん2005/10/14(金) 02:19:27
>>210
>>207
0212デフォルトの名無しさん2005/10/14(金) 06:45:10
printf("%d",0L);

この「L」って何なんですか?
普通の「0」とどんな違いがありますか?
0213デフォルトの名無しさん2005/10/14(金) 06:49:40
定数値の型がlong型
02142132005/10/14(金) 06:52:34
もとい、long int型
0215デフォルトの名無しさん2005/10/14(金) 07:06:14
>>213>>214
同じじゃん。longもlong intも。
0216デフォルトの名無しさん2005/10/14(金) 07:08:21
流れが読めない香具師だな
0217デフォルトの名無しさん2005/10/14(金) 07:25:44
流れって何?お前の脳内流れか?ププ
0218デフォルトの名無しさん2005/10/14(金) 07:30:34
>>213
ありがと
0219デフォルトの名無しさん2005/10/14(金) 07:39:42
ちなみに、基本的に数字定数はintみたいですが、intで表現できない大きな定数は勝手にlongとして扱ってくれるのですか?
0220デフォルトの名無しさん2005/10/14(金) 07:40:00
>>217
あ、素で理解できてないんだ。納得。
0221デフォルトの名無しさん2005/10/14(金) 07:43:21
>>220
説明もせずに、理解とかそういう言葉使うわけか。立派な詭弁ですね。
0222デフォルトの名無しさん2005/10/14(金) 08:09:58
>219
C99でどうなったか追っかけてないが、手元のK&R C第2版にはこうある。

P45 2.3 定数
(略)大きすぎてintに収まりきれない整数もlongとして扱われる。(略)

とはいえ、Cの仕様ではintの幅 = longの幅ということも許されるので
intで収まらん数はlongでも収まらんという場合もある。

printf("%s", typeid(100000000000000).name());

↑を各コンパイラに食わせてみたら、VC++.NET 2003とBCC5.5.1は__int64と返し、
g++は「error: integer constant is too large for "long" type」とコンパイルエラーとなった。
0223デフォルトの名無しさん2005/10/14(金) 08:14:00
久しぶりに見たな、ここまで痛いヤツ
誰とは言わんが
0224デフォルトの名無しさん2005/10/14(金) 08:51:53
>>223
そんなレスしたってまた痛いこと言い出すだけから、
このスレのためにもスルーが一番だと思うよ。
0225デフォルトの名無しさん2005/10/14(金) 09:13:44
理解力も無いのに煽るなんて馬鹿だなって書こうとしたけど、
考えてみれば理解力が無いから煽ってるんであって、言うだけ無駄なんだよね。
0226デフォルトの名無しさん2005/10/14(金) 09:35:42
数値を文字に変換するにはどうすればいいのでしょうか?
0227デフォルトの名無しさん2005/10/14(金) 09:46:55
sprintf
_itoa、_i64toa、_itow、_i64tow
_ltoa、_ltow
_ecvt
_fcvt
_gcvt
stringstream
strstream
0228デフォルトの名無しさん2005/10/14(金) 09:48:53
>226
文字? 文字列じゃなくて?
0229デフォルトの名無しさん2005/10/14(金) 09:50:51
文字列です。すみませんお願いします。
0230デフォルトの名無しさん2005/10/14(金) 10:10:17
char*lpszFileName = "_GRAPHSPEC";//アクセスファイル名
char s[100];
sprintf(s,"%s",nTableNo);

//FileNameを作成する
lpszFileName = strcat(lpszFileName,s);

なにか上手くいってないんですけど、なにか見落としてるところ
ありますでしょうか?
0231デフォルトの名無しさん2005/10/14(金) 10:11:38
↑nTableNo int nTableNo;
0232デフォルトの名無しさん2005/10/14(金) 10:47:35
ANSI Cでは、文字列リテラル("GRAPHSPEC")を変更した時のふるまいは未定義になっているので
lpszFileNameを書き換えてはいけません
書き換えたい場合は配列にするか動的にメモリを確保してください
(わかりづらい説明で申し訳ない‥‥リテラル、メモリなどでググってみて)

それとstrcatで文字列を連結しなくてもsprintfで連結できますよ
あとsprintfの第2引数は%sではなくて%dね
0233デフォルトの名無しさん2005/10/14(金) 11:02:28
char lpszFileName[100] = "_GRAPHSPEC"; //アクセスファイル名(_GRAPHSPECのみ)
sprintf(lpszFileName,"%s%d",lpszFileName,nTableNo);

ってやってみましたらOKです。ありがとうございます。みなさん感謝。
0234デフォルトの名無しさん2005/10/14(金) 11:04:08
SendMessageでマウス制御するのにいいサンプルありませんか?
猫を見てもいまいち理解できなかったのですが、、、
0235デフォルトの名無しさん2005/10/14(金) 11:05:27
>>234
こっちで聞いたほうがいいと思うよ
http://pc8.2ch.net/test/read.cgi/tech/1128951330/
0236デフォルトの名無しさん2005/10/14(金) 11:11:57
誤爆には気づいたけどマルチっぽいからやめておいた。
日を改めて書き込むことにするよ
>>235サンクス
0237デフォルトの名無しさん2005/10/14(金) 11:36:38
>>233
sprintf(lpszFileName,"_GRAPHSPEC%d" TableNo);
_GRAPHSPEC固定ならこの方がいいかもしれません

理由はlpszFileNameを第1引数と第3引数の両方に指定しているから。
lpszFileNameから読み込んだ内容がlpszFileNameに書き込まれることになり、
その動作は保証されていなかったと思う。(でも、ちょっと自信がないので詳しい人フォローを‥‥)

まぁ趣味のプログラム程度なら問題ないんだけどね^^
こんなこともあるんだな程度に‥‥
0238デフォルトの名無しさん2005/10/14(金) 12:12:05
>>236
誘導されてるんだから、移動する旨、誘導されてきた旨書き添えて書けば問題無いべ
0239デフォルトの名無しさん2005/10/14(金) 13:16:47
>>238
それではお言葉に甘えて

以降
http://pc8.2ch.net/test/read.cgi/tech/1128951330/
に移動します。

失礼しました。
0240デフォルトの名無しさん2005/10/14(金) 17:23:44
すいません、初歩的な質問なんですがfopen関数で読み込むファイルは
どこに置いておけばいいのでしょうか?
教えてください。
0241デフォルトの名無しさん2005/10/14(金) 17:29:47
お好きにどーぞ。
0242デフォルトの名無しさん2005/10/14(金) 17:41:27
どこでも
0243デフォルトの名無しさん2005/10/14(金) 18:16:15
ファイル名だけで開きたいなら実行ファイルと同じ場所に置くのが無難
0244デフォルトの名無しさん2005/10/14(金) 18:22:17
int i = 123;
int i;
void main(){}

C++だとエラーになるんですが、Cだとエラーになりません。
何でですか。
明らかにint iの再定義でエラーだと思うんですが
0245デフォルトの名無しさん2005/10/14(金) 22:41:02
-1を入力するとループを終了するようにしたいんだけど、
while( scanf("%d" , &x) != -1 ){
だと-1を入力しても終わらないんだが・・・
0246デフォルトの名無しさん2005/10/14(金) 22:42:01
あっそ
0247デフォルトの名無しさん2005/10/14(金) 22:43:45
ネタか。つまらん
0248デフォルトの名無しさん2005/10/14(金) 22:44:54
>>245
すれ違い
http://pc8.2ch.net/test/read.cgi/tech/1128354256/
0249デフォルトの名無しさん2005/10/15(土) 00:31:27
>>243
おいおい。実行ファイルのある場所=cwdなんて環境の方が少ないことに気付きたまえ。
0250デフォルトの名無しさん2005/10/15(土) 00:50:21
質問です。
PCの環境変数にPathとかあるじゃないですか?
これって色んなアプリでとりあいになってるっぽいんですけど、
これってなんかうまい使い方あるんですかね?

何が問題かというとですね。
後から設定したものに始めに設定したものが消されてしまって、
始めに設定したアプリが動かなくなってしまうんですよ。
0251デフォルトの名無しさん2005/10/15(土) 00:52:49
PATH=$PATH:/〜〜/〜〜〜
必要なものを付け足していけば良いだけ。区切子':'(コロン)
0252デフォルトの名無しさん2005/10/15(土) 00:52:49
Windowsなら一箇所にパス通してそこにそれぞれのバッチファイル作っとけば
■ このスレッドは過去ログ倉庫に格納されています