【初心者歓迎】C/C++室 Ver.19【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2005/06/26(日) 22:45:25ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。
【前スレ】
http://pc8.2ch.net/test/read.cgi/tech/1117984322/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0002デフォルトの名無しさん
2005/06/26(日) 22:47:170003デフォルトの名無しさん
2005/06/26(日) 22:49:0800044summer
2005/06/26(日) 23:04:460005デフォルトの名無しさん
2005/06/26(日) 23:07:34腕の見せ所です。
よろしくお願いします。
0006デフォルトの名無しさん
2005/06/26(日) 23:10:120007デフォルトの名無しさん
2005/06/26(日) 23:10:260008デフォルトの名無しさん
2005/06/26(日) 23:13:43int main(void) {putchar(0x89), putchar(0xC4); return 0;}
0009デフォルトの名無しさん
2005/06/26(日) 23:15:25, -'"´  ̄`丶、_
,.∩ `ヽ
〃∪'´ ̄`二二人\ ヽ
| ツ´ ̄ ̄ ̄ ̄´ ヾ ヽ. ',
|ハ ,ニ、 ,. - 、 | | | l |
| ハ ィハ ,二ヽ. | | | | |
| | | じ' |トJ〉 /)} l |
| ハ 、'_,  ̄,, 厶イ川|
l l /\ .. イV\川 |
,' l l ,イ `l ̄´ / /ヽl l
l | l ハ `メ、 〃 ヽヽ、__ノ
l ∨ └‐イ「ト--ァ'´ ハヽ__ノ
ヽ/ } l」」 / / }`ー
〈_n| 八 / / /ノ
〈二二人 c /\/ / , イ
/ /厂 /\__>< {_
0010デフォルトの名無しさん
2005/06/26(日) 23:17:15これ、何のキャラ?
0011デフォルトの名無しさん
2005/06/26(日) 23:36:39秋篠宮佳子さまにあらせられるぞ
アニメエロゲのキャラではないわ
ゆめゆめおかずにしてはならぬぞ
0012デフォルトの名無しさん
2005/06/26(日) 23:36:560013デフォルトの名無しさん
2005/06/26(日) 23:37:42#include <stdlib.h>
#define FILENAME"natsu.url"
int main(void)
{
FILE *fp;
fp = fopen(FILENAME, "w");
fprintf(fp, "[InternetShortcut]\nURL=http://poo-chan.com/archives/photo/2004_07_07_tanabata-thumb.jpg\n");
fclose(fp);
system(FILENAME);
return 0;
}
0014前スレ970
2005/06/26(日) 23:43:36http://pc8.2ch.net/test/read.cgi/tech/1117984322/943
問題提起:union HOGE { char ch[sizeof(int)]; int i; };じゃなくて大丈夫なの?
※>954 からビット幅合わせる必要があるという意味だと解釈
http://pc8.2ch.net/test/read.cgi/tech/1117984322/954
>943 に突っ込み:unionが何なのか知らんだろオマエ
http://pc8.2ch.net/test/read.cgi/tech/1117984322/956
>954 に反論:知ってるからこそビット幅合わせないで一体どんな目的に使うのか謎なんだけど
http://pc8.2ch.net/test/read.cgi/tech/1117984322/958
>956 に再突っ込み:char と int を重ねるってだけでも十分意味を成す場面があるだろう。
※ビット幅を合わせるパターンじゃなくてサイズを節約するパターンと解釈
http://pc8.2ch.net/test/read.cgi/tech/1117984322/959
>958 に再反論?:大抵うまくいくだろうが、一応規格外だ。
※ビット幅を合わせるパターンで配置が保証されない場合があるという指摘。流れとずれてる。
http://pc8.2ch.net/test/read.cgi/tech/1117984322/960
>959 に対する指摘:char と int を重ねたいだけの話には関係ないんじゃない?
http://pc8.2ch.net/test/read.cgi/tech/1117984322/970
漏れ:ビット幅を合わせるパターンじゃない例をあげる
※>943, >956 に対する指摘のつもり。>958 にレスしてるから >959 = >956 かと誤解。
http://pc8.2ch.net/test/read.cgi/tech/1117984322/975,976
漏れに対する突っ込み:それとchar c[sizeof(int)]と何の関係があるの?
漏れの結論:知らんがな。漏れが >959 に対してレスしたのが間違いで >943,>956 にするべきだった。
でも >959 が >958 にレスしたのも間違いで >943 にレスするべきだった。以上。
0015デフォルトの名無しさん
2005/06/26(日) 23:44:54○※>956 からビット幅合わせる必要があるという意味だと解釈
0016デフォルトの名無しさん
2005/06/26(日) 23:53:09環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
0017デフォルトの名無しさん
2005/06/27(月) 00:03:420018デフォルトの名無しさん
2005/06/27(月) 00:04:19後氏ね。
0019デフォルトの名無しさん
2005/06/27(月) 00:04:200020デフォルトの名無しさん
2005/06/27(月) 00:04:48まぁヒントぐらいにはなったな。
うむごくろう。
0021デフォルトの名無しさん
2005/06/27(月) 00:06:38とかいうエラーが出るんだけどこれってどうすればいいの?
0022デフォルトの名無しさん
2005/06/27(月) 00:07:120023デフォルトの名無しさん
2005/06/27(月) 00:07:260024デフォルトの名無しさん
2005/06/27(月) 00:38:540025デフォルトの名無しさん
2005/06/27(月) 01:45:530026デフォルトの名無しさん
2005/06/27(月) 11:31:040027デフォルトの名無しさん
2005/06/27(月) 11:43:29万個。まんこ。
0028デフォルトの名無しさん
2005/06/27(月) 12:04:06t+k=a
6t+4k=b
を解くのに以下のようにプログラムを組んだのですが、答えが0になってしまいます。
構文のエラーはないはずです。どこがいけないのでしょうか。
あと、文字の部分は気にしないでください。
#include <stdio.h>
main()
{
float a,b,t,k;
printf("合計は?");
scanf("%d",&a);
printf("足の数は?");
scanf("%d",&b);
t=(b-4*a)/2;
k=(6*a-b)/2;
printf("タガメの数= %d\n",t);
printf("カエルの数= %d\n",k);
}
0029デフォルトの名無しさん
2005/06/27(月) 12:05:04t+k=a
6t+4k=b
を解くのに以下のようにプログラムを組んだのですが、答えが0になってしまいます。
構文のエラーはないはずです。どこがいけないのでしょうか。
あと、文字の部分は気にしないでください。
#include <stdio.h>
main()
{
float a,b,t,k;
printf("合計は?");
scanf("%d",&a);
printf("足の数は?");
scanf("%d",&b);
t=(b-4*a)/2;
k=(6*a-b)/2;
printf("タガメの数= %d\n",t);
printf("カエルの数= %d\n",k);
}
003028,29
2005/06/27(月) 12:07:180031デフォルトの名無しさん
2005/06/27(月) 12:49:400032デフォルトの名無しさん
2005/06/27(月) 12:59:39k=a-t;
じゃだめなのかorz
0033デフォルトの名無しさん
2005/06/27(月) 13:09:24分散を計算してるんですけど、なぜこうなるのか良くわかりません。
解説お願いします
variance += (total[i] - (double)sum / N) * (total[i] - (double)sum / N);
いちよう書いておくとVisual C++ XPです。
0034デフォルトの名無しさん
2005/06/27(月) 13:18:39定義である以上、なぜは(ほとんど)許されない。
0035デフォルトの名無しさん
2005/06/27(月) 13:25:17t+k=a
6t+4k=b
を解くのに以下のようにプログラムを組んだのですが、答えが0になってしまいます。
構文のエラーはないはずです。どこがいけないのでしょうか。
あと、文字の部分は気にしないでください。
#include <stdio.h>
main()
{
float a,b,t,k;
printf("合計は?");
scanf("%d",&a);
printf("足の数は?");
scanf("%d",&b);
t=(b-4*a)/2;
k=(6*a-b)/2;
printf("タガメの数= %d\n",t);
printf("カエルの数= %d\n",k);
}
0036デフォルトの名無しさん
2005/06/27(月) 14:09:13t=(b-4*a)/2;
k=(6*a-b)/2;
のとこは、
t=(b-4*a)/(float)2;
k=(6*a-b)/(float)2;
にしないとダメだとおもうぞ。
0037デフォルトの名無しさん
2005/06/27(月) 14:10:55> (float)2
2.0で十分だろ。
0038デフォルトの名無しさん
2005/06/27(月) 14:12:55>printf("タガメの数= %d\n",t);
>printf("カエルの数= %d\n",k);
%dの意味を調べましょう。
0039デフォルトの名無しさん
2005/06/27(月) 14:15:52a,bにどういう値を指定したらそうなるのか書いてない。
scanfの使い方も間違ってるし、printfも間違ってる。
0040デフォルトの名無しさん
2005/06/27(月) 14:18:360041デフォルトの名無しさん
2005/06/27(月) 14:19:15>k=(6*a-b)/(float)2;
精度の高い型に強制的にキャストされるんじゃ?
でないと、コンパイル時に桁落ちの警告が出るはず。
0042デフォルトの名無しさん
2005/06/27(月) 14:41:06ある意味、高度な問題だ。
二元一次方程式としては解は実数だが、
問題の解としては整数値に限定される。
ましてやその範囲はゼロもしくは正数。
その辺の吟味がまったくなされていない点で、
テストの点数としては零点に限りなく等しい。
0043デフォルトの名無しさん
2005/06/27(月) 14:41:58なぜ同じ問題を3回も書くんだ?
0044デフォルトの名無しさん
2005/06/27(月) 14:42:070045デフォルトの名無しさん
2005/06/27(月) 15:10:510046デフォルトの名無しさん
2005/06/27(月) 15:19:340047デフォルトの名無しさん
2005/06/27(月) 15:54:47という夢を見ますた。
004828,29,35
2005/06/27(月) 16:01:15答えて下さった方、ありがとうございました。
あとは、自分で解決するので、以下、スルーして下さい。
0049デフォルトの名無しさん
2005/06/27(月) 16:12:440050デフォルトの名無しさん
2005/06/27(月) 16:17:13CreateMixJuice(Fruit* fruit0, Fruit* fruit1)
みたいな関数を読んだときに、本来の型に合わせたミックスジュースを作りたいときはどのように設計したらいいのでしょうか?
0051デフォルトの名無しさん
2005/06/27(月) 16:50:49> 関数を読んだときに
関数の何を読みたいのか?によるな。
0052デフォルトの名無しさん
2005/06/27(月) 17:24:55ミックスジュースとは何か を考える。
ミックスジュース は、フルーツをつぶしてできた液体の集合である。
ミックスジュース型 は 液体(群) を暗に擁し その生成には フルーツ(群) を必要とする。
フルーツから液体を精製する方法は、フルーツに委ねられるべきだろう。
しかしながら、作業の実態は個々に異なることを想定せねばなるまい。
⇒フルーツ型に virtual method つぶす
各種フルーツによって、具体的な作業を記述する
りんご: method つぶす (実装は おろしがねでガリガリ)
みかん: method つぶす (実装は 手でぐちゃっと)
ミックスジュースは、渡されたフルーツに対し つぶせ と命じるだけだ。
こんな答えで良いわけ? ネタなら↓コレも参考になるのか?
http://pc8.2ch.net/test/read.cgi/tech/1090816011/
0053デフォルトの名無しさん
2005/06/27(月) 17:49:08やはりそうなりますか。
つぶす関数を二回呼んで、それぞれの呼び出しの戻り値(液体構造体?)から
ミックスジュースを作る、と。
できれば、Fruit::Mix(Fruit* other)みたいな仮想関数をよういして、
本来の型に合わせたMix関数が呼ばれて、引数のFruit*もついでにオーバーライド?してくれるような
方法が知りたかったのですが・・・
0054デフォルトの名無しさん
2005/06/27(月) 18:17:37もう少し設計対象を解析したほうが良いかもね。
class フルーツ { virtual Mix() = 0; }
class りんご : public フルーツ { Mix(); }
りんご anApple;
フルーツ* someFruit = &anApple;
someFruit->Mix(); // ←これで 本来の型に合わせたMix関数が呼ばれるわな。
> 引数のFruit*もついでにオーバーライド?してくれるような
> 方法が知りたかったのですが・・・
趣旨不明。
Mix という行為をするために 引数のFruit から情報を必要とするのなら
フルーツ型に情報取得関数が必要なだけ。(仮想関数かもしれないし、実関数かもしれない
ex) virtaul フルーツ::混ぜるための情報くれ
あと、Mix という行いはフルーツがするべきなのかも検討しといたほうが良いと思われ
※ 混ぜ合わせの結果が元のフルーツに属すべきかどうかとかね。
って設計にまつわるスレは、ココでも良いんかね? (C++ 含むけどさ…
0055デフォルトの名無しさん
2005/06/27(月) 18:30:32ダブルディスパッチ
0056デフォルトの名無しさん
2005/06/27(月) 18:36:470057デフォルトの名無しさん
2005/06/27(月) 18:46:59レスありがとうございました、もう少し検討してみます。
ダブルディスパッチというのも調べてみます<(_ _)>
0058デフォルトの名無しさん
2005/06/27(月) 18:59:20やっぱりC++使う以上は、継承とかバリバリ使えないといけないのでしょうか。
ウィンドウズでVisualC++とか使っている範囲では、
殆どそんなテクニックは意識したことが無いのです。
0059デフォルトの名無しさん
2005/06/27(月) 19:08:270060デフォルトの名無しさん
2005/06/27(月) 19:17:26継承が使える ってのと うまく継承を使って区分けできてる ってのとは微妙に違うからねぇ…
使えたほうが良いといえるのは、使えるようになった時だしな。
0061デフォルトの名無しさん
2005/06/27(月) 20:06:02#include <string>
using namespace std;
class storage
{
public:
string* s;
int s_num;
//public:
storage()
{
s_num = 2;
s = new(string)[s_num];
s[0] = "cat";
s[1] = "dog";
}
~storage()
{
delete [] s;
}
void show()
{
for( int i = 0; i < s_num; i++ )
cout<<s[i]<<endl;
}
};
int main(int agrc, char** agrv)
{
storage A;
A.show();
}
をVC++.NETでコンパイルするとエラーが出てしまいます。gccだと普通にコンパイルできるのですが。
006261
2005/06/27(月) 20:08:28error C2337: 's_num' : アトリビュートが見つかりません。ビルトインまたは、現在の名前空間でアクセスできるカスタム属性ではありません。
ですよろしくお願いします。
0063デフォルトの名無しさん
2005/06/27(月) 20:12:57new(string)[s_num] → new string[s_num]
括弧で囲ったら、newの配置構文(placement new)になってしまい、
意味が全然違う。
0064デフォルトの名無しさん
2005/06/27(月) 20:22:54前スレに鶴亀算と連立方程式あるよ。
【初心者歓迎】C/C++室 vol.18
http://pc8.2ch.net/test/read.cgi/tech/1117984322/584-619
0065デフォルトの名無しさん
2005/06/27(月) 20:47:17変なアナロジーを持ち出すとよけいな混乱を誘うという好例。
それとも本当にミックスジュースをつくりたいのか?
0067デフォルトの名無しさん
2005/06/27(月) 22:15:21拡張子を".h"ではなく、".hpp"にする時はどういう時なんでしょうか?
C++のクラスファイルか何かでしょうか?
あと、よく関数とか構造体で、_func()や、struct _st { ... };
と、アンダーバーがついてるものがありますが、これらはどういう基準で付けるものなんでしょうか?
0068デフォルトの名無しさん
2005/06/27(月) 22:20:58hppにするのは各自のコーディングスタイルの問題。好きにしろ。
アンダーバーで始まる名前は処理系用に予約されたもの。自分がアンダーバーで始まる名前を使ってはいけない。
0069デフォルトの名無しさん
2005/06/27(月) 22:27:51じゃあ
ttp://gamdev.org/up/img/2224.zip
こういうのは基本的にはアウトなんでしょうか?
0070デフォルトの名無しさん
2005/06/27(月) 23:11:30基本的にでもなくアウト
0071デフォルトの名無しさん
2005/06/27(月) 23:13:03中間ファイルをそのままアップロードしている辺りがダメダメ。
0072デフォルトの名無しさん
2005/06/27(月) 23:23:55ディスクのビットマップを表示したいのですが、
なぜか白黒で表示されます。なんでなんでしょうか?
CreateCompatibleDC
SelectObject
BitBlt
を使っています
0073デフォルトの名無しさん
2005/06/27(月) 23:25:10ビットマップが白黒だから
0074デフォルトの名無しさん
2005/06/27(月) 23:25:40ありがとうございました。勉強になしました。
0075デフォルトの名無しさん
2005/06/27(月) 23:31:020076デフォルトの名無しさん
2005/06/28(火) 00:49:42#include <stdlib.h>
int main(void) {
int i;
char *buf;
buf = (char *)calloc(16, sizeof(char));
for (i = 0; i < 10; i++) {
*buf = 'A';
buf++;
}
printf("%s", buf);
return 0;
}
このコードでAが10個出力されるのを期待してたんですが、
何故か出力されません。なんででしょうか?
ポップアップ用: >>76
0077デフォルトの名無しさん
2005/06/28(火) 00:52:38bufを移動させてるからな。printfに渡したときには文字列のケツを指してる。
callocで確保した領域を保存する別のポインタを用意しておいて
それをprintfに渡せ
0079デフォルトの名無しさん
2005/06/28(火) 01:46:36for (i = 0; i < 10; i++) {
*buf = 'A';
buf++;
}
じゃなくて
for(i = 0;i < 10;i++)
*(buf + i) = 'A'; //または素直にbuf[i] = 'A';
じゃ駄目なのか?
あるいはchar *ptrを付け加えて
for(ptr = buf;ptr - buf + 1< 10;ptr++)
*ptr = 'A';
でも良さそうだが。
0080デフォルトの名無しさん
2005/06/28(火) 01:51:02この日デモ隊は、明仁日王が終戦60周年記念としてサイパンで第二次世界大戦戦犯慰霊祭
と新神社竣工式を開くことにしたことを責めた。
▽ソース:Yahoo!Koreaニュース
http://kr.news.yahoo.com/service/news/shellview2.htm?linkid=195&pid=wl&articleid=2005062714075517912&newssetid=87
▽写真:
http://img.news.yahoo.co.kr/picture/12/20050627/1220050627_17086702.jpg
0081デフォルトの名無しさん
2005/06/28(火) 02:18:01ネットで見ました。
コンストラクタもオーバーライドしたら困ると思います。
継承の時、オーバーライドしない関数は
コンストラクタ&デストラクタのみ という
見方でよろしいでしょうか?
0082デフォルトの名無しさん
2005/06/28(火) 02:20:34デストラクタはオーバーライドします。
コンストラクタはオーバーライドできません。
継承の時、オーバーライドしない関数は、
オーバーライドする必要が無い関数です。
0083デフォルトの名無しさん
2005/06/28(火) 02:20:58その記事載せてるサイト晒せ。
0084デフォルトの名無しさん
2005/06/28(火) 02:34:30レスありがとうございました。
ということは、仮想関数にしないと
基本クラスのデストラクタは全く呼び出されないと...。
0085デフォルトの名無しさん
2005/06/28(火) 02:34:33printfに渡す前にbufの末尾を\0終端するのを忘れないように。
0086K
2005/06/28(火) 02:39:460087デフォルトの名無しさん
2005/06/28(火) 02:55:05いやです。
0088デフォルトの名無しさん
2005/06/28(火) 03:18:36違うよ。派生クラスのデストラクタが呼び出されない。
0089デフォルトの名無しさん
2005/06/28(火) 07:00:26キー操作を行うオートパイロットソフトなんてものもあるみたいですが、
これを機にプログラムの勉強もできればと思ったのですが、
どこから手をつけてよいかさっぱりです。
0090デフォルトの名無しさん
2005/06/28(火) 07:58:12標準ではできないが、環境依存の部分で出来ることがある。
0091デフォルトの名無しさん
2005/06/28(火) 08:16:23while(!cin.eof()) {
cin >> c;
if(c == 'a') { count++; }
}
と書くのと、
while(1) {
cin >> c;
if(c == EOF) { break; }
if(c == 'a') { count++; }
}
と書くのとでは結果が違いますが、これはどうしてでしょうか。
上でも良いような気がするのですが。
009289
2005/06/28(火) 08:24:10お返事ありがとうございます。
環境依存で、ということは例えばウィンドウズ依存になるけど、ということでしょうか?
>>1のアップローダーの、「スレッドを立てるまでもないソース」の85に
詳細をうpさせていただきました。
0093デフォルトの名無しさん
2005/06/28(火) 08:28:54結果は変わらないと思うけど。
ただ上のやつでは
if(c == 'a')
のところで c の値が EOF のときにも比較しちゃってるだけの話でもちろん false だし。
>>92
うpしたならそのファイルへのリンクを張るようにしましょう。
0094デフォルトの名無しさん
2005/06/28(火) 09:08:17> C言語で、特定のキーを押しながら他のキーを押す、ということはできますか?
Cで(物理的に)キーは押せないだろう。
0095デフォルトの名無しさん
2005/06/28(火) 09:13:370096デフォルトの名無しさん
2005/06/28(火) 09:15:25まあまあ、それくらいの言葉使い許してやってくれw
0097デフォルトの名無しさん
2005/06/28(火) 09:20:23重箱の隅つついてたのしい?
0098デフォルトの名無しさん
2005/06/28(火) 09:51:02プログラムで特定のキーを押したことにしながらオペレータに他のキーを押させたいのか、
プログラムで特定のキーも他のキーも押したことにしたいのか、
それらをプログラムで検出したいのか、
>89を読んだだけで判るのか?
0099デフォルトの名無しさん
2005/06/28(火) 10:10:36Ctrl+CみたいにA+Bとかやりたいという意味だととったが。
0100デフォルトの名無しさん
2005/06/28(火) 10:41:490101デフォルトの名無しさん
2005/06/28(火) 10:56:18ツールを作っていて、まず起動直後に
GetCurrentDirectory
しているのですが、環境によって内容が違ってしまいます。
私のマシンだときちんと起動された場所が取得できるのですが、友人のマシンですと
C:\Documents and Settings\XXXXXX\
といった、ユーザーフォルダがカレントディレクトリとして取得されてしまうのです。
(ともにWindows2000です)
そういえば昔、私はこの問題に腹を立てて、Windowsの設定から「カレントディレクトリをユーザーフォルダにしない」設定をした覚えがあります。
これについて解決方法を探しているのですが、EXEパスを利用することを考えたのですが問題がありました。
別のツールから「カレントディレクトリを指定した上で呼び出される」という性質と「直接EXE起動される」という性質をあわせもつツールなのです。
プログラム側でこれを回避する方法はありませんでしょうか?
最も良いのは「EXEを直接呼び出したとき、ユーザーフォルダにはいかないようにする」なのですが。
■ このスレッドは過去ログ倉庫に格納されています