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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。
【前スレ】
http://pc8.2ch.net/test/read.cgi/tech/1117984322/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
2デフォルトの名無しさん:2005/06/26(日) 22:47:17
STLつかうと一気に実行ファイルサイズが10倍に?!
3デフォルトの名無しさん:2005/06/26(日) 22:49:08
フーン
44summer:2005/06/26(日) 23:04:46
 夏夏夏夏
5デフォルトの名無しさん:2005/06/26(日) 23:07:34
C言語で「夏」を表現してください。
腕の見せ所です。
よろしくお願いします。
6デフォルトの名無しさん:2005/06/26(日) 23:10:12
printf("前橋 : 35.4 ℃");
7デフォルトの名無しさん:2005/06/26(日) 23:10:26
断る
8デフォルトの名無しさん:2005/06/26(日) 23:13:43
#include <stdio.h>
int main(void) {putchar(0x89), putchar(0xC4); return 0;}
9デフォルトの名無しさん:2005/06/26(日) 23:15:25
>1乙

            , -'"´  ̄`丶、_
           ,.∩         `ヽ
         〃∪'´ ̄`二二人\  ヽ
         | ツ´ ̄ ̄ ̄ ̄´ ヾ ヽ. ',
         |ハ ,ニ、   ,. - 、 | | | l |
         | ハ ィハ     ,二ヽ. | | | | |
         | | | じ'   |トJ〉  /)} l |
         | ハ  、'_,   ̄,, 厶イ川|
         l l /\    .. イV\川 |
         ,' l l ,イ `l ̄´ /   /ヽl l
         l | l ハ  `メ、    〃  ヽヽ、__ノ
         l  ∨ └‐イ「ト--ァ'´     ハヽ__ノ
         ヽ/  }  l」」 /     / }`ー
          〈_n| 八   / /     /ノ
          〈二二人 c /\/ / , イ
           /  /厂 /\__>< {_


10デフォルトの名無しさん:2005/06/26(日) 23:17:15
>>9
これ、何のキャラ?
11デフォルトの名無しさん:2005/06/26(日) 23:36:39
この不敬ものめ!
秋篠宮佳子さまにあらせられるぞ
アニメエロゲのキャラではないわ

ゆめゆめおかずにしてはならぬぞ
12デフォルトの名無しさん:2005/06/26(日) 23:36:56
プリキュア?
13デフォルトの名無しさん:2005/06/26(日) 23:37:42
#include <stdio.h>
#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;
}
14前スレ970:2005/06/26(日) 23:43:36
想定外の突っ込みが入ったので、流れをまとめてみた。※は漏れコメント

http://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 にレスするべきだった。以上。
15デフォルトの名無しさん:2005/06/26(日) 23:44:54
×※>954 からビット幅合わせる必要があるという意味だと解釈
○※>956 からビット幅合わせる必要があるという意味だと解釈
16デフォルトの名無しさん:2005/06/26(日) 23:53:09
>>2
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
17デフォルトの名無しさん:2005/06/27(月) 00:03:42
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
18デフォルトの名無しさん:2005/06/27(月) 00:04:19
#include <stdafx.h>

後氏ね。
19デフォルトの名無しさん:2005/06/27(月) 00:04:20
ダイナミックリンクしといてサイズが変わらないとか言ってるよこの人。
20デフォルトの名無しさん:2005/06/27(月) 00:04:48
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
21デフォルトの名無しさん:2005/06/27(月) 00:06:38
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
22デフォルトの名無しさん:2005/06/27(月) 00:07:12
息が合ってません
23デフォルトの名無しさん:2005/06/27(月) 00:07:26
何でここでそのテンプレが…
24デフォルトの名無しさん:2005/06/27(月) 00:38:54
なんか今日はカオスってないか?
25デフォルトの名無しさん:2005/06/27(月) 01:45:53
あと氏ね
26デフォルトの名無しさん:2005/06/27(月) 11:31:04
配列の要素数80万個って可能ですか?
27デフォルトの名無しさん:2005/06/27(月) 11:43:29
>>26
万個。まんこ。
28デフォルトの名無しさん:2005/06/27(月) 12:04:06
二元一次連立方程式
t+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);

}

29デフォルトの名無しさん:2005/06/27(月) 12:05:04
二元一次連立方程式
t+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);

}

3028,29:2005/06/27(月) 12:07:18
二重カキコすまそ
31デフォルトの名無しさん:2005/06/27(月) 12:49:40
scanf()とprintf()の中のフォーマット文字列の中の%dがまずいんじゃね?%fに変えてみて。
32デフォルトの名無しさん:2005/06/27(月) 12:59:39
t=(b-4*a)/2;
k=a-t;

じゃだめなのかorz
33デフォルトの名無しさん:2005/06/27(月) 13:09:24
すみません、他スレに書き込んだのですが反応ないので。
分散を計算してるんですけど、なぜこうなるのか良くわかりません。
解説お願いします
variance += (total[i] - (double)sum / N) * (total[i] - (double)sum / N);
いちよう書いておくとVisual C++ XPです。
34デフォルトの名無しさん:2005/06/27(月) 13:18:39
分散の定義が (平均からの差)の2乗 だから。
定義である以上、なぜは(ほとんど)許されない。
35デフォルトの名無しさん:2005/06/27(月) 13:25:17
二元一次連立方程式
t+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);

}
36デフォルトの名無しさん:2005/06/27(月) 14:09:13
>>35
t=(b-4*a)/2;
k=(6*a-b)/2;

のとこは、

t=(b-4*a)/(float)2;
k=(6*a-b)/(float)2;

にしないとダメだとおもうぞ。

37デフォルトの名無しさん:2005/06/27(月) 14:10:55
>>36
> (float)2

2.0で十分だろ。
38デフォルトの名無しさん:2005/06/27(月) 14:12:55
>>35
>printf("タガメの数= %d\n",t);
>printf("カエルの数= %d\n",k);

%dの意味を調べましょう。
39デフォルトの名無しさん:2005/06/27(月) 14:15:52
>>35は釣り?
a,bにどういう値を指定したらそうなるのか書いてない。
scanfの使い方も間違ってるし、printfも間違ってる。
40デフォルトの名無しさん:2005/06/27(月) 14:18:36
釣りか。 %dのことをを 全部 %f にしてやってみろ。
41デフォルトの名無しさん:2005/06/27(月) 14:19:15
>t=(b-4*a)/(float)2;
>k=(6*a-b)/(float)2;

精度の高い型に強制的にキャストされるんじゃ?
でないと、コンパイル時に桁落ちの警告が出るはず。
42デフォルトの名無しさん:2005/06/27(月) 14:41:06
>>35
ある意味、高度な問題だ。
二元一次方程式としては解は実数だが、
問題の解としては整数値に限定される。
ましてやその範囲はゼロもしくは正数。
その辺の吟味がまったくなされていない点で、
テストの点数としては零点に限りなく等しい。
43デフォルトの名無しさん:2005/06/27(月) 14:41:58
>>28>>29>>35
なぜ同じ問題を3回も書くんだ?
44デフォルトの名無しさん:2005/06/27(月) 14:42:07
足の数や匹数をfloatとしている時点で(ry
45デフォルトの名無しさん:2005/06/27(月) 15:10:51
今時のタガメとカエルはそういう足の数なんだよ。
46デフォルトの名無しさん:2005/06/27(月) 15:19:34
4.5本足の蛙。
47デフォルトの名無しさん:2005/06/27(月) 15:54:47
ちなみにオレは、よく3本足と間違えられるくらいすごい。









という夢を見ますた。
4828,29,35:2005/06/27(月) 16:01:15
つい最近習ったばかりでよくわからないんです。
答えて下さった方、ありがとうございました。
あとは、自分で解決するので、以下、スルーして下さい。
49デフォルトの名無しさん:2005/06/27(月) 16:12:44
これが有名なカエタガ算か・・・
50デフォルトの名無しさん:2005/06/27(月) 16:17:13
フルーツ型のポインタ A B があったとして、これらが本当は リンゴ型 と みかん型のインスタンスだった場合に
CreateMixJuice(Fruit* fruit0, Fruit* fruit1)
みたいな関数を読んだときに、本来の型に合わせたミックスジュースを作りたいときはどのように設計したらいいのでしょうか?
51デフォルトの名無しさん:2005/06/27(月) 16:50:49
>>50
> 関数を読んだときに

関数の何を読みたいのか?によるな。
52デフォルトの名無しさん:2005/06/27(月) 17:24:55
>>50
ミックスジュースとは何か を考える。
 ミックスジュース は、フルーツをつぶしてできた液体の集合である。
ミックスジュース型 は 液体(群) を暗に擁し その生成には フルーツ(群) を必要とする。

フルーツから液体を精製する方法は、フルーツに委ねられるべきだろう。
しかしながら、作業の実態は個々に異なることを想定せねばなるまい。
 ⇒フルーツ型に virtual method つぶす

各種フルーツによって、具体的な作業を記述する
 りんご: method つぶす (実装は おろしがねでガリガリ)
 みかん: method つぶす (実装は 手でぐちゃっと)

ミックスジュースは、渡されたフルーツに対し つぶせ と命じるだけだ。

こんな答えで良いわけ?  ネタなら↓コレも参考になるのか?
 http://pc8.2ch.net/test/read.cgi/tech/1090816011/
53デフォルトの名無しさん:2005/06/27(月) 17:49:08
>⇒フルーツ型に virtual method つぶす

やはりそうなりますか。
つぶす関数を二回呼んで、それぞれの呼び出しの戻り値(液体構造体?)から
ミックスジュースを作る、と。

できれば、Fruit::Mix(Fruit* other)みたいな仮想関数をよういして、
本来の型に合わせたMix関数が呼ばれて、引数のFruit*もついでにオーバーライド?してくれるような
方法が知りたかったのですが・・・
54デフォルトの名無しさん:2005/06/27(月) 18:17:37
>>53
もう少し設計対象を解析したほうが良いかもね。

class フルーツ { virtual Mix() = 0; }
class りんご : public フルーツ { Mix(); }

りんご anApple;
フルーツ* someFruit = &anApple;
someFruit->Mix(); // ←これで 本来の型に合わせたMix関数が呼ばれるわな。

> 引数のFruit*もついでにオーバーライド?してくれるような
> 方法が知りたかったのですが・・・
趣旨不明。
Mix という行為をするために 引数のFruit から情報を必要とするのなら
フルーツ型に情報取得関数が必要なだけ。(仮想関数かもしれないし、実関数かもしれない
ex) virtaul フルーツ::混ぜるための情報くれ

あと、Mix という行いはフルーツがするべきなのかも検討しといたほうが良いと思われ
※ 混ぜ合わせの結果が元のフルーツに属すべきかどうかとかね。

って設計にまつわるスレは、ココでも良いんかね? (C++ 含むけどさ…
55デフォルトの名無しさん:2005/06/27(月) 18:30:32
>>50
ダブルディスパッチ
56デフォルトの名無しさん:2005/06/27(月) 18:36:47
このスレいいなぁ。
57デフォルトの名無しさん:2005/06/27(月) 18:46:59
>>54 >>55
レスありがとうございました、もう少し検討してみます。
ダブルディスパッチというのも調べてみます<(_ _)>
58デフォルトの名無しさん:2005/06/27(月) 18:59:20
他スレで相手にされなかったみたいなので...orz

やっぱりC++使う以上は、継承とかバリバリ使えないといけないのでしょうか。
ウィンドウズでVisualC++とか使っている範囲では、
殆どそんなテクニックは意識したことが無いのです。
59デフォルトの名無しさん:2005/06/27(月) 19:08:27
使えんより使えたがいい罠
60デフォルトの名無しさん:2005/06/27(月) 19:17:26
所詮道具なんだから、無理せず自分にあった服を着る考え方で良いんでない?

継承が使える ってのと うまく継承を使って区分けできてる ってのとは微妙に違うからねぇ…
使えたほうが良いといえるのは、使えるようになった時だしな。
61デフォルトの名無しさん:2005/06/27(月) 20:06:02
#include <iostream>
#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だと普通にコンパイルできるのですが。
6261:2005/06/27(月) 20:08:28
error C2143: 構文エラー : ';' が '[' の前にありません。
error C2337: 's_num' : アトリビュートが見つかりません。ビルトインまたは、現在の名前空間でアクセスできるカスタム属性ではありません。
ですよろしくお願いします。
63デフォルトの名無しさん:2005/06/27(月) 20:12:57
>>61
new(string)[s_num] → new string[s_num]

括弧で囲ったら、newの配置構文(placement new)になってしまい、
意味が全然違う。
64デフォルトの名無しさん:2005/06/27(月) 20:22:54
>>48
前スレに鶴亀算と連立方程式あるよ。

【初心者歓迎】C/C++室 vol.18
http://pc8.2ch.net/test/read.cgi/tech/1117984322/584-619
65デフォルトの名無しさん:2005/06/27(月) 20:47:17
>>50
変なアナロジーを持ち出すとよけいな混乱を誘うという好例。
それとも本当にミックスジュースをつくりたいのか?
6661:2005/06/27(月) 20:57:45
>>3
なるほど、ありがとうございます。
67デフォルトの名無しさん:2005/06/27(月) 22:15:21
素朴な疑問なんですが、

拡張子を".h"ではなく、".hpp"にする時はどういう時なんでしょうか?
C++のクラスファイルか何かでしょうか?

あと、よく関数とか構造体で、_func()や、struct _st { ... };
と、アンダーバーがついてるものがありますが、これらはどういう基準で付けるものなんでしょうか?
68デフォルトの名無しさん:2005/06/27(月) 22:20:58
>>67
hppにするのは各自のコーディングスタイルの問題。好きにしろ。
アンダーバーで始まる名前は処理系用に予約されたもの。自分がアンダーバーで始まる名前を使ってはいけない。
69デフォルトの名無しさん:2005/06/27(月) 22:27:51
>>68
じゃあ
ttp://gamdev.org/up/img/2224.zip
こういうのは基本的にはアウトなんでしょうか?
70デフォルトの名無しさん:2005/06/27(月) 23:11:30
>>69
基本的にでもなくアウト
71デフォルトの名無しさん:2005/06/27(月) 23:13:03
>>69
中間ファイルをそのままアップロードしている辺りがダメダメ。
72デフォルトの名無しさん:2005/06/27(月) 23:23:55
SDKで

ディスクのビットマップを表示したいのですが、
なぜか白黒で表示されます。なんでなんでしょうか?

CreateCompatibleDC
SelectObject
BitBlt
を使っています
73デフォルトの名無しさん:2005/06/27(月) 23:25:10
>>72
ビットマップが白黒だから
74デフォルトの名無しさん:2005/06/27(月) 23:25:40
>>68>>70>>71
ありがとうございました。勉強になしました。
75デフォルトの名無しさん:2005/06/27(月) 23:31:02
ガッ
76デフォルトの名無しさん:2005/06/28(火) 00:49:42
#include <stdio.h>
#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
77デフォルトの名無しさん:2005/06/28(火) 00:52:38
>>76
bufを移動させてるからな。printfに渡したときには文字列のケツを指してる。

callocで確保した領域を保存する別のポインタを用意しておいて
それをprintfに渡せ
7876:2005/06/28(火) 00:56:29
>>77
あっ・・本当ですね・・
こんな些細な事に気づかなかったなんて・・
本当にありがとうございました
79デフォルトの名無しさん:2005/06/28(火) 01:46:36
あるいは、ループカウンタ使ってるなら

for (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';

でも良さそうだが。
80デフォルトの名無しさん:2005/06/28(火) 01:51:02
市民団体「活貧団」会員らが27日、ソウル駐在日本大使館の前で反日デモを起こしている。
この日デモ隊は、明仁日王が終戦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
81デフォルトの名無しさん:2005/06/28(火) 02:18:01
「デストラクタはオーバーライドしない」という記事を
ネットで見ました。
コンストラクタもオーバーライドしたら困ると思います。
継承の時、オーバーライドしない関数は
コンストラクタ&デストラクタのみ という
見方でよろしいでしょうか?
82デフォルトの名無しさん:2005/06/28(火) 02:20:34
>>81
デストラクタはオーバーライドします。
コンストラクタはオーバーライドできません。
継承の時、オーバーライドしない関数は、
オーバーライドする必要が無い関数です。
83デフォルトの名無しさん:2005/06/28(火) 02:20:58
>>81
その記事載せてるサイト晒せ。
84デフォルトの名無しさん:2005/06/28(火) 02:34:30
>>82
レスありがとうございました。
ということは、仮想関数にしないと
基本クラスのデストラクタは全く呼び出されないと...。
85デフォルトの名無しさん:2005/06/28(火) 02:34:33
>>76
printfに渡す前にbufの末尾を\0終端するのを忘れないように。
86K:2005/06/28(火) 02:39:46
pascalの宿題解いてくれませんか?
87デフォルトの名無しさん:2005/06/28(火) 02:55:05
>>86
いやです。
88デフォルトの名無しさん:2005/06/28(火) 03:18:36
>>84
違うよ。派生クラスのデストラクタが呼び出されない。
89デフォルトの名無しさん:2005/06/28(火) 07:00:26
C言語で、特定のキーを押しながら他のキーを押す、ということはできますか?
キー操作を行うオートパイロットソフトなんてものもあるみたいですが、
これを機にプログラムの勉強もできればと思ったのですが、
どこから手をつけてよいかさっぱりです。
90デフォルトの名無しさん:2005/06/28(火) 07:58:12
>>89
標準ではできないが、環境依存の部分で出来ることがある。
91デフォルトの名無しさん:2005/06/28(火) 08:16:23
ファイル内のある文字(例えばa)を数えるときに、

while(!cin.eof()) {
cin >> c;
if(c == 'a') { count++; }
}
と書くのと、
while(1) {
cin >> c;
if(c == EOF) { break; }
if(c == 'a') { count++; }
}
と書くのとでは結果が違いますが、これはどうしてでしょうか。
上でも良いような気がするのですが。

9289:2005/06/28(火) 08:24:10
>>90
お返事ありがとうございます。
環境依存で、ということは例えばウィンドウズ依存になるけど、ということでしょうか?

>>1のアップローダーの、「スレッドを立てるまでもないソース」の85に
詳細をうpさせていただきました。
93デフォルトの名無しさん:2005/06/28(火) 08:28:54
>>91
結果は変わらないと思うけど。
ただ上のやつでは
if(c == 'a')
のところで c の値が EOF のときにも比較しちゃってるだけの話でもちろん false だし。

>>92
うpしたならそのファイルへのリンクを張るようにしましょう。
94デフォルトの名無しさん:2005/06/28(火) 09:08:17
>>89
> C言語で、特定のキーを押しながら他のキーを押す、ということはできますか?

Cで(物理的に)キーは押せないだろう。
95デフォルトの名無しさん:2005/06/28(火) 09:13:37
ヒント:AIBO
96デフォルトの名無しさん:2005/06/28(火) 09:15:25
>>94
まあまあ、それくらいの言葉使い許してやってくれw
97デフォルトの名無しさん:2005/06/28(火) 09:20:23
>>94
重箱の隅つついてたのしい?
98デフォルトの名無しさん:2005/06/28(火) 09:51:02
いや、漏れは>94じゃないが>89の言いたいことが判らん。
プログラムで特定のキーを押したことにしながらオペレータに他のキーを押させたいのか、
プログラムで特定のキーも他のキーも押したことにしたいのか、
それらをプログラムで検出したいのか、
>89を読んだだけで判るのか?
99デフォルトの名無しさん:2005/06/28(火) 10:10:36
>>98
Ctrl+CみたいにA+Bとかやりたいという意味だととったが。
100デフォルトの名無しさん:2005/06/28(火) 10:41:49
100
101デフォルトの名無しさん:2005/06/28(火) 10:56:18
質問です。
ツールを作っていて、まず起動直後に
GetCurrentDirectory
しているのですが、環境によって内容が違ってしまいます。

私のマシンだときちんと起動された場所が取得できるのですが、友人のマシンですと
C:\Documents and Settings\XXXXXX\
といった、ユーザーフォルダがカレントディレクトリとして取得されてしまうのです。
(ともにWindows2000です)

そういえば昔、私はこの問題に腹を立てて、Windowsの設定から「カレントディレクトリをユーザーフォルダにしない」設定をした覚えがあります。

これについて解決方法を探しているのですが、EXEパスを利用することを考えたのですが問題がありました。
別のツールから「カレントディレクトリを指定した上で呼び出される」という性質と「直接EXE起動される」という性質をあわせもつツールなのです。

プログラム側でこれを回避する方法はありませんでしょうか?
最も良いのは「EXEを直接呼び出したとき、ユーザーフォルダにはいかないようにする」なのですが。
102デフォルトの名無しさん:2005/06/28(火) 11:02:34
exeパスじゃないとすると、どのディレクトリになって欲しいんだ?
103デフォルトの名無しさん:2005/06/28(火) 11:02:53
>>101
Windows GUI 環境における「起動された場所」とは何かという疑問があるな。
104デフォルトの名無しさん:2005/06/28(火) 11:06:28
>>102-103
すばやいお返事ありがとうございます。

>exeパスじゃないとすると、どのディレクトリになって欲しいんだ?
EXEをダブルクリックで指定された場合 → EXEパス
外部ツールから呼び出された場合 → 外部ツールに「カレントディレクトリを指定してEXEを起動」があるため、カレントディレクトリ

となって欲しいのです。

>Windows GUI 環境における「起動された場所」とは何かという疑問があるな。
確かにごもっともです。
ですが、なんとなく、やりたいことは察していただけるかなと思いますが、直接的な解決策はないものでしょうか?
105デフォルトの名無しさん:2005/06/28(火) 11:08:23
>>101
共にそれがカレントディレクトリなんだから、
そのままでいいんジャマイカ?

「C:\Documents and Settings\XXXXXX\」がカレントディレクトリだと何が問題なんだ?
106デフォルトの名無しさん:2005/06/28(火) 11:10:17
>>105
多数のファイルを作成して(フォルダ内を)散らかすツールなので、
「C:\Documents and Settings\XXXXXX\」を散らかされると使う側から見てムカツクのではないかなと思いまして。
107デフォルトの名無しさん:2005/06/28(火) 11:11:24 BE:98334672-
そもそもカレントディレクトリってEXEのあるパスのことではないが。
Windowsの挙動に腹を立てる前に、まずソフトの仕様がおかしいキガス…

EXEへのショートカットでも作っとけば?
ショートカットの設定で作業フォルダが指定できるから。
108デフォルトの名無しさん:2005/06/28(火) 11:14:26
C言語からsendmail等を使いたいんですが、
そういうパイプ処理はOS依存なんでしょうか?

WinXP BCC5.5.1です
109デフォルトの名無しさん:2005/06/28(火) 11:14:36
>>106
まず、「カレントディレクトリとは何か?」
から調べた方がいいよ。


とりあえず、その場合は使用者がカレントディレクトリを変えるものだろう。
110デフォルトの名無しさん:2005/06/28(火) 11:16:39
>>106
そう思うんなら、どこに行くかわからないカレントディレクトリを問答無用で使うのが間違い。
おとなしくコマンドライン引数使え。
111デフォルトの名無しさん:2005/06/28(火) 11:22:18
なるほど。了解いたしました。
通常はモジュールパスのフォルダを使い、
コマンドライン引数で「/current」と指定されていたらカレントフォルダを参照するようにします。
ありがとうございました。
112デフォルトの名無しさん:2005/06/28(火) 15:17:02
浮動小数点の仕様は、機種依存しますか?
倍精度(double)は考慮せず、
単精度(float)の場合のみのケースではどうなんでしょうか。
具体的には、Intel系 -> PowerPC系 へのコンバート
を想定してます。
113デフォルトの名無しさん:2005/06/28(火) 15:23:11
おそらくバイナリで保存して、という話だと思いますが、
Intel、PPCなど、メジャーなCPUは同じ規格の浮動小数点を使ってるので大丈夫です。
(ただしエンディアン変換の事も忘れずに)
114デフォルトの名無しさん:2005/06/28(火) 15:25:45
>>112
もちろん機種依存。

ただしC/C++とは無関係だけど、IEEE754という浮動小数点数表現の規格がある。
そしてIntelもPowerPCもこれを採用している。
115112:2005/06/28(火) 16:18:28
バイナリファイルにfloat型の同じ値を書き込んで、
実験してみた結果、同じ値を出しました。
丁寧な解説ありがとうございました。

116デフォルトの名無しさん:2005/06/28(火) 17:43:28
>>108
sendmailはunixでゴザイマス
117デフォルトの名無しさん:2005/06/28(火) 18:24:19
ttp://www.pro.or.jp/~fuji/mybooks/cdiag/cdiag.4.4.html
これは今でも通用しますか?
PCに限れば、昨今のコンパイラは最適化で
FPUではなくSSE/SSE2を使うように出来ます。
SSEはfloat、SSE2はdoubleなので
ここで述べられているようなキャストの差は
なくなっていそうです。
また、変数のサイズは小さい方がキャッシュの
ヒット率も良さそうですが、、
118267:2005/06/28(火) 18:33:32
double型の二次元配列を戻り値にしたいんですが,
gcc -o simplex simplex.c
simplex.c: 関数 `turnSimplex' 内:
simplex.c:80: error: 互換性のないポインタ型からのreturnです
simplex.c:80: 警告: function returns address of local variable
というエラーが出ます,どうやったらいいですか?
119デフォルトの名無しさん:2005/06/28(火) 18:43:55
>>117
CPUの性能向上で、よほどの大量の演算でも人間には時間のかかり具合なんて区別できないから、
どうせなら精度の良いdoubleにした方がお得な感じがする。

Cの数学関数はC99でfloat版も用意されたな。VC/BCCなんかにも独自に存在する。
どうせ中の人はあれだろうけど。
120デフォルトの名無しさん:2005/06/28(火) 18:44:08
>>118
それだけで何を推測しろと言うのだ?
エラー系の質問者はたいていそうだが、ソースくらい出せよ
121デフォルトの名無しさん:2005/06/28(火) 18:52:53
>>118
double ** じゃだめなん?
122デフォルトの名無しさん:2005/06/28(火) 19:05:53
>>117
状況にもよるが、大量の配列なんかを扱うときはキャスト云々よりメモリアクセスの速度のほうがはるかに致命的なんで、floatのほうが速いこともある。
123デフォルトの名無しさん:2005/06/28(火) 19:22:33
>>118

ローカル変数のポインタを返すのは…マズイっしょ。staticな配列ならいざ知らず。

double型配列をreturnで戻すのではなく、関数の引数として与えるように
関数の仕様を変えた方がいいと思う。
124108:2005/06/28(火) 20:52:40 BE:242417298-##
すみませんお願いします
125デフォルトの名無しさん:2005/06/28(火) 21:01:18
>>124
>>116の回答だけでは不満なのか?

まあ「パイプ処理」について言えば、機種依存だな
126デフォルトの名無しさん:2005/06/28(火) 22:26:22
テストデータを「ちょいとCかなんかで作ってよ」といわれて焦っています
昔ちょっと触っただけなのに
早速詰まってしまいました、ご教授ください

ABCDEFG00001
ABCDEFG00002

ABCDEFG10000
と末尾の数字だけカウントアップさせたファイルをたくさん作りたいのですが

char *msg = "ABCDEFG"
char *str = "00000";

for (short i = 1; i < 1001; i++) {
  str = (char *)i;
  char * strcat(msg, str)
  <msgの内容をファイルに書き出し>
}

みたいなのを書いたのですが、これだと
i<10000のときに桁数が減ってしまいます。
例えば i = 500のときはstrは "500" じゃなくて "00500"
としたいのですが方法ありますでしょうか。
127デフォルトの名無しさん:2005/06/28(火) 22:27:27
>>125
ヒント:スレタイ
128デフォルトの名無しさん:2005/06/28(火) 22:28:18
spritnf
129108:2005/06/28(火) 22:29:15
sendmailは例です
sendmane.exeでも何でもいいんです
130デフォルトの名無しさん:2005/06/28(火) 22:30:30
(char *)iって・・・・何このバカ・・・
131デフォルトの名無しさん:2005/06/28(火) 22:31:21
std::ifstream ifs("test.dat");
ifs.fill('0');
for (unsigned i = 1; i <= 10000; ++i) {
    ifs << "ABCDEFG" << ifs.setw(5) << i << '\n';
}
ifs.close();
132デフォルトの名無しさん:2005/06/28(火) 22:31:58
>>126
char *msg = "ABCDEFG";
for (int i = 0; i < 10000; ++i) {
fprintf(stdout, "%s%05d\n", msg, i + 1);
}
133デフォルトの名無しさん:2005/06/28(火) 22:32:30
>>126
なんでそれで動くのかがわからん。
for (int i = 0; i < 10000; i++)
{
    char buf[64];
    snprintf(buf, sizeof buf, "ABCDEFG%05d", i);
}
shortでメモリサイズけちろうなんて馬鹿な考えもやめろ。
134デフォルトの名無しさん:2005/06/28(火) 22:35:23
その程度ならワンライナーでつくれてしまいそうだ
135デフォルトの名無しさん:2005/06/28(火) 22:42:09
釣りってわかってて、みんな優しいですね。
136126:2005/06/28(火) 22:44:07
あほ丸出しで本当にお恥ずかしい、ありがとう
137デフォルトの名無しさん:2005/06/28(火) 23:45:44
このスレ良いね。
ひとつの答えだけじゃなくて何度かの答えがあるから
こういう考え方も出来るのかと勉強できる。

Q&A形式で過去ログまとめてみていい?
138デフォルトの名無しさん:2005/06/28(火) 23:56:43
ガソガレ
139デフォルトの名無しさん:2005/06/28(火) 23:56:53
>>137
どぞどぞ、大歓迎
140デフォルトの名無しさん:2005/06/29(水) 00:14:17
>>137
GJと称えられるであろう。
141デフォルトの名無しさん:2005/06/29(水) 00:31:36
>>137
過去ログdatのまとめたのでも要る?zipとかで渡せるけど
142デフォルトの名無しさん:2005/06/29(水) 00:40:58
このスレのPart1から居る奴とかすげーな
なんか尊敬できる
143デフォルトの名無しさん:2005/06/29(水) 00:41:50
独習Cと独習C++とかいう黄色い本をやり終えたのですが、黒い画面に文字や数字を表示するだけで終わってしまいましたorz
Windowsアプリやimodeのアプリ、PS2で動くゲームのようなものって一体どうやったら作れるのでしょうか?
144デフォルトの名無しさん:2005/06/29(水) 00:42:33
たまに脱線して黒煙あげるけどな。
145デフォルトの名無しさん:2005/06/29(水) 00:46:33
>>143
C/C++には標準的なグラフィックライブラリが無いので
言語を覚えただけでは絵はかけません

WindowsならGDI,GDI+, 3DもやるならDirectX
i-modeのアプリはJavaで書かれている

ゲームを作りたいならDirectXがおすすめ
146デフォルトの名無しさん:2005/06/29(水) 00:53:29
>>143

さて、次に何がしたい?
Windows、i-アプリ、コンシューマーゲーム機では要求されるスキルは
かなり違うと思われ。

Windowsプログラムを書きたいならまずはSDKサンプルについてくる?WinMainから始まる
全てのWindowsプログラムのスケルトンコードに自分の欲しい機能を付加していく、のが
一番とっつき易いだろうな。で、ある程度Windowsプログラムの何たるかが判ってきたら
MFCやATLといったWindows用ライブラリ、STL、boost、Lokiといった汎用テンプレートライブラリ、
マネージドコードがいいなら.net Frameworkを活用してプログラム作成を少しでも楽にするとよかろう。
147デフォルトの名無しさん:2005/06/29(水) 00:57:20 BE:224764984-
>>143
猫でもわかるプログラミングとかオススメ。(賛否両論あるだろうけど)
http://www.kumei.ne.jp/c_lang/

SDK編の「ウィンドウを作る」の項に目を通してみれば
Windowsアプリの雰囲気はわかると思う。
148デフォルトの名無しさん:2005/06/29(水) 01:07:45
>>145
グラフィックライブラリとは一体何ですか?
DirectXとJavaは聞いたことがありますが・・・。
小学生の時にBASICを使ったときはCIRCLE()を使え
ば円が描けたりしたのですが、C言語には無いんですか?

>>146
iアプリ、ゲーム機は芝居が高そうなのでWindowsアプリからやっていこうと思っていますが
独習C、独習C++をやったあと何をすればいいのか解らない状態です。

>>147
ウインドゥを作るのところ、みてみました。
あれを全部打ってウインドゥが表示されるだけってのはかなりつらい気がorz
149デフォルトの名無しさん:2005/06/29(水) 01:12:02
>>148
>あれを全部打ってウインドゥが表示されるだけってのはかなりつらい気がorz
あれを全部コピペして(ry
最初はコールバック関数だけでいいよ。
こーゆー用語も自分で調べてみよう(ヒント:googleで[用語 コールバック]。
150デフォルトの名無しさん:2005/06/29(水) 01:14:32
「用語 コールバック関数」だったわ、スマン。
151デフォルトの名無しさん:2005/06/29(水) 01:38:42
Windows上でどういったプログラムを開発しようとしているかだよなぁ…
ビジネス用アプリケーションなのか、ゲームなのか、小物的アクセサリー(時計、デスクトップ
アクセサリー、「アレ」以外の何かなど)やツール類なのか、特殊なユーティリティ
(アンチウィルス、ディスクチェッカ、ウィルス、ポートスキャン、クラッキングツール、
攻撃ツールなど)、はてはデバイスドライバなのか、システムサービスなのか…

まぁいずれは全部を視野に入れているなら、C/C++は賢明な選択だったと思う。

で、148さんよ、あんた作りたいプログラムがあるのかい?
152デフォルトの名無しさん:2005/06/29(水) 01:59:35
>>149
どうもありがとうございます。
コピペでいいんですか?w

>>151
今はどうやったらDOSの黒い画面に文字と数字しか表示
できない状態から脱却することだけしか考えられませんorz
CとC++の二冊で1000ページやって文字しか表示できないとは思っていなかったので。
ペイントブラシ程度のものが作れればとりあえずは良いと思っています。
153デフォルトの名無しさん:2005/06/29(水) 02:11:36
>>152
んじゃ猫のコピペで勉強だな
154デフォルトの名無しさん:2005/06/29(水) 02:13:15 BE:344171677-
>>148
>グラフィックライブラリとは一体何ですか?
BASICの場合は、言語自体に描画機能が付いてたけど、
C/C++には描画機能がないので、
代わりに、プラットフォームが用意する関数郡(ライブラリ)を呼ぶ。
たとえば Windows で円を描きたかったら、Ellipse、
UNIX等の X Window システム上で円を描きたかったら、XDrawArc、
を呼び出す、という具合に。

>>152
>コピペでいいんですか?w
いいんですw
初めは部品部品のコピペで、必要に応じてパラメータをいじればいいと思う。
というか慣れてきた後も、(信用できる)サンプルコードの
コピーをいじるって手法はかなり活躍するかと。

生のAPIを使ってWindowsプログラムを作る場合は、
誰が書いてもああいうコードが必要になるから覚悟したほうがいい。
でも機能のかたまりは使い回せるように自分用のライブラリでも
作っておけば、アプリ作成はそんなに辛くないと思う。

VisualC++のMFCとかC++Builderとか使うと
生のAPIをあんまり使わずに簡単にWindowsアプリ組めると思うけど、
俺は使ったことないのでわからんぽ。
155デフォルトの名無しさん:2005/06/29(水) 02:14:01
3DやりたいならOpenGLだろ
DXにいくとDQN化する可能性大
156デフォルトの名無しさん:2005/06/29(水) 02:39:08
Windowsアプリケーションの基本(メッセージポンプ、メッセージ、
ウィンドウクラス、ウィンドウプロシジャ、リソース...)を
一通り理解したらさっさとMFCかATL/WTLへ行くよろし。

なお、「理解」したいんなら猫は適切ではない。
157デフォルトの名無しさん:2005/06/29(水) 02:40:27
>>108
パイプ処理はもちろん環境依存。
sendmailのようなプログラムとどういうやりとりをしたいのか書きましょう。
158デフォルトの名無しさん:2005/06/29(水) 02:48:59
ポインタを整数値にキャストすることについての質問です。
サンプルを見て理解できなかったので、色々検索してみました
が、上手く掛かりませんでした。

pBufferに、freadでファイル内のバイナリデータ全て
を入れてます。(正しくは指している、です)

typedef struct {
int num;
float (*f)[16];
} t_loader;

t_loader* LoadFile(char* pFilename)
{
t_loader* pLoader;
// ファイル読み込み&Allocate
(略)
// mallocの戻り値ポインタを変換
pLoader = (t_loader*)pMallocPtr;
// ココです
pLoader->f = (float(*)[16])( (long)pLoader->f + (long)pLoader );

ポインタをlongにキャストし、「加算」した値というのは
どういう意味を持つのでしょうか?
キャストはアドレス値に変換しているのは分かるのですが、
加算というのが理解できないです。
159デフォルトの名無しさん:2005/06/29(水) 03:21:21
>>158
pLoader->fを+1すると, sizeof(float)*16バイト進んじまうだろ?
任意バイト進めるには(char *)とか(long)とかにキャストする必要がある。
ってことなんじゃねぇかな、何したいのか分からないこの子ー度。
160デフォルトの名無しさん:2005/06/29(水) 03:26:35
>>158
それ、実際に動作するコードなのか?
少なくともそれだけだと、ちょっと理解しかねる
161デフォルトの名無しさん:2005/06/29(水) 03:31:54
longにキャストしてる時点で糞コード
162デフォルトの名無しさん:2005/06/29(水) 03:36:30
161なら何にキャストする?
163デフォルトの名無しさん:2005/06/29(水) 03:49:39 BE:568936499-
>>162
161じゃないが、演算のためにポインタを整数値にキャストすること自体が
間違ってると言いたいのだろう。
164デフォルトの名無しさん:2005/06/29(水) 03:53:39
アドレス+整数は普通だが
アドレス+アドレスって、何か意味あんのか

一体何がしたいんだ
165158:2005/06/29(水) 03:54:00
構造体はサンプルでは、もっとメンバ多いです。
int n;
int nA;
...
float (*f)[16];
float (*f1)[4];
...
だから、本来(というより自分の知識内でのやり方)は
アドレスをサイズ分ずらしメンバのポインタに入れていくのを
longキャストの部分のおかげでコード量がかなり抑えられているように
感じます。
ポインタ->整数値の例を取り上げたサイトは御存じありませんでしょうか
166デフォルトの名無しさん:2005/06/29(水) 03:58:21
なんか、offsetofとか使えば済む話のように聞こえるんだが
気のせいだろうか
それにしても>>158のコードは不可解
167デフォルトの名無しさん:2005/06/29(水) 04:03:50 BE:140478454-
あぁ、なんかやりたいことわかってきた。
>pLoader->f = (float(*)[16])( (long)pLoader->f + (long)pLoader );
この行より前に、ポインタに整数値読み込む処理があるだろ?

組込系とかで、めちゃめちゃに資源が限られてたりするわけ?
そうでなければ、そのサンプルは糞だから参考にしないほうがいい。
168デフォルトの名無しさん:2005/06/29(水) 04:10:07
1)pLoader->f1, pLoader->f2,....に、実際のデータにおけるオフセットを入れる
2)pLoaderに、データ読み込み
3)pLoader->f1, pLoader->f2,....を再計算
ってとこかな

いや実に糞なコードだな
組み込みであっても、不要なコードだろ
169デフォルトの名無しさん:2005/06/29(水) 04:10:43
つーか(float(*)[16])の意味がわからんが
((float*)( (long)pLoader->f + (long)pLoader ))[16]
これならまだわかるが。
170デフォルトの名無しさん:2005/06/29(水) 04:14:08
テポドンの制御ソフトらへんだと思われ。
171デフォルトの名無しさん:2005/06/29(水) 04:15:10
>>169
はぁ?
(float(*)[16])は、float[][16]のような二次元配列を指すポインタに
キャストしとるだけだろ
172デフォルトの名無しさん:2005/06/29(水) 04:22:42
>>171
なるほど、やっとわかった。
なんつーか高度なのか
単にわかりづらいだけのコードなのかわからん。
173デフォルトの名無しさん:2005/06/29(水) 04:24:08
>>170
そうか。ポテドンだったのか。
174デフォルトの名無しさん:2005/06/29(水) 04:35:16
>>158
やっとわかった。
t_loaderのメンバのポインタは、ロード時にfread()でセットされるんだろ。
ファイルのヘッダレコードの中に、構造体のレイアウトどおりに
オフセットが記録してあって、データの先頭からのバイト位置(オフセット)が
一旦ポインタに格納される。
で、データをロードした後で、メモリ上のレイアウトを再計算してるわけだ。

ちょっとトリッキーだな。
175158:2005/06/29(水) 04:44:35
なるほど。fread時にポインタにオフセット値を
入れておくのですか。
ポンと手を叩きたくなるほど納得行く説明
ありがとうございました。
176デフォルトの名無しさん:2005/06/29(水) 09:53:02
>>158 は中略したのは問題有りだな。
177デフォルトの名無しさん:2005/06/29(水) 13:45:33
ctrl+cでプログラムを強制終了する際に、これをキャッチすることは出来ないでしょうか?
178デフォルトの名無しさん:2005/06/29(水) 13:59:24
自作クラスって外部変数として使えますか?

error C2653 : 識別子がクラス名でも名前空間名でもありません。
というエラーが出るのですが
179デフォルトの名無しさん:2005/06/29(水) 14:08:45
>>178
ヘッダをインクルドする前に型を使っている予感
180デフォルトの名無しさん:2005/06/29(水) 14:14:29
>>177
環境依存。
181デフォルトの名無しさん:2005/06/29(水) 14:15:52 BE:188547078-##
>>180
ヒント:スレタイ
182180:2005/06/29(水) 14:21:15
>>181
ヒント:>177は環境を提示していない。
183デフォルトの名無しさん:2005/06/29(水) 14:38:29
>>179
ありがとうございます。解決しました。
184デフォルトの名無しさん:2005/06/29(水) 18:54:00
>>182
スマソ
185デフォルトの名無しさん:2005/06/29(水) 19:25:09
#include <iostream>
using namespace std;

class CA {
public:
CA(void){}
CA(int){cout << "a";}
};
main()
{
//new CA(1)[2];
//new CA[2](1);
}

CA(int) のコンストラクタが2回呼ばれると思ったのですが、駄目でした。
配列でとった時、デフォルトコンストラクタ以外を走らせるのは不可能なの
ですか?
186デフォルトの名無しさん:2005/06/29(水) 19:44:50
不可能
187デフォルトの名無しさん:2005/06/29(水) 19:47:56
>>185
C++0xを待たれい
188デフォルトの名無しさん:2005/06/29(水) 19:49:32
>>186-187
諦めます。レスあじがとございました;;
189まとめ中:2005/06/29(水) 20:02:31
まとめサイト作るって言って歓迎されたのでまとめ開始してます。
ver17あたりからまとめてる所。
1スレだけで膨大な量なんでメモ帳で項目分割。
17以後のログは勝手にまとめてますが許してください。
17以前は過去ログにあるものだけ掘って見ます。
過去ログ進呈してくださる方歓迎。

日々日々良ソースやアルゴリズムなど有難う。
プログラマの皆さんに感謝をしつつ、まとめ作業開始。

以後、何事も無かったかのように本来の質疑応答をどぞ ↓
190デフォルトの名無しさん:2005/06/29(水) 20:06:58
>>188
配列各要素に同じ値でいいんだったら、
class CA1 : public CA {CA1() : CA(1) {}};
とでもすればいいじゃん。
#私は嫌だけど。
191デフォルトの名無しさん:2005/06/29(水) 20:07:47
>>185
new CA[2]; ってどういう意味ですか?
どういうふうに使うのですか?
192デフォルトの名無しさん:2005/06/29(水) 20:09:09
>>189
頑張れよー
193デフォルトの名無しさん:2005/06/29(水) 20:26:40
>>191
CAがクラスならCAクラスのインスタンスを2つ作る
CAが何かのデータ型なら、2つ分の連続したCA型変数の領域を確保する
194デフォルトの名無しさん:2005/06/29(水) 20:33:47
ん? こうなったよ?
#include <iostream>
using namespace std;
class CA
{
public:
  CA(){cout << "default" << endl;}
  CA(int x){ cout << "param int x = " << x << endl;}
};
main()
{
  new CA[2](10);
}

[実行結果]
param int x = 10
param int x = 10
195デフォルトの名無しさん:2005/06/29(水) 21:00:19
>>193
ありがとうございます。
196デフォルトの名無しさん:2005/06/29(水) 21:11:23
何かゴミ捨て場漁ってたらVC++6.0が出てきた。
どうすりゃいいんだ?一応インストしてみたら使えるし。
まぁ、いいや。わーいいいもん手に入れたー
197デフォルトの名無しさん:2005/06/29(水) 21:12:06
とりあえずSTLPortでもいれとけ。
198デフォルトの名無しさん:2005/06/29(水) 21:13:59
最新のPlatformSDKはVC++6.0では使えないので注意


所詮は過去のコンパイラよ
199デフォルトの名無しさん:2005/06/29(水) 21:28:58
ヽ(`Д´)ノ ウルサーーーイ
200145:2005/06/29(水) 21:57:49
Windowsアプリを作る場合、MicrosoftのVisualC++とかいうのは必要なのでしょうか?

いきなり数万も投資するのは抵抗があるので、とりあえずフリーでダウンロードできる
VisualC++Express2005Beta2とかいうのをダウンロードしたのですが、ボタンが多すぎるし
ヘルプは何処を読んで良いのか解らず全然使い方が解りませんorz
201デフォルトの名無しさん:2005/06/29(水) 22:06:21
WinAPIが扱えるならどれでも
VCがそれなりに便利なのは確かだけど
202145:2005/06/29(水) 22:08:26
ちなみに今使っているのは本のCD-ROMについていたBorlandC++コンパイラとかいう
DOS窓から使う味も素っ気もない奴なんですが、これで問題ないでしょうか?
203デフォルトの名無しさん:2005/06/29(水) 22:08:53
>>200
↓でも使ってみれば?C/C++じゃないけどC++書けるなら簡単に使えるはず
http://onigiri.s3.xrea.com:8080/delphi/index.php?Delphi%A4%CE%C6%FE%BC%EA%A4%C8%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%EB%2FDelphi6
204デフォルトの名無しさん:2005/06/29(水) 22:17:00
このスレ褒められてから回答が丁寧だな

おまいらほめられて伸びるタイプなんですね
205デフォルトの名無しさん:2005/06/29(水) 22:42:10
206デフォルトの名無しさん:2005/06/29(水) 23:46:24
>>194
そんな文法は標準では無かったはず・・・。
コンパイラ何?
207デフォルトの名無しさん:2005/06/29(水) 23:47:39
>>187
組み込み配列の要素ごとのコンストラクタ制御について、何か提案されてたっけ?
208過去ログQ&Aまとめ中 ◆tOP1/BWZ7g :2005/06/30(木) 00:01:33
>>205
有難うございます。作業量大幅UPキター(汗
作業してたらこんな時間orz
明日からpart1から編集入ろう。
まだローカル作業中。ページ申し込みしてきました。
1日で100レス以上行くので早い事part19まで編集しなければ追いつかない。

ガンガル
スレ汚しレスすまそ。
以後、何事も無かったかのように ↓
209デフォルトの名無しさん:2005/06/30(木) 00:03:57
>>208
現時点からにしとけよ。
210デフォルトの名無しさん:2005/06/30(木) 00:09:07
Unixとかのコマンドラインアプリで、画面の状態を更新する物はどうやっているんですか?
例えば、エディタとかゲームとか。普通にprintf系で出力してないんでしょうか。
211デフォルトの名無しさん:2005/06/30(木) 00:09:22
>>208ガンガレ
212デフォルトの名無しさん:2005/06/30(木) 00:45:05
>>210

cursesのことを指してるのかぇ?
213デフォルトの名無しさん:2005/06/30(木) 00:47:25
>>210
エスケープシーケンス
214デフォルトの名無しさん:2005/06/30(木) 00:56:19
>>208
もし貴方の優れた試みが成功したならば、恐らく多くの2chのプログラマーが
大きな助けとなるでしょう。

英語の直訳風に言ってみた。
215デフォルトの名無しさん:2005/06/30(木) 01:06:43
>>212
>>213
cursesで行けそうですね。有り難うございます。
エスケープシーケンスでもできるんですか?ちょっと想像つかないのですが...
216145:2005/06/30(木) 01:14:22
>>203
DelphiってPascalですよね。
CとC++を覚えたばかりで更に他の言語を詰め込むのってどうなんだろう。

普通Winアプリを作る場合、やっぱりC++BuilderとかVC++のようなRADツールを使うんですよね?
メモ帳でWinアプリのソースを書いてBorlandのC++コンパイラを使ってDOS窓からコンパイルしている人っていますか?
VC++Express2005の使い方がどこかにあればいいんですが、全然見つからないorz
やっぱり諭吉さんとお別れして製品版を手に入れるほか無いですかね。
というか製品版にはマニュアルついているんですよね?
パソコンにプリインストされていたOfficeみたいにマニュアルが付属していなかったら最悪orz
217デフォルトの名無しさん:2005/06/30(木) 01:15:31
>>215
man terminfo

つか、その手のプログラムのソース見れ
218デフォルトの名無しさん:2005/06/30(木) 01:16:18
書評みたいでいいな。発言者が「208氏」ってなんの。

「本ページは名無しの、名無しによる、名無しの為の過去ログである。
 トピックはどれも現場(学校、研修所、会社、学校)で生まれたものであり、
 これを読めば貴方もデフォルトと成ることでしょう(意味不明」
219デフォルトの名無しさん:2005/06/30(木) 01:54:04
>>217
man見ときます。すいません。
この手のプログラムって大抵巨大なんで初心者には厳しい...
220デフォルトの名無しさん:2005/06/30(木) 06:09:52
>>216
DelphiはDelphiである
221デフォルトの名無しさん:2005/06/30(木) 07:19:16
>>216
>CとC++を覚えたばかりで更に他の言語を詰め込むのってどうなんだろう。

そう思うでしょ? でもね、人間というのはティミが考えてるよりもっともっと
包容力があるんだよ。
222デフォルトの名無しさん:2005/06/30(木) 07:38:49
accelerated c++(和訳版)に載っていた入力単語の登場回数を数えるサンプルコードなのですが、
コンパイルは成功するのですが実行しても意図した動作をしません。
恐らく無限ループになっています。
何度か見直して、ちゃんと本の通りになっていると思うのですが・・・何処がダメなのでしょうか?
int main(){
string s;
map <string,int> counters;
while (cin >> s)
++counters[s];
for (map<string,int>::const_iterator it = counters.begin();it != counters.end(); ++it){
cout << it->first << "\t" << it->second << endl;
}
return 0;
}
223デフォルトの名無しさん:2005/06/30(木) 07:44:19
>>222
BCC5.5.1 + WindowsXPSP2 では正しく動く。
環境は?
224デフォルトの名無しさん:2005/06/30(木) 08:07:45
>>223
cinの入力終了方法を分かってませんでした_no
Ctrl+zを入力たら上手く動きました。
すみません。
225デフォルトの名無しさん:2005/06/30(木) 10:11:42
>>224
ダメだこりゃ! パーフーパーフー
226デフォルトの名無しさん:2005/06/30(木) 10:30:21
以下のプログラムを実行してもkeyは何も表示されず最後のレコードの値しか表示されません。
mapの使用を終える前にkeyをdeleteしてしまうとまずいのでしょうか?
しかし、最初のループでdeleteをせずに後のループでdelete &(it->first)と言う様にやってもダメな様だし
どうすれば良いのでしょうか?やりたい事は文字列をキーにしてunsigned int二つ分のデータを値にする事です。
#include <iostream>
#include <string>
#include <map>
using namespace std;
void itoa(char* str,unsigned int num) //数値から数字への変換関数
{unsigned int radix=10;unsigned int i=0;while(num){str[4-i]=(char)(num%radix+48);num/=radix;i++;}}
int main(){
map <string,unsigned int*> range;int i=0;string *index = NULL;char tmp[5] = "";while(i<10){itoa(tmp,i);index = new string(tmp);
range[*index] = (unsigned int*)malloc(sizeof(unsigned int)*2);(range[*index])[0] = i;(range[*index])[1] = i+10000;
delete index;i++;}i=0;for(map<string,unsigned int*>::const_iterator it = range.begin();
it != range.end(); ++it){
cout << "key:" << it->first << "\tvalue1:" << (it->second)[0] << "\tvalue2:" << (it->second)[1] << endl;free(it->second);}
227デフォルトの名無しさん:2005/06/30(木) 13:39:36
>>226
突込みどころ満載なんで一言だけ。
itoaが期待通り動作してない。
228デフォルトの名無しさん:2005/06/30(木) 14:42:23
>>226
itoa()のような非標準の関数使うなや。検証できない環境の香具師もいるんだぞ。
229デフォルトの名無しさん:2005/06/30(木) 14:57:05
>>226
こう?
#include <iostream>
#include <string>
#include <map>
#include <sstream>
#include <vector>
using namespace std;
int main()
{
typedef string Key;
typedef vector <unsigned int> Value_Container;
typedef map <Key, Value_Container> Map;
Map range;
for (int i (0); i < 10; ++ i)
{
ostringstream index;
index << i;
Value_Container &value_container (range[index.str ()]);
value_container.resize (2);
value_container[0] = i;
value_container[1] = i+10000;
}
for(Map::const_iterator it = range.begin(); it != range.end(); ++ it)
cout << "key:" << it->first << "\tvalue1:" << (it->second)[0] << "\tvalue2:" << (it->second)[1] << endl;
}
230デフォルトの名無しさん:2005/06/30(木) 15:01:28
64bitポインタの32bitへの縮小ってできます?
間違って宿題スレに書いてた..
231デフォルトの名無しさん:2005/06/30(木) 15:08:39
>>228
レス良く見れや。itoaをわざわざ定義してるやン
それがおかしいんだけど
あと、このスレは環境依存OKだったはず

>>229
struct Value_Container {
 unsigned int first, second;
 Value_Container( unsigned int f=0, unsigned int s=0)
   : first(f), second(s) {};
};
でいいような。
232デフォルトの名無しさん:2005/06/30(木) 15:26:07
>>230
キャストできるけど何が起きても責任は取れない
233デフォルトの名無しさん:2005/06/30(木) 15:26:58
>>231
もちろん

typedef pair <unsigned int, unsigned int> Value_Container;
とかも
234デフォルトの名無しさん:2005/06/30(木) 15:28:44
226はmallocだからvectorにしときました
235デフォルトの名無しさん:2005/06/30(木) 15:29:35
>>232
キャスト以外に方法ないんですかね?
32bitの領域にメモリ確保して移すとか
236デフォルトの名無しさん:2005/06/30(木) 15:55:54
>>235
キャストは方法に入らない
ダウンサンクで検索汁
237デフォルトの名無しさん:2005/06/30(木) 17:13:33
すんごい初心者な質問ですいません。

コンパイラがstdio.hファイルをオープン出来ないなですが、何故なんでしょうか?
238デフォルトの名無しさん:2005/06/30(木) 17:16:25
>>237
コンパイラが正しくインストール/セットアップされていない
239デフォルトの名無しさん:2005/06/30(木) 17:22:26
>>238 一応マニュアル通りにセットアップしたのですが
自分に落ち度があったかもしれません。
もう一度やり直してみます。ありがとうございます。
240デフォルトの名無しさん:2005/06/30(木) 17:38:53
パスが正しく設定されていない。
環境変数のチェック汁
241デフォルトの名無しさん:2005/06/30(木) 18:08:55
>>240
コンパイラは作動してるんだろうから、環境変数の問題じゃなさそうじゃね?
予想だがBCCの.cfgにパスを書き込んでいないくさい希ガス。
>>237はまずコンパイラが何なのかを書き込みましょう。
でないと答えようがないです。
242デフォルトの名無しさん:2005/06/30(木) 19:00:04
>>240-241さん。
コンパイルできました。
別の本みて、cfgファイル作ってみたら、上手く動作しました。
何で上手くいったのかはよく分かりませんが、何にせよ助言ありがとうございました。
243デフォルトの名無しさん:2005/06/30(木) 19:06:55
64bitポインタ型へのキャストの文がわからない..
64bitであることを明示するにはどうすればいいんですかね?.
(?)hoge
244デフォルトの名無しさん:2005/06/30(木) 19:20:26
>>243
64bitポインタの環境ならば*で64bitになるんじゃないのか?
245デフォルトの名無しさん:2005/06/30(木) 19:26:50
mingw日本版のインストール方法がわかりません
どなたか教えてください
mingwのインストールは出来ました

ディレクトリ名はMingw-jpにしておきました
そうしろとあったので
246245:2005/06/30(木) 19:27:23
win98です
247デフォルトの名無しさん:2005/06/30(木) 19:39:29
>>206
亀レスだが、cygwin gcc 3.3.3 です。
248デフォルトの名無しさん:2005/06/30(木) 19:44:10
インストーラダブルクリックであとは自動じゃなかったっけ?
環境変数
PATH  に Mingwのbin CPLUS_INCLUDE_PATH に includeが必要だっけ。
249デフォルトの名無しさん:2005/06/30(木) 19:49:11
>>244
設定とは関係なしに明示したいのですが...
ちなみにVS.net2003です
250デフォルトの名無しさん:2005/06/30(木) 19:49:25
1からCをやるのにオススメのサイトとかある?
251デフォルトの名無しさん:2005/06/30(木) 19:51:58
角度を入力してラジアンに変えるのを関数で定義したいです。
#include <stdio.h>
#define pi 3.141592
double rad(double a)

main(){
int ans,rad,x;
printf("角度を入力してください");
scanf("%lf", &x);
ans=double rad(double a)
printf("%f\n",ans);
}
double rad(double a){
int x;
a=x*(pi/180);
}
こう書いたんですがうまくきません。
252デフォルトの名無しさん:2005/06/30(木) 19:59:33
で、そのradって関数の定義はどこにあるんだ?
253デフォルトの名無しさん:2005/06/30(木) 20:01:31
>>251
intとdoubleがぐちゃぐちゃだし
関数の呼び出し方を理解していないようだな

ans=double rad(double a)
ってなんだ
ans = rad(a);
でよい
254デフォルトの名無しさん:2005/06/30(木) 20:02:22
セミコロンもないし。
幼稚園児にギリシャ語を教えるようなもんだな。
255デフォルトの名無しさん:2005/06/30(木) 20:04:55
#include <iostream>
int main()
{std::cout<<"うんこ"<<std::endl; return 0;}

ここまで覚えた
256デフォルトの名無しさん:2005/06/30(木) 20:11:19
>>253
#include <stdio.h>
#include <math.h>
#define pi 3.141592
double rad(double a)

main(){
double ans,rad,x;
printf("角度を入力してください");
scanf("%lf", &x);
ans=rad(double a);
printf("%f\n",ans);
}
double rad(double a){
double x;
a=x*(pi/180);
}
こうしましたが、結果がすべて0になってしまいます
257デフォルトの名無しさん:2005/06/30(木) 20:17:57
>>256
だから
ans=rad(double a);
は何なんだよ。
xに読んだんなら
ans = rad(x);
でいいだろが
258デフォルトの名無しさん:2005/06/30(木) 20:19:11
>>257
そこ直してもできません・・・
259デフォルトの名無しさん:2005/06/30(木) 20:24:52
double rad(double a) { return a*(pi/180); }
にしろ。

それと、関数の呼び方や実引数、仮引数についてもっかい勉強しなおせ。
260デフォルトの名無しさん:2005/06/30(木) 20:31:46
>>259
最初から書いてもらえませんか?
261デフォルトの名無しさん:2005/06/30(木) 20:37:48
すげー池沼だ
262デフォルトの名無しさん:2005/06/30(木) 21:03:35
うるせー馬鹿じじいども
質問してやってんだからさっさと答えろ
263デフォルトの名無しさん:2005/06/30(木) 21:04:36
↑俺じゃないです。
264デフォルトの名無しさん:2005/06/30(木) 21:31:17
お願いします
265デフォルトの名無しさん:2005/06/30(木) 21:56:51
>>263-264
最初からトリップ付けないからそうなる
人生の助言だけしとく
266デフォルトの名無しさん:2005/06/30(木) 21:58:04
  / ̄⌒⌒ ̄ ヽ
 |  丿ノソ ̄ハ ) )
 ( 彳  /  \|      ̄ ̄ ̄/  ─┼─ ──┐||  ─┼─   ./
 彡」   ・  ・|       |/    .|     .|     ゝ   /
 (6 ヽ   つ /     _ノ.     /   ___|   ヽ_   /⌒ヽ_ノ
 ミ  / /⌒⌒ヽ
 |    \  ̄ ノ
 |     /   

                                         
 / ̄| ̄ヽ    ├─  ヽ    ┼─‐    ‐┼‐  . / ̄| ̄ヽ     
 |  /  |   __.|     ̄ヽ   / __| ヽ  . ‐┼‐   |  /   |  
 ヽノ  ノ   (_ノ\    _ノ    (__ノヽ    ヽ__ノ  ヽノ   ノ  
                                       _ _    ___  _
                                      ,! /_| |__   |   |  ! /____,、
 ______|________   |三三|              ー十ー十ー    / __  __|  .| □ | /  __  __l´
 .    |     ー―――‐    ヽ、       ノ _________ ..く_/___| |___ ..| □ |く_/\ヽ| |
  .   人       | ̄| ̄|      , ヽ     ノ |    |    |___   ___| | □ |    ヽ | 
   ノ  ヽ     | ̄| ̄|     ノ  ヽ.      |  ロ. |      / ヽ     .|__ .__|    / /
 ノ     ヽ、      ̄| ̄    ノ     ヽ ..  |    ヽ|     / /\ \   / ヽ   / / ヽ\
              ̄| ̄                      ..く_/   \ `フく_/\`フ く/  \`フ
           ̄ ̄ ̄ ̄       
267デフォルトの名無しさん:2005/06/30(木) 22:14:52
>>256
不勉強にも程がある。

#include <stdio.h>
#include <math.h>
double rad(double a);
int main(){
double ans,a;
printf("角度を入力してください");
scanf("%lf", &a);
ans=rad(a);
printf("%f\n",ans);
return 0;
}
double rad(double a){
return a*(M_PI/180);
}
268デフォルトの名無しさん:2005/06/30(木) 22:42:54
#include <stdio.h>
#include <conio.h>

int main (void){
char test[1];
printf ("入力してください。");
printf ("\n");
scanf ("%c",&test);
if ( test == "key" ){
printf("正です。\n");
}else{
printf("不です\n");
}
getch();
}

keyと入力しても正にならないのは何故か教えてください。
269デフォルトの名無しさん:2005/06/30(木) 22:46:32
>>268
基礎からやり直し
#include <stdio.h>
#include <string.h>

int main (void) {
    char test[256];
    printf("入力してください。\n");
    scanf("%s", test);
    if (!strcmp(test, "key"))
        printf("正です\n");
    else
        printf("不です\n");
    return 0;
}
270デフォルトの名無しさん:2005/06/30(木) 22:46:44
keyは文字列
scanf ("%c",&test); で取れてるのは文字

つーかデバッグライトしろって
printfでtestの中身表示させれば気がつくことじゃないか
271デフォルトの名無しさん:2005/06/30(木) 23:08:06
>>269-270
マジ、有難うございます。
C始めたばかりでして、ご迷惑をおかけしました。
デバッグライトなど少しずつ覚えていきたいと思います。
272デフォルトの名無しさん:2005/06/30(木) 23:19:55
少しテンプレでも作ってみた。
-- 以下 テンプレ ------------------------
■ ここの人のお勧め書籍
独学C / 初めてのC / 猫でもシリーズ

■ 過去ログ
19以前は以下のdatを有難くDLしる。(ver19スレ >>205氏提供乙)
ttp://www.uploda.org/file/uporg137053.zip.html

■ここの過去質疑応答
過去ログQ&Aまとめ中 ◆tOP1/BWZ7g 氏が製作されているみたい。
(公開されたらURLを書く)

------ 以上、テンプレ ------------------------------------
273デフォルトの名無しさん:2005/06/30(木) 23:45:07
↑追加
■入門者向けC++お勧め書籍(C未経験者可)
標準講座C++
決定版 はじめてのC++
274デフォルトの名無しさん:2005/07/01(金) 00:17:01
404だよ
275デフォルトの名無しさん:2005/07/01(金) 00:17:54
全員集合
276デフォルトの名無しさん:2005/07/01(金) 00:20:19 BE:181812896-##
独習C++が一番良本だと思われ
277デフォルトの名無しさん:2005/07/01(金) 00:30:58
独習C++はCの知識が前提でしょ。C経験者向け入門書だな。

あと、標準ライブラリ、オブジェクト指向の解説はかなり薄口のような気がする。
278デフォルトの名無しさん:2005/07/01(金) 00:39:44
>>194,247
$ g++ --version
g++ (GCC) 3.4.4 (cygming special) (gdc 0.12, using dmd 0.125)
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ g++ -ansi -pedantic -Wall -W -fsyntax-only 194.cpp
194.cpp:10: error: ISO C++ forbids declaration of `main' with no type
194.cpp: In function `int main()':
194.cpp:11: error: ISO C++ forbids initialization in array new
279デフォルトの名無しさん:2005/07/01(金) 00:46:50
#include <iostream>
int main(){std::cout<<"Hello!"<<std::endl;return 0;}

をmingwでコンパイルしようとすると大量のエラーを吐いてexeが生成されません。
コマンドプロンプト使ってます

サイトにあったサンプルコード
#include<stdio.h>
int main(void){
printf("Hello GCC World on Windows!!\n");
}
はnewlineナントカというエラーがありましたが、exeが作られ、ちゃんと動きました。
280デフォルトの名無しさん:2005/07/01(金) 00:54:12
>>279
エラーメッセージを晒せ
281デフォルトの名無しさん:2005/07/01(金) 00:59:38
コマンドプロンプトに表示されたものをどっかに出力する方法ってありますか?
それと、エラーが長くて上の方が見られなくなってしまいます
282デフォルトの名無しさん:2005/07/01(金) 01:02:47
>>281
dir >dir.txt
283デフォルトの名無しさん:2005/07/01(金) 01:03:59
>>281
Windows のコマンドプロンプトなら、
タイトルバーを右クリックして「プロパティ」を表示。
 [オプション] > [編集オプション] > [簡易編集モード] にチェックを入れる。
 [レイアウト] > [画面バッファのサイズ] > [高さ] を思い切り(4096ぐらい)大きくする。

これでエラーは消えない(スクロールさせれば残ってる)し、
マウスで(ちょっと怪しいけど)テキスト選択ができる。
選択後のコピーは Enter なので注意。
284デフォルトの名無しさん:2005/07/01(金) 01:08:26
標準エラーもリダイレクトしたければ
NT系のcmd.exeなら

t.exe > out.txt 2>&1

のような感じで。
command.comではそういう技はつかえんのでフリーのツールを探せ
285デフォルトの名無しさん:2005/07/01(金) 01:18:45
とりあえずキャプってきました
ttp://sylphys.ddo.jp/upld2nd/pc/img-box/img20050701011715.jpg
286デフォルトの名無しさん:2005/07/01(金) 01:32:04
>>279,285
gcc でコンパイルしてるのか?
g++ にしてみれば?
287デフォルトの名無しさん:2005/07/01(金) 01:35:11
>>286
出来ました!
ありがとうございます!

何故>>279の上のはg++で下のはgccになるんでしょうか?
288デフォルトの名無しさん:2005/07/01(金) 01:43:52
やっぱC言語って奥が深いな。解りにくいけど、解れば先にポンポン進める。
あ〜コンソールアプリから早く先に進みたいよ〜。
つか技術評論社からでているC言超入門とはじめてのC++を読んでるけど、これでいいのかどうか。
というか俺はC言語で何をやろうとしていたんだっけ?
289デフォルトの名無しさん:2005/07/01(金) 01:44:28
>>288
つ チラシの裏
290デフォルトの名無しさん:2005/07/01(金) 01:44:59
>>287
gcc は C のプログラムということになるので、
C で必要になるライブラリは勝手にリンクしてくれる。

C++ では言語標準の機能を使うために
C では必要の無いライブラリを追加でリンクさせる必要がある。

g++ を実行すれば、その時点で C++ プログラムだということが
GCC に伝わるので、そこらへんを勝手にリンクしてくれる。

gcc でも、自分で -lstdc++ として C++ のライブラリをリンクさせれば
おそらく同じ結果が得られる。
291デフォルトの名無しさん:2005/07/01(金) 02:00:44
>>290
なるほど。

分かり易く説明していただきありがとうございました!
292デフォルトの名無しさん:2005/07/01(金) 04:46:03
>>279
newlineなんちゃらは、最終行の末尾の改行がナインジャマイカ。
293デフォルトの名無しさん:2005/07/01(金) 07:34:12
最終行の末尾の改行なんてなくてもいいだろ
294デフォルトの名無しさん:2005/07/01(金) 07:44:49
警告が出るんだよ。
ついでに言えば、コンパイラ(とそのオプション)によってはバグるんだよ。
295デフォルトの名無しさん:2005/07/01(金) 07:59:50
技術評論社の決定版はじめてのC++は内容が古いからやめとけ
STLとかテンプレートの事が一切書かれてない
296デフォルトの名無しさん:2005/07/01(金) 08:14:21
どこのアホコンパイラだ
297デフォルトの名無しさん:2005/07/01(金) 09:02:19
>>293
ttp://www.kuzbass.ru/docs/isocpp/lex.html#lex.phases
2.1/1 の 2. より
" If a source file that is not empty does not end in a new-line character, or ends in a new-line character immediately preceded by a backslash character, the behavior is undefined."
298デフォルトの名無しさん:2005/07/01(金) 09:04:09
超基本的な話だと思うんですけど、コンパイルして実行したら一瞬で消えてしまうのはどうやって対処すればいいのでしょうか?
299デフォルトの名無しさん:2005/07/01(金) 09:19:44
ちなみに
ttp://www9.plala.or.jp/sgwr-t/c/S/smpl06-2.html
ここのサンプルを使ってみたときの話です。
300デフォルトの名無しさん:2005/07/01(金) 09:42:24
>>298
何 が 消 え る ん で す か
301デフォルトの名無しさん:2005/07/01(金) 09:48:20
>>300
どうせWindowsのコンソールと思われ。

>>298
先にコンソール立ち上げてそっちから実行するかプログラムの最後にsystem("pause");でも入れとけ。
302デフォルトの名無しさん:2005/07/01(金) 10:10:36
system("pause");入れたら解決しました。
ありがとうございましたー。
消えると言うのはDos窓のことでした。
303デフォルトの名無しさん:2005/07/01(金) 10:19:17
>>301
キミ、荒っぽいけどやさしいね。
304デフォルトの名無しさん:2005/07/01(金) 10:42:08
>>296
LSI-C86。
なかなかシュールなバグでね、ニモニックが一個落ちるだけだから運悪く実行できてしまうともうね。
305デフォルトの名無しさん:2005/07/01(金) 12:01:59
次元配列のポインタをやりとりが解りません。

SubFunc(int **pData)
[
 int data[][64]=pData;
}
main(){
 int data[32][64];
 SubFunc(data);
}
出鱈目ですが、こんな感じにSubFunc内で次元配列として扱える様に
渡す&受けるにはどう記述したら宜しいのでしょうか。
306デフォルトの名無しさん:2005/07/01(金) 12:11:07
×ポインタを ○ポインタの
コンパイラはgccを使用しています。
307デフォルトの名無しさん:2005/07/01(金) 12:22:28
>>305
SubFunc(int (*pData)[64]);
308デフォルトの名無しさん:2005/07/01(金) 12:38:43
>>307
有り難うございます。 引き数の時点で配列数入れるんですか・・・
ちなみに、 int data[][64]=pData;
の様な、別のポインタにコピーする事も出来るのでしょうか?
309デフォルトの名無しさん:2005/07/01(金) 13:25:49
>>308
C/C++では、多次元配列は、最初の次元以外の次元はすべて指定しなければならない。
C++なら、vector<vector<int> > >& でも使った方がいいんでわ?

別のポインタにコピーするには、

int (*data)[64] = pData;

ってすればできるでしょ。
310デフォルトの名無しさん:2005/07/01(金) 13:59:31
>>309
失礼しました・・・ 引数は (int data[][64])で通ったので、代入も同様に
出来るのかと思ったら、代入はint (*data)[64]でないと駄目なんですね・・・
この二つの違いが分からない orz

C++には諸々制限付いてる某なのでおとなしくCで書いてます。
311デフォルトの名無しさん:2005/07/01(金) 14:03:45
>>310
int data[][64]→int (data[])[64]→int (*data)[64] と内部で変換されているから。

dataは定数なので、これには代入できない。ちゃんとポインタ変数である事を示す
ために、*data と書かなければならない。カッコは優先順位変更のため。

int a[] = {1, 2, 3}, b[] = {4, 5, 6};
a = b;

とやったらエラーが出るっしょ?それと同じと考えてくれたまへ。
312デフォルトの名無しさん:2005/07/01(金) 14:05:17
ちなみに、関数の仮引数の方の data は、ポインタ変数なので、代入できる
と思った。コンパイルして試してみてないけど。
313デフォルトの名無しさん:2005/07/01(金) 14:13:35
DOS用のコンパイラが欲しいのですがLSI-C86試食版とBorland C++ 1.0ではどちらがいいのでしょうか?
また、他におすすめなコンパイラはありますか?

環境はNEC MobileGear (PC/AT用MS-DOS6.2, ハーフVGA, HDDの代わりにコンパクトフラッシュ使用)です。
314デフォルトの名無しさん:2005/07/01(金) 15:10:28
>>313
スモールモデルでいいのか?そうであればLSI-C86試食版。
でなければBorland-C++の方がいい。
315デフォルトの名無しさん:2005/07/01(金) 16:35:54
VBのActiveXコントロールをC++で利用するにはどうすればいいんですか?
Visual C++のクラスの追加でOCXを読み込むとプロパティが消えてしまいます。
316デフォルトの名無しさん:2005/07/01(金) 17:08:25
>>315
それはもうだめかもわからんね。
317デフォルトの名無しさん:2005/07/01(金) 20:14:09
>>313
Digital MarsのDosExtenderもいいぞ。
318デフォルトの名無しさん:2005/07/01(金) 20:52:50
適切なスレが見当たらないのでここで。
最近C/C++のコンパイルにmakeを使い始め、サフィック
スルールを学んでいるところです。
某解説webページに従って
.c.o:
   cc -c $<
と記述することでMakefileがかなり楽に書けるようにな
りました。
しかし、ひとつのディレクトリにソースもオブジェクト
もゴチャ混ぜになるのが好きでないため、下記の様なデ
ィレクトリ構成でコンパイルしたいと考えています。
MakeDir\
  +-- SrcDir\
  +-- ObjDir\
  +-- Makefile
上記のようなディレクトリ構成の場合、サフィックスル
ールを使って楽をするにはどのように書けばよいのでし
ょうか?
319デフォルトの名無しさん:2005/07/01(金) 20:58:43
{SrcDir}.c{SrcDir}.o:
  cc -c -o$@ $<
とかかな
320デフォルトの名無しさん:2005/07/01(金) 21:40:08
>>319
タイプミスと思われるところを訂正して
{SrcDir}.c{ObjDir}.o:
   cc -c -o$@ $<
これでうまくいきました。どうもありがとう。
321デフォルトの名無しさん:2005/07/01(金) 22:12:44
質問ですが、C++をやるに当たって最初に必要なものはなんでしょうか?何か買う必要があるのでしょうか?
幾ら調べても本当にわけが分かりません、コンパイラーというのが有れば出来るものなのでしょうか?ご指導をよろしくお願いいたします。。
322デフォルトの名無しさん:2005/07/01(金) 22:15:48
>>321
そうだなコンパイラがいるな
むろんC++用のやつだ

その前にテキストエディタがいるが、まあ最悪viでもメモ帳でもSimpleTextでも
OS付属のやつでよい
323デフォルトの名無しさん:2005/07/01(金) 22:16:32
>>321
コンパイラがあれば出来る。

Google で フリー  C/C++コンパイラ

で検索すれ。
324デフォルトの名無しさん:2005/07/01(金) 22:16:37
>>321
藻前には基礎知識が必要がと思う。
325デフォルトの名無しさん:2005/07/01(金) 22:16:43
学生ならVisual Studio .NET the Spokeがある。
326デフォルトの名無しさん:2005/07/01(金) 22:17:01
>>321
Microsoft Visual C++ Toolkit 2003 質問箱
http://pc8.2ch.net/test/read.cgi/tech/1109618655/6-12
327デフォルトの名無しさん:2005/07/01(金) 22:19:41
Cの基礎が大体分かったからAPIに手出してみたらさっぱり意味わかんねえ…
328デフォルトの名無しさん:2005/07/01(金) 22:21:14
>>327
つ チラシの裏
329デフォルトの名無しさん:2005/07/01(金) 22:23:40
>>327
それはWindows APIのことだろうか

色々な型とかあってわけわかんねーよ
なんだよLPCSTRって
とかそういうのは、ヘッダよめ
なんでもgrepする癖をつけろ

typedefとか#defineとかそういうのだ

よく使われるtypedefはそんなに多くないし、ある程度は決まりきった
命名規則に従ってるから、そのうち慣れるだろ

あとはMSDNと友達になるこったな
英文ぐらい、泣き言言わずに読め
330デフォルトの名無しさん:2005/07/01(金) 22:45:03
うわ、チラシの裏ですみませんって言おうと思ったら丁寧な助言が…。
マジ感謝!
取り合えずMSDNナンパしてきます。
331デフォルトの名無しさん:2005/07/01(金) 22:55:34
>>322-326
なるほど!ありがとうございます!
ということは、何か買う必要はないという事でいいですか?
くどいようですが確認の為ご理解ください、申し訳ない
332デフォルトの名無しさん:2005/07/01(金) 22:56:48
>>331
>>325だけはただじゃないが格安で高機能。
333デフォルトの名無しさん:2005/07/01(金) 22:58:37
>>331
ソースファイルを、実行形式にするにはコンパイルが必要。
それにはコンパイラが必要。

コンパイラは、各社各団体からいろんな種類のものが、有償無償で配布されている。
その中からどれを選ぶかは、どういう目的でどういう環境で利用するかによって異なる。
334デフォルトの名無しさん:2005/07/01(金) 23:00:47
>>332
今調べてみました、すごくいい物のようですね
まだ学生なのでこれを買ってみる事にします!
皆さん本当にありがとう!
335デフォルトの名無しさん:2005/07/02(土) 10:40:44
デバッガ機能重視、Winのアプリ作りてーなら選択肢はVC++ pro以上、高いけど。
実行ファイルが作れればいいなら、ググればいくらでもあるはず。
336デフォルトの名無しさん:2005/07/02(土) 17:46:25
初学者はフリーコンパイラで充分だと思うがな。
コマンドラインで、printfデバッグしながらってのが、
やってること理解しやすいし。
337デフォルトの名無しさん:2005/07/02(土) 17:51:39
ソースブラウザつきのGUIデバッガで動き見るほうが
はるかに動きを理解しやすいが。
初心者ならなおさらだな。
338デフォルトの名無しさん:2005/07/02(土) 18:26:46
>>336 >>337
上記に関してはどちらとも納得できるが、
>>335
のpro以上は特に初心者には必要ないように思う。

スキーでもゴルフでも居るよね、カッコから入る奴。
初心者なのにフル装備ってのもどうかね。
339デフォルトの名無しさん:2005/07/02(土) 18:34:08
カッコから入っても別にいいと思うが
つーかスキーやゴルフと話が違うだろ
あれらは最初からイイ物そろえておいた方が結果的にいい
340デフォルトの名無しさん:2005/07/02(土) 19:30:53
カバンや文房具に例えてみる件。
341デフォルトの名無しさん:2005/07/02(土) 19:35:14
っ[安物買いの銭失い]
342デフォルトの名無しさん:2005/07/02(土) 21:12:06 BE:568936499-
安物を使いこなせるのは上級者だけだよな
343デフォルトの名無しさん:2005/07/02(土) 22:21:20
>>342
その程度のことで自慢にはなりませんし、
真の上級者は道具は良いものを選びます
344デフォルトの名無しさん:2005/07/02(土) 22:39:21 BE:189645293-
別に俺が上級者だと言ったわけじゃないが。
345デフォルトの名無しさん:2005/07/02(土) 22:46:33
まぁスルーしておけ
346デフォルトの名無しさん:2005/07/03(日) 00:44:59
初学者がHello Worldとか素数列挙とかのプログラム
組むのに、商用が必要か? って話だろ。
なんで上級者の話してんだよ。
347デフォルトの名無しさん:2005/07/03(日) 05:04:46
商用買ったらあかんのか?
348デフォルトの名無しさん:2005/07/03(日) 05:16:46
>>346
学生さんなら、>>325を数千円程度の支出で手に入れられるわけだ。

テキストアプリケーションを作るだけなら、むしろUNIX like OS+gccが
いいと思うが、Windowsを使っていてゆくゆくはGUIにも手を出したい、
というのであれば、数千円の価値は十分あると思うぞ。

タダほど高い買い物は無いってな。
349デフォルトの名無しさん:2005/07/03(日) 08:38:41
統合開発環境の温室育ちと組むと疲れる・・・。
決まってハイスペックなマシン要求するしな。
コンソールの使い方もプログラミングの一環だと思って
gcc、bccあたりを使って欲しい、あくまで個人的意見だが。
350デフォルトの名無しさん:2005/07/03(日) 09:45:44
改めてハイスペックと言うほどハイスペックなんじゃなくても動くし・・・
351デフォルトの名無しさん:2005/07/03(日) 10:18:54
とりあえずCに触ってみたいという程度ならgcc辺りで良いんじゃね
PATHのお勉強できるし、もし途中で投げ出しても損はしないし
352デフォルトの名無しさん:2005/07/03(日) 13:32:24
まぁCはフリーの良いコンパイラがたくさんあるんだし、「どんなコンパイラ(IDE含
む)が自分に合っているのか?」程度が分かるくらいになってから買えばいいんじ
ゃねぇの?
353デフォルトの名無しさん:2005/07/03(日) 15:47:05
引数つきのマニピュレーターってどうやって作るんですか?

cout << manip("hoge") << endl

みたいな。
354デフォルトの名無しさん:2005/07/03(日) 16:03:52
>>353
引数付きコンストラクタを持つクラスを定義して
そのクラスと std::ostream を引数にとる operator << を定義する。
std::istream なら operator >> な。
355デフォルトの名無しさん:2005/07/03(日) 18:40:30
プログラム板が荒れているため、IDを導入するか検討中です。
賛成の方も反対の方も、このスレで自分は賛成か反対かをお書きください。

プログラム技術板に強制ID制を導入すべきか否か
http://etc4.2ch.net/test/read.cgi/vote/1118144381/

理由などの記入は別に構いません。
<<賛成>>か<<反対>>かだけ御記入頂ければ結構です。
ちなみに、当たり前ですが運営の方にIPが見えているので、1日ごとにIDが変わるからといって多重投稿しないでください。
356353:2005/07/03(日) 21:25:04
>>354
ありがとう。ちと頑張ってみます。
引数無しのマニピュレーターの作り方の解説はいっぱいあるんだけどね。
357デフォルトの名無しさん:2005/07/04(月) 03:40:35
356じゃないけど、

hex みたいなマニュピレータは、出力なら自分の右辺で出力された値(または文字列)が必要になるよね?
これって引数のostreamから取り出せるの? それとも、単にsetf/unsetfしているだけ?
前者なら色々面白い独自マニピュレータ作れそうだけど、後者だと限界があるね。
358デフォルトの名無しさん:2005/07/04(月) 10:20:47
Linux Fedora Core4、gcc4.0.0でプログラム自分自身が使用している使用メモリ量の取得方法を教えてください。
getrusageを使ってみたのですが、ru_maxrssがつねに0になってしまいます。
359デフォルトの名無しさん:2005/07/04(月) 11:01:29
>>358
鼬害かさもなくばUnixプログラミングスレ向きかな。
それを知ってどうしたいのか分からんが。
360デフォルトの名無しさん:2005/07/05(火) 02:14:16
関数のオーバーロードって、
void Func(int i);
void Func(int i,float f);
みたいなのは無理なんですか?
361360:2005/07/05(火) 02:18:06
解決しました
362デフォルトの名無しさん:2005/07/05(火) 04:50:14
すいません、dequeの二次元配列はどのように実装すればいいでしょうか?
vectorの二次元配列の方法で試してみましたがうまくいきません・・・
363362:2005/07/05(火) 05:33:34
事故解決しました。もっとよく考えてから質問するようにします・・・
364364:2005/07/05(火) 06:43:43
質問です。
解決しました。
365デフォルトの名無しさん:2005/07/05(火) 09:27:19
http://www.ops.dti.ne.jp/~allergy/thread/thread.html
ここを見ながらマルチスレッドのプログラムを作っています。
スレッドに複数の引数を渡したい場合どうすればよいのでしょうか?
366デフォルトの名無しさん:2005/07/05(火) 10:26:50
>>365
引数を全部構造体に入れて、構造体へのポインタを渡す。
367デフォルトの名無しさん:2005/07/05(火) 21:28:45
Windows上でファイルの更新日付を取得したいのですが、API使わないとダメなのでしょうか。
368デフォルトの名無しさん:2005/07/05(火) 21:31:58
>>360-364
ワロス
369デフォルトの名無しさん:2005/07/05(火) 21:47:10
>>367
ダメ。
API使いたくない理由はなんなんだ?
370デフォルトの名無しさん:2005/07/05(火) 21:49:27
>>367
stat()
371デフォルトの名無しさん:2005/07/05(火) 21:52:55
>>369-370
ありがとうございます。
できるだけ環境依存じゃないほうがいいかな、と。
372デフォルトの名無しさん:2005/07/05(火) 21:55:54
移植性を高くしたいとか?
boost::filesystemって使えたっけ?
373デフォルトの名無しさん:2005/07/05(火) 21:56:50
>>371
「Windows」上でファイルの「更新日付」を取得しようとする時点で
環境に依存するのは自明だと思う

「」内はC/C++に亡い概念のハズ
374デフォルトの名無しさん:2005/07/05(火) 21:58:56
>>372
今ちょっとhpp見たけど、更新日付は扱ってなさそう。
375デフォルトの名無しさん:2005/07/05(火) 22:00:20
>>371
何故そう思うのかは知らないが、マルチプラットホームが
最終目的なら、自分でラッパを書くという選択肢もあるぞ。
376デフォルトの名無しさん:2005/07/05(火) 22:11:34
べつにstat()でいいだろ。
377デフォルトの名無しさん:2005/07/05(火) 22:14:54
YAGNI!YAGNI!
378デフォルトの名無しさん:2005/07/05(火) 22:18:14
だから条件がすでに環境依存・・・
379デフォルトの名無しさん:2005/07/05(火) 22:37:23
ファイルの更新日付を取得する実装くらい
出会うプラットフォーム全部分書けばいいじゃん。
380デフォルトの名無しさん:2005/07/05(火) 22:39:54
だからstat()で十分だろ
stat()使えない環境なんか、使ってるのか?
381デフォルトの名無しさん:2005/07/05(火) 22:40:02
ファイルの書き込みについてです。
for (int i=0; i<size; i++) {
  fputc(buf[i], fp);
}
より
fwrite(buf, 1, size, fp);
の方が大概速いですけど、
分割して書き込む場合どのくらいのサイズに分割するのがいいんでしょう?
もちろんシステム毎に最適値は違うと思いますけど、
このくらいの範囲が良いみたいなのってありますか?
382デフォルトの名無しさん:2005/07/05(火) 22:42:48
4096とか8192とか。
383デフォルトの名無しさん:2005/07/05(火) 22:45:51
>>381
一度に全部書き込む
あとは言語のライブラリとOSがうまいことやってくれる









実測しろよ!!
384デフォルトの名無しさん:2005/07/05(火) 22:48:51
>>382,383
ありがとうございます。
いろいろ試してみます。
385デフォルトの名無しさん:2005/07/05(火) 22:54:10
MSCはopen(),creat(),close(),read(),write(),lseek(),stat()のようなものに
ついてはPOSIX互換エミュレーション層つくってんのに
opendir()は無いんだよな昔から

それなのに_dos_findfirst()だの_findfirst()だのいう珍妙な
Cランタイム関数がある
いらねっての
386デフォルトの名無しさん:2005/07/05(火) 23:03:03
そこでboost::filesy(略
387デフォルトの名無しさん:2005/07/05(火) 23:06:33
>>385
名は体を表す。MS-DOS時代からの名残だ。
388デフォルトの名無しさん:2005/07/05(火) 23:07:34
Borland C++ Builder には opendir() があるからてっきり VC++ にもあると思ってた。
389デフォルトの名無しさん:2005/07/05(火) 23:12:39
>>386
言っちゃなんだが半端な気がするんだよな、boost::filesystemは。
なんかJavaみたい。C++なのに。

>>387
それはしっとる。

>>388
そうそうBCCにはあるけどMSCには無い。
だから、FindFirstFile()を用いてopendir(),...のラッパーを作って
利用しているプログラムはわりと見かける。
でも、FindFirstFile()はファイル名以上のものを返してくれるから、
移植性が不要な場合は便利なんだよな、opendir()系列よりは。
390362:2005/07/06(水) 12:28:15
皆様方、

class SP{
  ・
  ・
};

i = rand() % 6;
SP sp[i];

こんな感じにクラスの配列を宣言したいのですが、
定数式が必要、サイズが0などのエラーが出てしまいます。
どのようにすればできるでしょうか?
391デフォルトの名無しさん:2005/07/06(水) 12:30:47
>>390
・C99対応コンパイラを使う
・newやmallocで動的にメモリを割り当てる

お好きな方をどうぞ。
392391:2005/07/06(水) 12:35:59
個人的には↓やるのがいい希ガス
std::vector<SP> sp;
for(int j=0; j<i; j++)
 sp.push_back(SP());
393デフォルトの名無しさん:2005/07/06(水) 13:15:32
>>392
返答ありがとうございます。それで試してみます。

すいませんあと、>>391のnewで動的に割り当てるというのは
SP sp = new SP[i]; ですか?
394デフォルトの名無しさん:2005/07/06(水) 13:18:14
>>391
C++を使っている以上、前者はあり得ないと思うのだが。
395デフォルトの名無しさん:2005/07/06(水) 13:33:38
>>393
基本的なことなんで本買ってじっくり勉強せい
396デフォルトの名無しさん:2005/07/06(水) 13:48:23
>>395
精進しますだ。
397デフォルトの名無しさん:2005/07/06(水) 14:28:15
pthreadを使ってクラス内の関数をスレッド化することを考えています。 

    for (int i=0;i<threadnum;i++) 
    { 
        if(pthread_create(&tid[i],NULL,(THREADFUNC)threadRoutine,(void*)i) != 0) 
        { 
            perror("pthread_create"); 
        } 
    } 

と書くと、3行目のところで 
error: invalid use of member (did you forget the '&' ?) 
というエラーが出てしまいます。 

プライベートメンバ関数の 
threadRoutine 
を 
void threadRoutine(void* pParam); 
と宣言するところを 
static void threadRoutine(void* pParam); 
にすると、コンパイル可能なようなのですが、今度は、そのメンバ関数内で、staticではないメンバ変数が使えなくなってしまいます。 
メンバ関数をstatic関数にせずに、マルチスレッド化するにはどのようにすればよいのでしょうか?

(THREADFUNC)、tidはそれぞれ 

typedef void *(*THREADFUNC)(void *); 
pthread_t   tid[threadnum]; 

です。 
398デフォルトの名無しさん:2005/07/06(水) 15:04:20
>>397
向こうに答えが書いてある。
399397:2005/07/06(水) 16:49:28
回答レスのすぐ直後に
「君もC/C++の勉強をしたまえ! 」
というレスがあったので、正しいやり方ではないのかと思っていました。

そうすると、マルチスレッド化にはstaticは必須ということなのでしょうか?

また、この場合、同じクラス内の別のメンバ関数を呼び出したい場合はどうすればよいのでしょうか?
staticメンバ関数からは呼び出せないというコンパイルエラーが出てしまうのですが。
400デフォルトの名無しさん:2005/07/06(水) 16:54:37
>>399
>また、この場合、同じクラス内の別のメンバ関数を呼び出したい場合はどうすればよいのでしょうか?
>staticメンバ関数からは呼び出せないというコンパイルエラーが出てしまうのですが。
呼び出したいメンバ関数を全て静的にすればいい。静的メンバ関数間の呼び出しは何の問題もない。
401デフォルトの名無しさん:2005/07/06(水) 17:01:15
>>399
スレッド関数に引数経由でthisポインタを渡せ
あとは、それ使ってメソッドコールすればよい

402デフォルトの名無しさん:2005/07/06(水) 17:07:26
>>392
std::vector<SP> sp(i);でいいだろ。
403デフォルトの名無しさん:2005/07/06(水) 17:07:35
そもそも非静的メンバ関数って 暗にスタックへthis プッシュしてるから、そのままでは無理がある。
だから、 static void threadRoutine(void* pParam); とする。

397 がやりたいことは、
1) スレッド起動時の引数の pParm に相当するところへオブジェクトのポインタを渡す
2) threadRoutine 内では
void someclass::threadRoutine(void* pParam)
{
 someclass* pThis = (someclass*)pParm;
 // あとは pThis 経由でアクセスすりゃいいじゃーん
}
とすれば良いんじゃないかい
404デフォルトの名無しさん:2005/07/06(水) 21:01:35
HWNDのラッパクラスを作る時によく使われるね
405デフォルトの名無しさん:2005/07/06(水) 21:41:35
C++で構造体を使いたい時、

struct hoge{
};

でなく

class hoge{
public:
};

を使っているのですが、何か問題ありますか?
お行儀が悪いとか、構造体如きにclass様を使うとはけしからんとか。
406デフォルトの名無しさん:2005/07/06(水) 21:52:18
>>405
C++では全然問題ない。両者は全く同じ。
407デフォルトの名無しさん:2005/07/06(水) 21:52:23
本当に構造体を使いたいのならstruct{}でいいんじゃないの?
少なくともタイプ量はそっちのが少ないでしょ
408デフォルトの名無しさん:2005/07/06(水) 21:54:09
まさかstructはtypedefしないとCみたいに変数宣言とかにもstructを書かないといけないと思っているんじゃないか?
409デフォルトの名無しさん:2005/07/06(水) 21:58:49
>405
趣味の問題ではあるが、強いて言うなら同じ構造体を C でも使いたい場合に書き換える必要がある、って
ことぐらいかな。
漏れなら C と互換性のある構造体(静的メンバなし、メンバ関数なし)だったら常に struct を使うけど。
410デフォルトの名無しさん:2005/07/06(水) 22:18:38
早速のご回答ありがとうございます。
取り立てて問題なさそうなので安心しました。

>>406
ということはstructでもコンストラクタは呼ばれるんですね

>>407
classの方が打ちやすいもので、
というか、structが打ちにくい…

>>408
いや、そういうわけでは

>>409
Cで使うというのは想定外でした。
単なる構造体にはstructを使う人が多数派ですよねえ
411デフォルトの名無しさん:2005/07/06(水) 23:47:26
漏れはstructにもコンストラクタを書く派だ。
#いや、流石に必ず書くわけではないが。
412デフォルトの名無しさん:2005/07/07(木) 00:57:36
321です。度々申し訳ないのですが、PCが出来ない時間にも勉強したいので参考書を買おうと思っています。
そこでC++初心者にお勧めの参考書を教えていただけませんでしょうか。
くだらない質問ばかりですみません・・・
413デフォルトの名無しさん:2005/07/07(木) 01:08:09
>>412
>>273
どっちでもいいが1冊仕上げるまでは入門サイトなんか見るな。
C++の信頼できる入門サイトなぞ存在しない。
そして、GUIにも手を出すな。
最初は純粋に言語仕様にのみ関心を注げ。
414デフォルトの名無しさん:2005/07/07(木) 01:25:34
>>413
参考になります!入門サイトを見ながらやろうとしていたので見ないようにします、助かりました。
まずは参考書を仕上げる事に専念したいと思います。
また一つ疑問がでてきたのですが一つ参考書が仕上がったら
次の参考書を仕上げるという形で勉強していけばいいのでしょうか?
415デフォルトの名無しさん:2005/07/07(木) 01:32:31
>>397,399
正確に説明してみよう。

まず「メンバ関数」は「関数」と違い、呼び出すためにクラスのインスタンスが必要。
これは this ポインタと呼ばれる隠れた引数としてメンバ関数に渡される。
この違いにより、「メンバ関数へのポインタ」は「関数ポインタ」とは型が違う。

そして pthread_create() へ渡すのは「関数へのポインタ」だ。

非メンバ関数およびstaticメンバ関数は、Cと同じく関数名を書いただけで
「関数」から「関数へのポインタ」に自動的に変換されるので、
>397のような書き方で通る。
ただしキャストは不要、っていうかキャストすんな。

非staticメンバ関数は関数名を書いただけでは式として不正。
&T::MF と書くことで「メンバ関数へのポインタ」の値とすることができる。
ただしこれは pthread_create() が受け取る「関数へのポインタ」ではないので、渡せない。
また、VC系だと T::MF で同じ値が得られるが、これは標準ではない。

さぁこれで全部情報は揃ったはずだ。
416デフォルトの名無しさん:2005/07/07(木) 01:36:55
>>414
俺は>>413ではないけれども。1つ終わったら、何かを作ってみる。それで
分からない事があれば調べながら続ける、という流れの方がいいと思う。
で、同時に参考書(≠入門書)を読んで知識を吸収する。何冊も入門書を
読み続けるとモチベーションが続かない。どうせ何冊本を読んでも調べ
ながら作業するという形態は変わらないわけだから(よね?)、正しい情報を
うまく探し出す作業に慣れるのが大事だと、俺は思うよ。
417397:2005/07/07(木) 02:31:01
>>398>>400-401>>403>>415さん、どうもありがとうございました。
当面の問題にはこれで対処できそうです。

pthread+gccでスレッドプログラムを作ったのは、今回が初めてなのですが、
VisualC++やC++Builderでのスレッドプログラミングに比べてあまりスマートな印象
を受けないのですが、これはpthreadの仕様から来るものなのでしょうか?
それともVCやBCBは独自の拡張を施しているからなのでしょうか?

また、boostのthreadでもやはりpthreadと同様の制限が出てくるのでしょうか?
418デフォルトの名無しさん:2005/07/07(木) 02:57:30
>>417
逆に聞きたいのだが、VC++と較べてどの辺がスマートじゃないと思うのかね?
#私にゃ>397を見る限り大差ないとしか思えないのだが。
419デフォルトの名無しさん:2005/07/07(木) 02:59:09
>>417
スマートに出来るようにラッピングすればよろしい。
420デフォルトの名無しさん:2005/07/07(木) 02:59:34
VC++でも_beginthreadex()やCreateThread()を使う分にはやり方は同じだろ
COMが絡む場合は各スレッドでアパートメントの初期化とかせなあかんから
より面倒

あ、もしかしてIOCPで実装されてるスレッドプールみたいなヤツのことを
言ってるか?
421デフォルトの名無しさん:2005/07/07(木) 03:19:07
boost::thread は明らかに機能が少なすぎる。pthreadのほうが自由度高い。
boostもっとガンガレ。
422デフォルトの名無しさん:2005/07/07(木) 09:52:47
質問です。
int array[i];に対して、int *ptr;を用意し、
 ptr = array;
 cout << ++ptr << endl;
と書くと問題ないのに、
 cout << ++array <<endl;
と書くと、
 error C2105: '++' には左辺値が必要です。
と出てしまい、コンパイルが通りません。

arrayとそのまま配列名を書くと、
配列の先頭アドレス(先頭要素のポインタ)になる、
と勉強したのですが、なぜこのようなことがおきるのでしょうか。

どのように解釈すればよいのか、ご教示ください。
お願いいたします。
423デフォルトの名無しさん:2005/07/07(木) 10:06:29
>>422
(&i)++ がエラーになるのと同じ。

424デフォルトの名無しさん:2005/07/07(木) 10:06:41
>>422
++のオペランドは単なる値ではなく、変数でなくてはいけない。たとえば、
int a = 0;
a++; /* ok */
(a + 3)++; /* error */
425デフォルトの名無しさん:2005/07/07(木) 10:41:27
>>422
ま、初めのうちは int array[]; と int * ptr; (配列とポインタ)に関しては「似て非なるもの」として

同じ点:
・array[offset] とか ptr[offset] という書き方ができる
・array も ptr もアドレスを表す値になる

違う点:
・ ptr++; とか ptr+=1; とか ptr=ptr+1; という風に値を変更できるが array はできない
・ ptr=array; とか ptr=array+1; も↑同様にできるけど array はできない

と考えればいいんでね?
あとは徐々に理解を深めていけばそのうち納得がいくと思う。
426デフォルトの名無しさん:2005/07/07(木) 10:56:06
int array[] で array は &array[0] の略記法、で終る話じゃ?
427デフォルトの名無しさん:2005/07/07(木) 12:25:41
>>422
> arrayとそのまま配列名を書くと、
> 配列の先頭アドレス(先頭要素のポインタ)になる、

これがそもそもの間違い。
428デフォルトの名無しさん:2005/07/07(木) 17:21:30
質問というよりはアンケートに近いんですが,関数のパラメータで
入力のパラメータと出力のパラメータ,どちらを先に書きますか?
簡単な理由,例えば主要なAPIでの実例(memcpyとかは出力が先だから先にしてる,
いやいやSTLのアルゴリズムは入力が先)とか交えてもらえるとありがたいです.
ドキュメント(コード)に明記すれば良いというのは重々承知した上で,
純粋な興味から質問しています.
429デフォルトの名無しさん:2005/07/07(木) 17:33:06
適材適所。
430デフォルトの名無しさん:2005/07/07(木) 18:41:42
>>428
どっちでもいい。好きにしろ。
431デフォルトの名無しさん:2005/07/07(木) 19:18:47
>>428
入力パラメータであることを明確にするには、順序ではなくconstをつけて
関数内部で変更されない(つまり入力専用)であることを明示する。
432デフォルトの名無しさん:2005/07/07(木) 19:22:24
俺はいつも出力パラメータが先

なぜって、入力パラメータにはたまにデフォルト値を使うことがあるから
433デフォルトの名無しさん:2005/07/07(木) 19:34:03
出力がオプションだったりすると入力が先の方が都合がいい罠。
434デフォルトの名無しさん:2005/07/07(木) 20:01:31
そういうことを考えると、結局「ケースバイケース」なんだよな。
435デフォルトの名無しさん:2005/07/07(木) 20:10:37
ケースバイケースではあるが、少なくともある範囲では統一されてる
ほうが読みやすいし理解しやすいな
string.hは引数順序の考え方が統一されており
stdio.hはてんでバラバラだ
436デフォルトの名無しさん:2005/07/07(木) 20:14:45
たしかにな。

fprintf() は、可変引数の関係上、ファイルポインタを前に持ってこなければならない。
じゃ、なんでfputsは、最後でファイルポインタを指定させるんだろう?最初にもってくれば、
fprintfとの整合が取れるだけでなく、memxxx, strxxx系のデータ出力方向(右から左へデータが流れる)
とも一緒になってよさそうだけど。
437デフォルトの名無しさん:2005/07/07(木) 20:16:16
代入演算子も、右から左へデータが流れるな。
438デフォルトの名無しさん:2005/07/07(木) 20:43:08
va_arg マクロの第二パラメータにcharを指定するとコンパイルエラーで、
代わりにintにするとOKなんだけど、これって処理系依存の制限?
それとも規格?
439428:2005/07/07(木) 21:48:21
やはりケースバイケースという結論に落ち着きますよね.
でも色々有意義な視点での意見が聞けてとても参考になりました.
ありがとうございます.
440デフォルトの名無しさん:2005/07/07(木) 21:59:38
struct Hoge{
int a;
int b;
int c;
}

struct Moge{
int abc[3];
}

&Moge.abc[0] の隣は &Moge.abc[1]、 更に&Moge.abc[2] と続くわけですが
同じように &Hoge.a &Hoge.b &Hoge.c と連続して並ばせたいのです。
これはC++では保証されていないと思いますが、保証される方法はありますか?
441デフォルトの名無しさん:2005/07/07(木) 22:16:28
>438
とりあえず C と仮定する。
default argument promotion によって char 型の引数は int 型になっている。
従って、 va_arg の第 2 引数に char を指定しても、実引数の型とは一致しない。
9899:1999 だと va_arg で実引数の型と一致していない場合は未定義動作だから規格には合致している。
いずれにしろ、va_arg の第 2 引数に char は使えない。
442デフォルトの名無しさん:2005/07/07(木) 22:16:48
クラスのメンバー関数ではなく普通の関数のオーバーロードってどうやれば良いんですか?

class A
{
   virtual void func ( );
}

↑OK

↓NG

virtual void func ();

443デフォルトの名無しさん:2005/07/07(木) 22:21:17
>>442
オーバーロードの条件に virtual はない。その例なら。

void func ();

でいい。
444デフォルトの名無しさん:2005/07/07(木) 22:23:49
>>441
どうもです。実はC++なんですが。
Cより型チェックが厳しいせいで、エラーになってたのかな?
445442:2005/07/07(木) 22:24:43

void func() // これを
void func() // 別の.cppで定義したこれとか
void func() // さらに別の.cppで定義したこれとかで置き換えたい

…って全然意味わかんないよ。
絶対無理だから。
自己解決しました。
さわがせてすまん。
446デフォルトの名無しさん:2005/07/07(木) 22:44:17
環境依存いいんですよね?
Windows で高速なファイルの結合ってどうやるのがいいんでしょうか?
(UNIX だと mmap するのかなーとか思うけどこっちも使ったこと無い)。
447デフォルトの名無しさん:2005/07/07(木) 23:32:18
>>446
自力であれこれしようとせずに、system("cat foo bar > fooz");とでもする。
448デフォルトの名無しさん:2005/07/08(金) 00:06:59
> 'cat' は、内部コマンドまたは外部コマンド、
> 操作可能なプログラムまたはバッチ ファイルとして認識されていません。
449デフォルトの名無しさん:2005/07/08(金) 00:07:37
じゃtype
450446:2005/07/08(金) 00:11:04
いや、確かに経験上(つってもDOSの頃の話)

copy /b foo+bar fooz

が一番速そうなんだけど仕事でこれやるのダサい気がして…。
451デフォルトの名無しさん:2005/07/08(金) 00:19:48
「VC++6.0」と「猫でもわかる」を使って独習しているんですが、

int main(void)
{
char str[256];

cout << "Hello world!!" << endl;
cin >> str;
ofstream out_file("text.txt");
out_file << str;
return 0;
}

で出来ることになっているテキストファイルは、どのフォルダに出力されるんでしょうか?
452デフォルトの名無しさん:2005/07/08(金) 00:22:23
>>451
可憐とフォルダ
453デフォルトの名無しさん:2005/07/08(金) 01:14:05
>>427
いや、そこは間違いじゃないだろ。

6.2.2.1 #3
"an lvalue that has type ``array of type'' is converted to
an expression that has type ``pointer to type'' that
points to the initial element of the array object"

ttp://www.vmunix.com/~gabor/c/draft.html#73
454デフォルトの名無しさん:2005/07/08(金) 01:17:56
>>440
C++では保証されていないので、処理系ごとの拡張になる。
VC なら #pragma pack とか /Zp とか。
GCC なら __attribute__((packed(x))) とか -fpack-struct とか。

まぁ拡張なんであまりお勧めはできない。
本当に必要か良く考えてから使えよ。
455デフォルトの名無しさん:2005/07/08(金) 01:19:03
>>442,445
「オーバーライド」と「オーバーロード」の区別はちゃんとつけとこうな。
456440:2005/07/08(金) 01:27:19
>>454
C++標準で保証させる方法は存在しないのですね。
素直にあきらめます。
457451:2005/07/08(金) 03:13:51
>>452
検索したんですが、そもそも作成すらされていないようでした。
プログラム自体が間違っているのか、VC++は何か設定が要るのか....
458デフォルトの名無しさん:2005/07/08(金) 03:19:42
ほんとに単純なプログラムなんですけど

#include<stdio.h>
struct node /* 構造体node(節点)の定義 */
{
char nodename ;
struct node *left;
struct node *right;
}*ai;

main(){

int a;

ai->left=NULL;
a=4;
if(ai->left==NULL)printf("%d",a);

}

が動きません
何がいけないのでしょうか??
459デフォルトの名無しさん:2005/07/08(金) 03:22:48
>>458
aiの型は?
460デフォルトの名無しさん:2005/07/08(金) 03:23:10
>459
型とは・・?
461デフォルトの名無しさん:2005/07/08(金) 03:26:05
> が動きません
動くだろボケ。
ちょっと変なメモリ領域をアクセスしようとするだけで。
462デフォルトの名無しさん:2005/07/08(金) 03:27:04
動きませんよ
コンパイラはボーランドのフリー使ってますよ
それが原因だったのですか
463デフォルトの名無しさん:2005/07/08(金) 03:28:17
>>460
aiってポインタでしょ
何指してるの?
464デフォルトの名無しさん:2005/07/08(金) 03:30:26
>>458
ポインタ ai がオブジェクトを指していないのがいけない。
465デフォルトの名無しさん:2005/07/08(金) 03:33:46
#include<stdio.h>
struct node /* 構造体node(節点)の定義 */
{
char nodename ;
struct node *left;
struct node *right;
}*ai,h;

main(){

int a;
h=ai;
ai->left=NULL;
a=4;
if(ai->left==NULL)printf("%d",a);

}

こうやってみたんですが動きません
どういったふうにaiを指させればよいのでしょうか??
466デフォルトの名無しさん:2005/07/08(金) 03:35:39
訂正
ai=h
467デフォルトの名無しさん:2005/07/08(金) 03:37:30
>>466
ai=&h
468デフォルトの名無しさん:2005/07/08(金) 03:39:10
>467
ありがとうございます
けど動きませんでした・・・
469デフォルトの名無しさん:2005/07/08(金) 03:45:09
>>468
>けど動きませんでした・・・
あなたの「動かない」をもう少し詳しく

あと
int main(){
--------略-----------
return 0;
}
470デフォルトの名無しさん:2005/07/08(金) 03:47:04
はい
動かないというのは、
ボーランドのフリーのコンパイラでコンパイルはできたんですが、
実行するとエラー(core dumped?)がでてしまい
動作してくれませんでした。
471デフォルトの名無しさん:2005/07/08(金) 03:55:16
>>470
ちょっと信じれないのだけど...

どこで落ちてるのか(どこまでは正常に動いてるのか)確かめるために
--------略-----------
printf("0\n");
h=ai;
printf("1\n");
--------略-----------
ってかんじにソース中にプローブを散りばめてみてはどうでしょ?
472471:2005/07/08(金) 03:58:54
こっちがいいかも
--------略-----------
printf ("0\n"); fflush (stdout);
ai=&h;
printf ("1\n"); fflush (stdout);
--------略-----------

あとh=ai;は間違ってた
473デフォルトの名無しさん:2005/07/08(金) 04:01:04
>471さん
何かおかしいですね・・・
さっそく
int a;
以降にprintf("0);を作業一つ一つ終わるごとに入れてみたんですが
何も表示されることなくエラーがでてしまいました。

わけわからん・・・
474デフォルトの名無しさん:2005/07/08(金) 06:16:30
どこで動かしてんじゃろ・・・
ウチの環境(Win2k、VC++6.0)じゃ普通に動いて4が出力されて終わったが・・・
475デフォルトの名無しさん:2005/07/08(金) 06:21:05
Linux(FedoraCore4)+GCCでも動いた
476デフォルトの名無しさん:2005/07/08(金) 06:37:53
このスレでいいのか?わかりませんが誰か教えてください。
複数のプロセスから日付時間等のログを記録するライブラリを
作成するのですが、複数のプロセスからログファイルに書き込む為に
ログが時間軸で並んでいません、
マシンの日付時間を取得してからログファイルに書き込む間に
他のプロセスに処理が移行されてしまう為だと思うのですが
日付時間を取得からファイル書き込みまでの間を割り込み禁止にできないでしょうか?
後からsortコマンドで並べかえるのも考えましたが、できればファイルに書き込む段階で
時間軸に並んでいた方が都合がいいので。
当然、排他処理等は行っています。OSはLinux,言語はCです。
ログファイルは通常のテキストファイルです。
477デフォルトの名無しさん:2005/07/08(金) 07:04:52
クラス A が定義される前に A のポインタや参照を宣言したいときは、

class A;
A* a;

のようにすればいいことを知ったのですが、
A が名前空間の中で定義されている場合はどうすればいいのでしょうか。

class std::istream;
std::istream* in;

のようなことがしたいのですが、
この後の行で iostream をインクルードすると
「error C2371: 'std::istream' : 再定義されています。異なる基本型です。」
となってしまいます。
478デフォルトの名無しさん:2005/07/08(金) 07:26:53
>>477
<iosfwd>にstream系のクラスの前方宣言が入っているからこれをインクルードすれば良い。
479デフォルトの名無しさん:2005/07/08(金) 07:52:01
オレの知り合いに、自作PCで自作OSで自作言語で、自作プログラムしか使わないで
インターネットとか、メールしてる奴いるけど、オレにはどうもプログラムは向いていないようだ・・・
そいつ東大だしやっぱ頭のいい奴がする事なんかな。
480デフォルトの名無しさん:2005/07/08(金) 07:58:25
>>476
セマフォ
481デフォルトの名無しさん:2005/07/08(金) 08:01:53
>>480
セマフォを使って排他処理は行っていますが、
セマフォでは、日付時間を取得からファイル書き込みまでの間を割り込み禁止には
できません、どうしても他のプロセスからの割り込み処理が入ってしまいます。
482476:2005/07/08(金) 08:16:19
イメージとしては

 ・
任意の処理
 ・
割り込み禁止
日付時間取得
テキストファイルにログ書き込み
割り込み禁止解除
483476:2005/07/08(金) 08:30:05
>>480 わかりました
セマフォを使ってライブラリが実行中と判断しているだけなので
ログファイルがオープン中かどうかもセマフォで行えばいいのですね!
ありがとう、やってみます。
484477:2005/07/08(金) 08:43:25
>>478
ありがとうございます。解決しました。
485デフォルトの名無しさん:2005/07/08(金) 09:56:25
すみません
BSTR型で変数を定義しようとしたら
「定義されていない識別子です」のエラーが発生しました。

VC++6.0 WinXpです。
どのヘッダをインクルードすればよいのでしょうか・・・
486デフォルトの名無しさん:2005/07/08(金) 10:03:42
>>485
これを期にgrepの使い方くらい覚えなさい。
487485:2005/07/08(金) 10:20:01
>>486
アホはアホらしく標準ヘッダをgrepして死にかけました…
488デフォルトの名無しさん:2005/07/08(金) 10:27:22
Cの時はログを無効化する際に以下の様にマクロを使用しますが、

例)
ログが DebugLog("hoge"); の場合、
以下のようなマクロを定義しコードを無効化
#define DebugLog(x) {}

C++だとクラス名が前について DebugTool::DebugLog("hoge"); ってな感じに
なるため
#define DebugTool::DebugLog(x) {}
って書いても::のところで切られてしまうようです。
上手い代替案もしくは書き方で回避など実現方法がありませんでしょうか?
489デフォルトの名無しさん:2005/07/08(金) 10:31:13
>>488
#if defined(NDEBUG)
void DebugTool::DebugLog(x) {}
#else
void DebugTool::DebugLog(x) {DoDebugLog(x);}
#endif
490デフォルトの名無しさん:2005/07/08(金) 10:50:35
>>485
ただ「使え」と言ったんではない。
使い方を覚えろ、と言ったんだ。
アホらしく検索すればアホみたいに沢山出てくるに決まってる。
491デフォルトの名無しさん:2005/07/08(金) 11:01:40
例えば
grep "typedef.*BSTR" *.h
とかするんだよ。
492485:2005/07/08(金) 11:21:50
typedef.*BSTR とか \}.*BSTR
で検索してみても分からず…。

これって普通に使える型じゃないんでしょうか・・・
493デフォルトの名無しさん:2005/07/08(金) 11:31:49
1分ほどで分かるんだが。
wtypes.h:
typedef WCHAR OLECHAR;
typedef /* [wire_marshal] */ OLECHAR __RPC_FAR *BSTR;

rpc.h:
#define __RPC_FAR
494485:2005/07/08(金) 11:56:27
ありゃ。見逃してました・・・。
大変申し訳ないです・・・。
495デフォルトの名無しさん:2005/07/08(金) 13:10:49
過ちを記憶し、次は聞かずにできるようになれ。
それならばなんら問題なし。
496デフォルトの名無しさん:2005/07/08(金) 13:46:26
駄目だよ、なんかカコよすぎる
497デフォルトの名無しさん:2005/07/08(金) 13:46:56
bcc32で質問なのですが
union CPatch
{
 unsigned long patch_data;
 struct t_Part {
  char patch;
  char LSB;
  char MSB;
  __property bool Drum = {read=GetDrum, write=SetDrum};
  private:
  char drum;
  bool GetDrum() { return static_cast<bool>(drum); }
  void SetDrum(bool val) { drum = val ? 0x80 : 0x00; }
 } Part;
};
上のような共用体は問題無いのでしょうか?
期待した動作はしているようなのですが・・
498485:2005/07/08(金) 14:21:33
>>495
おかげでVBとVCの連携とか普通にできるようになりました。
ありがとうございます。
499デフォルトの名無しさん:2005/07/08(金) 14:25:07
>>497
「問題ない」とはどういう意味なんだろう。
少なくとも互換性という点に関しては、bcc以外では全く使えないという答になるが。
500497:2005/07/08(金) 14:58:03
>>499
やってはいけないことをやってないかという意味です。
501デフォルトの名無しさん:2005/07/08(金) 15:48:05
>>500
bccでしか通らないことを問題としないなら医院で内科医?
#まさか、このスレでbccとして問題ないか聞いているわけじゃないよな?
502デフォルトの名無しさん:2005/07/08(金) 19:07:05
作っていたプログラムをビルドすると、basetsd.h というのが
外部依存関係で出てきて、その中身を見たのですが、

#if ( 501 < __midl )

typedef [public] __int3264 INT_PTR, *PINT_PTR;
typedef [public] unsigned __int3264 UINT_PTR, *PUINT_PTR;

typedef [public] __int3264 LONG_PTR, *PLONG_PTR;
typedef [public] unsigned __int3264 ULONG_PTR, *PULONG_PTR;

#else // midl64

この一文、[public] の部分の意味がわかりません。
503デフォルトの名無しさん:2005/07/08(金) 19:10:19
なぜ開発環境を書かないのですか?
504デフォルトの名無しさん:2005/07/08(金) 19:47:15
書いたところで解るのですか?
505デフォルトの名無しさん:2005/07/08(金) 19:50:11
>>502
上の#if ( 501 < __midl )に注目しろ。
これはMIDLコンパイラが使う部分であって、C/C++コンパイラは読まない。
506デフォルトの名無しさん:2005/07/09(土) 16:35:12
プログラム起動時にLANコネクタが接続されているかどうかを
プログラム上で検知する方法が解りません。
Windows API にもそれらしい関数を見つけられませんでした。

機能としては、Windowsでタスクトレイにあるネットワークアイコンが
ケーブル未接続状態ですと×印が付きますよね。あの様な
機能を実装したいと思っております。

何か良い方法は御座いませんでしょうか?

参考ページとなるようなことでも構いません
507デフォルトの名無しさん:2005/07/09(土) 16:50:25
あれは別にケーブルが接続されてないから出るわけではない
508デフォルトの名無しさん:2005/07/09(土) 16:55:57
>>506
接続先が存在するか否かで判断すればいいんじゃ?
509デフォルトの名無しさん:2005/07/09(土) 16:57:56
ま、無線もあることだし^^
510デフォルトの名無しさん:2005/07/09(土) 17:01:16
APIどーのよりTCP/IPを勉強すべし
511デフォルトの名無しさん:2005/07/10(日) 07:07:55
速度向上のためにinlineを指定しようと思ってますが、
いかがなものでしょうか?
あまり意味のないことでしょうか?
512デフォルトの名無しさん:2005/07/10(日) 07:20:16
>>511
意味のないinline化をしてしまうことがないように
プロファイルしてから効果的なところのみをinline化するといいですよ
513デフォルトの名無しさん:2005/07/10(日) 09:24:13
本当に高速化を狙うなら、inlineより マクロの方がいいよ。
inline 関数がインライン展開されても、普通に引数のプッシュポップや、スタック操作とかの、
関数処理の準備/後始末コードが埋め込まれることもある。
マクロなら、そういうことが全然なくて、レジスタの取り回しにも無駄が発生しない。
514デフォルトの名無しさん:2005/07/10(日) 09:33:06
そんなに大した差ではない気がする…。
マクロだと式を二重に評価してしまうミスを起こしがち。

#define max(n,m) ((n)>(m)?(n):(m))
inline int max(int n,int m){ return n>m?n:m; }

void f(std::istream& in)
{
 int n=max(in.read(),in.read());
}

こういうミスのないように、inlineのほうをオススメしたい。
515デフォルトの名無しさん:2005/07/10(日) 09:34:15
#define max(n,m) ((n)>(m)?(n):(m)) ←意図しない結果
inline int max(int n,int m){ return n>m?n:m; } ←意図する結果
516デフォルトの名無しさん:2005/07/10(日) 09:36:37
>>514
その例はたまたまOKだけど、関数引数の評価順序って決まってないんじゃなかったっけ?
n,とmの順序が意味を持つ関数なら、問題起こるんじゃないか?
517デフォルトの名無しさん:2005/07/10(日) 09:38:25
もちろん、マクロの危険性はわかるけど、それは関数と明確に区別
(マクロ名は大文字、関数は小文字みたいに)して、危険なコードに
ならないように気を使えば済むこと。
518デフォルトの名無しさん:2005/07/10(日) 09:41:36
それですまないのが人間というもの
519514:2005/07/10(日) 09:45:02
>>516
ごめん、引数の評価順序のことは忘れてた。
この例では、in.read の呼出回数が2回であるのに対して
マクロのほうだと3回呼ばれてしまうっていうことを示したかった。
520デフォルトの名無しさん:2005/07/10(日) 09:57:37
>>513
寡聞にして、
>普通に引数のプッシュポップや、スタック操作とかの、
>関数処理の準備/後始末コードが埋め込まれることもある。
こういう例を知らないのだが。
具体例を挙げてもらえまいか。
521デフォルトの名無しさん:2005/07/10(日) 10:14:05
最適化で綺麗さっぱり消えそうな気がするが。>inline関数処理の準備/後始末コード
522511:2005/07/10(日) 10:37:03
最適化に関して、お勧めのサイトはないでしょうか?
高速化に関して勉強をしたいと思ってますが。

今、案件で文字列解析のものをしてまして、
苦戦をしてます。
523デフォルトの名無しさん:2005/07/10(日) 10:51:42
>>522
文字列解析なら寧ろ、アルゴリズムを見直すのが一番じゃね?
小手先の最適化をいくら施してもデータ件数に対するオーダーが変わるわけじゃないし。
つーことで、

つ[Google]
524511:2005/07/10(日) 11:18:05
>>523
ありがとうございます。
今、休日返上でアルゴリズムの改良をしてます。
かなり速くなりました。

あと一つお聞きしたいのですが、

クラスのメンバ関数内でstatic int a;と宣言したとしますよね。
この場合は、クラスオブジェクト単位でのstaticですよね。

たとえば、
CMyClass a,b;とあったとして、
void CMyClass::func(void)
{
static int a;
}

とあったら、このローカル変数aは全てのCMyClassオブジェクトをまたがる(共有する)変数となるのでしょうか?
525デフォルトの名無しさん:2005/07/10(日) 11:35:49
Yes。
メンバ関数はオブジェクト毎ではなくクラス毎に生成されるってことを
頭に入れておくと理解しやすいと思う。
526511:2005/07/10(日) 11:38:04
>>525
ではCMyClass a,b;両方のオブジェクトで静的なローカル変数を共有すると。
なるほど。
ご返答助かります。

ありがとうございまいた。
527511:2005/07/10(日) 12:37:24
STLのstringのfind関数と、CString(MFC)のFind関数とではどっちが速いのでしょうか?

今はSTLを使ってますが、
どうやらこのfindが重さのネックのようです。
528デフォルトの名無しさん:2005/07/10(日) 12:42:53
どういう用途で使ってるのさ
529511:2005/07/10(日) 12:48:06
std::stringで使ってるクラスを、CStringに変えて、CString::Find検索にしたところ、
劇的に速くなりましたw

STLって重いんですね。
ちょっとSTLのスレッドでその辺を質問してこようと思います。
530デフォルトの名無しさん:2005/07/10(日) 13:09:02
Game.hでButton.hをインクルードし、Button.hでGame.hをインクルードみたいに、
お互いにインクルードみたいなことがしたいんですが、
やる方法がありましたら、教えてください。
531デフォルトの名無しさん:2005/07/10(日) 13:13:09
>>530
それに未来はないのでヘッダファイルの整理を推奨します。
532デフォルトの名無しさん:2005/07/10(日) 13:26:46
>>531
やっぱ、そこですかね。
方法自体も探してたんですけど、みつからなかったですし。
#ifndef〜#endifは重複対策で相互対策ではないですしね。
ありがとうございました。
533デフォルトの名無しさん:2005/07/10(日) 13:28:34
>>529

std::string text = >>529;
for(int i=0; i<1000,000; i++)
text.find("質問");
でやってみた。(BCB6#4)

std::printf.find > 4246sec
CString.Find > 2774sec
AnsiString.Pos > 1192sec
534デフォルトの名無しさん:2005/07/10(日) 14:10:40
>>530
仕事自体、考えたほうが吉。
535デフォルトの名無しさん:2005/07/10(日) 14:50:02
>>533
俺もやってみたけどCStringの方が遅かった。
_mbsstrを呼んでいるためのようなのでそこをどうにかしてみたけれど、
やっぱりstd::stringの方が早かった。
ATL::CString 3857ms
std::string   3069ms
(10,000,000回forで回した)

CStringは最終的に_mbsstrを呼んでいた。
std::stringは検索対象の1文字目を取り出して、それをchar_traits::findで検索し、
見つかればそこからchar_traits::compareして一致しているかで探している。
536デフォルトの名無しさん:2005/07/10(日) 15:09:01
>>535
ワタシはCStringのほうが軽いです。

実行した環境は何でしょうか?
わたしはVC++6です。
537デフォルトの名無しさん:2005/07/10(日) 15:31:15
5000個ぐらいのファイルを10種類の分類したいのですが
ファイルのパスを変更するやり方がわかりません。
どなたか教えてください。
538デフォルトの名無しさん:2005/07/10(日) 15:34:08
超初歩的な質問で申し訳ないんだけど
オープンしたテキストファイルの途中にfprintfで書き込むことってできる?
追加ならできるんだけど・・・
539デフォルトの名無しさん:2005/07/10(日) 15:38:11
>>538
できる。
540535:2005/07/10(日) 15:39:47
>>536
VC++7.1だ。念のために言っておくと535のCStringはstrstrを呼ぶようにしての値だ。
541デフォルトの名無しさん:2005/07/10(日) 15:46:59
539>>
できれば教えてください…
542デフォルトの名無しさん:2005/07/10(日) 15:52:46
>>541
オープンしてテキストファイルの途中に行きfprintfで書き込め
543デフォルトの名無しさん:2005/07/10(日) 15:58:56
>>542
意地悪だなw

>>541
fseek
544536:2005/07/10(日) 16:00:37
自分で独自Find作ったら、それが今のところ一番速いw
どうなってるの?
545デフォルトの名無しさん:2005/07/10(日) 16:04:32
>>544
シラネーヨ。ソース晒せば?
546デフォルトの名無しさん:2005/07/10(日) 16:44:33
てかstd::stringを日本語でfindって大丈夫なんか
あぶなくね?
547538:2005/07/10(日) 17:27:35
>>542
>>543
ありがとう!やってみる
548デフォルトの名無しさん:2005/07/10(日) 17:57:38
>>544
どうせマルチバイトも考慮しないconst char*引数にとる関数だろ?
CStringはマルチバイト意識してるしstd::stringは参照連結意識してるし
ただの配列検索するだけのクソコードより遅いのは当たり前。
549デフォルトの名無しさん:2005/07/10(日) 18:01:13
_mbsstr()使ってりゃCStringTは遅いだろ
SBCS、またはUNICODEは前提じゃね?
550デフォルトの名無しさん:2005/07/10(日) 18:52:27
まず最初に、どこから勉強をすればいいんですか?
ネットを初めてまだ1ヶ月の漏れですけど
教えてくださいお願いします。
551デフォルトの名無しさん:2005/07/10(日) 18:54:23
>>550 情報検索と質問のやり方。
552550:2005/07/10(日) 18:57:58
>>551
とりあえずC++をマスターすればいいんですか?
情報検索はぐぐれば何とかなりますよね?
553デフォルトの名無しさん:2005/07/10(日) 19:07:17
>>552
とりあえず何がしたいのかがわからないと何もいえない。
「C++をマスター」というのも、具体的に何のことかわからない。
自分以外の人が読むことを考えて文章をよく読み直すようにしろ。

情報検索は、基本的にGoogleで問題ないと思う。
技術情報は英語を検索対象として使えると、
日本語だけよりも数倍幅が広がるぞ。

あと、C/C++に関する具体的な質問でなければ、ここはスレ違いだ。
別スレいけ。
554デフォルトの名無しさん:2005/07/11(月) 01:49:01
再帰ってなるべく避けた方がいいのでしょうか?
それともばんばん使ってもいいの?
555デフォルトの名無しさん:2005/07/11(月) 01:56:10
人によって意見が分かれると思うが、一般に再起を使うと分かりにくくなるし、
メモリが限られるシステムの場合はスタックオバーフローなどの危険が伴う。
ただ再起を使わないととても複雑になる処理(ディレクトリツリーや魔方陣等)
もあるので臨機応変に。
556デフォルトの名無しさん:2005/07/11(月) 01:58:07
>555
ありがとうございます
557デフォルトの名無しさん:2005/07/11(月) 17:04:06
データのダンプをするプログラムで、
ループ処理の中で呼び出されるある関数の中で10Mくらいのサイズの変数を使いたいのですが
mallocしても、char data[10000000]="";としても、
数回の実行でセグメンテーション違反が出てしまいます。
mallocの場合は一度ずつフリーしているし、char dataで用意した場合は一度実行したらreturnでブロックの外に行っているので
メモリ領域は解放されているはずなのですが・・。
取得するメモリ領域を小さくするとループされる回数が増える(セグメンテーション違反のタイミングが遅れる)から
メモリ不足が原因だと思うのですが、マシンの空きメモリは60Mくらいあって、最大10Mのメモリ取得なら問題無いはずだし。
どんな原因が考えられますか?
558デフォルトの名無しさん:2005/07/11(月) 17:10:18
>>557
症状が再現する最小のプログラム片を晒してみろ。
559デフォルトの名無しさん:2005/07/11(月) 17:16:05
>>557
malloc()は兎も角、ローカル変数はスタックに取られるので無理。
あと>558。
560557:2005/07/11(月) 17:38:09
再現するプログラムを作ろうとしたら再現しなくて
元のソースを良く見たら別の関数でメモリリークしてました_no
ごめんなさい!!
561デフォルトの名無しさん:2005/07/11(月) 17:43:54
class CBase {
int m_nData1;
int *m_p;
public:
int GetData1 () { return m_nData1; }
int * GetP () { return m_p; }
};

class CSub : public CBase {
int m_nData2;
public:
CSub () { ZeroMemory(this, sizeof(CSub)); }
int GetData2 () { return m_nData2; }
};

あの、質問です。コンストラクタによる初期化で迷ってます。
コンストラクタで全部0にしたい場合、
ZeroMemoryでthisを指定して、全部0にしちゃっていいんでしょうか?
↑のはいちおう全部0が入ったのですが・・。
どなたかお願いします m(__)m
562デフォルトの名無しさん:2005/07/11(月) 17:44:58
>>561
だめ。
563デフォルトの名無しさん:2005/07/11(月) 17:47:52
>>561
仮想化した瞬間アボーンするからやっちゃダメ。
その例ならば、
CSub() : m_nData2(0) {}
というように0でメンバを一つずつ初期化するのが無難。
564561:2005/07/11(月) 17:48:43
>>562
素早い回答感謝です。
だめってことは、全部0にならない場合があるってこと
でしょうか?

Sub () { memset(this, 0, sizeof(CSub)); }

↑はどうですか?
これもいちおう成功したのですが・・。
565561:2005/07/11(月) 17:49:51
あ、かぶった。。

仮想関数使ったことないのでwよくわからないのですが、
やぱ一個ずつ0にするのが無難なのかあ。
566デフォルトの名無しさん:2005/07/11(月) 17:52:13
>>564
そうじゃなくて、0にしたら駄目な部分まで0にしてしまうから良くない。

ちなみに、CSub() : m_nData2() {} みたいに初期化する値を省略することもできる。
567デフォルトの名無しさん:2005/07/11(月) 17:54:35
1の虚数部(i) ってなんですか?
568561:2005/07/11(月) 17:57:18
>>563
m_nData2 = 0;
ってやらないのは、なにか意味があるんですか?
ときたまその記述方は見かけるのですが・・。

>>566
CSub () : m_nData2() {}
これを今やってみたのですが、0が入りませんよー (T_T)

雑魚な質問ばかりですみません m(__)m
569デフォルトの名無しさん:2005/07/11(月) 18:02:23
>>567
数学板の算数スレに行ってこい
570デフォルトの名無しさん:2005/07/11(月) 18:15:01
>>568
>563
初期化と代入の違いについて調べよ。
571デフォルトの名無しさん:2005/07/11(月) 18:30:02
ZeroMemoryしちまったら関数のコードまで0になんだろ
572561:2005/07/11(月) 18:33:37
>>570 >>571
すみません。私にはわからないので、
もうちょっと勉強してきます。

ヒントいただきました。
ご親切に、ありがとうございました。 m(__)m
573デフォルトの名無しさん:2005/07/11(月) 18:39:22
関数のコードっつうかvptrな
574デフォルトの名無しさん:2005/07/11(月) 19:22:39
16進数の文字コードを文字列に変える関数を教えてください。
たとえば、「0x92, 0xca, 0x8f, 0xed, 0x00」とか
575デフォルトの名無しさん:2005/07/11(月) 19:30:16
それそのまんまchar型配列に入れてけば?
576デフォルトの名無しさん:2005/07/11(月) 19:31:16
>>574
16進数の文字コードとはどんな状態なんだ?
577デフォルトの名無しさん:2005/07/11(月) 19:35:54
>>574
文字コードに16進もクソもない。
578>>577:2005/07/11(月) 19:42:03
またオバカさんが現れました!
579デフォルトの名無しさん:2005/07/11(月) 19:42:35
>>578
自己紹介乙
580デフォルトの名無しさん:2005/07/11(月) 20:20:22
>>576
文字列として入った状態です。

文字列を16進数に変換するには?
581デフォルトの名無しさん:2005/07/11(月) 20:21:59
asc$()
582デフォルトの名無しさん:2005/07/11(月) 20:22:38
>>580
> 文字列に変える関数を教えてください <574
> 16進数に変換するには? <580

何をどう変換したいんだ?
583デフォルトの名無しさん:2005/07/11(月) 20:24:35
>>580
strtol()
584デフォルトの名無しさん:2005/07/11(月) 20:26:49
「○進数に変換」って言い方がそもそも変なことに気づいて欲しい。
585580:2005/07/11(月) 20:27:19
事故解決しました。
586デフォルトの名無しさん:2005/07/11(月) 20:33:33
あぁ、つまり、文字の実際のコードの数値を16進数文字列で取得したいと言うことか
質問が曖昧すぎだな
587デフォルトの名無しさん:2005/07/12(火) 00:45:57
>>561
ポインタ(その例では m_p )を ZeroMemory() とか memset() でゼロ埋めしても、
ヌルポインタ(その例では m_p(0) としたときの値)になることは言語の規格として保証されていないから、
移植性が問題になるときは気をつけれ。
588デフォルトの名無しさん:2005/07/12(火) 09:13:05
>>587
C言語では規定されていないけど、
C++ではNULLがビットパターン0になるよう規定されてなかったっけか?
まぁどちらにしろ、明示的に初期化した方がいいと思うけどさ。
589デフォルトの名無しさん:2005/07/12(火) 09:17:16
>>588
>C++ではNULLがビットパターン0になるよう規定されてなかったっけか?
ちがう
590デフォルトの名無しさん:2005/07/12(火) 09:18:06
>>589
まじかー、知らなかった、ありがとん!
591デフォルトの名無しさん:2005/07/12(火) 09:56:44
p=0 とかやると、NULLを表すビットパターンが格納されることが保障されている。んでなかったっけ。
592デフォルトの名無しさん:2005/07/12(火) 12:13:16
ポインタに0を代入するとNULLになるが、0はNULLじゃないんだよ。
つーか、本件の場合それ以前に問題なわけだが。
593デフォルトの名無しさん:2005/07/12(火) 12:22:50
URLエンコードのプログラムって文字コードによらず同じなんですか?
594デフォルトの名無しさん:2005/07/12(火) 12:31:49
NULLを内部で0にできない環境って例えばどんなのがあるんですか?
595デフォルトの名無しさん:2005/07/12(火) 12:36:29
>>594
アドレス0に有効なデータを配置しないといけない環境。
596デフォルトの名無しさん:2005/07/12(火) 12:37:39
>>593
エンコード方法自体に違いはない。
エンコードするものが違うだけ。

って言うかスレ違いだろ。
597デフォルトの名無しさん:2005/07/12(火) 12:56:19
>>596
レスありがとうございました。
確かにスレ違いでした。すみません。
598デフォルトの名無しさん:2005/07/12(火) 15:27:01
rand()だと乱数が固定してしまうし
srand(time(NULL))だと連続で早い処理では
同じ乱数ばかりがでてしまいます。
実行毎に違いばらばらな乱数を出すにはどうしたらよいのでしょうか?
599デフォルトの名無しさん:2005/07/12(火) 15:46:26
>>598
起動時に1回だけsrand呼ぶんじゃダメなのか?
600デフォルトの名無しさん:2005/07/12(火) 15:51:42
Cの標準ライブラリの範囲では無理なんじゃないかな。
シーケンシャルに実行されるんなら、
・n = ファイル"rand.txt"から数を一つ読み込む、無ければ0。
・srand(n)
・ファイル"rand.txt"にrand()で乱数を一つカキコ。
・処理
でどう?
601デフォルトの名無しさん:2005/07/12(火) 16:09:57
>>600
馬鹿?
乱数系列の種を、特定の乱数系列かの乱数から得たら規則性ができちゃうじゃん。
602デフォルトの名無しさん:2005/07/12(火) 16:11:58
時間から
603598:2005/07/12(火) 16:38:08
srandを呼ぶということは毎回scanfで入力するということですか?
だとするとできれば避けたいです。
とりあえず今までwhileの中に入れてたsrand(time(NULL))を
whileの外からだすことにしました。するとさっきよりよい結果が。
それでも似た値(特に一回目が)になりますが妥協することにします。
ありがとうございました。
604デフォルトの名無しさん:2005/07/12(火) 16:44:11
>>603
ループ回るたびに乱数ルーチン初期化してるのがそもそも間違い。
普通は
srand(time(0));
while(true)
{
 printf("%d\n", rand());
}
こんな感じで使う。
ちなみに乱数生成のパラメータはグローバルスコープ持ってるのが普通だから、通常はアプリ起動時に1回だけsrand呼べば十分。
605超初心者ゴン:2005/07/12(火) 19:37:42
//登録するレコードをメモリに記憶させる
memcpy((pCODE)->name,(BABS.name),sizeof(BABS.name));//古いメモリから確保されたメモリにコピーします
len = strlen(BABS.add);
pCODE->add = new char[len+1];
strcpy(pCODE->add , BABS.add);
memcpy(&(pCODE->add_len),&(BABS.add_len),sizeof(short));
memcpy(&(pCODE->anco),&(BABS.anco),sizeof(short));
memcpy(&(pCODE->teno),&(BABS.teno),sizeof(short));
memcpy(&(pCODE->num) ,&(BABS.num) ,sizeof(short));
memcpy(&(pCODE->age) ,&(BABS.age) ,sizeof(short));
//指定されたメモリを上書きする
memcpy((g_pCODE->name)+g_REVI_num,(pCODE->name),sizeof(hangar));
len = strlen(pCODE->add);
(g_pCODE->add) = new char[len+1];
strcpy((g_pCODE->add)+g_REVI_num,(pCODE->add));
memcpy(&(g_pCODE->add_len)+g_REVI_num,&(pCODE->add_len),sizeof(hangar));
memcpy(&(g_pCODE->anco)+g_REVI_num,&(pCODE->anco),sizeof(hangar));
memcpy(&(g_pCODE->teno)+g_REVI_num,&(pCODE->teno),sizeof(hangar));
memcpy(&(g_pCODE->num) +g_REVI_num,&(pCODE->num) ,sizeof(hangar));
memcpy(&(g_pCODE->age) +g_REVI_num,&(pCODE->age) ,sizeof(hangar));
delete [] pCODE; //使い終わったメモリを解放する
struct hangar{
char name[21];//名前
short anco;//市外局番
short teno;//局番
short num;//番号
short age;//年齢
char *add;//住所
short add_len;//住所用の長さ
};
g_REVI_numは修正bナす ・hangar *g_pCODE; ・extern hangar *g_pCODE;
なにかうまく行きません。なんか変なところばかりですけど、もっと変なところはありませんか?
606デフォルトの名無しさん:2005/07/12(火) 20:08:37
>>605
>もっと変なところはありませんか?
なんて答えて欲しいんだ?

で、なんでmemcpy()を使うの? 普通に考えれば只の代入でよさそうな気がするのだけれど。
607デフォルトの名無しさん:2005/07/12(火) 20:16:34
非常にバカバカしい問題で申し訳ないのですが、

#include <stdio.h>

main() {
printf("Hello!");
return 0;
}              でプログラムをコンパイルしようと
               すると、
エラー E2209 sample1.c 1: インクルードファイル 'stdio.h' をオープンできない
警告 W8065 sample1.c 4: プロトタイプ宣言のない関数 'printf' の呼び出し(関数 main )
*** 1 errors in Compile ***、というエラーがでます。どなたか解決策を教えてください。
コンパイラはborlandを使ってます。
608デフォルトの名無しさん:2005/07/12(火) 20:18:56
>>607
コンパイラの設定がうまく行ってないと思われる。
609デフォルトの名無しさん:2005/07/12(火) 20:20:32
610デフォルトの名無しさん:2005/07/12(火) 20:55:16
>>605
*pCode = BABS;
パット見だけど、でいいんでないの?
611デフォルトの名無しさん:2005/07/12(火) 21:16:02
>>610
文節中に副詞句を割り込ませるとはなかなかやるな。
それはそうと、pCode->addの指す先をコピーしないとまずい希ガス。
612デフォルトの名無しさん:2005/07/12(火) 21:29:34
>>610,611
浅いコピーと深いコピーの違いだな
>>610だと浅いコピーになる
613デフォルトの名無しさん:2005/07/12(火) 22:13:13
N個の文字列を入力し、その長さに応じたメモリ領域を動的に確保したいんですが、
なぜか正常に動作してくれません。
mallocあたりがおかしいんでしょうか。それとも文字列の代入が・・・?

#define N 5
int main(void){
char s[101] , *stbl[N];
int i;
for(i = 0 ; i < N ; i++) stbl[i] = NULL;
for(i = 0 ; i < N ; i++){
printf("%d : " , i+1);scanf("%100s" , s);
if((stbl[i] = (char *)malloc(sizeof(char) * strlen(s) + 1)) == NULL)
printf("Memory Error\n");goto FREE;
stbl[i] = s;
}
for(i = 0 ; i < N ; i++) printf("%s\n" , stbl[i]);
FREE:
for(i = 0 ; i < N ; i++) free(stbl[i]);
return 0;
}
614デフォルトの名無しさん:2005/07/12(火) 22:16:10
>>613
> stbl[i] = s;
strcpy(stbl[i], i);

あとここを
> char s[101] , *stbl[N];
こうすれば
char s[101] , *stbl[N] = {0};
直後のfor(i = 0 ; i < N ; i++) stbl[i] = NULL;が不要になる。
615デフォルトの名無しさん:2005/07/13(水) 00:03:58
エンディアン変換について質問があるんですが、

/* Big endian: */
#if !(defined(__alpha)||defined(__i386__)||defined(__vax__))
#define BIG_ENDIAN
#endif

こんな感じのコードをみかけます。
ダウンロードしてきたソースコード内を検索してみましたが、
defined(XXX)の中のXXXがマクロ定義されている部分は見つかりませんでした。
コンパイラさんは一体いつ、どこでXXXが定義されている、いないを判断しているんでしょうか

コンパイラは
gcc version 3.3.3
です。
616デフォルトの名無しさん:2005/07/13(水) 00:43:13
>>615
コンパイラにすら届かない
617デフォルトの名無しさん:2005/07/13(水) 00:46:24
>616さんどういうことでしょうか・・・
CPUが勝手に処理するんでしょうか?
618初心者:2005/07/13(水) 00:54:08
>>610さん
住所だけが可変なんで固定長ならそうでいいかもしんないですけど。・・・
でもあとで住所を更新すればいいかもしんないですけど。。。
619デフォルトの名無しさん:2005/07/13(水) 00:54:52
>>617
プリプロセッサが処理する
620デフォルトの名無しさん:2005/07/13(水) 01:20:50
>>605
>pCODE->add = new char[len+1];
〜中略〜
>delete [] pCODE; //使い終わったメモリを解放する
↑ありえない。delete [] pCODE->add; delete pCode; だろ

>short add_len;//住所用の長さ
↑わざわざ宣言してるのに何故使わない?

>&(g_pCODE->add_len)+g_REVI_num
↑意味わからん。これでいいだろ→(g_pCode+g_REVI_num)->add_len

>住所だけが可変なんで
↑ならそう書け↓
memcopy(pCode, &BABS, sizeof(hangar));
pCODE->add = new char[BABS.add_len+1];
strncpy(pCODE->add, BABS.add, BABS.add_len);
621デフォルトの名無しさん:2005/07/13(水) 01:24:19
ポインタに単語を放り込んでその単語の種類の数を数えるのってどうすればいいんでしょうか?
622デフォルトの名無しさん:2005/07/13(水) 01:25:59
>>621
もーすぐあのスレで宿題が解かれるよ
623デフォルトの名無しさん:2005/07/13(水) 01:49:06
>>615
コンパイラ(プリプロセッサ)が自動的に定義するマクロがある。
gccだったら、
echo | gcc -dM -E -
としてみると、そういうマクロの一覧が見られる。

624デフォルトの名無しさん:2005/07/13(水) 01:54:15
VisualC++2003なんですが、
カスタムビルドで使う環境変数マクロ(ProjectDirなど)を
自作したいんですがどうすれば可能でしょうか?
625デフォルトの名無しさん:2005/07/13(水) 02:54:35
VCスレで訊けば?
626デフォルトの名無しさん:2005/07/13(水) 08:43:57
ファイルサイズを取得する一般的な方法を教えてください。
言語は C/C++ どっちでもいいです。できれば環境に依存しない方法を。

今のところは↓のようにしているのですが、これって問題ありますか?また、一般的ですか?

long filesize(const char* path)
{
 long size;
 FILE *fp=fopen(path,"rb"); if(fp==NULL)return -1;
 fseek(fp,0,SEEK_END);
 size=ftell(fp);
 fclose(fp);
 return size;
}
627デフォルトの名無しさん:2005/07/13(水) 09:32:06
>>626
環境に依存しない一般的な方法はない。
そもそも、ファイルの概念が存在しない環境もある。
628デフォルトの名無しさん:2005/07/13(水) 09:46:44
>>626
そのやり方は、まぁ無難だね。
問題は、2GBを超えるファイルの扱いだけど。
それと、多くの環境でstat()が使えるし、
外部コマンドに頼る方法もあるので検討してみては?
629626:2005/07/13(水) 10:28:12
ありがとうございます。_stat を検討してみます。
630デフォルトの名無しさん:2005/07/13(水) 10:28:59
質問です。

int a, b;
unsigned int c;
a = -1;
b = 0;
c = 20;
if (a < (b + c))
 return 0;

ということを行なうと、どうやらunsigned比較が行なわれるらしく、比較の結果がfalseになります。
この暗黙のキャストの優先順位はどう決まっているのでしょうか?
631デフォルトの名無しさん:2005/07/13(水) 10:36:17
コンパイルで警告が出るはずだが…
unsigned と signed の演算では unsigned として計算される。
signed として扱いたいなら明示的にキャストする必要あり。
632超初心者ゴン:2005/07/13(水) 10:51:17
>>620さん
ありがとうございます!
633超初心者ゴン:2005/07/13(水) 11:28:02
>>620san
strcpy(pCODE->add, BABS.add, BABS.add_len);
'strcpy' : 関数が不正な 3 個の実引数をともなって呼び出されました。
ってなってしまいました。
634デフォルトの名無しさん:2005/07/13(水) 11:32:48
プログラムを始めた初心者です。最近、if文とfor文と一次配列と二次配列がなんとか理解できるようになって、なんちゃってエクセルが作れるようになたのですが、こんなプログラムって、ゲーム作るのに役に立つんですか?
635デフォルトの名無しさん:2005/07/13(水) 11:35:30
めちゃめちゃ役に立ちます。
636デフォルトの名無しさん:2005/07/13(水) 11:38:50
>>631
ありがとうございました。

コンパイラは警告はいてくれませんでした。VS6.0です。
警告レベルをあげてみますね。
637デフォルトの名無しさん:2005/07/13(水) 11:47:41
質問です。
将来使うつもりで変数を宣言しておいたところ、「一度も使われていません」警告がでました。
それは当然なのですが、これが邪魔っけなので消したいのですが

int a = 0;
a = a;
とかやると(現段階では)無駄な動作が入ってしまいます。

昔どこかで「これは使われてないけど、使ったことにしておく」命令を見た覚えがあるのですが、どなたかご存知ないでしょうか。
よろしくお願いします。
638デフォルトの名無しさん:2005/07/13(水) 11:48:12
まじっすか!
ゲーム作るには、何らかのソフトウェアが必要ですよね?
639東海大学前:2005/07/13(水) 11:48:36
プログラミング初心者なのですが、キーボードから整数値の駐車時間を分単位で読み込む。
・駐車時間が1時間未満ならば無料
・駐車時間1時間から3時間未満までは150円
・3時間以上は、一律300円
・0(ゼロ)を入力すると終了する。
というのがどうしても分からないのですが、よかったら教えて頂けないでしょうか?
<プログラム実行例>


PARKING
Input minutes = 430
Parking time => 7:10 =>\300
Input minutes = 127
Parking time => 1:7 =>\150
Input minutes =67
Parking time => 1:7 =>\150
Input minutes =32
Parking time =>0:32 =>\ 0
Input minutes =0
640デフォルトの名無しさん:2005/07/13(水) 11:50:15
>>637
gccにはそういう指定がある。VC++とか他のコンパイラは知らん。
641デフォルトの名無しさん:2005/07/13(水) 11:50:31
>>638
何のコンパイラ使ってるか知らんが、WIN32 SDK さえあれば、
C言語だけで作れないことはない。
642デフォルトの名無しさん:2005/07/13(水) 11:59:51
>>639
> <プログラム実行例>
>
>
> PARKING
> Input minutes = 430
> Parking time => 7:10 =>\300
> Input minutes = 127
> Parking time => 1:7 =>\150
> Input minutes =67
> Parking time => 1:7 =>\150
> Input minutes =32
> Parking time =>0:32 =>\ 0
> Input minutes =0

なんだ、もう出来上がってるじゃん。
643デフォルトの名無しさん:2005/07/13(水) 12:01:45
>>637
コメントにしておけば?
644デフォルトの名無しさん:2005/07/13(水) 12:09:36
>>637
コンパイラのオプションで警告が出ないようにする。
できるかどうかはコンパイラによる。
645東海大学前:2005/07/13(水) 12:10:57
実行例はあるのですが、どうやったらこのプログラムができるか教えてください。
646東海大学前:2005/07/13(水) 12:16:26
[1] 授業単元:プログラミング
[2] 問題文(含コード&リンク): キーボードから整数値の駐車時間を分単位で読み込む。
・駐車時間が1時間未満ならば無料
・駐車時間1時間から3時間未満までは150円
・3時間以上は、一律300円
・0(ゼロ)を入力すると終了する。
というのがどうしても分からないのですが、よかったら教えて頂けないでしょうか?
<プログラム実行例>


PARKING
Input minutes = 430
Parking time => 7:10 =>\300
Input minutes = 127
Parking time => 1:7 =>\150
Input minutes =67
Parking time => 1:7 =>\150
Input minutes =32
Parking time =>0:32 =>\ 0
Input minutes =0
[3] 環境
 [3.1] OS:Windows/Linux/等々 windows xp
 [3.2] コンパイラ(バージョン):
 [3.3] 言語:C/C++/どちらでも可 のいずれか c/c
[4] 期限 できれば今すぐお願いします。
647デフォルトの名無しさん:2005/07/13(水) 12:19:20
648デフォルトの名無しさん:2005/07/13(水) 12:23:54
>>646
いい加減、スレ違いだって事に気づけよ
649デフォルトの名無しさん:2005/07/13(水) 12:52:39
int i_main = 100;
char *i_mainchar;
sprintf(i_mainchar,"%d",i_main);
for(int i = 1;strlen(i_mainchar) - 1 >= i; i++){
cout << i_mainchar[i];
}

なぜか実行すると落ちるんですが…
cout部分のiを直接指定すると平気です。
原因がわかりません。よろしくお願いします。
650デフォルトの名無しさん:2005/07/13(水) 12:55:12
テキストファイルを読み込んで1行づつinputに格納してるんですが
こうやると途中にスペースがあるファイルだとスペースで読み込みを中止して
次の行になってしまうんですが回避する方法はありませんか?
std::string FileName;
std::cin >> FileName;

std::ifstream Input_File( FileName.c_str() );
std::string str;
std::vector< std::string > input;

int i=0;
while(!Input_File.eof()){
Input_File >> str;
input.resize(i+1);
input[i] = str;
i++;
std::cout << str << std::endl;
}
651デフォルトの名無しさん:2005/07/13(水) 13:01:05
>>649
i_maincharが何も指してない。
652649:2005/07/13(水) 13:15:15
本当だ…。
ありがとうございました^^
# Cの変数は難しい〜。
653デフォルトの名無しさん:2005/07/13(水) 13:26:09
>>650
std::stringへの>>は空白区切り。
行単位で読みたいときはstd::getline
654デフォルトの名無しさん:2005/07/13(水) 13:42:44
>>637
a;
とだけ書けば良かったような希ガス。
655デフォルトの名無しさん:2005/07/13(水) 14:24:36
>>637
bccなら
プリプロセッサ指令#pragma warn - 8057を入れるか
コマンドラインオプションで-w-8057入れとけ
656超初心者ゴン:2005/07/13(水) 15:48:21
すみませんホントお願いがあるんですけど、メールでソースを送りますから
誰か見ていただけませんでしょうか?
657デフォルトの名無しさん:2005/07/13(水) 16:00:13
5億行もあるソース見られるか!
658超初心者ゴン:2005/07/13(水) 16:02:08
いやいやそこまでないっす!編集します!
659デフォルトの名無しさん:2005/07/13(水) 16:03:25
printfとwriteの違いがよく分かるサイトを教えてください
660デフォルトの名無しさん:2005/07/13(水) 16:05:05
>>654
それやるとBCCでは
W8019 コードは効果を持たない
と言われる。
なぜかcppだと言われない。
661デフォルトの名無しさん:2005/07/13(水) 16:10:34
>>656 この↑アドレスに送れ。みてやる
662デフォルトの名無しさん:2005/07/13(水) 16:11:57
>>660
(void)a;
じゃだめ?
663超初心者ゴン:2005/07/13(水) 16:19:38
>>661さんsageってなんですか?
664デフォルトの名無しさん:2005/07/13(水) 16:21:03
超初心者ゴンも相手している奴もウザス
665超初心者ゴン:2005/07/13(水) 16:23:37
>>661
どうすれば送れるのですか?
666デフォルトの名無しさん:2005/07/13(水) 16:28:56
>>656
回線切って首吊って氏ね。
667超初心者ゴン:2005/07/13(水) 16:31:19
いやいや死なないし!でどうすれば遅れますか?
668超初心者ゴン:2005/07/13(水) 16:31:54
字間違った、、送れますか?
669超初心者ゴン:2005/07/13(水) 16:34:11
>>661さんお願いします!
670659:2005/07/13(水) 16:35:17
ヒント お願いします
671デフォルトの名無しさん:2005/07/13(水) 16:44:29
writeなんて標準にないし
672デフォルトの名無しさん:2005/07/13(水) 16:54:07
環境依存OKじゃなかったのか?このスレ
673超初心者ゴン:2005/07/13(水) 16:59:24
>>661さんお願いします!
674デフォルトの名無しさん:2005/07/13(水) 17:15:52
>>672
環境をかけって事をいいたいのではないかと。
675659:2005/07/13(水) 17:43:34
UNIX環境・・・
676デフォルトの名無しさん:2005/07/13(水) 17:58:47
man使えば?
677613:2005/07/13(水) 18:12:58
>>614
遅れてスマソ
strcpy(stbl[i], i); は strcpy(stbl[i], s); ですよね。
正常に動作することはできましたが、なんでstbl[i]=s; ではだめなんでしょうか・・・?
678デフォルトの名無しさん:2005/07/13(水) 18:33:28
>>677

sがA番地、stbl[i]がB番地を指しているとすると

strcpy()では、A番地から始まる文字列をB番地にコピーする
stbl[i] = s; では、stbl[i]もA番地を指すようになる
(ついでに、malloc()で確保したB番地を指す者が存在しなくなるので、メモリリークとなる)

やってることは全然違う。
679デフォルトの名無しさん:2005/07/13(水) 19:14:24
>>677
stbl[i] = s;ができるのならstrcpyも存在するわけがない。
つまりstbl[i] = s;ができないからstrcpyが在る。
680デフォルトの名無しさん:2005/07/13(水) 19:53:42
>>679
トートロジー以下
681デフォルトの名無しさん:2005/07/13(水) 20:07:44
よってこのstrcpyは高速移動をしていないと言える。
682デフォルトの名無しさん:2005/07/13(水) 20:20:03
C/C++ってむかつくな
関数のプロトタイプみただけじゃ何やってるかわからん。
引数に指定された値を書き換えるのって気持ち悪いと思うのはオレだけか?
683デフォルトの名無しさん:2005/07/13(水) 20:24:50
> C/C++ってむかつくな
無理にやれとは言わないよ

> 関数のプロトタイプみただけじゃ何やってるかわからん。
プロトタイプに期待しすぎ

> 引数に指定された値を書き換えるのって気持ち悪いと思うのはオレだけか?
書き換えないときはconstで
684デフォルトの名無しさん:2005/07/13(水) 20:29:48
>>682
引数に指定された値を書き換えるのはCでは不可能だが?
685デフォルトの名無しさん:2005/07/13(水) 20:33:54
>>682
それ、C/C++だけか?
686マリー:2005/07/13(水) 21:11:31
構造体なりクラスなりを値で返せばいいじゃない
687初心者丸出し:2005/07/13(水) 21:12:52
windowsで簡単なプログラムを書こうと思ったんですが
getcharやscanfでキーボード入力ができません。
windowsではキーボード入力できないのですか?
688デフォルトの名無しさん:2005/07/13(水) 21:14:09
> getcharやscanfでキーボード入力ができません。
なんで「できない」と思ったのか?
689デフォルトの名無しさん:2005/07/13(水) 21:16:40
>>687
できますよ!
そのプログラムを晒しなさい、怒らないから
690デフォルトの名無しさん:2005/07/13(水) 21:17:14
Cで10進数をn進数にするプログラムを作ったんだけどどうもうまく遺憾。
691初心者丸出し:2005/07/13(水) 21:35:18
>>688 689
聞いといてなんですが何とか解決しました。
もう一つ聞きたいのですが、エディタは皆さんどんなのを使ってるのでしょうか?
今使っているエディタは括弧の対応が分かりづらくて苦労してます
692デフォルトの名無しさん:2005/07/13(水) 21:36:32
viなら%コマンド一発だ
まあ薦めはしないが
693デフォルトの名無しさん:2005/07/13(水) 21:41:11
すいません、>>2に書いてあることが気になったのですが、
STLって使える場面ではどんどん使って大丈夫ですか?
それともあまり使わないほうがいいのでしょうか?
694デフォルトの名無しさん:2005/07/13(水) 21:41:56
>>691-692
薦めないのか?vi使ってるよ
695初心者丸出し:2005/07/13(水) 21:51:15
>>694
実はお恥ずかしい話ですが、シェル(ターミナル?)がないと
コンパイルの仕方分からないんですよ…

だからコンパイル実行機能付きのエディタ使ってるんですが…
696デフォルトの名無しさん:2005/07/13(水) 21:51:48
>>693
>>2は少々誇張表現気味。
あまり気にせずに使え。
697デフォルトの名無しさん:2005/07/13(水) 21:52:57
>>695
どうせすぐ慣れるから今はそれでいいんじゃない?
698デフォルトの名無しさん:2005/07/13(水) 22:30:25
>>695
cygwinでも入れとけ。
unix互換シェルにgccも入ってる
viやemacsも入ってたはず
699デフォルトの名無しさん:2005/07/13(水) 22:33:40
>>696
なるほど、気にしないで使ってみます。返答ありがとうございました。
700初心者丸出し:2005/07/13(水) 22:58:14
>>698
cygwinですか一度入れてみます
ありがとうございました
701デフォルトの名無しさん:2005/07/13(水) 23:23:45
emacsはデフォルトでは使えないな。viはあるけど。
702デフォルトの名無しさん:2005/07/14(木) 00:08:41
>>690
ご参考までに。
#include <stdio.h>
char* to_radix_n(unsigned int x, char* s, int n) {
    int index = 0, left = 0, digit;
    char temp;
    do {
        digit = x % n;
        s[index++] = digit > 9 ? digit - 10 + 'A' : digit + '0';
    } while (x /= n);
    s[index--] = '\0';
    while (left < index) {
        temp = s[left];
        s[left++] = s[index];
        s[index--] = temp;
    }
    return s;
}
int main(void) {
    unsigned int x;
    char s[256];
    printf("Enter Number:"); scanf("%u", &x);
    printf("%u(10) = %s(16)\n", x, to_radix_n(x, s, 16));
}
703620:2005/07/14(木) 00:10:41
>>633
>strcpy(pCODE->add, BABS.add, BABS.add_len);
  ~~~~~~~
もういちど>>620を良く見直せ。
704デフォルトの名無しさん:2005/07/14(木) 00:32:30
いきなり悪いC言語初めて60分だが早速壁にぶちあたってしまった。
LSI C86 Ver3.30c試食版をXPつかっているんだがコマンドプロンプトで
コンパイルしたら
aaa.c 1: can't open: stdio.h: No such file or directory
て、でてコンパイルできないんだが。
たのむ!誰か教えてくれ!
705デフォルトの名無しさん:2005/07/14(木) 00:33:18
コンパイラの設定が悪いんだろうな
706デフォルトの名無しさん:2005/07/14(木) 00:36:37
そうか、ありがとう。も一回よくみてみるわ
707デフォルトの名無しさん:2005/07/14(木) 00:38:50
かんきょうへんすうきちんとせっていしてさいきどうしとるか?
708デフォルトの名無しさん:2005/07/14(木) 00:48:55
そのコンパイラはやめたほうがいいよ・・・・。
709デフォルトの名無しさん:2005/07/14(木) 00:51:12
708>なぜ
710デフォルトの名無しさん:2005/07/14(木) 00:51:42
始めて60分ならいいじゃん、タダだし本でてるし
711デフォルトの名無しさん:2005/07/14(木) 00:52:53
だったらcygwinでgccでいいんじゃん
これで問題解決
712デフォルトの名無しさん:2005/07/14(木) 00:54:05
>>711
GPLとか希望に燃える16歳にはキツスギス
713デフォルトの名無しさん:2005/07/14(木) 00:56:42
cygwin勧める人多いけど、初心者にはMinGWがいいんじゃないかな。
cygwin入れるぐらいならLinux入れろと。
714デフォルトの名無しさん:2005/07/14(木) 00:57:08
>>704
LSI-C86試食版は、ロングファイル名に対応してないからだろ。
ソースの置き場所を工夫してみろ。
715デフォルトの名無しさん:2005/07/14(木) 00:57:27
>>712
うん、実行するのにdllガイルんじゃ友達に自慢できないもんね
716デフォルトの名無しさん:2005/07/14(木) 00:57:42
>>712
>>704のコンパイラならその萌えてる希望は実現可能って事か。
切ないぞ
717デフォルトの名無しさん:2005/07/14(木) 00:58:21
>>713
まじかよw
718デフォルトの名無しさん:2005/07/14(木) 00:59:49
>>716
 >>715
くだらん理由だよw
719デフォルトの名無しさん:2005/07/14(木) 01:00:35
>>715
本当?おかしいなぁ。
720デフォルトの名無しさん:2005/07/14(木) 01:06:41
あれから何回かためしてるけどいっこうに
aaa.c 1: can't open: stdio.h: No such file or directory
と、でるばっかりだ。
そもそもなんでこれがでるのか教えてくれないか
721デフォルトの名無しさん:2005/07/14(木) 01:10:03
goto >>705
722デフォルトの名無しさん:2005/07/14(木) 01:10:14
>>720
忍耐力あるんだな
 >>707
 >>714
723デフォルトの名無しさん:2005/07/14(木) 01:10:29
>>720
まじでmingw入れろ。幸せになれるから。
724デフォルトの名無しさん:2005/07/14(木) 01:11:44
ちなみにこれがコンパイルしようとしたソースコードです
#include <stdio.h>

main()
{
printf("ようこそC言語へ!\n");
return 0;
}
725デフォルトの名無しさん:2005/07/14(木) 01:16:33
>>724
うむ、完璧だ
726デフォルトの名無しさん:2005/07/14(木) 01:19:43
これ、テキストドキュメントに書いてるんだがそのとき字の大きさを
変えるためフォントを開いたんだよな。そのとき書式も変えてMS P明朝
にしてあるんだが何か関係あるか
727デフォルトの名無しさん:2005/07/14(木) 01:19:58
>>724
ぼちぼち次の餌をクレ
728デフォルトの名無しさん:2005/07/14(木) 01:25:46
あきらめてcygwinいれろ、でgcc -mwindows -mno-cygwin でコンパイルしろ
729デフォルトの名無しさん:2005/07/14(木) 01:27:48
>>726
そう思うなら新規でテキストファイル作ってそこにコピペしろ
>>722の意味がわからないならそう言え
730デフォルトの名無しさん:2005/07/14(木) 01:31:26
すいません。722の意味を教えてください。
731446:2005/07/14(木) 01:37:14
デフォルト char が符号付かどうか調べようとして

  char c = -1;

とすると (c==-1) と (0<=c) の両方が成立してしまうコンパイラ>LSI C86
732デフォルトの名無しさん:2005/07/14(木) 01:38:25
733デフォルトの名無しさん:2005/07/14(木) 01:49:52
ありがとうございます。これみてまたやってみます。
734デフォルトの名無しさん:2005/07/14(木) 01:51:48
main()
{
char c[3000], nwo[3000];
int j, i;

scanf("%s", &c);

/*for(i=0; i<3000; ++i){
nwo[i]=0;
} */

printf("%c\n", c[2]);
return 0;
}

キーボード入力でabcdeと入力したらcが出力されるようにしているつもりなんですが、
/* */をはずすと何も出力されなくなるんです。なぜだか分かりません
配列cとは何も関係ないように思うのですが
735デフォルトの名無しさん:2005/07/14(木) 01:54:37
質問させてください。
画像処理を課題に出されて、その第一段階でつまずいてしまいました。

配列に画像データをバイナリで取り込んで、配列をファイルに書き出しして画像データに戻そうとしたのですが、
元画像サイズが1MBちょっとなのに対して、できた画像は50kB足らずで当然表示も出来ません。

バイナリエディタで開くと途中までは書き込めているようなのですが・・・
また、3kBの画像ではちゃんと動きました。
何が問題なのでしょうか?ご教授お願いします。


コンパイラはLSI C-86 Ver.3.30c 試食版を
ttp://homepage3.nifty.com/aokura/#C言語を始めよう
を通して使っています。ってこれのせいかな・・・
736735:2005/07/14(木) 01:55:00
問題のソースです
#include <stdio.h>
#define H 54/* 54byte */
#define D 1228800 /* 縦*横*4byte = 640*480*4 */

FILE *fp;
char data[H+D];

void get_ref(void){
fp = fopen("ref.bmp","rb");
fread(data, 1, H+D, fp);
fclose(fp);
}

void main(){
get_ref();
fp = fopen("ref2.bmp","wb");
fwrite(data, 1, H+D, fp);
fclose(fp);
}
737デフォルトの名無しさん:2005/07/14(木) 01:57:42
>>734
んじゃメモリの構造を考える時間だな
charの前にstaticつけてみろ
738デフォルトの名無しさん:2005/07/14(木) 01:58:54
>>734
int main(void)
{
char c[3000] , nwo[3000] = {0};
int i , j;

scanf("%s" , c);

printf("%c\n" , c[2]);
return 0;
}
739デフォルトの名無しさん:2005/07/14(木) 01:59:04
>>734
scanf("%s", c);
740734:2005/07/14(木) 02:02:38
>>737
できたー!
741デフォルトの名無しさん:2005/07/14(木) 02:04:36
>737
メモリの構造というと語弊があったな
メモリの構造→メモリの確保の仕方
742734:2005/07/14(木) 02:07:52
>>738
NULL pointer assignment
って出てしまいました。よくわかりません
743デフォルトの名無しさん:2005/07/14(木) 02:15:37
#include<stdio.h>
int main(void){
char c[2];
scanf("%s",c[0]);/*2文字以上入力*/
printf("%s\n" , c[0]);
return 0;
}
C言語のauto変数でこんなことも許されてるのは何故ですか?
ほかのメモリ領域を侵食してしまったりして危険だと思うのですが
744734:2005/07/14(木) 02:15:41
>>737
staticをつけるとグローバル変数になると言うことでよろしいのでしょうか?
745デフォルトの名無しさん:2005/07/14(木) 02:18:20
>>743
本当にコンパイルしたのか?
746743:2005/07/14(木) 02:23:18
>>745
lsic8086で試してみました
747デフォルトの名無しさん:2005/07/14(木) 02:25:16
>>746
もしそれがエラーにならないんだったら、使うのをオススメできないんだが。
748743:2005/07/14(木) 02:33:13
>>747
エラーも無しで綺麗にリンカーまで通ってしまいました
オプション指定無しでですが

#昔、auto変数の配列のことで聞いた事があったので試してみたのですが…
#lsic86は簡単な実験をするときに使っていたのですが、gccの導入を考えておこうと思います
749デフォルトの名無しさん:2005/07/14(木) 02:41:38
>>744
それによって生じるメモリの扱われ方とか確保のされ方とかその辺を言いたかった

ちなみに>>743もstaticつければ多分エラーがでるのではないかと
実行環境ないから検証できんが
750749:2005/07/14(木) 02:44:12
auto変数って書いてあったよママンorz
スルーしてくれ
751デフォルトの名無しさん:2005/07/14(木) 02:47:22
scanf()やprintf()のような可変長引数関数については、通常Cコンパイラは
引数の型チェックはしないし、できない。大体、引数の個数も型も
決まっちゃいないんだからな。

コンパイラがprintf()書式指定文字列を「知って」おり、それに照らし合わせて
積極的にチェックするような仕様でない限り、コンパイルが通ってしまうのは、
普通だ。
752デフォルトの名無しさん:2005/07/14(木) 02:57:28
つ【snprintf】
753デフォルトの名無しさん:2005/07/14(木) 02:59:48
>>752
>>743のように、char*を渡すべきところにcharを渡すようなバグ
に対しては、何の役にも立たない。
754743:2005/07/14(木) 03:00:57
>>751
ということはlsic86が悪いというわけでは無いのですね

でも、静的変数にしておくとscanfで入力したあとに
エラーとして(NULL)が出力されてプログラムが終了するのですが
これは静的変数と動的変数の違いの一つなのでしょうか?
755743:2005/07/14(木) 03:02:13
間違えました
× 動的変数
○ 自動変数
756デフォルトの名無しさん:2005/07/14(木) 03:02:34
>>754
いや、クラッシュしてるから
757デフォルトの名無しさん:2005/07/14(木) 03:07:10
>>743
じゃなくて、書式指定文字列ではここはnull terminateされたchar*文字列
を渡すんだといっておきながらcharを渡しているわけだから、
その時点でバグなの。
その結果は、メモリの破壊。SEGVで落ちるかも知れないし、
どこかを知らずに書き換えるだけかもしれない。

可変長引数関数に関しては、一般的なCコンパイラはそういった種類の
バグを検出できない、というだけの話。
758743:2005/07/14(木) 03:10:42
>>756,757
なるほど、よく分かりました
ありがとうございました
759デフォルトの名無しさん :2005/07/14(木) 06:28:29
シリアルポ−ト(COM1)の入力では、WM_の
メッセ−ジは発生しないのでしょうか?
760デフォルトの名無しさん:2005/07/14(木) 07:30:17
#include <stdio.h>

int main(void)
{
int dat;
int ans;

printf("Input 'dat' ... ");
scanf("%d", &dat);

ans - dat + 2;

printf("dat : 2 = %d\n",ans);

return 0;

}


質問です
上のソースファイルをコンパイルすると
30:1: warning: no newline at end of file
というメッセージがでてどうすればいいかわかりません。
メッセージの意味とどうすればいいか教えてください。
761デフォルトの名無しさん:2005/07/14(木) 07:36:28
>>760
ソースファイルは改行で終わらないといけない。
なのにお前のコードはそうなってはいないよという警告。
762760:2005/07/14(木) 07:50:53
>>761
お答えありがとうございます
なるほどそういういみですか。
最後の } を入力した後、enterキーを押して改行を行うと本には書いてあるんですが、
そのとうりやって、保存して、メモ帳を閉じる、という手順でやってるんですが。。。
何がいけないんでしょう?
763デフォルトの名無しさん:2005/07/14(木) 08:16:57
自分がミスをしたという可能性は完全に無視ですか。
764760:2005/07/14(木) 08:28:55
なんかいじってたらえらーでなくなりました
朝からごくろうさんです。
765デフォルトの名無しさん:2005/07/14(木) 08:44:02
>何がいけないんでしょう?
あんたの日本語能力、態度、その他諸々。
766デフォルトの名無しさん:2005/07/14(木) 08:44:38
>>765
英語能力も指摘しておかないと。
767デフォルトの名無しさん:2005/07/14(木) 09:19:39
これなんですか??
a.c:16: error: two or more data types in declaration of `main'

int main()
{
の括弧でエラーが出てるんですが…
768デフォルトの名無しさん:2005/07/14(木) 09:24:02
>>767
その前のクラス、構造体宣言にセミコロンが無い。
769デフォルトの名無しさん:2005/07/14(木) 09:31:39
構造体を宣言してました、、そんなことまでわかるんですねぇ
どうもありがとうございました^^
770768:2005/07/14(木) 09:44:51
>>769
まぁ俺は経験からすぐにわかったが、別に経験が必要なわけじゃない。
http://www.google.co.jp/search?hl=ja&q=%22two+or+more+data+types+in+declaration%22&lr=lang_ja
771769:2005/07/14(木) 10:16:29
googleで検索はしたんですが、""を付けなかったので意味わからないことになってました。。
文字列検索は""をつけるといいんですね。。覚えておきます。。
772デフォルトの名無しさん:2005/07/14(木) 10:54:08
すいません、質問ですが。

char table_name[10]=
{
(省略)
};

の「char table_name[10]」の部分の正式な名称があるとおもいますが、教えていただけますでしょうか?
773デフォルトの名無しさん:2005/07/14(木) 11:00:31
>>772 「正式」ってなんだ?
774超初心者ゴン:2005/07/14(木) 11:05:00
いま課題のソースの一部分なんですけど
(pCODE)->addとpCODE->addって意味は一緒でしょうか?
775デフォルトの名無しさん:2005/07/14(木) 11:15:07
pCODEがマクロだったら違う意味になるかもね。
776デフォルトの名無しさん:2005/07/14(木) 11:16:17
>>774
同じだが、何か省略してないか?
777超初心者ゴン:2005/07/14(木) 11:35:10
>>775さん
マクロではないです。
>>774さん
僕には何を省略してるかわかんないですけど。
778デフォルトの名無しさん:2005/07/14(木) 11:57:41
多重継承で教えてください

class CSub1
{
int *pdata
CSub1(int i){
pdata=somoting(i);
}
}

class CSub2
{
CSub2(int *pdata){}
}

class CMain:public CSub1 ,public CSub2
{
int *const pdata;
CMain(int i):CSub1(i),pdata(CSub1.pdata),CSub2(CSub1.pdata) //or CSub2(pdata)
{}
}

としてもコンパイルが通りません
CSub1 CSub2は既存のライブラリーのクラスなので変更できません.
解決策はないのでしょうか?
779デフォルトの名無しさん:2005/07/14(木) 12:07:18
>>772
その定義を二つの部分に分けるなら、「char」と「table[10]={...}」に分かれる。
したがって、「char table_name[10]」の部分に名前はない。
文法的には、
「char」がdecl-specifier-seq
「table_name[10]」がdeclarator
「={...}」がinitializer
だと思う。
780デフォルトの名無しさん:2005/07/14(木) 12:21:43
>>778
省略しすぎで訳わからん。
>778だけ見るとCSub1::pdataはprivateに見えるのだが?
781デフォルトの名無しさん:2005/07/14(木) 12:39:09
>>778
どうして一番重要なエラーメッセージを載せない?
782デフォルトの名無しさん:2005/07/14(木) 12:53:07
単純なゲームを作ってるんですけど、
その中でランキングを作ろうと思って

a[0].name=("%s",name);/*ここにゲームの結果*/
a[0].rscore=("%d",score);

for(i=0;i<10;i++)/*ファイルの読み取り*/
fscanf(fp1,"%s%d",a[i+1].name,&a[i+1].rscore);

上のようにやってこのあと構造体に渡そうとしてるんですけど
どうやらデータがa.name,a.rscoreに入ってないようで表示させようとしたら
エラーででて終了してしまうんですけど、どこが悪いかわかりますか?
783デフォルトの名無しさん:2005/07/14(木) 13:12:29
>>782
>どこが悪いかわかりますか?
頭。

名前に空白を入れられても詰まらんから、スコアファイルはfscanf()よりfgets()+sscanf()の方が無難だろうなぁ。
スコアを先に置けばsscanf()の代わりにstrtol()でもいいかも知らん。
いずれにしても、やりたいことが判らんからもう少し全体が判るようにソースを晒して味噌。
#まさか、最初はファイルがないから読み込めないって落ちだったら笑うが。
784778:2005/07/14(木) 14:00:57
これならいい?
class CCreateData
{
public:
int *pdata;
CCreateData(int i){pdata=create(i);}
};
class CWrapperOfDataOperation
{
public:
CWrapperOfpDataOperation(int *pdata){
variouseInitialize(pdata);
}
operator = ...
};
class CDataAndOperation:public CCreateData ,public CWrapperOfpDataOperation
{
public:
int *const pdata;
CDataAndOperation(int i):CCreateData(i),pdata(CCreateData.pdata),CWrapperOfpDataOperation(pdata)
{}
};
ごめん,今したらコンパイルは通った。
けれど int *const pdata; に値が何もわりあてられてないので
コンストラクター 
CWrapperOfpDataOperation(pdata)
で失敗して
0xcccccd8を読み込み中にアクセス違反が発生しました
というエラーが出る
785デフォルトの名無しさん:2005/07/14(木) 14:07:40
>>782
> a[0].name=("%s",name);/*ここにゲームの結果*/
> a[0].rscore=("%d",score);

(´・д・`) ポカーン…
786デフォルトの名無しさん:2005/07/14(木) 14:24:53
>>782
> a[0].name=("%s",name);/*ここにゲームの結果*/
> a[0].rscore=("%d",score);

豪快だなあ・・・Lua みたいだな

文字列同士の代入は出来ないぞ
  sprintf( a[0].name, "%s", name );/*ここにゲームの結果*/
とかだな

あと、a[] の配列サイズは 11 個あるんだよな?
787デフォルトの名無しさん:2005/07/14(木) 14:46:46
>>786
そう言う事は、構造体の定義を見てから言え。
788デフォルトの名無しさん:2005/07/14(木) 16:09:28
>>787
>783
789デフォルトの名無しさん:2005/07/14(木) 17:02:34
>>772
宣言子
790デフォルトの名無しさん:2005/07/14(木) 18:33:35
>>783
> >>782
> >どこが悪いかわかりますか?
> 頭。
イイコトイッタ(゚∀゚)
791デフォルトの名無しさん:2005/07/14(木) 18:35:29
>>772
変数の定義の一部
792デフォルトの名無しさん:2005/07/14(木) 20:19:16
        ,. ‐ '"~´ / ̄ ̄`~`''‐ 、     `` 、
        , '´    /     /    `''‐、     \
      , '‐''"~´ ̄ ̄`~`ヽ、 /          \     ヽ
.   /             ̄``''‐.、     ∠>ヽ./\ ヽ
.  /             _____   \     /゚ /   ヽヽ   
 〈       ,. ‐''"~´      l  ``''‐、 ヽ.    / [ [[[ ヽi
.  ヽ.    /ヽ、_,. -┴─-== __=-'_、_, \、_/      _l
.   |   / 、.__/ ノ!ヽ、._ー-‐''⌒,r=-─ゝノ|| ‖  ̄ ̄ ̄  |
   !  {   / ,イ{ ヽ ( 〈、_,.ィrヮー< _,リ_|| ‖         !
   ヽ :ヽ _{. 〈.'`ァrッ‐、- - ,, ヽ-‐='..ゞ.{_.|| ‖        :l
.     `‐、\\ヽヽ-‐ツ ''´         `{_ |! ‖       !    
      :   |{_ ヽ.i. 〔ー-            { !.  |!__       ,'
.       :  |{_ _)l   `,ィ-─_、    //  | 0| ___/
       :   |{_ ミ. !  ヽ ̄,.-‐) .//    /l ̄ __/
      :  |{ ,.`ヽ.   `ー '´.∠‐'´    /'´ ̄ノ,ノ/
        ,l ‐''"~´ ̄ ̄ ̄l~´      /-──<´
       |  「 --┘    |___/  `!     |
          L.. -─ ''_""~ ̄‐''"~´l       |    |
アドレスを直接参照できるなんて気持ち悪いって言ってんだよーーーーー
793デフォルトの名無しさん:2005/07/14(木) 20:56:53
フーン
794デフォルトの名無しさん:2005/07/14(木) 22:11:01
こんばんは、よろしくお願いします。
void Main(void){
この上記の引数のvoidは、1番目のvoidを強調していると考えてよいのでしょうか。
795デフォルトの名無しさん:2005/07/14(木) 22:12:38
>>794
単に引数がないことを明示している。
796デフォルトの名無しさん:2005/07/14(木) 22:15:02
>>794
よい。
参考までに
int main(int);
の場合は一番目のintを強調していると考えてよい。
797デフォルトの名無しさん:2005/07/14(木) 22:22:24
へー
798デフォルトの名無しさん:2005/07/14(木) 22:26:05
バックグラウンドでプログラムを起動するにはどうすればいいのですか?
あと、自分へのリンクを作成するにはどうすればいいんですか?
ボーランドC++コンパイラ win xp です。
799デフォルトの名無しさん:2005/07/14(木) 22:26:44
>>796
さらに
参考までに
struct ahya *hoge(struct ahya *);
の場合は一番目のstruct ahya *を強調していると考えてよい。
800デフォルトの名無しさん:2005/07/14(木) 22:35:57
>>795-796さんありがとうございます。
よくわかりました。
801デフォルトの名無しさん:2005/07/14(木) 22:36:02
int Main(char);
これの場合は若干控えめな表現。
802デフォルトの名無しさん:2005/07/14(木) 22:38:31
>>799
そうなんですか。ありがとうございます。参考になります。
>>801
こんなこともできるのですか。
難しいですね、ありがとうございました。
803デフォルトの名無しさん:2005/07/14(木) 23:19:04
http://www.geocities.co.jp/SilkRoad/4511/vb/urlenc_c.htm
このURLエンコードのソースコードをコンパイルしてみたら
unsignedとsignedの変換でエラーが出まくったのでその部分だけキャストして直して
文字コードをEUCに、改行コードをLFにしてLinux上でコンパイルして実行してみたんだけど
全角文字を入力するとセグメンテーション違反になってしまう。
何故?
それと、他にURLエンコードの関数を知ってたら教えて欲しいです。
804デフォルトの名無しさん:2005/07/14(木) 23:27:44
>>803
落ちるかどうかは知らんけど、そのソースはSJIS用だねぇ。
それを修正しているならその辺りを疑ってみては?
805デフォルトの名無しさん:2005/07/14(木) 23:29:01
しかし、よくもまぁ、こんなゴミみたいなサンプル探してくるなぁ。
806デフォルトの名無しさん:2005/07/14(木) 23:38:17
URLエンコード ソース
とかでぐぐるとそのウンコソースが比較的上位に出るようだな(w

別にURLエンコードって、ソーステキストの文字エンコーディングに
依存する必要は無いはずなんだが....
わざわざSJIS漢字の1byte目の場合は、2byte目も決めうちで%エンコード
してるみたいね
その必要は無いのに。
807デフォルトの名無しさん:2005/07/14(木) 23:56:56
>>784
ソース貼る前にコンパイル通るか確認しろよ、ばか。

初期化順は初期化リストに書いた順ではなく、
基底クラス(書いた順)、各メンバ(書いた順)になる。

その例ではメンバ CDataAndOperation::pdata の初期化よりも先に
基底クラス CWrapperOfpDataOperation の初期化が行われるので、
当然の結果となる。
gcc だと -Wall で警告が出る。
808デフォルトの名無しさん:2005/07/14(木) 23:57:42
即席で作った。

#include <string.h>
#include <ctype.h>

/*
 * Encodes src string into dst, returns dst itself.
 */
char *url_encode(const char *src, char *dst)
{
    int c;
    const char *rfc2396_mark = "-_.!~*'()";
    char *result = dst;
    
    while (c = *src++) {
        c &= 0xff;
        if (isalnum(c) || strchr(rfc2396_mark, c))
            *dst++ = c;
        else if (c == ' ')
            *dst++ = '+';
        else
            dst += sprintf(dst, "%%%02X", c);
    }
    *dst = 0;
    return result;
}
809803:2005/07/15(金) 00:15:49
>>804-806 >>808
レスありがとうございました。
>>808のソースがちゃんと動いたので使わせてもらいます。
わざわざ書いくれてありがとうございました。
810デフォルトの名無しさん:2005/07/15(金) 00:18:16
>>808
それ、特殊キャラクタの数が足りない
811デフォルトの名無しさん:2005/07/15(金) 00:43:11
>>810
unreserved = alphanum | mark
mark = "-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")"

unreserved character以外はescapeされるべきである
というrfc2396の記述に従ったんだが

何か間違ってたかい?
812803:2005/07/15(金) 01:01:00
unwise = "{" | "}" | "|" | "\" | "^" | "[" | "]" | "`"
これらの文字列があったら不正と判断すれば良いんですか?
他に不正と判断すべき文字列ってありますか?
813803:2005/07/15(金) 01:02:49
>>812
×文字列
○文字
814803:2005/07/15(金) 01:09:14
あれ?
!!!をグーグルで検索するとエスケープされますけど
>>808の関数はエスケープしませんね。
if (isalnum(c) || !strchr(rfc2396_mark, c))

ではないですか?
815デフォルトの名無しさん:2005/07/15(金) 01:11:12
ちがうちがう、rfc2396_markはエスケープしなくていい文字列だ
816803:2005/07/15(金) 01:19:25
>>814
×エスケープ
○エンコード
間違えすぎ_no

こうしてみましたけど、間違ってますか?
char *url_encode(const char *src, char *dst) {
int c;
const char *rfc2396_mark = "-_.!~*'()";
const char *rfc2396_unwise = "{}|\\^[]`";
char *result = dst;

while (c = *src++) {
c &= 0xff;
if (strchr(rfc2396_unwise, c))
return NULL;
else if (isalnum(c) || !strchr(rfc2396_mark, c))
*dst++ = c;
else if (c == ' ')
*dst++ = '+';
else
dst += sprintf(dst, "%%%02X", c);
}
*dst = 0;
return result;
}
817803:2005/07/15(金) 01:22:33
>>815
グーグルの方がおかしいって事ですか?
818デフォルトの名無しさん:2005/07/15(金) 01:24:54
>>816
だめ。
てか、途中でreturn NULLしちゃってどうするの。

rfc2396のmarkに含まれる記号文字は、エンコードしなくていいと
言ってるだけで、しても構わない。
もし、何らかのプログラム(たとえばIE)の挙動にあわせたい等の理由で
その中身を替えたいのなら、rfc2396_markの文字を適当に調整しなさい。
819デフォルトの名無しさん:2005/07/15(金) 01:35:50
>>818
return NULL;は、
呼び出し側で
if(url_encode(str,result)){
成功時処理
}else{
失敗時処理
}
としようと思ったんです。

unreserved = alphanum | markという記述の意味とか
ついさっきやっと気付きました。
>>808のコードを使う事にします。
ありがとうございました。
820デフォルトの名無しさん:2005/07/15(金) 12:31:54
798ですが、他所できいてきます
821デフォルトの名無しさん:2005/07/15(金) 13:21:15
Visual Studioで開発してたんだけど
マウスの操作がめんどくさくて腱鞘炎になりかけ

今まで開発してたVC++.net 2003のソースコードも
そのまま使えて、なおかつ
Emacsぽくキーバインドだけでほとんど操作ができる環境ってないの?
822デフォルトの名無しさん:2005/07/15(金) 13:27:44
>>821
emacsとか
823デフォルトの名無しさん:2005/07/15(金) 14:39:28
emacsだとMFCでボタンとか配置するとき
どうするんだろう?
824デフォルトの名無しさん:2005/07/15(金) 14:59:29
>>823
普通にxxx.rcを手書きすればいいじゃない。

>>821
それ以前に、ショートカットキーのカスタマイズはお試しになったのかしら?
825デフォルトの名無しさん:2005/07/15(金) 15:12:33
>>824
お釜?
826デフォルトの名無しさん:2005/07/15(金) 16:52:05
>>823
MFCだからって別にリソースで凄いことやってるわけじゃないからな?
827デフォルトの名無しさん:2005/07/15(金) 19:15:09
関数の後ろにあるconstの意味って何でしょうか?
828デフォルトの名無しさん:2005/07/15(金) 19:24:08
その戻り値がconstである、じゃなかったっけ
829デフォルトの名無しさん:2005/07/15(金) 19:26:59
そのメンバ関数がオブジェクトを変更しない、という意味だ
const オブジェクトに対してもconstメンバ関数なら呼べる
そうでなければ呼べない
830デフォルトの名無しさん:2005/07/15(金) 19:28:34
戻り値がconstは普通に戻り値の型の前か・・・
831デフォルトの名無しさん:2005/07/15(金) 20:06:44
すみません。
こちらのサイトttp://hp.vector.co.jp/authors/VA016117/dscroll.html
のプログラムをコピペして実行してみたのですがどうしてもスクロールバーが表示されません。
アドバイスいただけないでしょうか。
832831:2005/07/15(金) 20:32:35
すみません。やっとわかりました。
お騒がせしてすみませんでした。
833デフォルトの名無しさん:2005/07/15(金) 21:10:34
834デフォルトの名無しさん:2005/07/15(金) 22:14:23
>>829
回答ありがとうございます。
835デフォルトの名無しさん:2005/07/15(金) 22:43:38
質問させてください。
外部ファイルでテンプレートを定義してもLNK0219エラーが出てしまうんですけど、
何か普通の関数を定義するときとは違う方法が必要なのでしょうか?
よろしくお願いします。
(外部ファイルでテンプレート→cppに実態、ヘッダにプロトタイプ宣言。メインCPPでヘッダ読み込み。)
836デフォルトの名無しさん:2005/07/15(金) 22:51:49
テンプレはヘッダに書くべし
837デフォルトの名無しさん:2005/07/15(金) 23:01:38
>>836
出来ました。ありがとうございました!
それにしても、どうしてなんでしょうね?
838デフォルトの名無しさん:2005/07/15(金) 23:11:20
すいません質問させてください。
キーボード入力のときにリターンで終了させるときと、
Ctrl+Dで終了させるときがありますが、プログラムの違いは何処なんでしょうか?

それとwindowsのコマンドプロンプトではCtrl+Dで終了できないのですが
何か他に方法があるのでしょうか
839デフォルトの名無しさん:2005/07/15(金) 23:15:50
>>838
Ctrl+C
840838:2005/07/15(金) 23:29:44
>>839
終了できましたが肝心の結果が表示されませんでした。
これはプログラムの問題ってことですか?
841デフォルトの名無しさん:2005/07/15(金) 23:34:26
>>838
WindowsでCtrl+Dの代わりなら、Ctrl+Zだな

Ctrl+Dで終わるプログラムは、EOFで終わるように組まれてるプログラムだ
842838:2005/07/15(金) 23:48:41
>>841
できました。ありがとうございます
ということはCtrl+DはEOFってことなんですね。
843デフォルトの名無しさん:2005/07/16(土) 00:04:35
>>842
正確にはEOFというわけじゃなく、現在の端末入力をすぐに送る
ってことだ。プログラム側から見ると、入力中はブロックして(待って)
いるread()がその時点でリターンする。

行頭でCtrl-Dを入力した場合や、Ctrl-Dを連続して入力した場合、
read()が読み取るべき入力内容が何もないから、read()は0を返す。
それがEOFと解釈されるわけだ。
844デフォルトの名無しさん:2005/07/16(土) 00:19:52
test.obj : error LNK2001: 外部シンボル "_TypeStart" は未解決です
Debug/test1.exe : fatal error LNK1120: 外部参照 1 が未解決です。

このようなエラーはどのように解決するんでしょうか?
初心者なんで、教えてもらえませんか?
845デフォルトの名無しさん:2005/07/16(土) 00:21:13
外部シンボル "_TypeStart" を解決する

846デフォルトの名無しさん:2005/07/16(土) 00:23:21
>>845
わかりました・・・
847838:2005/07/16(土) 00:29:23
>>843
なるほどー難しいですが、なんとなく分かりました。
848デフォルトの名無しさん:2005/07/16(土) 00:43:56
>>844
objファイルががリンクされてない。
849デフォルトの名無しさん:2005/07/16(土) 01:08:48
外部〜エラーははリンカーがぶち切れしてる
850デフォルトの名無しさん:2005/07/16(土) 01:35:19
C++独学中の学生です。環境はVisualC++6.0です。
http://www.cplusplus.com/doc/tutorial/tut3-1.html
の一番下の黄色い四角にあるプログラムを拡張して、
マトリックスをパラメータとして関数に渡したいのですが、うまくいきません。
ご指導お願いします。


#include <iostream.h>
void printmatrix (int arg[][], int length) {
for (int n=0; n<length; n++)
for (int m=0; m<length; m++)
cout << arg[n][m] << " ";
cout << "\n";
}
int main ()
{
int matrix[][] = {{1,2,3},{4,5,6}};
printmatrix (matrix,3);
return 0;
}
int main ()
{
int firstarray[] = {5, 10, 15};
int secondarray[] = {2, 4, 6, 8, 10};
printarray (firstarray,3);
printarray (secondarray,5);
return 0;
}
エラー表示
cpp(4) : error C2087: '<Unknown>' : missing subscript
cpp(13) : error C2087: '<Unknown>' : missing subscript
cpp(13) : error C2078: too many initializers
851デフォルトの名無しさん:2005/07/16(土) 01:41:35
>>850
エラーメッセージに書いてある通り、C/C++では配列の要素数は明らかでないといけない。
従って、二重配列をパラメータとしたいのであれば
void printmatrix(int arg[][3], int length) {...;}
として受け取らないといけないし、
int matrix[][3] = {{1, 2, 3, }, {4, 5, 6, }, };
として定義しないといけない。
要素数を固定にしたくないのであれば、1次元の配列(≒ポインタ)を渡すようにするのが無難。

しかしまぁ、<iostream.h>ですか。またアナクロな……
852デフォルトの名無しさん:2005/07/16(土) 02:11:45
>>851
ありがとうございます。
マトリックスのサイズは将来的に固定しないで扱えるようにしたいので、
1次元の配列に並べなおして計算していくことにします。

>しかしまぁ、<iostream.h>ですか。またアナクロな

何かがまずいのでしょうか?
853デフォルトの名無しさん:2005/07/16(土) 02:21:22
拡張子の無いiostream をインクルードして、std名前空間を利用するのが今時のC++
.hのついたヘッダファイルは、C++の規格がまだ整っていなかったころ使われていた過去の遺物。
854デフォルトの名無しさん:2005/07/16(土) 02:26:31
>>853
たまに見かける.hがないヴァージョンが最新とは知りませんでした。
何じゃこりゃと無視せずに勉強することにします。
ありがとうございます。
855デフォルトの名無しさん:2005/07/16(土) 02:32:22
version toka iunayo
C++ ha mukasikara <iostream> datta.
856デフォルトの名無しさん:2005/07/16(土) 02:38:15
>>855
あんたの言う昔は何年前のことかね?
857デフォルトの名無しさん:2005/07/16(土) 06:06:21
あのう、前前スレはhtml化されたのでしょうか・・・?
858ミキミキ:2005/07/16(土) 08:07:04
「素数を求めるプログラム」を作成して下さい。
言語はA〜Cの中から選択をしてください。
A : Visual Basic
B : C/C++
C : Java
859デフォルトの名無しさん:2005/07/16(土) 08:50:35
inlineってマクロみたいに一回展開されるだけ?
それとも、inline内部の関数は全部展開してくれる?
860デフォルトの名無しさん:2005/07/16(土) 08:51:03
マルチすなや。
つーか、削除依頼出しておけ。
861デフォルトの名無しさん:2005/07/16(土) 08:52:19
>>859
inlineはコンパイラにインライン展開してもいいことを示唆するための指示子。
マクロとは全く違う。
862デフォルトの名無しさん:2005/07/16(土) 12:37:50
C言語はじめて3ヶ月くらいの初心者です.

質問ですが,実行ファイルの終了時にウィンドウ(コマンドプロンプト)が
消えないようにするにはどうしたらよいのでしょうか.
863デフォルトの名無しさん:2005/07/16(土) 12:43:39
>>862
#include <stdlib.h>

int main()
{
  system("pause");
  return 0;
}
864デフォルトの名無しさん:2005/07/16(土) 12:48:58
>>863
thxです.
865デフォルトの名無しさん:2005/07/16(土) 13:16:39
#include "windows.h"
Sleep(ミリ秒);
or
#include "stdio.h"
scanf("%d", c);
866デフォルトの名無しさん:2005/07/16(土) 13:59:28
scanf("%d", c);
アホかい。
867デフォルトの名無しさん:2005/07/16(土) 14:01:40
何かおかしいか?
868デフォルトの名無しさん:2005/07/16(土) 14:02:14
>>864
コマンドプロンプトから実行させるようにユーザーに言えばいい
869デフォルトの名無しさん:2005/07/16(土) 14:32:13
>>867
止めるだけのためにscanf()を使うのは楊枝を鉈で削るようなもの。
無駄なばかりか危険ですらある。
870デフォルトの名無しさん:2005/07/16(土) 14:42:05
%*dとかならそういった問題はないと思う。
871デフォルトの名無しさん:2005/07/16(土) 14:55:41
scanfでやるとしたら
scanf("%*s");
っていうほうがよく見かける
872デフォルトの名無しさん:2005/07/16(土) 15:05:25
scanf()をどうしても使いたいなら>871だね。
まぁ、getchar()で充分だと思うのだけど。
873デフォルトの名無しさん:2005/07/16(土) 15:14:08
勘で、、、"!"ボタンを押してみよ。>>863
他にもいっぱい解決手段が書いてあるけど。
874デフォルトの名無しさん:2005/07/16(土) 15:14:46
ごめん>>862だね。
875デフォルトの名無しさん:2005/07/16(土) 15:22:03
エンター押すのうざいならgetch()って手もあるな
876デフォルトの名無しさん:2005/07/16(土) 15:27:01
いや、素直にコマンドラインから実行しろよ…
877デフォルトの名無しさん:2005/07/16(土) 16:06:38
>>876
GUIからでもコマンド呼べるのはCUIの長所の一つですが。
バッチ的なルーチンでも出力内容を見るために、ちょっと待って欲しい時はある。
漏れもgetchで待たせて、目の前にあるスペースキー等でコマンドプロンプトのウィンドウを抹殺することはよくある。
個人個人の好みの問題だ罠。
878デフォルトの名無しさん:2005/07/16(土) 16:20:46
>>857
まだじゃない?どうぞ
ttp://www.uploda.org/file/uporg148741.zip.html
879デフォルトの名無しさん:2005/07/16(土) 18:33:08
C++のstringクラスって動的に伸び縮みするのに、何故newやdeleteを使わなくて済むんですか?
なにかテクニックがあるなら他の自作クラスで活かしたいんですが。
880デフォルトの名無しさん:2005/07/16(土) 18:41:24
内部でnewやdeleteと同等なことをやってる。
881879:2005/07/16(土) 18:45:29
>>880
ちょっと考えたのはコンストラクタとデストラクタでnewとdeleteを呼ぶってやり方なんですが、
deleteは自身がデストラクタを呼ぶらしいので永久ループになりそうな気がします。
882デフォルトの名無しさん:2005/07/16(土) 18:50:38
> deleteは自身がデストラクタを呼ぶらしいので永久ループになりそうな

何を意味不明なことをいっとるんだ

~string() { delete this; };
とか言うコードを考えてるのか?
そんな阿呆なことは流石にやらない。

メンバ変数をdeleteするだけなら何も問題無い。
その歳に、そのメンバに対するデストラクタは走るが、
自身に対するデストラクタは走らないから、無限ループにはならないよ。
883デフォルトの名無しさん:2005/07/16(土) 19:03:33
>>881

class string {
 private:
  char* p;
  int length;
 public:
  string() : length(1024) { p = new char[length]; }
  ~string() { delete p; }
};
884デフォルトの名無しさん:2005/07/16(土) 19:19:35
だがコンストラクタとデストラクタでだけnew、deleteするなんざ糞クラス
885879:2005/07/16(土) 19:53:18
なるほど、わかりました。動的に確保したメンバだけdeleteするんですね。
ありがとうございます。
886デフォルトの名無しさん:2005/07/16(土) 20:10:15
>  string() : length(1024) { p = new char[length]; }
>  ~string() { delete p; }
          ~~~~~~~~~
別の問題が発生していますが(笑)
887デフォルトの名無しさん:2005/07/16(土) 20:24:31
char* につける引数名は何がふさわしい?
888デフォルトの名無しさん:2005/07/16(土) 20:29:48
これだと思うのつければいい
決まりなぞない

俺はpstr
889デフォルトの名無しさん:2005/07/16(土) 20:46:10
>>887
sでいい場合もあるが、意味を優先してつけるべき。
from, toとかsrc, dstとかpatternとか
890デフォルトの名無しさん:2005/07/16(土) 21:09:50
cp, pc
どっちか気分による
891デフォルトの名無しさん:2005/07/16(土) 21:10:52
ポインタの文字列だから、pstrがいいかな。
892デフォルトの名無しさん:2005/07/16(土) 21:21:46
文字列はchar*型でいいの?
それとも、unsigned char*型?
893デフォルトの名無しさん:2005/07/16(土) 21:24:30
だから型に従った名前付けるのなんざウンコだっての
ハンガリアンと一緒に滅んだ思想だよ

型じゃなくて意味で名前を付けろ。型そのものが意味である場合は
別に構わないが。
894デフォルトの名無しさん:2005/07/16(土) 21:27:31
>>892
文字として扱うのにsignedもunsignedもねぇよ
895デフォルトの名無しさん:2005/07/16(土) 21:28:23
>>893
ハゲドー
896デフォルトの名無しさん:2005/07/16(土) 21:28:29
ねぇよっていうか、関係ねぇよ
897デフォルトの名無しさん:2005/07/16(土) 21:30:28
charとchar*は区別して、char*の場合は頭にpをつけるのが礼儀。

ちなみに、チャー型じゃなくて、キャラ型だからね、発音は。
898デフォルトの名無しさん:2005/07/16(土) 21:36:24
iconv()について質問です。

man iconv(3)を読むと、「iconv 関数は 1 度に 1 つのマルチバイト文字を変換する」
と書いてありますが、マルチバイト文字が複数含まれる文字列(『あいうえお』とか)に
対して実行した場合一度で全て変換されました。

ネットで探したサンプルではwhile()で回すものと一度のみの両方がみつかりましたが
どちらが正しいのでしょうか?感覚的には前者が正しいような気がしますが、実際の
挙動は後者になるので悩んでいます。一度に変換される文字数は不定だったりする
のでしょうか?

899デフォルトの名無しさん:2005/07/16(土) 21:37:08
礼儀ってなんだ?
イライラする香具師の方が多いと思うが
900デフォルトの名無しさん:2005/07/16(土) 21:43:40
>>897
はいはい日立の腐れ社員は腐れコーディング規約でも量産して
三流派遣社員に鼻で笑われてくださいよ
901デフォルトの名無しさん:2005/07/16(土) 21:47:29
>>898
> iconv 関数は 1 度に 1 つのマルチバイト文字を変換する

の意味は、一度のiconv()呼び出しで一つのマルチバイト文字しか変換しない
という意味ではなくて、単純に一文字ずつ逐次変換していく、という
内部動作を語ってるの。

関数全体としては、変換できたバイト数は引数経由で取得できるから、
変換が完了したかどうかはそれを見て判断する。で、完了するまで
ループする。という使い方が正しい。
902デフォルトの名無しさん:2005/07/16(土) 21:57:07
charをチャー型と発音する人は意外と多い事実
903デフォルトの名無しさん:2005/07/16(土) 21:58:30
charはチャー、のがむしろ伝統的だと思うぞ
904デフォルトの名無しさん:2005/07/16(土) 21:59:17
だからなに?
905898:2005/07/16(土) 22:04:17
>>901
ありがとうございます。
「1 つのマルチバイト文字を変換」が内部動作を表しているということは
理解できましたが、そうなるとiconv()をwhileの内部に入れても、それは
必ず一度しか実行されないということにならないでしょうか?

iconv()の実行後に、結果が (size_t)-1 にならず、かつinleftが0より大きい
という状況はありえるということでしょうか。(それがありえる場合、whileは
無限ループに陥りかねない気もします…)
906デフォルトの名無しさん:2005/07/16(土) 22:06:33
チャー型?キャラ型?

文字型っつーんだよ
907デフォルトの名無しさん:2005/07/16(土) 22:13:36
#include <stdio.h>
#include <math.h>

int kc(int n,float x){
double k;
k = x*tan(M_PI/n);
//printf("k=%1.10f\n",k);
return k;
}

int main(void){
double k;
k = kc(12,1);
printf("k=%f\n",k);
}

-------------------------
return k; の返り値が0になってしまいます。
どこか型などがおかしいのでしょうか?
908デフォルトの名無しさん:2005/07/16(土) 22:17:34
>>907
int kc(
909デフォルトの名無しさん:2005/07/16(土) 22:17:55
>>905
> iconv()の実行後に、結果が (size_t)-1 にならず、かつinleftが0より大きい
> という状況はありえるということでしょうか

無論あり得る。outbufのサイズが不十分な場合だな。
その場合は、変換を続行するために、ポインタをずらしたりバッファ間で
コピーするなどのバッファ管理は当然必要になる。
910デフォルトの名無しさん:2005/07/16(土) 22:22:02
質問

int GetLength()
{
return m_len;
}

というのがあって、
文字列の長さを取得するのに、GetLength()呼び出しとm_len呼び出しはどっちが速い?
911デフォルトの名無しさん:2005/07/16(土) 22:24:37
>>908
あ、解決しました。
ありがとうございました。
912デフォルトの名無しさん:2005/07/16(土) 22:25:43
>>910
答: m_len は呼び出せない。
913898:2005/07/16(土) 22:26:25
>>909
ありがとうございます!
理解できました。

一度エラーが出たら処理失敗扱いであぼーんしていたのですが
outbufが足りない場合はそうやって対処してから続きを行うことが
できるんですね。勉強になりました。。。
914デフォルトの名無しさん:2005/07/16(土) 22:27:55
ていうかそもそも、m_lenは「呼び出す」などというものでもない
915デフォルトの名無しさん:2005/07/16(土) 22:28:08
>>910
それだけの情報ではわからない。
m_len を呼び出すと言うのも意味不明。

スピードは実測が基本。
916デフォルトの名無しさん:2005/07/16(土) 22:29:50
>>910
m_lenを呼び出すというのは適当に脳内置換してやる。
GetLengthがクラス宣言内にあればどうせインライン展開されるから速さは同じ。
917デフォルトの名無しさん:2005/07/16(土) 22:30:59
たといインラインでなくても、たったその程度では遅いの早いの言うほどのものでもない
918デフォルトの名無しさん:2005/07/16(土) 22:33:30
>>913
失礼。outbufが足りない場合は戻り値-1でE2BIGになるかな?

なんにせよ、
> 一度エラーが出たら処理失敗扱いであぼーん
エラーの場合でも、それはしないほうがよい。
ちゃんとerrnoを見よう。

EINVALの場合、inbufのMBC文字がハンパだということだから、
続きがある場合はバッファに追加すれば変換できる可能性がある。
行単位などではなくブロック単位で変換する場合はその手当ては必須だ。

本当にエラー(変換不能)と言えるのは、EILSEQの場合だけだろう。
この場合も、取りあえず?に変換して文字飛ばしして対処という手もある。
919デフォルトの名無しさん:2005/07/17(日) 00:56:09
char配列の先頭へのポインタにcharポインタを代入しようとすると、怒られてしまいます。例えば、

#include <stdio.h>
int main(){
 char str[]="abcde";
 char* p;
 *p = 'f';
 str = p;
}

をコンパイルしようとすると
error: incompatible types in assignment
になります(gcc 3.3)。str = (char*)p とキャストしても駄目でした。
どこでつまずいてるのかわからないんですが、
「char配列の名前=charポインタ」という認識自体が間違ってるんでしょうか?
920デフォルトの名無しさん:2005/07/17(日) 01:00:38
「ポインタ=変数」という認識が間違ってる。
921デフォルトの名無しさん:2005/07/17(日) 01:01:57
>>919
配列はポインタではない。
配列は定数みたいなモンで、配列に代入はできない(初期化はできる)

あと、そのコードで

*p = 'f';
はダメだぞ。どこも指してないポインタが指している場所に値を代入しようと
してる。
コンパイルできても、クラッシュする。
922デフォルトの名無しさん:2005/07/17(日) 01:03:18
923デフォルトの名無しさん:2005/07/17(日) 01:04:01
ああ、はやく夏休み終わらないかなー。
924デフォルトの名無しさん:2005/07/17(日) 01:06:38
>>919
二つの間違いがある。
1.配列の名前は配列の先頭アドレスを指す定数である
                           ~~~~
2.pはまだ有効なアドレスを持っていないので*p = 'f';はエラー。p = "f";にすべき
925924:2005/07/17(日) 01:07:37
必死こいて書いたら>>921さんが同内容をorz
9261/2:2005/07/17(日) 01:08:54
double sum_element(double *arg,int start, int end){
double sum = 0;
int i = start;
if(end<start)
sum = 0;
else
{
while(1)
{
sum = sum + *(arg+i);
++i;
if(i>end)
break;
}
}
return (sum);
}
9272/2:2005/07/17(日) 01:09:14
void Cholesky(double *A, double *L, int n){
for(int i=0; i<n; i++)
{
*(L+i*n+i) = sqrt(*(A+i*n+i) - sum_element(A,0,i-2));
}
}
void main(){
int n = 4*4;
double si[16];
ifstream fin ("PGAmatrix.dat");
for(int i=0; i<n; i++)
fin >> si[i];
fin.close();
double *SI = si;
double *L = new double[n];
Cholesky(SI, L, n);
}
外部から読み込んだマトリックスをコレスキー分解を作ろうとしている最初の段階なんですが、
コンパイルは通るものの、-6.27744e+066という数字が出力されてしまいます。
恐らくポインタの扱いに間違いがあると思うのですが、ご指導お願いします。
928デフォルトの名無しさん:2005/07/17(日) 01:15:44
>>927
SI, L には n 個しか要素が無いから i*n+i 個目の要素は
i > 0 のときにに存在しない要素になる。
929デフォルトの名無しさん:2005/07/17(日) 01:54:11
BCC5.5でwindowsプログラムを作りたいのですが、どの様にコンパイル又はコード追加をすれば良いのでしょうか。

*cfgの内容はデフォルトのまんまです。
930デフォルトの名無しさん:2005/07/17(日) 01:58:21
何行も定義しなければならないようですね。
SDKに関して勉強してきます。
931デフォルトの名無しさん:2005/07/17(日) 01:58:25
>>929
それくらい自分で調べてください
932デフォルトの名無しさん:2005/07/17(日) 01:58:26
>>928
ポインタは問題ないのでしょうか?
家に帰ってきちゃったので、明日学校で試して見ます。
ありがとうございます。
933デフォルトの名無しさん:2005/07/17(日) 02:31:28
double random_range(double lowest_number, double highest_number)
{
if(lowest_number > highest_number){
swap(lowest_number, highest_number);
}
srand((unsigned)time(NULL));
double range = highest_number - lowest_number + 1.0;
double rn = lowest_number + range * (double) rand()/RAND_MAX;
return rn;
}
double rnorm(double mean, double stdv){
double r1=random_range(0.0,1.0);
double r2=random_range(0.0,1.0);
double rn = sqrt((-2.0*log(r1)))*sin(2*3.141593)*r2;
return rn;
}
void main(){
int n =10;
for(int i=0; i<n; ++i)
{
double rn=rnorm(0.0,1.0);
cout << rn << endl;
}
}
一様乱数を標準正規乱数に変換して指定された数だけ出力するようにしたいのですが、
同じ乱数が出力されてしまいます。
異なる乱数を指定した数だけ出力する方法を教えてください。
934933:2005/07/17(日) 02:32:19
ヘッダファイルを付け忘れてました。
#include<iostream>
#include <cstdlib>
#include <algorithm>
#include <ctime>
#include <iomanip>
#include <vector>
#include<math.h>
using namespace std;
935デフォルトの名無しさん:2005/07/17(日) 04:41:37
>>933
見るからに1秒以内で終わる(time(NULL)の値が変化しない)処理の中で
毎回srandしてたらそりゃ同じ結果しか出んだろ
936デフォルトの名無しさん:2005/07/17(日) 06:02:04
>>920
だがポインタを保持して置くのは変数
937デフォルトの名無しさん:2005/07/17(日) 07:52:06
>>929
とりあえずコンパイル時にソースファイルに-Wを指定するとWinMainから始まるプログラムとしてリンクされる。
938デフォルトの名無しさん:2005/07/17(日) 08:44:53
>>919です。レスと>>922のURLで間違いが理解できました。
配列の名前だって名前空間使ってるんだから、変数みたいに代入できるんだろうと思ってました。
(できれば便利なのにな...)
939デフォルトの名無しさん:2005/07/17(日) 09:04:25
>>938
> (できれば便利なのにな...)
そうか?
940デフォルトの名無しさん:2005/07/17(日) 09:25:40
malloc/freeは遅いって聞いたんだけど、静的な配列を自動的に確保/解放するのより遅いんですか?
あと、確保/解放するメモリの量は速度に関係しますか?
941デフォルトの名無しさん:2005/07/17(日) 09:30:03
>>939
でも配列から同じ要素数の配列への代入はできてもいいんじゃないか?
できるようになれば一貫性の向上につながると思う。
942デフォルトの名無しさん:2005/07/17(日) 09:32:51
>>940
初心者は意識しなくて構いません。
#つーか、ちゃんと理解できていれば遅いかどうか嫌でも判るわけで。
943デフォルトの名無しさん:2005/07/17(日) 09:35:04
>>941
memcpyかmemmoveで我慢汁。
sizeofで配列全体のサイズがわからなかったら糞言語だったんだろうがな。
944デフォルトの名無しさん:2005/07/17(日) 09:41:10
もしくは C++ なら vector 使うって話だな。
945デフォルトの名無しさん:2005/07/17(日) 09:55:07
>>942
mallocはヒープから取ってくる、普通の配列は自動変数と同じようにスタック上に確保する、という理解なのですが。
ただ、ヒープとスタックどちらが速いのか、また、ヒープ上での確保速度は大きさに依存するのかがわからないんです。
946デフォルトの名無しさん:2005/07/17(日) 10:03:02
スタックとヒープの機能を提供するのがそれぞれ何かを考えれば
自ずと答えがわかるはずなんだがなぁ
947926:2005/07/17(日) 10:32:07
>>928
すいません。解決できてません。
もう少し、アドバイスをお願いします。
948デフォルトの名無しさん:2005/07/17(日) 11:15:33
>>938
配列名は配列の先頭を指すポインタ型のリテラルと理解するとわかりやすいと思う。
949デフォルトの名無しさん:2005/07/17(日) 11:56:51
チェックボックスのような物を作りたくて
以下のように書いていたのですが、文字列に文字列を代入することが出来ないようで困っています。
何か代用方法はありませんでしょうか?

char a[]="A";
char b[]="B";
char c[]="C";

char y[]="○";
char x;
scanf("%s",x);

switch(x){
case 'A':
a[]=y;
break;
}

950デフォルトの名無しさん:2005/07/17(日) 11:59:07
>>947
配列はその要素数を超えてアクセスできない。
int a[1];
a[0] = 1; // ok
a[1] = 1; // ng
951デフォルトの名無しさん:2005/07/17(日) 12:00:58
>>949
strcpy
っていうか、糞コードだなぁ。
952デフォルトの名無しさん:2005/07/17(日) 12:09:03
>>951
どーいうときに使うのか分かんなくて読み飛ばしてたところに思いっきり書かれてました。
早い返答ありがとうございます。
クソなのは昨日から勉強始めたばかりなので目瞑っておいてください…。
953デフォルトの名無しさん:2005/07/17(日) 12:26:08
>>945
malloc()の速度は基本的には実装依存なので、ライブラリのソースを見
るか計ってみないとわからない。

でも、速度が大きさに依存する実装方法はちょっと思い浮かばない。ヒー
プのフラグメントっぷりに依存することは多いかも。
954デフォルトの名無しさん:2005/07/17(日) 13:44:16
>>949
scanf("%s",x);    //間違い。xはポインターじゃない。
scanf("%c", &x);

もしxを文字型配列にするんならscanfじゃなくてfgetsにしたほうがいい。
955952:2005/07/17(日) 14:05:20
>>954
ご飯食べてさぁ続き、と思ったら更に質問するようなことが起きたのですが、
おもいっきしその解答が先出しされててびっくりしました。
本当にありがとうございまっす。
956デフォルトの名無しさん:2005/07/17(日) 14:08:42
>>927
なんでdouble *SI = si;なんて冗長な事してるの?
バグとは関係ないけど見辛いから質問するときは止めとけ。
あと、*Lも
957デフォルトの名無しさん:2005/07/17(日) 14:11:47
g++(gcc) 3.3.3 を使っているのですが、標準で使える class の一覧って
どこかにあるのでしょうか?ヘッダファイル(?)をあさるしかないのでしょうか?
例えばファイルの ctime が知りたいと思ったときどのような手順で調べるのが
普通なのでしょうか?
google で検索しようとしてキーワードに標準と入れると STLの説明ばかり
ひっかかってしまいます。タコで申し訳ありません。
958デフォルトの名無しさん:2005/07/17(日) 15:06:30
公式サイト
マニュアル
書籍
ヘッダーファイル
959デフォルトの名無しさん:2005/07/17(日) 15:37:26
自分でも驚いているのですが・・・
float x;
x = 1/4;
printf("%f\n",x);
わ、割り算が出来ません...orz
960デフォルトの名無しさん:2005/07/17(日) 15:38:20
>>959
1.0/4.0
961デフォルトの名無しさん:2005/07/17(日) 15:45:07
>>959
割り算はできてる。int / int で切り捨てられて 0 になっている

>>960 は 80点

x = 1.0f / 4.0f;
962デフォルトの名無しさん:2005/07/17(日) 15:46:40
>>961
なんでわざわざ単精度で割算するんだ?
963961:2005/07/17(日) 15:49:39
>>962
俺に聞かないでくれ

x が float型だからそうしたんだよ
(まぁ printf に渡されるのは double になっちまうけどな)
964デフォルトの名無しさん:2005/07/17(日) 15:55:27
x が float型だったらfで計算しなくちゃならんのか?それが100点?
965961:2005/07/17(日) 15:59:09
>>964
規格を額面通り受け取って
コンパイラによる最適化を考えなければ
よりよいコードだと思ったのだが。

何か問題でも?具体的に頼む
なんか自信なくなってきた
966デフォルトの名無しさん:2005/07/17(日) 16:01:18
>>965
まずはあなたが何故そう書いたのか説明してくれよ
967デフォルトの名無しさん:2005/07/17(日) 16:11:08
>>965
「よりよいコード」とか考えるんだったら x を double にするのが正解だろ。
968デフォルトの名無しさん:2005/07/17(日) 16:12:53
それは流石に965に言うことじゃないと思うが
969961:2005/07/17(日) 16:31:21
>>966
ゴメソ。じゃ説明する

>>960のコードは次のコードと同じようなことをしている

    int i = 1L + 4L;

わざわざ大きい型を使っている
最終的に小さい型へ型変換される

>>967 禿同
970デフォルトの名無しさん:2005/07/17(日) 16:37:23
>>969
ttp://www.pro.or.jp/~fuji/mybooks/cdiag/cdiag.4.4.html
計算精度を落とし、速度も落とし、それでもfloatで計算する事が20点アップするとは思えないが。
さすがに1/4の場合なら結果に違いは無いかもしれんが。
971デフォルトの名無しさん:2005/07/17(日) 16:39:11
低レベルな質問、度々申し訳ございません。
x=a+b+c;
while(x>3)
{
printf("%d",&a);
a++;
}
このループがエンドレスなのは何故でしょうか…。
972デフォルトの名無しさん:2005/07/17(日) 16:40:10
>>971
書いてある通りに動いてると思うよ
973デフォルトの名無しさん:2005/07/17(日) 16:40:24
あああ、書いたあとに自己解決。
と思ってx<3にしたら今度は何も表示されないように…。
974デフォルトの名無しさん:2005/07/17(日) 16:40:35
>>971 なんで終わると思うの?
975デフォルトの名無しさん:2005/07/17(日) 16:49:36
>>974
だよねー
976デフォルトの名無しさん:2005/07/17(日) 17:01:57
floatよりもdoubleが数倍速いってマジなのかね。
なんか年寄りの昔話にしか思えないんだけど。最近のCPUでも成り立つ話なのか・・・。
977デフォルトの名無しさん:2005/07/17(日) 17:03:43
>>973
自分で設定した条件式すらも理解できんのか?
前判定・後判定って知ってるか?
for文知ってるか?do while文知ってるか?

まだまだアドレスやらポインタやらは早いんじゃないかな?

>>976
コンパイラにマシン語吐き出させたら分かるんじゃない?
978デフォルトの名無しさん:2005/07/17(日) 17:09:35
>>977
えーと、昨日始めたばかりなので、
アドレスやらポイントやらは何言われてるのかよー分かりませんが、
先に式書いておいてもwhileの中では反映されないってことに気付きました。
これが前判定後判定ってことですよね?
979デフォルトの名無しさん:2005/07/17(日) 17:10:18
>>976
CPUって言うよりコンパイラだべ。
980デフォルトの名無しさん:2005/07/17(日) 17:12:26
前判定、後判定なんて関係ないだろこの場合は
981デフォルトの名無しさん:2005/07/17(日) 17:14:23
>>978
ループの中でxが更新されない限り、一度成り立った条件は崩れないだろ。
(他のタスクでうんちゃらかんちゃらは分かりにくくなるので省略)
だからループ抜けなかったり、入らなかったりするのは当然。
982デフォルトの名無しさん:2005/07/17(日) 17:15:05
>>977
マシン語読めないんでorz

>>979
おお、コンパイラの話なのですか。
この記事は恐らくgccだと思うので、VCなら関係ないのかな・・。
983デフォルトの名無しさん:2005/07/17(日) 17:17:05
なんでやねん
984デフォルトの名無しさん:2005/07/17(日) 17:22:40
>>978
printf("%d",&a);
&aは変数aのアドレス
985957:2005/07/17(日) 17:23:12
>>958
例えば公式サイトだと
ttp://gcc.gnu.org/onlinedocs/
だと思うのですが、そこのどの辺を見るとよいのでしょうか?
986デフォルトの名無しさん:2005/07/17(日) 17:28:52
>>984
あああ、scanf("%d",&a)とかと勘違いしてましたー。
アドレスとやらはちょこっと教科書読み進めてみたら出てきましたけど、
良く分からないので取り合えず放置しときます。

あんまり低レベルでグダグダ質問しても失礼なのでこの辺りで自習に戻ります。
ありがとうございました。
987デフォルトの名無しさん:2005/07/17(日) 17:37:29
floatとdoubleの話はコレだな
ttp://www.pro.or.jp/~fuji/mybooks/cdiag/cdiag.4.4.html
988デフォルトの名無しさん:2005/07/17(日) 17:41:26
>>985
そことは別だがここはどうだ?
http://www.shibu.jp/cppreference/
989デフォルトの名無しさん:2005/07/17(日) 17:44:02
>>971
彼が何が分からないのか今分かった。
一度 x=a+b+c という等式を教えたら、その後は自動的に計算し
てくれると思ってるのか。
"="はその時点での右辺の計算値を左辺の変数に代入するとい
う意味。
下記だとaしか更新されない。ループの中でxに再代入しない限り
ループに入る前の値を保持する。
x=a+b;
while (x<3) {
    a = a+1;
}
990デフォルトの名無しさん:2005/07/17(日) 17:47:36
>>987
何の前提もなく
> C言語の浮動小数点数には、float型とdouble型がありますが、この説明からは、
> float型には何のメリットも無いようでしょう。実際、無いのです。
ならば、この文章は間違いだな。
991デフォルトの名無しさん:2005/07/17(日) 18:11:01
>>987
この部分だけ切り取って読むと、思い込みの激しい筆者に見えるな。
C言語の総論として書いているのをみると、この作者にとってはWindowsやLinux
上でのアプリ開発のためだけに、C言語は存在するのかなぁと、見えてしまう。
色々なCPUのコンパイラは昔々の話ではなく今でも立派な現役なのに。
992957:2005/07/17(日) 18:32:55
>>988
ありがとうございます。
993デフォルトの名無しさん:2005/07/17(日) 18:39:53
まあfloat型がいいかdouble型がいいかはコンパイラとCPU両方に依存するだろうな。
FPUの実装にもよるし、コンパイラがどう最適化するかにもよるし。
特にコンパイラの最適化に関しては、最近はSSEのスカラ演算レベルなら
自動でやってくれるから、全部float型の方がいいかもしれないしね。
994デフォルトの名無しさん:2005/07/17(日) 18:44:13
>>961 の、floatじゃないと80点だ、という話からこんな事になっただけだべ
次スレまだー?
995デフォルトの名無しさん:2005/07/17(日) 19:05:55
VC++2003で面白い結果になった。
float型の変数に例の結果を代入するのを書いたんだが、
1.0/4.0も1.0f/4.0fも即値でコードに3E800000が埋め込まれて
movで代入するだけになってる。
996デフォルトの名無しさん:2005/07/17(日) 19:22:45
最適化されちまってねえか
997デフォルトの名無しさん:2005/07/17(日) 19:42:39
むしろdebugビルドでそうなったんだ。
だれかgccとbccでチェック頼む。
998デフォルトの名無しさん:2005/07/17(日) 19:55:02
定数式がコンパイル時に評価されるのは最適化以前の問題だと思っていたが…
999デフォルトの名無しさん:2005/07/17(日) 20:20:44
結論、何か理由がない限りfloatよりもdoubleを使おう。
同じように、1.0f / 4.0fとしないで 1/4.0で充分だろう。
1000デフォルトの名無しさん:2005/07/17(日) 20:37:34
千昌夫
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。