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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。
【前スレ】
http://pc8.2ch.net/test/read.cgi/tech/1125743714/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
2デフォルトの名無しさん:2005/10/10(月) 00:46:11
>>1000
早くうpしろよ
3デフォルトの名無しさん:2005/10/10(月) 00:46:18
>>1 乙
前スレ>>1000 うpうp!
4デフォルトの名無しさん:2005/10/10(月) 00:46:56
>>1 乙
>>1000 早く
5デフォルトの名無しさん:2005/10/10(月) 00:47:00
1000 名前:デフォルトの名無しさん [sage] 投稿日:2005/10/10(月) 00:45:20
1000なら妹の下着うpする。
6デフォルトの名無しさん:2005/10/10(月) 00:48:06
1000 名前:デフォルトの名無しさん[sage] 投稿日:2005/10/10(月) 00:45:20
1000なら妹の下着うpする。

1000 名前:デフォルトの名無しさん[sage] 投稿日:2005/10/10(月) 00:45:20
1000なら妹の下着うpする。

1000 名前:デフォルトの名無しさん[sage] 投稿日:2005/10/10(月) 00:45:20
1000なら妹の下着うpする。

1000 名前:デフォルトの名無しさん[sage] 投稿日:2005/10/10(月) 00:45:20
1000なら妹の下着うpする。

1000 名前:デフォルトの名無しさん[sage] 投稿日:2005/10/10(月) 00:45:20
1000なら妹の下着うpする。
7デフォルトの名無しさん:2005/10/10(月) 00:57:56
>>2-5
VIPでやれ
8デフォルトの名無しさん:2005/10/10(月) 01:13:52
STLつかうと一気に実行ファイルサイズが10倍に?!

環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。

すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
9デフォルトの名無しさん:2005/10/10(月) 01:16:41
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?

#include <stdafx.h>
後氏ね。

言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
10デフォルトの名無しさん:2005/10/10(月) 01:17:29
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?

#include <stdafx.h>

あと死ね。

言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
11デフォルトの名無しさん:2005/10/10(月) 01:34:11
>>8
VIPでやれ
12デフォルトの名無しさん:2005/10/10(月) 01:49:32
前スレの949ですが以下が考えたプログラムです。
data.datというファイルから数値を入力し合計と平均を出すだけの
プログラムだと思うのですが全く何も起こらなくて。
何がいけないんでしょう?
#include<stdio.h>
#include<stdlib.h>
void main(void)
{int val;
int sum=0;
int cnt;
FILE *fp;
if((fp=fopen("data.dat","r"))==NULL)
{ printf("File not found---\n");
exit(1);
}
for(cnt=0;;cnt++)
{fscanf(fp,"%d",&val);
if(val==0)
{break;
} sum+=val; }

if(cnt>0)
{
printf("Sum=%d Ave=%f",sum,(double)sum/cnt);
} fclose(fp); }
13デフォルトの名無しさん:2005/10/10(月) 01:55:35
>>12
デバッガで一行ずつ追っていけばすぐ解決するお。
14デフォルトの名無しさん:2005/10/10(月) 01:57:33
おそらく無限ループしてるんだろうな
15デフォルトの名無しさん:2005/10/10(月) 02:01:04
>>12
forの条件式は?
16デフォルトの名無しさん:2005/10/10(月) 02:05:05
>>15
fscanfでvalに読み込んだ値が0ならbreakするようになってる
0がなかったら無限ループになるだろうね
17デフォルトの名無しさん:2005/10/10(月) 02:12:03
あと整数に変換できない文字列が途中にあっても無限ループするな
18デフォルトの名無しさん:2005/10/10(月) 02:14:11
こういうのはfgetsとatoiを使うのがいいのかな?
19デフォルトの名無しさん:2005/10/10(月) 02:14:25
>>16
fscanfが失敗したらbreakもいれておこう
20デフォルトの名無しさん:2005/10/10(月) 02:19:51
とりあえずfscanfの返り値チェックするようにすればいいだろ
21デフォルトの名無しさん:2005/10/10(月) 02:26:17
unsigned long int (64bit)が使えるフリーのコンパイラってないですかね、
教えて下さい。 
22デフォルトの名無しさん:2005/10/10(月) 02:36:30
(unsigned) long long intの間違いじゃないの?

まあどっちにしろgccで使えるよ。
23デフォルトの名無しさん:2005/10/10(月) 02:37:16
unsigned __int64 ならBCCでも使えるだろ。実際使うとなるといろいろ問題だが。
24デフォルトの名無しさん:2005/10/10(月) 02:41:30
gccだとlong long int でも32ビットになってしまいます。
bccでも駄目でした・・・
かろうじてFTN95とg77がサポートしてましたが、符号なしは無理なようで・・
25デフォルトの名無しさん:2005/10/10(月) 02:41:38
ちょっと軽い気持ちで聞くんだけど。
そういうCPUの桁数(ビット数)を超えちゃう計算ってC言語でどうやるの?
例えばハードディスクの容量の計算とかって余裕で足りないじゃん。
普通に足し算するにしても頭こんがらがるんだけど。
26デフォルトの名無しさん:2005/10/10(月) 02:42:37
おい、下着は何処だ?
27デフォルトの名無しさん:2005/10/10(月) 02:45:21
まずは妹をください
そうすればパンツをご覧にみせます
28デフォルトの名無しさん:2005/10/10(月) 02:47:54
>>25
gmpとかのライブラリを使う
29デフォルトの名無しさん:2005/10/10(月) 02:48:10
>>25
同感です、FTN95で、922京あたりの素数が求められた時には感動しました。
セレロンだから遅いですけどw
30デフォルトの名無しさん:2005/10/10(月) 02:48:27
>24
手元のcygwin/gcc v3.4.4で

unsigned long long int hoge;
printf("%d\n", sizeof(hoge));

とやったら 8 と出力されるけど。__int64に直してBCC5.5.1でやっても同様。
31デフォルトの名無しさん:2005/10/10(月) 02:52:29
なるほど!bccでは宣言の仕方が違ったんですね、
これで心おきなく1844京辺りの素数が求められそうです、
ありがとうございました!
32デフォルトの名無しさん:2005/10/10(月) 02:55:33
ご覧にみせます の検索結果のうち 日本語のページ 約 25 件中 1 - 21 件目 (0.45 秒)
33デフォルトの名無しさん:2005/10/10(月) 03:12:17
>>28
そういうのあるんだ。サンクス。
34デフォルトの名無しさん:2005/10/10(月) 03:12:28
#include<stdio.h>
main(){
unsigned __int64 i,j,k;
scanf("%d",&j);
scanf("%d",&k);
i=j*k;
printf("%d %d",i);
return 0;
}

i=4200000000,j=5とかやってみたら、いきなりあふれてしまった、
一筋縄ではいかないようですねw
35デフォルトの名無しさん:2005/10/10(月) 03:29:22
%dじゃなくて%uじゃなかったけ?
printfのところを//でコメントアウトして実行してみたら?
36デフォルトの名無しさん:2005/10/10(月) 03:35:51
>>34
bcc32でやってるんなら、scanf()で__int64とかunsigned __int64を読み込む
書式は用意されてないよ。
自前で用意汁。これがさっき言っていた問題点。
37デフォルトの名無しさん:2005/10/10(月) 03:37:33
>>36
んなこたぁない。
%I64dと、%I64uがある。from BCB6。BCC5.5.1でも同じじゃマカろーか。
38デフォルトの名無しさん:2005/10/10(月) 03:55:05
ぉお、構想どうり動きそうです!
ついでにソース晒してみます。
#include<stdio.h>
#include<math.h>
main(){
unsigned __int64 n,a=0,i,j,m=2,l;
printf("Start number = ");
scanf("%I64u",&l);
printf("End Number = ");
scanf("%I64u",&n);
printf("[%10d] = %10d \n",1,2);
for(i=l;i<=n;i+=2){
for(j=3;j<=__int64(sqrt(i));j+=2){
if(i%j==0){
a=1;
break;
}
}
if(a==0){
printf("[%10I64u] = %10I64u \n",m,i);
m=m+1;
}else{
a=0;
}
}
return 0;
}
39デフォルトの名無しさん:2005/10/10(月) 04:02:12
ちなみにgccにも特殊な書式が必要なんですか?
40デフォルトの名無しさん:2005/10/10(月) 04:12:40
%lld、%llu
41デフォルトの名無しさん:2005/10/10(月) 04:15:46
42デフォルトの名無しさん:2005/10/10(月) 04:16:30
つまり%Ld、%Luでもよい。
43デフォルトの名無しさん:2005/10/10(月) 04:31:14
ぉお、もの凄い!参考書が必要じゃなくなりそうなページですね
44デフォルトの名無しさん:2005/10/10(月) 04:47:27
>38のコードはStart numberに偶数を指定するとトンチキな結果を返すのでだめだめ。
あと1も素数と判定されてしまう。
45デフォルトの名無しさん:2005/10/10(月) 05:22:15
#include<stdio.h>
#include<math.h>
main(){
unsigned __int64 n,a=0,i,j,m=2,l=1;
printf("Start number = ");
scanf("%I64u",&l);
while(l%2==0 || l==1){
printf("Start number = ");
scanf("%I64u",&l);
}
printf("End Number = ");
scanf("%I64u",&n);
for(i=l;i<=n;i+=2){
for(j=3;j<=__int64(sqrt(i));j+=2){
if(i%j==0){
a=1;
break;
}
}
if(a==0){
printf("[%5I64u] = %20I64u \n",m,i);
m=m+1;
}else{
a=0;
}
}
return 0;
}
46デフォルトの名無しさん:2005/10/10(月) 05:23:18
OKですね
47デフォルトの名無しさん:2005/10/10(月) 05:27:35
そういう直し方をされても困ってしまうのだが
48デフォルトの名無しさん:2005/10/10(月) 05:41:25
#include<stdio.h>
#include<math.h>
main(){
unsigned __int64 n,a=0,i,j,m=1,l=1;
printf("Start number = ");
scanf("%I64u",&l);
if(l==1L){
l=3L;
}
if(l%2==0){
l=l+1L;
}
printf("End Number = ");
scanf("%I64u",&n);
for(i=l;i<=n;i+=2){
for(j=3;j<=__int64(sqrt(i));j+=2){
if(i%j==0){
a=1;
break;
}
}
if(a==0){
printf("[%5I64u] = %20I64u \n",m,i);
m=m+1;
}else{
a=0;
}
}
return 0;
}
49デフォルトの名無しさん:2005/10/10(月) 05:43:41
こういう感じですかね

あと18446744073709549951が個人で求められる最終解っぽいですね
50デフォルトの名無しさん:2005/10/10(月) 05:46:59
手元でちゃんと確認してからソース貼ってくれよ頼むから
今度は2から開始した時に2がカウントされないよ

アルゴリズムの方を見直すという考えはないの
51デフォルトの名無しさん:2005/10/10(月) 06:13:37
#include<stdio.h>
#include<math.h>
main(){
for(;;){
unsigned __int64 n,a=0,i,j,m=1,l=1;
printf("Start number = ");
scanf("%I64u",&l);
if(l==1L){
l=3L;
}
if(l%2==0 && l!=2){
l=l+1L;
}
printf("End Number = ");
scanf("%I64u",&n);
if(l==2){
l=l+1;
printf("[ 1] = 2\n");
m=2;
}
for(i=l;i<=n;i+=2){
for(j=3;j<=__int64(sqrt(i));j+=2){
if(i%j==0){
a=1;
break;
}
}

   略

これでOKっぽいですね、ありがとうございました。
52デフォルトの名無しさん:2005/10/10(月) 06:29:00
そういうことを言いたいんじゃないんだがもういいや
53デフォルトの名無しさん:2005/10/10(月) 07:58:10
>>51
そんなループwhile使えよ
かっこ悪い
54デフォルトの名無しさん:2005/10/10(月) 08:26:45
なんちゅーか、やらされてる感がプンプンする、
言われたとこだけ直して、これでいいでしょ!
とっとと終わらせたい、みたいな。
55デフォルトの名無しさん:2005/10/10(月) 13:01:58
おかしいと思うならこう直せと言ってやれば良いじゃん
本人はとりあえず結果がでて満足してるんだし
まさか、完璧なコード以外認めないとか言うんじゃなかろうな
56デフォルトの名無しさん:2005/10/10(月) 13:33:33
認めない
5751:2005/10/10(月) 14:28:43
確かにwhile使った方がエレガントですね、
forで書くとbreakとcontinueがごっちゃになってバグりやすかったです。
58デフォルトの名無しさん:2005/10/10(月) 14:43:37
この場合の修飾詞はエレガントじゃなくてスマートじゃないかな。
まあ本当に優雅に見えたのならそれで間違いじゃないし、スレとは全然関係ないけど。
59デフォルトの名無しさん:2005/10/10(月) 15:16:42
第1引数で書く記号の種類、第2引数でそれをいくつ書く

という関数を作りたく、以下のようにしたところ、
引数が少ない と、怒られました。2個であってる気がするのですが、
何故怒られるのでしょうか?ちなみに、SHARP を 2 に変えると引数少ないエラーは
消えます。


#include <stdio.h>

#define HYPHEN 0;
#define ASTERISK 1;
#define SHARP 2;
#define PLUS 3;

void draw_symbol(int symbol, int count);

int main(){
draw_symbol(SHARP, 10);
}

60sage:2005/10/10(月) 15:17:34
void draw_symbol(int symbol, int count);
{
int i;

switch symbol
{
case HYPHEN:
for(i=0; i > count; count++){ printf("-"); }
break;
case ASTERISK:
for(i=0; i > count; count++){ printf("*"); }
break;
case SHARP:
for(i=0; i > count; count++){ printf("#"); }
break;
case PLUS:
for(i=0; i > count; count++){ printf("+"); }
break;
}
}
61デフォルトの名無しさん:2005/10/10(月) 15:40:41
>>59
SHARPが"2;"と展開されている。
62デフォルトの名無しさん:2005/10/10(月) 15:43:47
61>>
あああああ!!
ありがとうございます。

とってみたらswitchで爆発しました。
63デフォルトの名無しさん:2005/10/10(月) 15:44:48
defineにセミコロン書くなよ・・・
64デフォルトの名無しさん:2005/10/10(月) 15:53:20
>>63
すいません。つい。

以下の内容で解決しました。

・switchにの条件式に()を付け忘れていた
・タグの先のforで比較対照(count)を++していた
65デフォルトの名無しさん:2005/10/10(月) 17:49:37
ファイルを特定の行まで読みたいんですけど,どうも上手くいきません.
どうすれば良いんでしょうか.
istream_iteratorの使い方がおかしいのかな?

std::vector<std::string> text;
std::ifstream ifs("data.txt");
if(!ifs)
  std::exit(EXIT_FAILURE);
std::istream_iterator<std::string> it1(ifs), it2, eof;
it2 = std::find(it1, eof, "山田\n");
std::copy(it1, it2, std::back_inserter(text));
std::copy(text.begin(), text.end(), std::ostream_iterator<std::string>(std::cout));

data.txt
小林
田中
山田
大村
66デフォルトの名無しさん:2005/10/10(月) 17:56:38
あぁぁぁコード見てすごくいらついた。
#define HYPHEN 0 のままテーブル(?もしくはswitch)でch拾うほうが
いいかもしれんが。さらにくずコードですまん。
#include <stdio.h>
#define HYPHEN '-'
#define ASTERISK '*'
#define SHARP '#'
#define PLUS '+'
void draw_symbol(int ch, int count)
{
while(count-- > 0){ putchar(ch); }
}
int main(void)
{
draw_symbol(SHARP, 10);
}

67デフォルトの名無しさん:2005/10/10(月) 18:18:48
(゚Д゚)ハァ?
68デフォルトの名無しさん:2005/10/10(月) 18:24:49
>>65
ちゃんと動くが?
69デフォルトの名無しさん:2005/10/10(月) 18:29:23
年月日 時分秒のデータを秒だけのデータにしたくて以下のように書いたのですが
結果は
98年1月31日 23時59分59秒 ==> 888937199
98年2月1日 0時0分0秒 ==> 888678000
となってしまいます。
使い方が間違ってますか?

#include<iostream>
#include<time.h>
using namespace std;
main(){
time_t seconds;
struct tm timeptr;
timeptr.tm_mday = 31;
timeptr.tm_mon = 1;
timeptr.tm_year = 98;
timeptr.tm_hour =23;
timeptr.tm_min = 59;
timeptr.tm_sec = 59;
seconds = mktime(&timeptr);
cout<<seconds<<endl;
timeptr.tm_mday = 1;
timeptr.tm_mon = 2;
timeptr.tm_year = 98;
timeptr.tm_hour =0;
timeptr.tm_min = 0;
timeptr.tm_sec = 0;
seconds = mktime(&timeptr);
cout<<seconds<<endl;
return 0;
}
70デフォルトの名無しさん:2005/10/10(月) 19:13:09
>>69
mktime()かstruct tmの説明をよく読め。tm_monは1オリジンではない。
71デフォルトの名無しさん:2005/10/10(月) 19:48:49
>>68
うち(WinXP, CodeWarrior8.3)じゃ
小林
しかtextに突っ込まれないのです
72デフォルトの名無しさん:2005/10/10(月) 19:54:59
>>71
それで正しい動作です。
73デフォルトの名無しさん:2005/10/10(月) 19:57:29
>>71
全部小林にしたらヨクネ?
74デフォルトの名無しさん:2005/10/10(月) 19:59:48
>>72
すいません.
私の質問は>>71の1行目,「ファイルを特定の行まで読みたい」と言うことです.
私のコードが間違っていて(私の意図とは異なっていて),コンパイル結果がC++としては正しい動作をしていることはわかります.
しかしながらその正しい動作は,私の意図した動作とは異なります.
私の書いたコードのどの部分がおかしくて,どう修正すれば意図した動作になるのか教えてくださればありがたいです.
75デフォルトの名無しさん:2005/10/10(月) 20:13:40
>>65
istream_iterator は InputIterator で ForwardIterator じゃないから、1度しか値を取り出せないよ。
76デフォルトの名無しさん:2005/10/10(月) 20:16:39
>>65
それと、STLの反復子は、「本当のend」を一つ通り過ぎた位置である
事に注意。
7712:2005/10/10(月) 20:49:33
レスどうもです
forの条件文は省略してます。
ちょっとまだできないのでもいっかい考えてみます
お騒がせしましたー
78デフォルトの名無しさん:2005/10/10(月) 21:00:47
xのy乗を求める問題で、どこか間違ってるところありますか?

include <stdio.h>
#include <math.h>


main()
{
double x,y,z;

printf("x =");
scanf("%lf",&x);
printf("y =");
scanf("%lf",&y);

z = pow(x ,y);
printf("x\ty = %lf", z);
}
79デフォルトの名無しさん:2005/10/10(月) 21:03:37
>>78
思い通りの動いてるなら、間違っていない。
思い通りに動いていないなら、間違ってる。
80デフォルトの名無しさん:2005/10/10(月) 21:08:41
>>78
くだらない事でマルチをする君の行動と態度が間違っている
81デフォルトの名無しさん:2005/10/10(月) 21:10:14
>>80
エラーが発生してるから困ってるんです。
82デフォルトの名無しさん:2005/10/10(月) 21:20:07
>>81
どんなエラー?
83デフォルトの名無しさん:2005/10/10(月) 21:24:32
C++プログラミング Vol.1&Vol.2[ISBN4-89471-009-9, ISBN4-89471-024-2] (1997年)
H.M.ダイテル+P.J.ダイテル著

学生時代趣味で始めようとして、結局読まずじまいだった本が出てきた。
社会人になってから8年、エクセルのVBAのfor文、if文しか使ったことか無かった俺だが、
2週間で読破し、用語や内容についても読んでいるだけでほぼ理解することができた。
俺の頭が良すぎるのか、テキストがすばらしいのか。とりあえず、おすすめしときます。

なんかサクサク理解できたからか、おもしろくなってきたので
Visual C++.NET 2003 stdを買ってきた。
そして、各種VC++の本を買ってきてきては orz。また買ってきては、orz。
このままでは、合計3万5千円の損になる。C++については理解してると仮定して、
どなたか、良い本知りませんか。
84デフォルトの名無しさん:2005/10/10(月) 21:26:31
>>83

推薦図書/必読書のためのスレッド PART26
http://pc8.2ch.net/test/read.cgi/tech/1126785299/
85デフォルトの名無しさん:2005/10/10(月) 21:29:10
>>83
VC++で何をしたいんだよ?コンソールアプリ作るのか、WebなのかそれともGUIなのか
GUIにしてもWin32APIを叩くのか、MFC使うのか


まぁ何が言いたいかっていうと ス レ 違 い って事なんだけどな
86デフォルトの名無しさん:2005/10/10(月) 21:39:38
>>82
どんなエラーかがちょっとわからないんですけど、
確実にコンパイル通りません。
87デフォルトの名無しさん:2005/10/10(月) 21:44:15
>>78
include <stdio.h>
#include <math.h>

include <stdio.h>
#include <math.h>

include <stdio.h>
#include <math.h>

include <stdio.h>
#include <math.h>


これが原因?
88デフォルトの名無しさん:2005/10/10(月) 21:49:12
>>86
大事な質問のコツを教えてやる。
エラーメッセージはコピペしろ。
89デフォルトの名無しさん:2005/10/10(月) 21:51:59
>>88
すみません、
エラーメッセージってなんですか?
90デフォルトの名無しさん:2005/10/10(月) 21:53:45
>>89
まぁ、待て
includeの前に # つけてみ
91デフォルトの名無しさん:2005/10/10(月) 21:54:38
ワロス
92デフォルトの名無しさん:2005/10/10(月) 22:01:28
いやまだコピペミスという可能性も

ないか・・・・・・
93デフォルトの名無しさん:2005/10/10(月) 22:03:58
しかもマルチ?
94デフォルトの名無しさん:2005/10/10(月) 22:40:10
こんな脳みそ足りない奴と同じ種族とは思いたくない。
9565:2005/10/10(月) 23:06:20
>>75-76
なるほど.意図した動作にならない理由が分かりました.
そうするとcopyでファイルの部分部分を一気に読み取る,というのは難しいですかね.
96デフォルトの名無しさん:2005/10/10(月) 23:14:06
すみません、ちょっと教えていただけませんでしょうか!
 GAFREC* pGAFRecs;
LAFREC* pLAFRecs;
int j;
intiNum = 3;
floatfNum = 123.123F;
for(j = 0; j < 20; j++ )
{
pGAFRecs[j].nWL= iNum;
pGAFRecs[j].fFactValue= fNum;
pLAFRecs[j].nWL= iNum;
pLAFRecs[j].fX= fNum;
pLAFRecs[j].fY= fNum;
pLAFRecs[j].fZ= fNum;
iNum *= 3;
fNum += 11.222F;
}
テストしたくて、このように値を入れてあげようかとやったんですけど、下記のエラーがでてしまいました。
&つけるなり、キャストなりとしてみたんですけど、わからずここにきました。
:\HIROEO&RYU\WriteFactorFiles\WriteFactorFilesDlg.cpp(189) : warning C4700: 値が割り当てられていないローカルな変数 'pGAFRecs' に対して参照が行われました。
C:\HIROEO&RYU\WriteFactorFiles\WriteFactorFilesDlg.cpp(191) : warning C4700: 値が割り当てられていないローカルな変数 'pLAFRecs' に対して参照が行われました。
リンク中...
WriteFactorFiles.exe - エラー 0、警告 2
よろしくお願いします。
97デフォルトの名無しさん:2005/10/10(月) 23:17:47
>>96
こちらこそよろしくお願いします。

  ∧_∧
 ( ・∀・)
 ( ∪ ∪
 と__)__)
98デフォルトの名無しさん:2005/10/10(月) 23:23:15
いえいえこちらこそ。。って教えて頂きませんか!
99デフォルトの名無しさん:2005/10/10(月) 23:26:18
GAFRECって何か知らないけど、 newもしないで使えるポインタなんだ。
多分
pGAFRecs = new GAFREC[20];
pLAFRecs = new LAFREC[20];
っていうのがいるんじゃない?
100デフォルトの名無しさん:2005/10/10(月) 23:35:32
GAFRECはこちらです↓
//GAFファイル書き込みデータレコード構造体
typedef struct _tagGAFREC
{
 int nWL; //WL値
 floatfFactValue;  //f値
}GAFREC;

//LAFファイル書き込みデータレコード構造体
typedef struct _tagLAFREC
{
 intnWL;//WL値
 floatfX;//x値
 floatfY;//y値
 floatfZ;//z値
}LAFREC;
newは他の関数でして処理してます。
101デフォルトの名無しさん:2005/10/10(月) 23:38:09
>>100
まて、 ほかの関数でって言ってるけど、
>>96を見る限り、変数 pGAFRecs; は定義されてから一度もnewされてないじゃないか?

そりゃ、エラーも出るだろ。
102デフォルトの名無しさん:2005/10/10(月) 23:44:29
ちょっとやってみます
103デフォルトの名無しさん:2005/10/10(月) 23:45:47
ポインタをまったく理解してなかったというオチか・・・
104デフォルトの名無しさん:2005/10/10(月) 23:49:11
多分>>102は、newした後delete忘れるんだろうなって思ってる。
105デフォルトの名無しさん:2005/10/10(月) 23:53:50
ありがとうございます。うまく行ったのですが、
ファイルポインタの渡し方がわからずどうすればよろしいですか?
自分で行ったポインタの渡し方↓
WriteFactorFiles( "gaffile.csv", "laffaile.csv",
2,pGAFRecs,3,pLAFRecs );
プロトタイプ宣言↓
bool WriteFactorFiles( LPCTSTR lpszGAFName, LPCTSTR lpszLAFName,
int nGAFRecCnt,GAFREC* pGAFRecs,
int nLAFRecCnt,LAFREC* pLAFRecs );
って感じなんですけど、どうすればうまく渡せますか?
106デフォルトの名無しさん:2005/10/10(月) 23:55:24
bccでコンパイルしてできた.exeを起動すると一瞬
画面が出てきて終わってしまいます。これは何がいけないんですか?
107デフォルトの名無しさん:2005/10/10(月) 23:57:21
>106
コマンドプロンプトから起動しないから。あるいは入力待ち状態にならないから。
108デフォルトの名無しさん:2005/10/10(月) 23:57:27
自己解決しました
109デフォルトの名無しさん:2005/10/10(月) 23:57:41
こまんどぷろんぷと
110デフォルトの名無しさん:2005/10/10(月) 23:59:01
>>105
bool WriteFactorFiles(
          LPCTSTR lpszGAFName,
          LPCTSTR lpszLAFName,
          int nGAFRecCnt,
          GAFREC* pGAFRecs,
          int nLAFRecCnt,
          LAFREC* pLAFRecs );

lpszGAFName にフルパスでファイル名渡すんなら、もらった後で
ファイル開けばいいだけだと思うんだけど……

それがいやなら、多分VC使ってると思うんで、 CFile&とかってやってみるか。

bool WriteFactorFiles(
          CFile& gafFile,
          CFile& lafFile,
          int nGAFRecCnt,
          GAFREC* pGAFRecs,
          int nLAFRecCnt,
          LAFREC* pLAFRecs );

こんな感じ?
111デフォルトの名無しさん:2005/10/11(火) 00:09:51
コマンドプロントから起動しなくてもexeで一瞬で消えないようにすることはできなのでしょうか?
112デフォルトの名無しさん:2005/10/11(火) 00:27:03
ちゃんとした日本語をしゃべってください。
113デフォルトの名無しさん:2005/10/11(火) 00:27:04
>>111
getchar();
これでおk
114デフォルトの名無しさん:2005/10/11(火) 00:40:26
理解力の差か・・・
115デフォルトの名無しさん:2005/10/11(火) 00:48:52
なかなかうまく行きません。
デバッグしてたんですが。エラーしてしまいました。
どこが悪いか指摘して頂きませんか!お願いします。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/970.txt
116デフォルトの名無しさん:2005/10/11(火) 00:53:08
エラーメッセージ書かない奴って何考えてんだ。
117デフォルトの名無しさん:2005/10/11(火) 00:57:02
良いんじゃない、エラーメッセージ書かなくても教える奴居るし。
118デフォルトの名無しさん:2005/10/11(火) 00:57:45
delete[]pGmem;
delete pGmem;
119デフォルトの名無しさん:2005/10/11(火) 01:04:27
すみませんしつも・・・
120119:2005/10/11(火) 01:04:59
自己解凍しました。
121デフォルトの名無しさん:2005/10/11(火) 01:07:27
デバッグエラーって書いてあります。
なんかダイアログがでてきて、英語でわけのわからぬことが
書いてあります。
122デフォルトの名無しさん:2005/10/11(火) 01:09:49
>>121
そのわけがわからないことは君にとって分からないことなのであって
普通のプログラマにとっては最も重要な情報の1つなのですよ
123デフォルトの名無しさん:2005/10/11(火) 01:24:02
Debuf Error!

Program C:\w\WriteFactorFiles.exe

DAMAGE;after Normal block (#81)at 0x00346010
124デフォルトの名無しさん:2005/10/11(火) 01:25:08
って書いてありました。
deleteするところで↑エラーしてしまいます。
考えられる原因はなんでしょうか?
125デフォルトの名無しさん:2005/10/11(火) 01:33:28
>>124
ポインタと、メモリの確保を勉強しなおして来い。
126デフォルトの名無しさん:2005/10/11(火) 01:33:51
できれば手で直接打たずにコピペしてください。
127デフォルトの名無しさん:2005/10/11(火) 03:24:30
つーか、その程度もまともに手打ちできないようではプログラミングなんて
入力ミスとの戦いになるだけでおもしろくもなんともないだろうなぁ。
128デフォルトの名無しさん:2005/10/11(火) 03:48:18
>>127
そんなの3ヶ月もすりゃ慣れるべ。
長い目でみてやれや。
129長い目:2005/10/11(火) 03:53:22
(───ω───)
130デフォルトの名無しさん:2005/10/11(火) 03:55:24
>>115
freadがsizeof(int)とsizeof(float)なんじゃ?それだけかどうかは知らんけど。
エラーは"after Normal block"でググれば判る。
131デフォルトの名無しさん:2005/10/11(火) 07:35:59
メッセージボックスで出てくるものをどーやってコピペせいっちゅーんじゃこいつは・・・
132デフォルトの名無しさん:2005/10/11(火) 08:49:35
じゃあちゃんと間違えないで書き写してください
133デフォルトの名無しさん:2005/10/11(火) 08:54:44
>>131
プリントスクリーンキーでとって画像うpしる!
134デフォルトの名無しさん:2005/10/11(火) 10:03:31
>>131
[Ctrl]+[C]
135デフォルトの名無しさん:2005/10/11(火) 10:04:47
(゚д゚)・・・
136デフォルトの名無しさん:2005/10/11(火) 10:57:46
(゚д゚)ウッウー
137デフォルトの名無しさん:2005/10/11(火) 11:04:04
案外メッセージボックスの類がCTRL+Cでコピーできることを知らない人が多い
138デフォルトの名無しさん:2005/10/11(火) 11:12:13
>>137
勉強になりますた
139デフォルトの名無しさん:2005/10/11(火) 12:39:22
>>137
漏れも初めて知った
ありがとう^^
140デフォルトの名無しさん:2005/10/11(火) 12:44:47
知ってる人の方が少ないと思われるがの
141デフォルトの名無しさん:2005/10/11(火) 13:52:22
そこで試そうとも思わないような香具師がプログラミングなんて笑わせるぜ。
142デフォルトの名無しさん:2005/10/11(火) 14:56:40
>>115
//レコード値を書き込む
for(i = 0; i < nGAFRecCnt; i++)
{
//レコード値を読み込む
fread(&pGmem[i].nWL,sizeof(GAFREC),1,GLFP);
fread(&pGmem[i].fFactValue,sizeof(GAFREC),1,GLFP);
Ret = fprintf(GLFP,"%d,%f",pGmem[i].nWL,pGmem[i].fFactValue );
if(Ret == NULL)
{
delete [] pGmem;
fclose(GLFP);
return false;
}
}
って書いてあるけど、  ここでpGmemがdeleteされたときってもう一回
→→→→delete[]pGmem;←←←ここでエラーが起きてしまいます。
でdelete喰らうわけだよね。
その場合、二回deleteされるわけだけど、そういう時って何が起こってるの?
143デフォルトの名無しさん:2005/10/11(火) 17:25:17
実行時にエラーになるだけ
144デフォルトの名無しさん:2005/10/11(火) 18:49:23
C++とJavaってどっちが早いですか?
145デフォルトの名無しさん:2005/10/11(火) 18:50:23
スレ違い
146デフォルトの名無しさん:2005/10/11(火) 19:09:31
すいませんでした
147デフォルトの名無しさん:2005/10/11(火) 20:45:24
許しません
148デフォルトの名無しさん:2005/10/11(火) 21:51:46
クラス内でスレッドを作りたいんだけど、どうやるの
149デフォルトの名無しさん:2005/10/11(火) 21:53:02
お仕置きです
150デフォルトの名無しさん:2005/10/11(火) 22:29:30
>148
よくある質問だ。

キミは↓こんな事をしたかったが、できなかった。そうだね?
class Thread {
public:
 Thread() { fHandle = CreateThread( ThreadProc ); }
 DWORD WINAPI ThreadProc(void *) { return 0; }
};

かわりに↓こうすればよい。
class Thread {
public:
 Thread() { fHandle = CreateThread( StaticThreadProc, this ); }
 DWORD ThreadProc() { return 0; }
 static DWORD WINAPI StaticThreadProc(void *aParam) { return ((Thread*)aParam)->ThreadProc(); }
};

CreateThread には (_beginthread(ex)にも) "パラメータ" を渡すところがあるね?
そこに this を入れるのがコツだ。
151デフォルトの名無しさん:2005/10/11(火) 22:50:08
初心者の質問 newについて

main() {
 int *integer = new int[];
 
 for (int i = 1; i <= 10; i++)
  cin >> integer[i];
 
 return 0;
}

これは、コンパイル時にエラーにならないのですが、
メモリの内容壊してますか?
152デフォルトの名無しさん:2005/10/11(火) 23:02:39
ありがとうございます
でも、俺のやろうとしてる方法と違います。

class Thread{
public:
DWORD __stdcall Thread1(PVOID);
};

クラス内はこうなってます。
これを

class Thread{
public:
static DWORD __stdcall Thread1(PVOID);
};

にするとコンパイル出来るんですが、private部分にある変数が使えません
これはどうすれば??
153デフォルトの名無しさん:2005/10/11(火) 23:42:05
>>152
thisを渡したら。
154デフォルトの名無しさん:2005/10/11(火) 23:57:30
>>151
明らかにシンタックスエラーじゃないか
どんな糞コンパイラだよ
155デフォルトの名無しさん:2005/10/12(水) 00:03:57
>>151
あとC++じゃ関数の戻り値の型省略できない
156デフォルトの名無しさん:2005/10/12(水) 00:48:50
>>152
もっと冷静に150を読むんだ。

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

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

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

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

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

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

class Hoge{};

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

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

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

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

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

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

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

if (r6 < min) min = r6;

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

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

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

if (r6 < min.num) {
min.num = r6;
min.name = 6;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

何が問題かというとですね。
後から設定したものに始めに設定したものが消されてしまって、
始めに設定したアプリが動かなくなってしまうんですよ。
251デフォルトの名無しさん:2005/10/15(土) 00:52:49
PATH=$PATH:/〜〜/〜〜〜
必要なものを付け足していけば良いだけ。区切子':'(コロン)
252デフォルトの名無しさん:2005/10/15(土) 00:52:49
Windowsなら一箇所にパス通してそこにそれぞれのバッチファイル作っとけば
253デフォルトの名無しさん:2005/10/15(土) 01:48:41
>>251
それってアプリインストールしたときに勝手にやってくれます?

>>252
えー。もしかして、そんな方法しかないんすか?
ショボーン。
つか、なんでこんな糞みたいなもん使うのか非常に疑問っす。
激しくウザイ。
なんでこんなもん使いたがるのか。>アプリ制作者
254デフォルトの名無しさん:2005/10/15(土) 01:59:58
というかスレ違いでは?
255デフォルトの名無しさん:2005/10/15(土) 05:57:50
デスクトップ上のアクティブウインドウに別のプログラムから
キー入力を行うにはどうすればよいのでしょうか。
WIN APIとMFCをごっちゃで使っています。

HWND wh = ::GetForegroundWindow();
::SendMessage(wh, WM_CHAR, 'a', 0);

として、メモ帳をアクティブにしても何も表示されません。
256デフォルトの名無しさん:2005/10/15(土) 05:59:03
あっそ
257デフォルトの名無しさん:2005/10/15(土) 06:11:38
258デフォルトの名無しさん:2005/10/15(土) 07:39:46
>>255
GetForegroundWindowで取れりゃ苦労せんわ
259デフォルトの名無しさん:2005/10/15(土) 11:54:13
>>245
一応マジレス
scanf等の実行文そのものは数じゃないから演算子使っても無駄。
x != -1にしたいなら
while(x != -1){
scanf("%d", &x);
として次のwhile判定で弾く。もしくはbreakを使う。
260デフォルトの名無しさん:2005/10/15(土) 12:09:41
>259
>scanf等の実行文そのものは数じゃない
scanfの返り値はintだけど。

代入に成功した入力項目の数が返される。まあ-1になることはないから>245の例は無限ループだな。
261デフォルトの名無しさん:2005/10/15(土) 13:04:33
クラスの宣言なのに「識別名の宣言」とか言われる
ちゃんと定義してヘッダもインクルードしてるのにヽ(`Д´)ノ
262デフォルトの名無しさん:2005/10/15(土) 14:22:55
>259
一応マジレス。
読み込み不一致の対策取っとけ。
263デフォルトの名無しさん:2005/10/15(土) 14:26:30
配列ポインタの配列の領域を確保することは不可能ですか?
p = new ((int*)[5])[ncount];
264デフォルトの名無しさん:2005/10/15(土) 14:28:00
勘違いしてた。ポインタだから4だ..
265デフォルトの名無しさん:2005/10/15(土) 14:46:11
>>263
typedef int (*ptr_to_array5_of_int)[5];
ptr_to_array5_of_int *p = new ptr_to_array5_of_int[ncount];
266デフォルトの名無しさん:2005/10/16(日) 11:42:42
absの様な符号付き整数の絶対値を分岐等を使わずに、
intをintの範囲内で簡潔に求める事は出来ますでしょうか。

最上位ビットから論理演算だけでどうにか・・・は無理ですかね。
267デフォルトの名無しさん:2005/10/16(日) 11:50:31
>>266
できる
268デフォルトの名無しさん:2005/10/16(日) 12:30:03
Linux でのはなし。
SIGTERM に自前のハンドラを設定しているプロセスが、stdin を fgets してブロックしています。
このプロセスに SIGTERM を送ると、ハンドラが実行されるのはいいのですが、
fgets が復帰してくれません。
他のI/Oでは signal が入るとEINTRで復帰すると思うのですが、fgets ではそうならないのでしょうか。
signal が入ったら fgets から復帰させるには、どうしたらよいのでしょうか。
269デフォルトの名無しさん:2005/10/16(日) 12:37:57
>>266
int abs(int n){
    int c = n >> 31;
    return n+c^c;
}

intが32bitでシフト演算が算術シフトと仮定するとこんな感じ。
そうじゃなかったらint c = -(n<0);にしても同じ。

ようするにcは負数なら全ビットが1、そうでなければ0にすれば良い。
270268:2005/10/16(日) 12:49:23
自己解決したのかも。
シグナルハンドラの中で fclose(stdin) をしたら、fgets が復帰しました。
が、fgets してる最中に fclose してしまうのってどうなんですかね?
問題無いでしょうか?
271デフォルトの名無しさん:2005/10/16(日) 12:58:03
>>269
試してみたら確かに結果は正しいのですが、何故なのか解らず、
16進で1ステップ毎にダンプしてみたら、負の数をシフトすると
シフトしたビットは埋まるのですね。 今まで知りませんですた。 orz

有り難うございました。
272デフォルトの名無しさん:2005/10/16(日) 13:25:53
>>271
>269も書いているが、負の値の右シフトが算術シフトである保証はないので要注意。
273デフォルトの名無しさん:2005/10/16(日) 13:30:34
>>270
select とか?
スレ違いかな。
274デフォルトの名無しさん:2005/10/16(日) 17:09:32
VisualC++ 7.0 なんですが、環境変数 USERVARというのを想定し、 C++ の
コード上から値を設定して、そのプログラムが動作時にその環境変数
をずっと有効(export)していたいのですが、どのようにすれば
良いでしょうか?
275デフォルトの名無しさん:2005/10/16(日) 17:17:04
int が 36ビット、1の補数+符号ビットで表現されているなら、

int abs(int x) {
return x & ~0377777777777;
}

C言語の定義内で、ポータブルな方法はない。
276デフォルトの名無しさん:2005/10/16(日) 17:44:55
>>274
どういう形で作っているのか知らないけど、
ダイアログベースやSDI等のGUIベースなら、Appクラスなどにメンバ変数として
持たせるって言う手段があると思う。
277デフォルトの名無しさん:2005/10/16(日) 17:57:37
>>266
abs() つかえよ。
分岐を使わずに効率よく実装できるなら、コンパイラがそうしてくれるだろう。
278デフォルトの名無しさん:2005/10/16(日) 17:58:40
>>277
多分宿題かなんかなんだよ
279デフォルトの名無しさん:2005/10/16(日) 18:19:30
>>277
absてlibcだと思いますが、269をインラインかそのまま記述した場合と、
速度的に違い無いんですか?
280デフォルトの名無しさん:2005/10/16(日) 18:30:37
>absてlibc
んなもんコンパイラによる。
標準ヘッダのインクルードをただのスイッチとして扱う処理系だって存在しうる。
281デフォルトの名無しさん:2005/10/16(日) 19:48:49
>>279
実は単純にif文で書くのが一番速いかも知れない。
282デフォルトの名無しさん:2005/10/16(日) 20:14:47
パイプラインが深い最近のCPUじゃまずいだろ。
283デフォルトの名無しさん:2005/10/16(日) 20:24:51
if文を書いたからといって、最適化で分岐が消えないとも限らない。
284デフォルトの名無しさん:2005/10/16(日) 21:08:37
だれかアセンブラリストうp
285デフォルトの名無しさん:2005/10/16(日) 22:18:41
(n>0?n:-1*n)
286デフォルトの名無しさん:2005/10/17(月) 00:30:11
最適化の影響で、ある変数がある範囲内で変更されない事が確認されるとその範囲内ではconst扱いとしもう一段階最適化するコンパイラが存在する
その結果
if(n>1){
処理1
}else{
処理2
}
などと言う文が
{処理1}goto out
{処理2}
out:
このようなコードになる可能性がある
その最適化を妨げるのがvolatile宣言
287デフォルトの名無しさん:2005/10/17(月) 00:31:42
妨げるって・・・
288270:2005/10/17(月) 01:34:47
>>273
stdin は FILE* なので、select とは相性が良くないです。
fd から FILE* のバッファに読み込み済みだと、fread はすぐできても read はすぐできない状況となり、
select は返ってこなくなります。

というか、スレ違いでしたか。
うーん、困った
289デフォルトの名無しさん:2005/10/17(月) 07:27:53
#if defined(TEST1 && TEST2)
(中略)
#endif
をビルドしてみると
「"defined" の後ろの ')' が欠けています」
とエラーが出るのですが、わたしの環境だけでしょうか?
(gccです)
#if defined(TEST1) && defined(TEST2)
だとうまくいきます
http://www.kumei.ne.jp/c_lang/intro/no_37.htm
290デフォルトの名無しさん:2005/10/17(月) 07:48:42
>>289
gccが正しい
291デフォルトの名無しさん:2005/10/17(月) 09:30:55
すごく初歩的な質問なんですが、
char * ptr = malloc(1024);
の後で
free(ptr);
をするときにサイズを指定しなくてもきちんとmallocした分が開放されるのでしょうか?
たとえmallocとfreeを別の関数の中で呼び出したとしても、ptrがキャストなどで違う型になっていても、いついかなるときでも大丈夫なのでしょうか?
292デフォルトの名無しさん:2005/10/17(月) 09:49:22
先生、質問!
printfは遅いと良くききますが、
なぜ遅いのでしょうか?どの程度遅いのでしょうか?

printf("%c%c%c%c%c",a,b,c,d,e);

putc(a);putc(b);putc(c);putc(d);putc(e);
では、どちらが速そうでしょうか?
文字数が変わると、どう変化してくるでしょうか?
293デフォルトの名無しさん:2005/10/17(月) 10:08:21
これがゆとり世代と言う物なんだろうか。
294デフォルトの名無しさん:2005/10/17(月) 12:03:07
fprintf()とsprintf()について質問があります。
たとえば、sprintf( string, "%c%c", c1, c2 )とした場合、
stringの三文字目は、必ず、\0になるのでしょうか?
そういう仕様が決まっているでしょうか?
fprintfについても同様でしょうか?
295デフォルトの名無しさん:2005/10/17(月) 12:05:43
>>294
sprintfは文字列の最後にNULL文字を追加する仕様になっています。
fprintfは追加しません。
296デフォルトの名無しさん:2005/10/17(月) 15:12:14
すみません。>>291は馬鹿みたいな質問ですが、何とか答えをいただけないでしょうか?
typedef struct aaa {
int x; char y;
} aaa;
として
aaa * ptr = malloc(1234);
のようなサイズで確保した場合でも
void * p = ptr;
free(p);
で正確に1234バイト開放されるのでしょうか?
297デフォルトの名無しさん:2005/10/17(月) 15:19:06
>>296
Yes.
298デフォルトの名無しさん:2005/10/17(月) 15:35:39
>>297
ありがとうございます!
いったいどういう仕組でそんなことができるのか不思議ですが、今は信じておきます。
どんなコンパイラでも同様に処理してくれると考えてもよいでしょうか?
299デフォルトの名無しさん:2005/10/17(月) 15:36:08
>>296
その場合の1234バイトが開放される事はYESだが、2つの領域(aバイト,bバイト)を開放した場合、次に(a+b)バイトの領域を確保できるかどうかは不明
300デフォルトの名無しさん:2005/10/17(月) 15:36:16
型は関係無いのでな
301デフォルトの名無しさん:2005/10/17(月) 15:44:54
>>298
規格に準拠したコンパイラであれば、そう処理してくれる。
302デフォルトの名無しさん:2005/10/17(月) 15:47:06
>>299
そうなのですか。例え開放した後でもmallocの後には毎回NULLかどうかチェックしないとダメってことですね。

>>300 >>301
なるほど、納得しました。

しかし、コンパイラは動的確保したサイズは覚えててくれるのに、確保したかどうかや開放したかどうかは覚えててくれないのですね。
面倒ですが、サイズを管理しなくてすむ分は楽だと考えてfreeしまくります!
みなさん、どうもありがとうございました。
303デフォルトの名無しさん:2005/10/17(月) 15:53:09
>>302
サイズを覚えているのはコンパイラじゃない。
ヒープマネージャが覚えている。
304デフォルトの名無しさん:2005/10/17(月) 15:55:16
g++-2.95ではコンパイルが通らずg++-3.3では通るという現象が起きているのですが、どなたかわかりませんか?
1 #include <iostream>
2 #include <algorithm>
3 #include <functional>
4 #include <iterator>
5 using namespace std;
6
7 template <class T>
8 class MyFirstContainer {
9 public:
10 typedef T value_type;
11 typedef value_type *pointer;
12 typedef value_type &reference;
13 typedef size_t size_type;
14 typedef ptrdiff_t difference_type;
15 //typedef pointer iterator;
16 class MyIterator: public iterator <forward_iterator_tag, T> {
17 typename MyIterator::value_type *vp;
18 public:
...
これで、
list4-4.cc:16: parse error before `<'
...
のようになってしまいます。
よろしくお願いします。
305デフォルトの名無しさん:2005/10/17(月) 16:05:07
新しいバージョンで通るなら、
コンパイラのバグが修正されたってことじゃね?

とソースも読まずにレスしてみる
306デフォルトの名無しさん:2005/10/17(月) 18:35:30
”このXは100です”と表示させようとしましたができません。
どこを修正したらいいですか?
よろしくお願いします。
#include <stdio.h>
int main(void)
{
char ch;
int num;
ch = 'X';
num = 100;
printf("この %c は", ch);
printf(" %d です", num);
return 0;
}
307デフォルトの名無しさん:2005/10/17(月) 18:36:46
>>306
全角文字は多バイト
308デフォルトの名無しさん:2005/10/17(月) 18:49:11
>306
ありがとうございます。
Xをxにしたらきちんと表示されました。

X(2バイト以上)を代入して表示させたい時はどうすればいいですか?
309デフォルトの名無しさん:2005/10/17(月) 19:01:52
wchar_t
310デフォルトの名無しさん:2005/10/17(月) 19:07:59
>>308
マルチバイト文字列を使うか、ワイド文字を使う
311デフォルトの名無しさん:2005/10/17(月) 19:21:57
再帰処理はスタックを消費するんでしょうか?
だとすると、いずれスタックオーバーフロー?
312308:2005/10/17(月) 19:30:34
>>309>>310
ありがとうございます。
ググってみても使い方も分からずまだ理解不足ですが、ひとまずscanf()などの先のステップに進んでみます。
313デフォルトの名無しさん:2005/10/17(月) 19:51:02
>>311
Yes.
314デフォルトの名無しさん:2005/10/17(月) 19:56:05
>>304
確かなことは言えないんだけど,
g++-2.95のときはクラステンプレート内のサブクラスの定義で
テンプレート使ったら理不尽なエラーが起こっていた.
あと,クラステンプレート内でメンバー関数テンプレートなんか
使うときもエラーの回避に苦労したような記憶がある.
315デフォルトの名無しさん:2005/10/17(月) 19:57:24
質問です。
Cを想定していますが、別のアプローチがあるならC++でも構いません。

何らかの仕事をし、その結果が成功か失敗かを取得したいとします。
このとき戻り値はどのように設計するのが適切でしょうか?
状況次第というのはごもっともだと思いますが、参考としてだけでも。


私は、以下のように考えました。

(1)成功なら1、失敗なら0を返す
(2)成功なら0、失敗ならエラーの内容により非0(正の数)を返す
(3)成功なら0、失敗ならエラーの内容により非0(負の数)を返す

条件式に使用することを考えると(1)が楽っぽいのです。
この場合、関数名は IsHoge 等にするべきでしょうか?
ただ、それだと値をチェックしてるだけで実際の仕事はしていないようにも見えてしまいます。

(2)や(3)だと、成功したら0なのか、失敗したら0なのかが分かり辛そうです。
(1)のように分かり易い命名法があれば別ですが…。


# 同じ質問をJavaでもしたかったりするのですが、
# さすがにスレ違いかマルチポストは避けられませんよね……

316デフォルトの名無しさん:2005/10/17(月) 20:00:11
CならTRUEとFALSEを定義しておけばいいんじゃないか?
C++ならboolを使うなりクラス内で静的定数でtrueとfalseを定義するとか。
317デフォルトの名無しさん:2005/10/17(月) 20:01:07
>>315
(1)か(3)が一般的だろうね。
何かのハンドルを返す関数であれば、
失敗時にNULLを返すという意味で(1)にするのが適切だと思うけど
ただエラーコードを返すだけならば(3)でも構わないと思う。

if (DoSomething() < 0) { // error

のような仕様はよく見かけるし。
関数名は特にIsをつける必要はないかと。
318デフォルトの名無しさん:2005/10/17(月) 20:02:16
>>315
時によりけり。
それだけでは決めかねる。

# とりあえず、IsHoge なんてネーミングはナンセンスだと思われ
319315:2005/10/17(月) 20:18:43
他のスレを見ているうちに早くもレスが!
ありがとうございます。

とりあえず分かったのは、
適切なコメントやドキュメントが大切ということでしょうか。


>>316
それって(1)と何か違うのでしょうか?

>>317-318
値をチェックするだけなら IsHoge でもOKってことですよね?
320デフォルトの名無しさん:2005/10/17(月) 20:22:18
その値がHogeであるかどうか、ならIsHogeでいいと思うけど、
Isをつける場合はエラーコード等は返さず、trueかfalseのみを返した方が直感的。
エラーコードを返す場合は別の名前にした方がいいと思われ
321デフォルトの名無しさん:2005/10/17(月) 20:36:57
>>319
>それって(1)と何か違うのでしょうか?
0を返すか1を返すかなんて内部仕様。
TRUEやFALSEを書いとけば動くコードにしとけば
後で気が変わっても今までのもちゃんと動く。
322315:2005/10/17(月) 21:53:08
なるほど、何度もありがとうございました。
323デフォルトの名無しさん:2005/10/17(月) 21:58:57
微妙にスレ違いだったらすいません
どこが適当かイマイチよくわからなくて…

「DirectXゲームグラフィックスプログラミング」という本で勉強しているのですが
ヘッダファイルに

#ifndef _Common_h_
#define _Common_h_

(中略)

#endif // _Common_h_

とされているのですがコレらの意味はなんでしょうか?
重複して読み込まないため?とも思うのですがハッキリした答えがわかりません
どなたかアドバイスお願いいたします
324デフォルトの名無しさん:2005/10/17(月) 22:03:37
>>323
>重複して読み込まないため?とも思うのですが
そのとおり.
通称インクルードガード
325デフォルトの名無しさん:2005/10/17(月) 22:09:22
>>324
ありがとうございます!

今まではCommon.hに全てのヘッダファイル読ませてましたのですが
それだと無駄なものまで読み込んでしまうので何か無いかと思ってたトコロでした

# インクルードガードってなんとなくカコイイ響きですね
326315:2005/10/17(月) 22:50:26
コンパイラによっては、#pragma でインクルードガードができたりするっぽい。

#ifndef は、既にどこかで定義されていたら読み込まない、という意味なので
1回目にヘッダを読み込んだとき

 (1) _Common_h_ が定義されていないので普通に読み込む
 (2) _Common_h_ を定義する
 (3) 本文を読み込む
 (4) ファイル末尾で読み込み終了

となるが、2回目以降は

 (1) _Common_h_ が定義されているので #endif まで飛ぶ
 (2) ファイル末尾で読み込み終了

となる。
327デフォルトの名無しさん:2005/10/17(月) 22:51:09
*おおっと*
名前が残ったままだったぜ!
328デフォルトの名無しさん:2005/10/17(月) 22:52:06
#pragma once
だな

VCのコンパイラとかこれが使える
329デフォルトの名無しさん:2005/10/17(月) 23:58:36
個人的にはそんな環境依存なもの使わないけど
330デフォルトの名無しさん:2005/10/18(火) 00:12:56
VC++前提のソースはよく#pragma onceとインクルードガードの
両方を使っている。
一体何がしたいんだろう……
331デフォルトの名無しさん:2005/10/18(火) 00:18:01
VC++では#pragma onceでより高度にガードして、、
他のコンパイラではonceを無視してくれることを祈りつつ従来のガード?
332デフォルトの名無しさん:2005/10/18(火) 00:30:30
>>330
#pragma onceだったらヘッダの読み込みをそこで中断できるから、
インクルードガードと比べて高速になるから。

ただ#pragma onceのない環境も考慮してインクルードガードもついでに付加してる......かな?
333デフォルトの名無しさん:2005/10/18(火) 00:34:41
#ifndef _Common_h_
#include "Common.h"
#endif
334デフォルトの名無しさん:2005/10/18(火) 00:50:41
・グローバルスコープで_で始まる名前
・_で始まりその次が大文字の名前
・__を含む名前
は予約されてるから_Common_h_みたいなのはイクナイ
335デフォルトの名無しさん:2005/10/18(火) 03:47:09
>334
Javaのパッケージ名はFQDNを逆にしたものが推奨されているようだけど
(com.example.hoge など)
C/C++でもそのようにしたほうがいいのかな?
(#ifndef COM_EXAMPLE_HOGE_XXX.H みたいな感じ)
336デフォルトの名無しさん:2005/10/18(火) 05:30:47
カレントディレクトリからインクルードされる前提なら
ファイル名にヒネリを加えた名前でいいと思う。
その前提がない場合はUUIDを使うんじゃないかな。
337デフォルトの名無しさん:2005/10/18(火) 08:05:24
>>331
VCが吐くpragma onceを入れたヘッダファイルは、
ちゃんとその前後をVCのコンパイラだということを判別する#ifdef〜#endifで囲んである
他コンパイラで読み込めばそこは飛ばされるだけ

>>335
ファイル名がhoge.hだったら
#ifndef ___HOGE_H_DEFINED_AND_INCLUDED_
ってしてる
こんな感じでちょっと捻っただけでええと思う
338デフォルトの名無しさん:2005/10/18(火) 08:34:19
バカは質問に答えなくていいと思う
339デフォルトの名無しさん:2005/10/18(火) 10:39:25
真の馬鹿とは自分が愚かだという事すら自覚していない馬鹿だ
340デフォルトの名無しさん:2005/10/18(火) 10:45:01
>>338-339
まぁ落ち着けよ
341デフォルトの名無しさん:2005/10/18(火) 12:17:37
342デフォルトの名無しさん:2005/10/18(火) 13:03:26
数万個ある要素(std::string)の中から、ある文字列を含む要素を検索する
効率のいい方法って無いですかね?
かなり高い頻度で検索するので、各要素を順番に_mbsstrで調べていくのは効率が悪いと思いました。
343デフォルトの名無しさん:2005/10/18(火) 13:05:45
まぁなんだかんだ言って被った事は一度もないわけで。
344デフォルトの名無しさん:2005/10/18(火) 13:06:48
>>342 std::set or std::map
345デフォルトの名無しさん:2005/10/18(火) 13:07:45
>>344
それじゃ「ある文字列を含む」ではなく「ある文字列と一致する要素」しか探せない希ガス
346デフォルトの名無しさん:2005/10/18(火) 13:13:26
>>342
std::find
347342:2005/10/18(火) 13:18:21
>>346
それはシーケンシャルに検索するのと変わらない気がするのですが・・・
348デフォルトの名無しさん:2005/10/18(火) 13:18:49
>>342
メモリ消費にある程度融通が利くならSuffixArray(もしくはSuffixTree)を使うといいんじゃまいか?
文字列集合全体に対してSuffixArrayを作り、各インデックスとペアで所属するstringへのポインタなりを格納しておけば
全体で数千万文字あっても20〜30回程度の探索で含まれている部分を見つけることができるはず。
349342:2005/10/18(火) 13:26:14
>>348
良さそうですね。ちょっと調べてきます。
350デフォルトの名無しさん:2005/10/18(火) 13:26:29
>>347
B&M法でも自分で組むしかあるまい。
351デフォルトの名無しさん:2005/10/18(火) 14:41:26
double型をint型にしたいのですが何箇所かでうまく出来ません。
どうすればいいのでしょうか?

#include <stdio.h>
int main(){
int i,j;
double a;
for(a=0.0,j=0; a<10.0; a+=0.1,j++) {
i=(int)a;
if(j==10){
printf("%f %d \n",a,i);
j=0;
}
}
return(0);
}
352デフォルトの名無しさん:2005/10/18(火) 14:49:21
>>351
「うまく出来ません」を説明しろよ。
353デフォルトの名無しさん:2005/10/18(火) 14:55:38
>>351
double型は制御変数に使うべきでは有りません。
354351:2005/10/18(火) 16:35:16
こんな感じになってしまいます。

1.000000 0
2.000000 2
3.000000 3
4.000000 4
5.000000 4
6.000000 5
7.000000 6
8.000000 7
9.000000 8
10.000000 9

>>353
実際のプログラムでは使っていません。
状況を再現するのにやりやすかったので使いました。
355デフォルトの名無しさん:2005/10/18(火) 16:38:43
コメントも何もついてないソース晒して問題となった「状況」とやらを
勝手に察しろというのがばかげてるって分かってる?
356デフォルトの名無しさん:2005/10/18(火) 16:39:30
>>354
丸め誤差でググれ
357デフォルトの名無しさん:2005/10/18(火) 16:43:20
i=(int)a; → i=(int)(a+0.5);
358デフォルトの名無しさん:2005/10/19(水) 00:41:20
プログラムを実行したら、起動中のテキストやワードなどに、指定しおいた文字や数字を
入力するプログラムを作りたいのですが、できますか?
359デフォルトの名無しさん:2005/10/19(水) 00:44:46
できますよ
360デフォルトの名無しさん:2005/10/19(水) 00:45:42
>>359
どのような 方法でやればいいのか教えてください
361デフォルトの名無しさん:2005/10/19(水) 00:57:04
テキストやワードというのが何のOSで動いていてどんな動作をするアプリなのかわからんけど
とりあえずその起動中のテキストやワードを作った人と連絡を取って
プログラムからの入力方法を聞いたらどうかな

winでならSendMessageとかで送りつければ出来るけど
362デフォルトの名無しさん:2005/10/19(水) 01:01:36
>>360
VBでやれば5分もあれば作れる。ODEについてくる開発ガイドを読め。
どうしてもVCでやりたいと言うならまずMFCかATLの経験はあるか?
363デフォルトの名無しさん:2005/10/19(水) 01:03:03
C言語質問スレ【激初心者】
http://pc8.2ch.net/test/read.cgi/tech/1129043264/26
364デフォルトの名無しさん:2005/10/19(水) 01:11:39
>>361
よく「テキスト」と「ワード」がアプリの名前だってわかったな。

オレには全然わからなかったぞい。
365デフォルトの名無しさん:2005/10/19(水) 07:51:24
srand(0)とsrand(1)はおなじ結果を返すのでしょうか?
srand(1)とsrand(2)は違う結果になるのですが、srand(0)とsrand(1)はおなじ系列を返します。
それともコンパイラのバグでしょうか?環境はgcc4.0.2、Suse Linux9.2です。

366デフォルトの名無しさん:2005/10/19(水) 08:06:16
ワードはまぁ、MSWordか?って思うが、テキストってなんだ?
MaxOSのシンプルテキストか?
367デフォルトの名無しさん:2005/10/19(水) 08:08:26
MaxOSってなんだよ俺
MacOSだろ・・・
368デフォルトの名無しさん:2005/10/19(水) 08:47:51
>>365
違う引き数で同じ系列を返してはいけないという仕様はなかったと思う。
srand()を呼ばない場合はsrand(1)と同じ系列を使う実装が多い筈なので、
srand(0)とsrand(1)が同じ系列になるのかもしれない。
369デフォルトの名無しさん:2005/10/19(水) 12:54:32
「起動中のワード」→「起動中のMS Word」かな
「起動中のテキスト」→痛々しいな
370デフォルトの名無しさん:2005/10/19(水) 13:10:01
やっべ脳内で勝手にテキスト→エクセル変換してた
371デフォルトの名無しさん:2005/10/19(水) 13:13:28
テキストエディタ(メモ帳)だとおもってたけど・・・
372デフォルトの名無しさん:2005/10/19(水) 15:21:02
変な人気を獲得した361
373デフォルトの名無しさん:2005/10/19(水) 15:47:18
テキサスかと思った
374デフォルトの名無しさん:2005/10/19(水) 19:55:13
#include<stdio.h>
#include<string.h>

main(){
char kekka[5];
char str[40];

printf("【おみくじ】");
getchar();

strcpy(kekka, "大吉");
strcpy(str, "充実した一日。いろいろな所に遊びに行こう");

printf("%s:%s" , kekka, str);
return 0;
}

こんなプログラムを書いたのはいいものの、"大吉"が出力されない。
他の英数字ならできたんだけど、何が悪いんだろう。
375デフォルトの名無しさん:2005/10/19(水) 20:08:12
ワイド文字とかマルチバイト文字専用の文字列コピー関数を使え。
376デフォルトの名無しさん:2005/10/19(水) 20:14:51
>>374
とりあえずstrの領域が足りないな。
char str[41]
にしてみそ。
377デフォルトの名無しさん:2005/10/19(水) 20:19:45
>>375,376
ありがとう、無事解決。これで毎朝、大吉しか出ない占いプログラムが鬱な俺を勇気付けてくれます。
378デフォルトの名無しさん:2005/10/19(水) 20:24:37
毎日いろいろな所に遊びに行くのか
379デフォルトの名無しさん:2005/10/19(水) 20:27:14
えらくネガティブな勇気付けだなおい・・・
380デフォルトの名無しさん:2005/10/19(水) 20:29:48
he,he,he.....も、もう。さがさないで、ください。
381デフォルトの名無しさん:2005/10/19(水) 20:55:25
C++相談室 part44 スレで質問したら、こちらに誘導されましたので
こちらにコピペさせていだだきます。よろしくお願いします。

激しくレベルが低い質問でとても恥ずかしいのですが教えてください。
Linuxでアプリケーション作っているんですけど、そのアプリケーションの
設定ファイルをそれぞれの一般ユーザーのホームディレクトリに作りたいと
思っています。プログラム自身は/usr/local/binに置くつもりです。

ofstream fout("hogehoge.txt");

でファイルを作ると実行ファイルと同じ場所に出来てしまいます。
というか、/usr/local/binではパーミッションで作れません。
ホームディレクトリはどのように指定してやればいいのでしょうか。
教えてください。お願いします。
FedoraCore4でフルインストール、フルアップデートな状態です。
382デフォルトの名無しさん:2005/10/19(水) 20:57:28
./hogehoge.txt
383デフォルトの名無しさん:2005/10/19(水) 21:07:58
>>382 素早いレスありがとうございます。今試してみたのですが、
それだとカレントディレクトリにhogehoge.txtが出来てしまいます。
384デフォルトの名無しさん:2005/10/19(水) 21:13:50
ごめん
こんなこと聞くのはダメな証拠なのですが

GUIのツール・ソフトウェアを作るのに、最適なツールとか開発ソフトってなんでしょうか
おすすめなのを教えてください
小さなアプリとか、そういう類。で、どんなアプリやツールにはどの言語がいいかとかおながいしまつ
385デフォルトの名無しさん:2005/10/19(水) 21:15:10
ああ、ホームディレクトリか。間違えた
../hogehoge.txt
386デフォルトの名無しさん:2005/10/19(水) 21:16:07
あ、間違えた。これも違う気がしてきた。
つかわすれてしもた。タッチノ
387デフォルトの名無しさん:2005/10/19(水) 21:16:51
環境変数HOMEを取得すりゃええんちゃう

つman getenv
388デフォルトの名無しさん:2005/10/19(水) 21:18:35
応えてくれませんよね…どういっていいのかわからないので

スレ立てるまでもないにも質問いってきます
389デフォルトの名無しさん:2005/10/19(水) 21:29:36
>>387 getenv("HOME") で取得出来ましたありがとうございました。
390デフォルトの名無しさん:2005/10/19(水) 21:31:03
マルチすんなやクズ
391デフォルトの名無しさん:2005/10/19(水) 21:33:44
すんまそん
392デフォルトの名無しさん:2005/10/20(木) 01:39:38
こんばんは。質問させてくださいませ。
当方C++でGSLを使っておりまして、GSL_blasを使って、行列計算をしてみたのですが、
500×500の正方行列同士の積にかかる演算時間が1回当たり1.5〜1.7秒と芳しくありません。

GSLを用いずにfor文を用いて同じ演算をやらせても同じような結果が出てしまいます。
通常、このくらいのサイズの行列の演算にはどのくらいの時間を要するのでしょうか?

先ほど、Cの方の質問スレに載せてしまい、マルチになってしまうのですが、どうか教えてくださいませ。
よろしくお願いします。
393デフォルトの名無しさん:2005/10/20(木) 03:19:34
>>392
質問が曖昧すぎ。
ハードウェアは何使ってるの?そのスペックは?コンパイラは?
394デフォルトの名無しさん:2005/10/20(木) 04:10:30
>>392
うちの3倍は遅いね
395392:2005/10/20(木) 11:41:25
>>393
FreeBSDでCPUはathlonXP、コンパイラはG++で-O2をかけてあります。
ほかの事に関してはちょいと分からないかも・・・
396デフォルトの名無しさん:2005/10/20(木) 12:58:20
longの範囲を越える値の四則演算ができるようなクラスってある?
397デフォルトの名無しさん:2005/10/20(木) 13:05:35
>>396
ある。
398デフォルトの名無しさん:2005/10/20(木) 13:12:37
>>392
計算回数の算出した?
399デフォルトの名無しさん:2005/10/20(木) 13:22:19
#include<stdio.h>
void mystrcpy(char *, char *);
void main()
{
char cstr[50], str[]={"leafsaasin-"};

mystrcpy(cstr, str);
printf("%s\n"
"%s\n", str, cstr);
}

void mystrcpy(char *csp, char *sp)
{
int n=0;

while(*(sp+n) != '\0'){
*(csp+n) = *(sp+n);
n++;
}
*(csp+n) = '\0';
}

上記のプログラムのmystrcpy関数を一行で書けるというのですが
どのようにすればいいでしょうか。
400デフォルトの名無しさん:2005/10/20(木) 13:29:31
// はい、一行
void mystrcpy(char *csp, char *sp) {int n=0; while(*(sp+n) != '\0'){*(csp+n) = *(sp+n); n++;} *(csp+n) = '\0';}
401デフォルトの名無しさん:2005/10/20(木) 13:38:41
>>399
while ( (*csp++ = *sp++) != '\0' );

でいいのかな
402396:2005/10/20(木) 13:54:55
>>397
名前をおせーて
403394:2005/10/20(木) 14:35:50
Linux 2.6.11
Pentium III (Coppermine) 853.308 Hz
g++ (Debian 1:3.3.5-13)
-O3 -march=pentium3 -msse -mfpmath=sse -fforce-addr -fomit-frame-pointer
liboctave,atlas使って0.47089秒くらい
404392:2005/10/20(木) 14:37:10
>>398
すいません、計算回数の算出はどうすれば出来るのでしょうか?
405デフォルトの名無しさん:2005/10/20(木) 14:47:49
>>402
gmpとか
406デフォルトの名無しさん:2005/10/20(木) 14:59:33
>>404
for文使ってる方は何回回ってるか判るでしょ
407デフォルトの名無しさん:2005/10/20(木) 15:01:51
O(N^3)ぐらいじゃね?
408デフォルトの名無しさん:2005/10/20(木) 15:03:53
>>407
計算量じゃねえよ
409デフォルトの名無しさん:2005/10/20(木) 15:11:33
配列の内容をCSVで書き出すとき、下のように書いてるんですが、
もっと簡単にスマートに書く方法はありませんか?

std::string* a = new std::string[3];
a[0] = "foo";a[1] = "bar";a[2] = "buz";
for (int i = 0; i < 3; i++) {
  if (i != 0) std::cout << ",";
  std::cout << a[i];
}
std::cout << std::endl;
410デフォルトの名無しさん:2005/10/20(木) 15:13:38
expression templateで効率化するんだ
・・・と内容読まずにレスってみる
411デフォルトの名無しさん:2005/10/20(木) 15:24:40
>>409
3固定なら
cout << a[0] << "," << a[1] << "," << a[2] << endl;
n なら
if (n){
cout << a[0];
for(int i=1; i<n; ++i) cout << "," << a[i] ;
cout << endl;
}
てきとうだけど
412409:2005/10/20(木) 16:05:41
>>411
なるほど。
やっぱり最初の項目だけ特別扱いしないといけないんですか。
413デフォルトの名無しさん:2005/10/20(木) 16:40:01
質問です。

とあるクラスAと、それを継承したBを作ったのですが
class A{
void operator =(A&);
};

class B : public A{
void operator =(A&);
};

とやり、メインスレッドで
B b1, b2;
b1 = b2;
とやったところ、何故かBのoperator=(A&)ではなく、Aのoperator=(A&)に飛んでしまいました。
これは何故なのでしょうか。
414デフォルトの名無しさん:2005/10/20(木) 16:46:35
>>409
char *a[N] = { /* ... */ };
char *div = "";
int i;

for( i=0; i<N; i++,div="," )
{
  printf( "%s%s", div, a[i] );
}
415デフォルトの名無しさん:2005/10/20(木) 16:50:39
だったら
const static char punct[] = ",,\n";
for (i = 0; ry
{
 fprintf(stdout, "%s%c", a[i], punct[i]);
}
fflush(stdout);
416デフォルトの名無しさん:2005/10/20(木) 17:18:38
>>409
aをvectorか配列のラッパテンプレートクラスにして,

std::copy(a.begin(), a.end() - 1, std::ostream_iterator<std::string>(std::cout, ","));
std::cout << *(a.end() - 1) << std::endl;

ってのは?
417416:2005/10/20(木) 17:25:51
オレはバカか.修正.
std::copy(a.begin(), a.end() - 1, std::ostream_iterator<std::string>(std::cout, ","));
std::cout << a.back() << std::endl;
418デフォルトの名無しさん:2005/10/20(木) 17:44:41
プロセスIDから、そのプロセスの実行ファイル名を知りたいのですが、うまく行きません。
ファイル名を知るには、どうしたらよいでしょうか。
OS:Windows Xp Pro SP2 コンパイラ:Borland C++ 5.5.1

#include <stdio.h>
#include <windows.h>
void main(void)
{
HANDLE hProcess;
char fileName[1000];

/* 第三引数は、タスクマネージャで見つけた notepad.exe の PID */
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 3644);
GetModuleFileName(hProcess, fileName, 1000);

printf("ハンドル:%d\n", hProcess);
printf("ファイル名:%s\n", fileName);

CloseHandle(hProcess);
}

ソースファイル名 getName.c
コンパイル時のコマンド >bcc32 getName.c
実行結果
 ハンドル:2000
 ファイル名:タ・
419デフォルトの名無しさん:2005/10/20(木) 17:55:55
>>418
最低限返り値を調べろよ。
420418:2005/10/20(木) 19:12:37
printf("GetMFN:%d\n", GetModuleFileName(hProcess, fileName, 1000));

上記のように書き換えてみると、
GetMFN:0 と表示されました。
notepad.exeのファイル名の取得に失敗しているようです。

また、notepad.exe以外の実行ファイルのPIDを試したところ、
以下のような規則性がありました。

「プロセス」の「ユーザー名」が SYSTEM の場合
GetMFN:35
ハンドル:0
ファイル名:D:\mydata\C\新しいフォルダ\getName.exe

「プロセス」の「ユーザー名」が ログインユーザ名 の場合
GetMFN:0
ハンドル:2000
ファイル名:タ・

管理者、制限ユーザ両方でログインしてみましたが、結果は同様です。
421デフォルトの名無しさん:2005/10/20(木) 19:32:09
>>420
GetModuleFileNameが失敗する原因をGetLastErrorで調べてみた?
422418:2005/10/20(木) 20:12:14
以下の2つの処理それぞれの後ろに、FormatMessage(……GetLastError()……)を挿入しました。

hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 1472);
1箇所目……
GetModuleFileName(hProcess, fileName, 1000));
2箇所目……

「プロセス」の「ユーザー名」が SYSTEM の場合
アクセスが拒否されました。
この操作を正しく終了しました。

「プロセス」の「ユーザー名」が ログインユーザ名 の場合
指定されたプロシージャが見つかりません。
この操作を正しく終了しました。

OpenProcess()が失敗しているようです。
タスクマネージャで見たPIDをそのまま打ち込んではいけないのでしょうか。
423399:2005/10/20(木) 20:25:55
>>401
返答ありがとうございます
試してみます。
424デフォルトの名無しさん:2005/10/20(木) 21:17:14
>>412
最後の項目を特別扱いすればいいじゃん。

for (int ic = 0; ic < cols; ++ic) {
std::cout << a[ic] << ic == cols - 1 ? '\n' : ',';
}
425デフォルトの名無しさん:2005/10/20(木) 21:29:03
ポインタを戻り値とする関数で
特定の条件を満たさない場合はポインタを返さず
エラーで終了させたい場合はどうやるのが一般的でしょうか?

Test* func(int a)
{
 if(a==5) return p;
}
だとビルド時に戻り値がないと警告がでてしまいます
426デフォルトの名無しさん:2005/10/20(木) 21:30:24
0返したり例外投げたり
427デフォルトの名無しさん:2005/10/20(木) 21:31:58
0を返して関数を呼ぶ時に処理をするというコトでしょうか?
if(!func(4)) return ; 
428デフォルトの名無しさん:2005/10/20(木) 21:38:16
>>422
MSDN嫁。PROCESS_ALL_ACCESS権限で他プロセスのハンドルを得るには
SeDebugPrivilege特権を得ておく必要があると書いてある。
GetModuleFileName()にしかハンドルを使わないのなら、
PROCESS_QUERY_INFORMATION程度で十分なんじゃないか?
429デフォルトの名無しさん:2005/10/20(木) 22:13:57
>>425
"エラーで終了させたい" って何をどのように終了させるんだか?
関数を終了(return)するだけなら、0(NULL,正常なポインタでない値)を
返して上位でエラー処理、とか、プログラム自体をここで強制終了
したいなら必要な終了処理を呼び出した後に、exit(1) とか?
一般的ったって、目的必要に応じてだから、質問下手すぎ。
430デフォルトの名無しさん:2005/10/20(木) 22:20:07
>>425
Cなら単純にexit()してもいいかもしらん。
C++なら素直に例外を投げるのがよい。
431デフォルトの名無しさん:2005/10/20(木) 22:21:32
>>425
どちらにしても、戻り値を返す関数は、戻り値を返さないわけにはいかない。
どの場合でも(exitなど制御を飛ばすものはともかく)表記上は必ず戻り値を
返すように記述する必要があるのは当然。
432418:2005/10/20(木) 22:37:28
>SeDebugPrivilege特権

これがキーワードだったようです。

http://support.microsoft.com/default.aspx?scid=kb;ja;131065
こちらのページのサンプルでは、動作が確認できました。

ありがとうございました。
433392:2005/10/20(木) 23:07:05
>>406-407
遅レス申し訳ないです。
>>407さんのとおり、計算回数はO(N^3)(500^3)だと思います。
for文の中では掛け算を500^2回実行している事になります。

どうにかして、もうちょっと早く動かす事は出来ないのでしょうか?
434デフォルトの名無しさん:2005/10/20(木) 23:59:25
多少ループをエンロールしてみるとか。
435392:2005/10/21(金) 00:49:35
>>434
ループの一部を関数として登録するという事でしょうか?>エンロール
436デフォルトの名無しさん:2005/10/21(金) 00:59:06
アンロールじゃないのか。
437デフォルトの名無しさん:2005/10/21(金) 01:02:06
>>435
for(i=0; i<MAX; i++){処理;}だと1回ごとにforの条件判定が来るがfor(i=0; i<MAX; i+=2){ 処理;処理; }だと2回に1回forの条件判定が来る
これをfor(i=0; i<MAX; i+=100){ 処理; ... 処理; }とするとforの条件判定が100回に1回になる

これがエンロール
438デフォルトの名無しさん:2005/10/21(金) 01:06:47
unroll
439デフォルトの名無しさん:2005/10/21(金) 01:10:47
>>437
そうやってCPUのキャッシュをだめにするのが速くする秘訣か。
440デフォルトの名無しさん:2005/10/21(金) 01:15:01
それを言うならアンロールじゃないかと。
441デフォルトの名無しさん:2005/10/21(金) 01:22:35
エンロールじゃないねアンロールだったすまそw

>>439
キャッシュのミスヒットが起きると性能落ちるから1次キャッシュいっぱいまで広げるのがミソ
キャッシュのアラインにあわせてループの展開回数を調整する必要があるがまあそこまでやらないでも条件判定が減るだけでもだいぶ違う

Pentium4用に最適化かけるのとXeon用に最適化かけるのとではコードサイズに差がでる
442434:2005/10/21(金) 01:25:35
すまん。エンロールとアンロールを素で間違えた。
443デフォルトの名無しさん:2005/10/21(金) 01:25:38
そういうのは正直バッドノウハウだと思うんだ。
444デフォルトの名無しさん:2005/10/21(金) 01:30:50
データキャッシュだけならそうかもしれないけど命令キャッシュの方忘れてない?
例えばPrescottだと命令キャッシュは実行トレースだからキャッシュに収まるように
工夫するのにμOP考えないといけないから無理だと思うよ。
445デフォルトの名無しさん:2005/10/21(金) 01:31:47
>>443
ではグッドノウハウとやらをお願いします。
446デフォルトの名無しさん:2005/10/21(金) 01:36:17
こんばんは

とある駐車場の駐車料金の計算をするのにプログラム組みたいのですが
色々わからないとこあるので教えてほしいです。

まず、そこの駐車場は
1日の駐車料金の最大料金が
平日1500円 土日祝日1200円で当日最大ではなく毎日適用。
時間料金が曜日時間関わらず 15分100円(1時間400円)
つまり、平日だと駐車時間が3時間30分を超えたあたりで1500円でそれ以上料金はあがらない。
という料金設定です。

で、組みたいのが
入庫時間(月日時分を続けて入力 例:10月21日1時30分なら 10210130)
と出庫時間(上記同様)
を入力すると駐車料金が表示されるのを作りたいのです。
コンパイラは MS Visual C++ 2003
一応、C++でコンソールアプリケーションとして作りたいのですが
OSの時計機能から時分と取り込んだりして祝日などの判別もしてみたいのです。

どうふうにすればいいのか
よろしくおねがいします。
447デフォルトの名無しさん:2005/10/21(金) 01:38:13
そこまで言葉にできるならそのまま式立てるだけだと思うよ。
448デフォルトの名無しさん:2005/10/21(金) 01:39:41
>>444
というか、条件判断のコードが出てこなくなるから単純にキャッシュのミスヒットや分岐予測をする必要が無くなり
その結果としてパイプラインのストールも減る
したがってNetBurstなんかでも有効

まあ、この辺は最近はコンパイラが最適化として考えてくれるんだっけ?
449デフォルトの名無しさん:2005/10/21(金) 01:43:07
>445
そういうので処理速度を少しでも縮めようと可読性の低いコードを量産するよりも
律速になっている部位を特定してそこのアルゴリズムを改良する、あるいは設計を見直す


これでいいですか
450デフォルトの名無しさん:2005/10/21(金) 01:49:29
数値計算の世界では若干可読性が落ちても
本計算の際には計算時間が短くなるほうが良いコード

いわゆる、通常アプリケーションとは少し考え方が違う
451デフォルトの名無しさん:2005/10/21(金) 01:50:16
>413
b1 = b2;
で呼ばれるのは暗黙のB::operator=(B&);
452デフォルトの名無しさん:2005/10/21(金) 01:52:36
条件分岐で必ずストールするわけじゃないし、単純なfor文でのループなら
ストールするのはほとんどの場合ループを抜ける時だけ。
むしろ実行トレースキャッシュに収まらなくて毎回トレースキャッシュミス起こす方が
コストが高くつくと思うけど。
453デフォルトの名無しさん:2005/10/21(金) 01:56:48
>>449
それは、今回のバッドノウハウと指摘した物に対比した場合、
グッドノウハウと呼べるほど具体的なものでは無いような気がしますけど。
俺の気のせいですかそうですか。


まぁいいんでない?それで満足なら。
454デフォルトの名無しさん:2005/10/21(金) 02:13:08
>>452
どうなんだろうね?NetBurstにはV-Tune掛けろとしか言い様が無いな
455デフォルトの名無しさん:2005/10/21(金) 03:11:02
VC++.NETについての質問です。
this->items(これはArray何とか型)->Clear();
でthisによってitemsという変数を引っ張って来るのは分かるのですが
そこからArray何とか型(失念してしまいました)::Clear();となりitemsの中身が
クリアされるのは何故なのか分かりません。
どういった処理がここでは行われているのでしょうか?
456デフォルトの名無しさん:2005/10/21(金) 04:17:35
>どういった処理
itemsの中身をクリアする処理に決まってるじゃんか
457デフォルトの名無しさん:2005/10/21(金) 07:09:36
すいません言葉足らずでした。
items(これはArray何とか型)->Clear(); の結果
Array何とか型(失念してしまいました)::Clear();
に何故なるのかという事です。申し訳ないです
458デフォルトの名無しさん:2005/10/21(金) 07:11:03
下げ忘れました(涙 すいません
459デフォルトの名無しさん:2005/10/21(金) 07:46:41
そのArray何とか型にClearってメソッドがあるんだろ。
460デフォルトの名無しさん:2005/10/21(金) 10:02:54
定義したはずのクラスが定義されてないことになっていて
派生できないのですが、なぜかわかりますか?

#ifndef COMMAND_WINDOW_H
#define COMMAND_WINDOW_H
#include <afxwin.h>
class CCommandWindow {
public:
  CCommandWindow() {}
  virtual void Main() = 0;
  void Draw();
};
#endif // COMMAND_WINDOW_H

#ifndef GAME_SELECT_WINDOW_H
#define GAME_SELECT_WINDOW_H
#include <afxwin.h>
#include "CommandWindow.h"
class CGameSelectWindow : public CCommandWindow {  // ここでエラー
public:
  CGameSelectWindow() {}
  CGameSelectWindow(int x, int y);
  virtual void Main();
};
#endif // GAME_SELECT_WINDOW_H
461デフォルトの名無しさん:2005/10/21(金) 10:19:13
>>455
itemsを仮にCitems型と仮定して
下二つの文のやってることは同じ

this->items->clear();
     ↓
Citems* items = this->items;
items->clear();
462デフォルトの名無しさん:2005/10/21(金) 10:22:02
>>460
とりあえずヘッダ内の宣言だけはコンパイル通った。

void CGameSelectWindow::Main()
を定義してないものをコンパイルしようとした。

StdAfx.h,CommandWindow.cpp,CGameSelectWindow.cpp
その他の*.h,*.cppのインクルードファイルをミスった。

を予想。
463デフォルトの名無しさん:2005/10/21(金) 11:00:49
>>460
Main()は派生クラスで定義してあります
ファイル名は何度も確認したので間違ってないと思います
空のプロジェクトで作ったのでstdafx.hはありません

今コンパイルしたら意味不明なエラーがいっぱい出てきた・・・

enum {
  SPADE = 1, CLUB, HEART, DIAMOND, JOKER, BOTTOM
};
  // error C2065: 'CLUB' : 定義されていない識別子です。
  // error C2065: 'HEART' : 定義されていない識別子です。
  // error C2065: 'DIAMOND' : 定義されていない識別子です。
  // error C2065: 'JOKER' : 定義されていない識別子です。
  // error C2065: 'BOTTOM' : 定義されていない識別子です。
  (今定義してるのに)
  // error C2143: 構文エラー : ';' が '{' の前にありません。
  // error C2143: 構文エラー : ',' が '}' の前にありません。
  (全ての{}にエラー出してるらしい)

afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
  // error C2275: 'UINT' : typedef 識別子に、クラス メンバ アクセス演算子 (->) を使用しました。
  (使用してない)

こんな感じで140ほど
464デフォルトの名無しさん:2005/10/21(金) 11:01:38
465デフォルトの名無しさん:2005/10/21(金) 13:13:54
>>460=463
派生クラスのMainからvirtualを取れ
466デフォルトの名無しさん:2005/10/21(金) 13:26:26
IHTMLDocumentインターフェースを使いたいんですが、どうすればいいでしょうか
「未定義のシンボルIHTMLDocument」っていうコンパイルエラーが出ます

C++Builder使ってます
467466:2005/10/21(金) 13:43:15
#include <mshtml.h>
でした
468デフォルトの名無しさん:2005/10/21(金) 17:09:16
>>465
まだコンパイル通りませんが、そうしてみます

>>462>>465
付き合ってくれてありがとうございました
469デフォルトの名無しさん:2005/10/22(土) 08:24:54
新しくプロジェクトを作って最初からソースを書いたら
おかしなエラーは出てきませんでした。継承も問題無くできました

ソースの書き換えとコンパイルしかしていないのに、
突然>>463のように意味不明なエラーが大量に出てきました
ソースをエラーが出る前の状態に戻してもエラーは消えませんでした

もうコンパイラのバグとしか思えません
こういう症状に心当たりはありませんか?
winxphomeSP2、vc++.net2003です
470463:2005/10/22(土) 08:25:26
 
471デフォルトの名無しさん:2005/10/22(土) 08:42:23
>>469
その新しいプロジェクトのファイル構成を全部挙げてみろ
472デフォルトの名無しさん:2005/10/22(土) 08:48:43
どうしてもコンパイラのせいにしたがるんだよなぁ。
頭悪いとしか言いようがない。
473デフォルトの名無しさん:2005/10/22(土) 08:50:38
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1001.zip
カードゲームです。メニュー画面の作りかけです
他にresource.hと画像ファイルがあります
474デフォルトの名無しさん:2005/10/22(土) 09:00:16
エラー出て当たり前だな。

コンパイルの流れを追ってみろ。
まずMyMenu.cppをコンパイルする時にインクルードされる順番は
MyMenu.h ・・・(1)
StdAfx.h
CommandWindow.h→Draw.h→MainFrame.h→CardGame.h→MyMenu.h
ここでCardGame.hからMyMenu.hをインクルードして安心しているようだが
(1)でインクルードガードが既に発動していて中身は読み飛ばされる。
しかも(1)でも内容は読み込まれる前。
コンパイラがCMyMenuを把握するタイミングなぞないよな?
475デフォルトの名無しさん:2005/10/22(土) 09:09:59
>>473
キミたぶん、この新しいプロジェクトと前のプロジェクトは同じ構成と思ってるんだろう
そうでないと、コンパイラのバグとか思うわけもないからな
ハッキリ言う、同じ構成じゃない
前のプロジェクトは、必要なファイルが作られてなかった
だからエラーが出てるんだよ
476463:2005/10/22(土) 09:14:50
>>474
インクルード先の読み込みが終わったら
インクルード元に戻ってくるんじゃないんですか?
関数の呼び出しみたいに

MyMenu.hの最初の別ヘッダの読み込みが終わったら
下の内容が読み込まれるんじゃないんですか?
477デフォルトの名無しさん:2005/10/22(土) 09:20:08
何もかも、バカすぎる
悪いことは言わん、もっとVC++でのプログラムの仕方を勉強してから出直せ
空プロジェクト作って1から自作するには早すぎる
478デフォルトの名無しさん:2005/10/22(土) 09:21:34
stdafxの役目とか使い方とかプロジェクトの設定の仕方とかその他の構成の仕方とかまったくわかって無いなこいつ
479デフォルトの名無しさん:2005/10/22(土) 09:28:20
なんか呆れてきたが

>>476
> インクルード先の読み込みが終わったら
> インクルード元に戻ってくるんじゃないんですか?
> 関数の呼び出しみたいに
読み込みじゃなくて一つのファイルに展開するようなモンなんだが。

MyMenu.hのインクルードより下の内容が読まれる前に
CardGame.hで未定義の識別子CMyMenuが出てくるでしょ?
CMyMenuが未定義になるのは、CardGame.hでMyMenu.hをインクルードしていても
そもそもCardGame.hがMyMenu.hからいつくかのヘッダーファイルを経由して
呼び出されているわけだから、既にMY_MENU_Hが定義されていて
その時のCardGame.hからはインクルードガードで中身が見えない。
~~~~~~~~~
処理系依存になっていいなら#pragma onceでも使え。
480463:2005/10/22(土) 09:39:40
原因がわかりました
確かに順番通り見ていくとCMyMenuの定義が済む前に使用してます
#pragma onceでも使ってみます
教えてくれてありがとうございました
481デフォルトの名無しさん:2005/10/22(土) 11:29:00
なんとなく、「納得はしてないが取り敢えず返事しておくか」という不承不承な感じのするレスだな。
482デフォルトの名無しさん:2005/10/22(土) 11:41:11
そりゃまあ初心者歓迎を謳いながら、頭悪いとか馬鹿とか叩けばそうなるわな。

>>480
気にするなよ。
慣れないうちは誰でもそんなもんだ。
483デフォルトの名無しさん:2005/10/22(土) 11:43:01
初心者と無能者を同列に考えるなよ
484デフォルトの名無しさん:2005/10/22(土) 11:45:36
進めよさらば与えられん
485デフォルトの名無しさん:2005/10/22(土) 14:30:34
bccでライブラリを作るにはどうすればいいですか
486デフォルトの名無しさん:2005/10/22(土) 15:22:03
ぐぐれ、じゃだめ?
487デフォルトの名無しさん:2005/10/22(土) 16:03:10
>>288
fileno
488デフォルトの名無しさん:2005/10/22(土) 16:08:39
>>487
そんな低レベルな問題じゃないから。
489デフォルトの名無しさん:2005/10/22(土) 16:17:30
と試しもせずに言っている阿呆が居ります
490デフォルトの名無しさん:2005/10/22(土) 17:28:06
filenoでfdは取れるけど、そもそもstdioみたいなバッファリングIOと
selectは相性が良くないって話だろ
常識だぞ
491デフォルトの名無しさん:2005/10/22(土) 17:30:46
int a = 123;
sizeof(a);



int a = 123;
sizeof(int);

って全く等しいのですか
492デフォルトの名無しさん:2005/10/22(土) 17:31:46
Yes
493デフォルトの名無しさん:2005/10/22(土) 17:34:32
>>491
いいえ、前者と後者では括弧を省略できるかできないかの違いがあります。
494デフォルトの名無しさん:2005/10/22(土) 18:32:12
>>493
それは「いいえ 'a' と 'int' が違います」と言うようなもんだろ。
495デフォルトの名無しさん:2005/10/22(土) 18:45:10
>>490
そこで思考停止するのはもったいない。
496デフォルトの名無しさん:2005/10/22(土) 22:44:37
>>485
ヘルプ嫁
497デフォルトの名無しさん:2005/10/23(日) 10:43:20
と、答えられない奴がしゃしゃり出てきて無駄なレスをしましたとさ。
498デフォルトの名無しさん:2005/10/23(日) 11:06:36
>>491
とにかくsizeofの結果は同じになる。
ちなみに構文上、sizeofに指定するのが型名でない場合はsizeof aと書ける。
499デフォルトの名無しさん:2005/10/23(日) 11:37:30
C++のインライン関数についての質問です。

inline void func() { ... }

という関数があり、何カ所からか利用され、ある程度インライン展開されているのは確認しています。
この関数を、さらに関数テーブルでのアクセスにも利用したいと考えております。

void (*pfunc)() = func;

このようなコードを埋め込むと、その他の参照箇所のインライン化まで阻害してしまうのでしょうか?
別途funcの実体を用意し、その他のインライン展開に影響は与えないように最適化されるのでしょうか。

一般的なコンパイラの実装の場合で構いませんので、ご教授いただきたく(´・ω・`)
500デフォルトの名無しさん:2005/10/23(日) 11:52:10
>>499
おそらく後者。
501デフォルトの名無しさん:2005/10/23(日) 12:10:19
>>499
>>500に一票
502デフォルトの名無しさん:2005/10/23(日) 12:19:34
>>500-501
素早いレスありがとうございます。
かなり実行速度にシビアな環境なので、本来ならばマクロやらで強制展開させるべきなのでしょうが
可読性やその他もろもろを考えると、、、というところで悩んでいました。

とりあえずこのまま行けそうなことが分かり安心いたしました。
ありがとうございました。
503デフォルトの名無しさん:2005/10/23(日) 14:49:22
「おそらく」で安心できるもんなの?
504デフォルトの名無しさん:2005/10/23(日) 16:15:40
ふつー後者。
505デフォルトの名無しさん:2005/10/23(日) 18:59:47
FILE*型が示しているファイルのサイズを知るにはどうすればいいのですか
506デフォルトの名無しさん:2005/10/23(日) 19:03:50
>>505
標準の範囲でやろうとするならば

int size;
fseek(fp, 0, SEEK_END);
size = ftell(fp);

ただし確実ではないので、出来ることならシステム固有のAPIを使うべき。
507デフォルトの名無しさん:2005/10/23(日) 19:58:42
>>505
ファイルサイズが2GBを超える場合、>506の手法は使えない場合が多いので念のため。
508デフォルトの名無しさん:2005/10/25(火) 15:16:51
引数に構造体を含む関数を作るときに、
その引数をポインタにするか参照にするかでいつも迷うんですけど、
皆さんはそこら辺はどうしてるんですか?
509デフォルトの名無しさん:2005/10/25(火) 15:19:15
>>508
基本的には参照。
NULLを渡す可能性がある場合はポインタ。
510デフォルトの名無しさん:2005/10/25(火) 15:20:04
構造体はコピーできんかったっけか?
511デフォルトの名無しさん:2005/10/25(火) 15:25:13
不必要なテンポラリを避けるためにも普通は参照かポインタで渡すなぁ
512デフォルトの名無しさん:2005/10/25(火) 15:52:45
○ンポラリ
513デフォルトの名無しさん:2005/10/25(火) 16:07:55
>>508
[in]パラメータは参照
[out]、[in,out]パラメータはポインタ
514508:2005/10/25(火) 16:19:55
>>509,>>513
解答ありがとうございます。
この二つ方針を併せて使っていこうと思います。
515デフォルトの名無しさん:2005/10/25(火) 17:29:53
[in]パラメータは一応constにしといた方がええんじゃね?
516デフォルトの名無しさん:2005/10/25(火) 17:58:48
あるポインタから別のポインタまでのアドレスに格納されてる値を取り出すにはどうすればいい?
517デフォルトの名無しさん:2005/10/25(火) 18:20:41
1BYTEずつ読めば?
518デフォルトの名無しさん:2005/10/25(火) 18:21:46
普通に取り出せばいい。
何がわからないのかわからない。
519デフォルトの名無しさん:2005/10/25(火) 18:23:59
あぁちなみに、その2つのポインタの間が確実に使用されているんじゃないならヤメテオケ
520デフォルトの名無しさん:2005/10/25(火) 18:39:28
言葉足らずでした。
あるポインタから別のポインタまでのアドレスに格納されてる値の全てを配列に格納したのですがどうすればいいですか
って事です。
繰り返し文使わないと駄目ですかね
521デフォルトの名無しさん:2005/10/25(火) 18:40:19
したの?
じゃあもういいんじゃね?

したいの?
じゃあmemcpyでも使えば?
522デフォルトの名無しさん:2005/10/25(火) 18:44:44
>>521
ありがとビーム}!!!!!!!!!!111111111^^^^^^^
523デフォルトの名無しさん:2005/10/25(火) 19:01:30
>>520
C++ならstd::copyとか使うほうが良いかもしれない。
524デフォルトの名無しさん:2005/10/25(火) 23:49:45
ファイルに
X Y Z
X Y Z

X Y Z
っていう座標があるんだけど、これを比較するのだけど
1行目読み込んでから、下の行全部比較して
次は2行目から下の行を比較っていうのやるにはどうすりゃいいのかな

行単位で指定して、数値型で読み込むのってどうやったらいいのかわかんなくて
525デフォルトの名無しさん:2005/10/25(火) 23:54:06
>>524
全部メモリに読み込んでから処理したら?
526デフォルトの名無しさん:2005/10/25(火) 23:54:10
それはテキストファイルなのか?
527デフォルトの名無しさん:2005/10/25(火) 23:56:12
>>525
メモリが足りなくなるほどの行数なので
順次比較してメモリを消費しない方向でやりたいのです

>>526
テキストファイルです
ファイル操作で、何行目から読み込むとかそういう指定が出来ないのかと…
528デフォルトの名無しさん:2005/10/25(火) 23:59:05
>>527
メモリが足りなくなるほどの行数ってどれくらいよ。
実際にやってみもしないうちから足りない足りない言うのは阿呆だよ。
529デフォルトの名無しさん:2005/10/26(水) 00:01:14
100万〜1000万の行で、配列に入れようとしてメモリがぶっ飛びます
530デフォルトの名無しさん:2005/10/26(水) 00:01:47
・・・・
531デフォルトの名無しさん:2005/10/26(水) 00:02:23
1BYTEずつ読み出して、改行コード来たら停止すれば?
532デフォルトの名無しさん:2005/10/26(水) 00:06:39
fgets使うってことですか?
fgetsとかだと、1行単位で読み込んでも、文字型だし比較が出来ず
何行目を読み込むかという指定が出来ないと効率も悪いので

早い話が1個目の座標をがーっと最期の1000万まで比較して、
次の座標は、またはじめから比較するのはアフォくさいからそれより下の行から比較ってのをやりたいのです
533デフォルトの名無しさん:2005/10/26(水) 00:10:44
んじゃあやっぱり一度にメモリに読み込め
534デフォルトの名無しさん:2005/10/26(水) 00:13:23
自分でファイルフォーマットを設計できるんなら、固定長レコードの
ファイルにするんだね。そうすればランダムアクセスできるから。
さらに高速化したいんなら、バイナリに汁。
535デフォルトの名無しさん:2005/10/26(水) 00:13:26
だからオーバーフローするの
無理。何回もそれはやってるから

一時変数にはじめの座標格納して
それ以下のは比較の変数に格納して、それを順次更新していけばメモリは食わないじゃん
ただ、それをやるのに、行指定で数値型で格納する方法がわからなくて
536デフォルトの名無しさん:2005/10/26(水) 00:14:31
一度数値を全部バイナリに変換したファイル作ればfseekで一発
537デフォルトの名無しさん:2005/10/26(水) 00:16:58
オーバーフロー・・・(゚д゚;)

領域の取り方が悪いだけじゃ・・・
538デフォルトの名無しさん:2005/10/26(水) 00:17:35
比較した結果はどうなるの?
539デフォルトの名無しさん:2005/10/26(水) 00:20:38
そもそもそんなうん百Mなテキストデータなんか使うなよ・・・
540デフォルトの名無しさん:2005/10/26(水) 00:25:53
ったく役にたたねぇなぁ…こんぐらいのこと答えれや
541デフォルトの名無しさん:2005/10/26(水) 00:43:26
>>540
その位の事、自力でやれよ。
役に立たないヤシだなぁ…
542デフォルトの名無しさん:2005/10/26(水) 00:45:52
超適当コード
----create.cpp(1000万行のテキストデータを作る)-----
#include <fstream>
using namespace std;

int main(){
ofstream ost("hoge.txt");
for(int i=0; i<10000000; i++){
ost << i << " " << 255 << " " << 255 << endl;
}
ost.close();

return 0;
}
543542:2005/10/26(水) 00:47:42
----search.cpp(1000万行のテキストデータをメモリに格納してランダムアクセス)-----
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
#include <ctime>
using namespace std;

int main(){
clock_t start = clock(), end;
ifstream fin("hoge.txt");
string buf;
vector<string> vstr;
while(getline(fin, buf))
vstr.push_back(buf);
end = clock();

cout << "elapsed time: " << (end-start) / CLOCKS_PER_SEC << endl;
cout << vstr[5976367] << endl; //適当に抽出

return 0;
}

手元のPCでは30秒ちょいかかった。オーバーフローはなし。
データの符号化に凝れないなら気の利いたPCでも調達すれば?
544デフォルトの名無しさん:2005/10/26(水) 00:48:20
>>535
ソースがおかしいだけじゃないのか?
とりあえず、データ構造とアルゴリズムを見直せ。


後、やりたい事を箇条書きするなど、
考えをまとめてからコーディングする癖を付けておいた方がいいぞ
545デフォルトの名無しさん:2005/10/26(水) 00:53:17
「オーバーフローする」ってのがよく分からない俺はだめ学生かも。
でかいテキストファイルだとfopenでは開けないの?

fgetsしてsscanfするっていう方法しか考えつかなかった。……orz
546545:2005/10/26(水) 01:12:16
いや、俺の読みが正しいかもしれない。
fopenしたものを、全部配列に読み込もうとして失敗してる模様?

「100万〜1000万の行で、配列に入れようとしてメモリがぶっ飛びます 」
「fgetsとかだと、1行単位で読み込んでも、文字型だし比較が出来ず」

配列に読み込まず、fopenしたままfseekなりなんなり使えばいいんじゃなかろうか。

それとも、OSの都合で4ギガを超えるファイルを扱えないとか、
そういう方向の問題だろうか。
547542:2005/10/26(水) 01:19:05
>546
上のコードで実際に生成したけど161MB程度だったよ。
548デフォルトの名無しさん:2005/10/26(水) 01:41:15
インデックスシーケンシャルファイルでSEEK位置を最初に保存して
fscanf等でデータ取ってきて適当にatoi等で数値に変換

#俺ならデータベースを利用するけどな
549デフォルトの名無しさん:2005/10/26(水) 01:42:18
>>546
fseek()とか使いたいんなら、ランダムアクセス可能なように
最初から固定長のファイルにしとけ、と。
550デフォルトの名無しさん:2005/10/26(水) 01:42:30
なんか本人の自覚以上に初心者が激しく根拠のない理屈をこねてるだけだな。
>>524,etc
>行単位で指定して、数値型で読み込むのってどうやったらいいのかわかんなくて
>ファイル操作で、何行目から読み込むとかそういう指定が出来ないのかと…
ファイルの先頭に戻すか開きなおして必要な行まで読み飛ばせばいいだけだろが?
特殊な約束事が無い限り、行での指定は出来ない。自分で行を数える。
自分で行数数えながらその位置を覚えておけば(ftell)次回はそこまで
読み飛ばせるし。(fseek)

>fgetsとかだと、1行単位で読み込んでも、文字型だし比較が出来ず
カスか? 文字列から必要な数値を読み取るのは入門レベルの例題だろうに。
>何行目を読み込むかという指定が出来ないと効率も悪いので
入門者以下が足りない考えで効率云々するのは失笑ものかと。

>メモリが足りなくなるほどの行数なので
>だからオーバーフローするの
まさかメモリを確保できなくなるのを「オーバーフロー」と言って通じる
なんて思ってやしないよな??
1000万行としてint X,Y,Z でも sizeof(int)*3*10 MegaByte だから、
まあ効率云々能書きたれるなら、まあ今時充分利用可能な程度の
大きさだな。(仮想メモリででも)
551545:2005/10/26(水) 01:42:41
>>547
質問者が言ってる「オーバーフロー」は、
こんな感じのコードを書いたせいじゃないかと思った。

char buf[100][1000000]; /* 100万行 100MB */

for (i=0; i<1000000; i++) {
 fgets(云々……

例えばボーランドの無料コンパイラだと、
配列とかスタックメモリ(?)が1MBを超えたらアウトだった(気がする)

……俺、すげー馬鹿なこと言ってるかも?
全然的外れだったら、誰か俺を止めて。
552デフォルトの名無しさん:2005/10/26(水) 01:43:09
>>548
どーしても固定長にできないんなら、まあそうなるな
バカバカしいけど
553545:2005/10/26(水) 01:55:15
書き込む前にリロードしときゃ良かった。
なんか俺、すげー場違いかも。

俺より詳しい人が来たので、>>524はこのひとに訊いて下さい。
554デフォルトの名無しさん:2005/10/26(水) 02:12:53
>>551
ええと、静的領域にではなく、関数内などスタック領域にとってしまったと?
それをスタックオーバーフローとでも表示する処理系でもあるのか?
まあ確かにそういった区別やmalloc()など理解してそうにもないなあ、
いぜれにせよ、入門者がわかったつもりでトンデモなのは今回に限らない。
555デフォルトの名無しさん:2005/10/26(水) 02:22:30
そもそもデータ処理として、全データ1対1の総当り「比較(?)」というのが
激しく素人くさくて意味わかんね。
目的と応用性によって、もっと簡単な手順や、前処理がいくらでもあろうに。
556デフォルトの名無しさん:2005/10/26(水) 06:24:11
1000万行で32ビットの値だとしても120MB程度でそ?
スワップする事を考慮すれば、
よっぽど古いPCじゃない限りメモリが足りなくなることは無いんじゃないの?

総当りなら時間はめちゃかかるだろうけど。
557デフォルトの名無しさん:2005/10/26(水) 08:40:13
Windowsでコマンドプロンプトの出力を取り込むためのUnixのpopenの様な関数はありませんか?
558デフォルトの名無しさん:2005/10/26(水) 08:50:27
>
559デフォルトの名無しさん:2005/10/26(水) 08:55:40
>>557
無名パイプ
560デフォルトの名無しさん:2005/10/26(水) 09:52:22
質問です。
newのオーバーライドなのですが、適用するソース範囲を制限することはできませんでしょうか。
例えば「このCPPファイルの中のnewのみオーバーライド」や「このクラスのメンバー関数の中でつかわれるnewのみオーバーライド」が欲しいのです。

最も外側でoperator newをオーバーライドすると、全てのnewが上書きされますよね。
とある組み込み機器の環境でこれに困っていまして、システム側が勝手にnewを使ってるっぽいのです。

オーバーライドしたnewの中身には、自前メモリー管理システムが入っているのに、その管理クラスの初期化前に呼ばれてエラーになってしまいます。
制限によって、システム側の勝手にnew呼び出しの前に処理を書くことができませんし、初期化時の値が保証されている変数も存在しません。(あればnewの中でそれをフラグにして分岐を行なうのですが)


例えばあるクラスの中で行なうnewのみをオーバーライドできるというのが理想です。

・CPPファイルを分ければOKかと思ったのですが、リンクの段階で「すでに定義されています」エラー

・(自作)CAppクラスのCApp::operator newをオーバーライドすれば、CAppの中で使われているnewがオーバーライドされるのかと思ったら、new CAppがオーバーライドされるだけだった
561デフォルトの名無しさん:2005/10/26(水) 10:04:48
>>560
自分で定義を与えることができるのはグローバルな new とクラスごとの new だけ。
望みの効果を実現する簡単な方法は無い。

static bool みたいな静的変数の初期化も保証されないタイミングで new が呼び出されてるの?
本当にそんなタイミングだとしたら、デフォルトの new すら動く保証がないはずだよ。
562デフォルトの名無しさん:2005/10/26(水) 10:07:59
>>561
お返事ありがとうございます。
なんとその環境ではstatic変数が利用できないのです(つД`)
とここまで言うと環境がわかる人が出てきそうですが…。

とりあえず暮らすごとのnewをオーバーライドし、
new char; とかについては専用のクラス関数を用意することにします。

しかし、CPPファイルをまたいで影響を受けるとはかなり意外でした。
これ、他の人が公開しているライブラリ(cppファイルで公開)を利用したら、自前のnewオーバーライドと必ず衝突してしまいますよね?
563デフォルトの名無しさん:2005/10/26(水) 10:13:18
new(nothrow)みたいに引数付きのoperator newを用意すれば?
564デフォルトの名無しさん:2005/10/26(水) 10:18:05
>>562
なんとなく環境の想定がついたが、深くは突っ込まないでおこう。

呼び出し箇所を置き換えて回る覚悟があるなら
引数つき new (配置 new と呼ばれるもの)を作って
そちらを呼ぶようにすればいい。
new(customized) char とか書ける。
標準の nothrow_t nothrow を参考に。

まともな知識があれば、ライブラリの一部として
グローバルな new の置き換えを定義するようなことはしない。
やるにしてもオプション扱いだろう。
565デフォルトの名無しさん:2005/10/26(水) 10:29:06
お返事ありがとうございます。

配置newというのは知りませんでした。
try/catchも無いような環境ですので不安ですが、これからテストしてみます。
本当に助かります。
566デフォルトの名無しさん:2005/10/26(水) 11:17:58
やりました。配置newでいけました。

というわけでマクロ化して
#define NEW(x) new(0) x
とでもしておこうかと思います。
本当にありがとうございましたっ。まだ全機種チェックはできてませんが…。
567デフォルトの名無しさん:2005/10/26(水) 17:07:49
現在DLLを使用したプログラムを書いています。
しかし、DLL_PROCESS_DETACHの際に、MessageBox関数を呼び出しても、メッセージボックスは作成されません。
環境は、 Windows2000 SP4 Borland C++ 5.5.1 SDK
具体的には、以下のようなプログラムを書いています。
//------------------------------------------------------------------//
BOOL WINAPI DllMain(HANDLE hInstance, DWORD what, LPVOID Notused)
{
  switch(what) {
  case DLL_PROCESS_ATTACH:
    MessageBox(HWND_DESKTOP, "Process attaching DLL.", "DLL Action", MB_OK);
    break;
   case DLL_PROCESS_DETACH:
    MessageBox(HWND_DESKTOP, "Process detaching DLL.", "DLL Action", MB_OK);
    break;
  case DLL_THREAD_ATTACH:
    MessageBox(HWND_DESKTOP, "Thread attaching DLL.", "DLL Action", MB_OK);
    break;
  case DLL_THREAD_DETACH:
    MessageBox(HWND_DESKTOP, "Thread detaching DLL.", "DLL Action", MB_OK);
    break;
  }
  return 1;
}
//------------------------------------------------------------------//
参考:DLL_PROCESS_DETACH と MessageBox関数の問題例
ttp://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200212/02120053.txt 
DLL_PROCESS_DETACHの際に、MessageBox関数を使うのは不正なのでしょうか。
568デフォルトの名無しさん:2005/10/26(水) 17:22:59
>>567
ttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/dllmain.asp
>There are serious limits on what you can do in a DLL entry point.
>To provide more complex initialization, create an initialization routine for the DLL.

多分ダメ。
569デフォルトの名無しさん:2005/10/26(水) 17:50:27
>>567
原則DllMainではkernel32.dllの関数しか使えないと思ったほうがいい。(Advanced Windowsに書いてある)
IDEを使っているのならOutputDebugStringなんかを使うようにしたらいいかと思う。
570デフォルトの名無しさん:2005/10/26(水) 18:11:55
つーか普通、そこには何も書かないかと・・・
571デフォルトの名無しさん:2005/10/26(水) 18:33:38
>>568
DLLのエントリポイントでできることには、重大な制限があります。
より複雑な初期化を行うには、DLLのための初期化ルーチンを作る必要があります。
と訳したけど、MessageBox関数が使えない理由になるのか分からなかった。

>>569
> 原則DllMainではkernel32.dllの関数しか使えないと思ったほうがいい。(Advanced Windowsに書いてある)
DLLにそんな制約があるとは知らなかった。勉強になりました。
OutputDebugStringを利用するようにしてみます。

長いこと悩んでいたけど、すっきりしました。ありがとうございます。
572508:2005/10/26(水) 19:08:16
#include <stdio.h>

class foo
{
public:
  void put(){
    puts("HogeHoge");
  }
};

void main()
{
  foo *pfoo = NULL;
  pfoo->put();
}

と書いて実行したら画面に
HogeHoge
と表示されてしまいました。
pfooは有効では無いはずなのに、何で表示されたんでしょうか?
573デフォルトの名無しさん:2005/10/26(水) 19:09:07
うはw名前残ったまんまだったww
574デフォルトの名無しさん:2005/10/26(水) 19:14:45
>>572
foo::put()がvirtualでなく、メンバにもさわってないから。
でも実装上たまたまうまくいっただけで、C++的には鼻から悪魔だと思う。
575デフォルトの名無しさん:2005/10/26(水) 19:19:26
>>572
通常の処理系では、virtualでないメンバ関数は、thisを引数にとる
関数として実現される。よって、そのコードは、以下のコードと同じようにコンパイルされる。

void __foo_put(foo *this){ puts("HogeHoge"); }

void main()
{
  foo *pfoo = NULL;
  __foo_put(pfoo);
}

で、__foo_putはthisパラメタに触れていないから、NULLが渡されても問題なく振る舞う。
ただし正常に動作する保証がある訳ではないはず。
576デフォルトの名無しさん:2005/10/26(水) 19:55:03
>>574,>>572
なるほど。そう言う訳だったんですか。
C/C++の世界は深いですね…。
ありがとうございました。
577デフォルトの名無しさん:2005/10/26(水) 21:30:15
C++の世界というかC++コンパイラの実装の世界というべきかもね。
578デフォルトの名無しさん:2005/10/27(木) 00:07:19
X Y Z => R G B ?
579デフォルトの名無しさん:2005/10/27(木) 17:21:17
とりあえずメンバ関数はすべてvirtualにしておいたほうが
いいってことですか?
580デフォルトの名無しさん:2005/10/27(木) 18:21:57
なんで?
581デフォルトの名無しさん:2005/10/27(木) 18:31:05
>>579
どう見ても誤爆です。
本当にありがとうございました
582デフォルトの名無しさん:2005/10/27(木) 19:37:54
今晩は、よろしくお願いします。
ポインタの質問です。
もし、vectorクラスのポインタを引数として渡し。
そこにデータを追加したいとき

void watasu(vector<string> *data){
string moji = "sss";
data.push_back(moji);
}
このvector にも、メモリーを割り当てておく
必要があるのでしょうか。
583デフォルトの名無しさん:2005/10/27(木) 19:39:28
素直に参照渡ししとけ!
584デフォルトの名無しさん:2005/10/27(木) 19:39:49
>>582です。
書き込んでから、私すごい誤解していますよね。
vector は、ひとつだけなんですから。
それはしなくていいということですね。
585デフォルトの名無しさん:2005/10/27(木) 19:45:38
dataはポインタだろ?
.じゃなくて->だと思うが。
586デフォルトの名無しさん:2005/10/27(木) 20:43:39
>.
ヽ(`Д´)ノ ミエネエヨ!
587デフォルトの名無しさん:2005/10/27(木) 20:55:38
目を皿のようにすれば見える
588デフォルトの名無しさん:2005/10/27(木) 22:05:37
初心者というより入門者なのですが、大学の課題で行き詰ってしまったので
アドバイスを頂きたいです。
OSはWindowsXP、コンパイラはVisualC++6.0で、課題の内容は
「1〜50人までの数学、英語の成績を入力して、それぞれの教科についての合計点、平均点、最高点、最低点を集計結果にまとめよ。尚、負の数が入力された時点で入力が終了したと判断し、直前の入力までを集計せよ」という内容です。
今現在の状況は

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1016.txt

という所までで数学、英語それぞれについての合計がmt,et
平均がma,ea 最高点がmmax,emax 最低点がmmin,eminです。
入門書や教科書とにらめっこしてなんとかここまではできたのですが、
これを実行しても最高点しか正常に表示されない状況でして・・・。
どなたかアドバイスお願いできないでしょうか?
ちなみに変数宣言の所で0を代入しているのは配列の初期化やらよく分からなかったので
取り合えず全部初期化しておこうと思った次第です。長文失礼しました。
589デフォルトの名無しさん:2005/10/27(木) 22:16:21
ATLでつくったServiceのCOMインタフェースにアクセスしたいのですが
Serviceからならアクセス出来ましたが、一般のEXEからだと
クラスのCoCreateInstanceで失敗してしまいます
なんらかの権限の問題だと思いますが、わかる方いませんか?
590デフォルトの名無しさん:2005/10/27(木) 22:26:18
>>587
等幅フォントにすれば普通に見える
591デフォルトの名無しさん:2005/10/27(木) 22:34:24
>>588
minの初期値、配列の添え字をもう少し考えなさい。
scanfで入力した値と比較している値の添え字が違うよ。
592588:2005/10/27(木) 23:16:03
>>591
アドバイス有難うございます。
しばらく考えてみたのですが、minの初期値は満点の100を代入して
なんとか修正できたものの、配列の添え字については
n番目の負の値を集計から除くとn-1になると思うのですが
これはおかしいのでしょうか・・・・
未だに合計が修正できないので間違っている事は分かるのですがどう間違っているのかが分かりません。
593デフォルトの名無しさん:2005/10/27(木) 23:20:53
>>592
おかしいのはscanfしてから出力する間の配列へのアクセス。
nに今回入力された値を格納しているようだけど、max、minの比較が何で前回入力した値(n-1)なの?
totalに足してる値が何で前回入力した値なの?
ずれてませんか?
594デフォルトの名無しさん:2005/10/27(木) 23:32:20
初心者きわまりない質問で恐縮なんですけど、
VC++.NETでWindowsのプログラムを作るときに、
ダイアログエディタみたいなので
簡単にメインウィンドウにコントロールを配置することってできるんすか?
595デフォルトの名無しさん:2005/10/27(木) 23:40:39
>>594
メインウィンドウ自体をダイアログにしてしまえばいい。
596デフォルトの名無しさん:2005/10/27(木) 23:42:39
VC++2005では.NETFrameworkベースでそういう開発が出来るんだっけか。
managedC++限定なのかね
597デフォルトの名無しさん:2005/10/27(木) 23:51:52
>>596
別にMFCでもダイアログベースで開発すれば済む話では内科医?
598デフォルトの名無しさん:2005/10/27(木) 23:54:27
つか.NETだと基本はFormベースのポトペタ。何も考えずそれがデフォルト。
599588:2005/10/27(木) 23:56:03
>>594
言われている事が理解出来ていないかもしれませんが、
確かにn-1だと最初のループでm[-1],e[-1]とおかしい値になりますね・・・
最終的に負の値を入力する事が入力終了のフラグだったので
[n]だとその負の値が集計に入って合計と最小値が狂ってしまうと思って
n-1にしたのですがやはりおかしいですね。
集計に影響せず、かつ負の値を入力終了のフラグにするには
どうすればいいのか考えてみましたが思いつきません。
600588:2005/10/27(木) 23:56:54
>>594
>>593
でした。失礼しました
601デフォルトの名無しさん:2005/10/28(金) 00:00:17
もう588が言ってることが良く分からんから直したソース張る。

for(n=0;n<50;n=n+1){
printf("%2d番:",n+1);
scanf("%d %d",&m[n],&e[n]);

if(m[n]<0||e[n]<0){break;}

if(m[n] > mmax){mmax = m[n];}
if(e[n] > emax){emax = e[n];}
if(m[n] < mmin){mmin = m[n];}
if(e[n] < emin){emin = e[n];}

mt += m[n];
et += e[n];
ma = mt/(n + 1);
ea = et/(n + 1);

printf("--- 集計結果 -------------------------\n");
printf("人数:%d\n",n+1);
printf(" 数学英語\n");
printf("合計点: %f %f\n",mt,et);
printf("平均点: %f %f\n",ma,ea);
printf("最高点: %d%d\n",mmax,emax);
printf("最低点: %d%d\n",mmin,emin);
}
602デフォルトの名無しさん:2005/10/28(金) 00:01:21
>>600
そもそもループ内で結果を出力しているのがおかしいと思うのだけど。
603588:2005/10/28(金) 00:08:39
>>601
どもです。
それを参考にしてもうちょっと考えてみる事にします(´・ω・`)
604デフォルトの名無しさん:2005/10/28(金) 00:16:15
ていうかな。集計出すだけなら配列に入れる必要ないよ、これ。
こんな感じでいける。

#include <stdio.h>
#include <limits.h>

int main()
{
    int e, m;
    int num = 0, msum = 0, esum = 0;
    int mmax = INT_MIN, emax = INT_MIN;
    int mmin = INT_MAX, emin = INT_MAX;
    
    for (; scanf("%d %d", &m, &e) == 2 && m > 0 && n > 0; ++num) {
        if (m > mmax) mmax = m;
        if (m < mmin) mmin = m;
        if (e > emax) emax = e;
        if (e < emin) emin = e;
        msum += m;
        esum += e;
    }
    printf("人数: %d人\n", num);
    printf("     数学    英語\n");
    printf("合計 %5d  %5d\n", msum, esum);
    printf("平均 %5.1f  %5.1f\n", (double)msum/num, (double)esum/num);
    printf("最高 %5d  %5d\n", mmax, emax);
    printf("最低 %5d  %5d\n", mmin, emin);
    return 0;
}
605604:2005/10/28(金) 00:18:03
あ、すまん。これだと零点が入れられないな。
if文の
m > 0 && n > 0

m >= 0 && n >= 0
に直してくれ。

で、>>588は今後こういうのは宿題スレに持ち込むように。
606デフォルトの名無しさん:2005/10/28(金) 02:30:13
>602がスルーされた件について。
607デフォルトの名無しさん:2005/10/28(金) 09:05:19
どうでもいいよ
608デフォルトの名無しさん:2005/10/28(金) 10:30:30
>>604
作って終わりのプログラムならな
実際は配列をベースに(ry
609デフォルトの名無しさん:2005/10/28(金) 10:41:25
単に生成した単一画像データをWeb上のcgiにポストするだけのプログラム書いてるはずなのにmultipart/mixedとかいらん機能載せてクラスが肥大化してきた俺が来ましたy(ry
610デフォルトの名無しさん:2005/10/28(金) 14:46:16
質問です。

Object obj = NULL;
という宣言をすると(Objectは自作クラスです)、

error C2440: 'initializing' : 'const int' から 'class Object' に変換することはできません。

というエラーが出ます。
ですがObjectは
void operator=(void*);
がオーバーロードしてあり、実際
Object obj;
obj = NULL;
はコンパイルが問題無くとおります。

initializingという単語から考えて、変数の宣言と同一時の=は通常の=とは別扱いなのでしょうか?
なるべくなら
Object obj = NULL;
という宣言方法で書きたいのですが、できないものでしょうか。
611デフォルトの名無しさん:2005/10/28(金) 14:48:11
Object* obj = NULL;

インスタンスそのものをNULLにしようとしてどうするんだおまいさん?
612デフォルトの名無しさん:2005/10/28(金) 15:05:42
>>610
初期化と代入の違いを勉強しよう
613デフォルトの名無しさん:2005/10/28(金) 15:59:40
>>611-612
お返事ありがとうございます。

>>611
そこは「わざと」なんで気にしないで下さい。
私の例が誤解を招くような例でした。
確かにObject* obj = NULL; を勘違いしているように見えますね。すいません。

>>612
確認できました。
なるほど
Object obj = NULL;

Object obj(NULL);
と解釈されるんですね。ありがとうございました。
614デフォルトの名無しさん:2005/10/28(金) 16:11:33
老婆心ながら、
Object obj;
obj = NULL;
なら大丈夫だろ?
#気色悪い設計だと思うが。
615デフォルトの名無しさん:2005/10/28(金) 16:12:37
>がオーバーロードしてあり、実際
>Object obj;
>obj = NULL;
>はコンパイルが問題無くとおります。
>>614

斯くの如く、初期化と代入は違うのだよ。
617デフォルトの名無しさん:2005/10/28(金) 16:48:51
>>610
もっと根本的にObjectなんてクラスは本当に必要?
618デフォルトの名無しさん:2005/10/28(金) 16:58:04
>>610
コピーコンストラクタを自前で書け。
619デフォルトの名無しさん:2005/10/28(金) 18:40:28
>>595
おぉ、なるほど。
ありがとうございます
620デフォルトの名無しさん:2005/10/28(金) 19:53:10
低レベルな質問で申し訳ないですが
あるテキスト(テキスト形式のメール本文とか)の中に
URLがあった場合、そのURLに自動的にリンクを張ろうとしています
URLのある場所とかがわかればそこにタグを追加するだけなんですが
URLをどうやって検出するかというところで悩んでいます。
どなたかアドバイス・ヒント等いただければよろしくお願いします
621デフォルトの名無しさん:2005/10/28(金) 20:12:00
>>620
通常、プロトコル(例えばhttp)を検出する。問題は、どこで終端するかだが。
622デフォルトの名無しさん:2005/10/28(金) 20:19:16
>>621
すいません、>>620じゃ全然情報足りないですね
現在はhttpで開始点を検出することはできてるんですが
おっしゃるとおりどこまでをURLか、という部分で悩んでいます
623デフォルトの名無しさん:2005/10/28(金) 20:25:42
URL の正しい構成を RFC から拾ってきて正規表現でマッチさせるのが多分王道。
但し、ピリオドも正しい構成要素なのでこの方法では

The URL is http://foo/bar.html.

のように文章のピリオドも構成要素として見なしてしまうのが難点。
624デフォルトの名無しさん:2005/10/28(金) 20:27:59
>>622
空白の前まで。httpの前が開き括弧なら、空白の前の対になる閉じ括弧は無視。
2バイト文字を無視するかどうかは主義主張に則ってどうぞ。
尚、元来'?'や'&'は含まれない筈だがcgiの呼び出しなどで当たり前に使われてしまっているので要注意で。
625620:2005/10/28(金) 20:38:43
>>623 >>624
ありがとうございます、がんばってみます!
626デフォルトの名無しさん:2005/10/28(金) 21:15:41
どなたかこの本持ってる方いますか?
ぐぐっても感想が見つからなかったので、どなたか使ってる方がいたら
使える本かどうか伺いたいです
ttp://www.gihyo.co.jp/books/syoseki.php/4-7741-2526-1

まだ勉強中の身分で、同じ出版社から出てるC言語辞典は結構役に立ってるのですが
問題の本を見た感じだとC言語辞典とは大分違いそうなので質問にあがりました
627デフォルトの名無しさん:2005/10/28(金) 23:28:05
>>626
>C++はメジャーなプログラミング言語(C言語のスーパーセット)ですが、入門書の数はそれなりにあるのに、ほかの種類の書籍に恵まれてきませんでした。
腐るほど出てると思うんだが
628デフォルトの名無しさん:2005/10/28(金) 23:54:04
初版のコメントまんまなんじゃないの
629デフォルトの名無しさん:2005/10/29(土) 09:57:44
>>595
これを見て思ったんだけど、
ダイアログをベースにしたプログラムってどうするんですか?
VC++.NETでWin32のプログラムです。
630デフォルトの名無しさん:2005/10/29(土) 10:00:30
>>629
説明書くらい読め。
631デフォルトの名無しさん:2005/10/29(土) 10:02:10
>>629
WinMainの中でいきなりDialogBoxやCreateDialogを呼べばいい。

ところでダイアログボックスにはウィンドウクラスを指定できるから、
自分でRegisterClassEx()して(ダイアログプロシージャではなく)ウィンドウプロシージャを書くこともできる。
632デフォルトの名無しさん:2005/10/29(土) 14:43:46
質問です。XP、.NET です。
先ほど他スレに投稿したのですが、スレ違いと判断して、誘導の後こちらに引っ越させていただきました。

関数ポインタについてです。

CHoge hoge {
public:
 bool (*pFunc)();
 bool Func();
 void test();
}

CHoge::test()
{
 pFunc = Func;
}

上記のコードをコンパイルした結果、関数へのポインタへの代入に失敗しました。
Func() の型は bool (*)(CHoge*) のため(CHoge* は暗黙の引数 this を受け取る)、
bool (*)() 型の pFunc には代入できなかった、という理解でよろしいのでしょうか?

また、上記問題を解決するため、

 bool (*pFunc)(CHoge* pHoge);
 static bool Func(CHoge* pHoge);

というように、Func を静的にし、メンバを呼ぶためオブジェクトのアドレスを渡すようにしたのですが、
これでは、Func() の記述内に pHoge-> が散乱してしまい、格好悪くなってしまいます。

何かいい解決法はないでしょうか。
よろしくお願いします。
633デフォルトの名無しさん:2005/10/29(土) 14:48:21
これ何言語?
634632:2005/10/29(土) 14:50:44
C++ のつもりでしたが・・・、不備がありましたでしょうか。
CHoge::test() → void CHoge::test() です。
635デフォルトの名無しさん:2005/10/29(土) 14:51:29
>>632
メンバ関数ポインタを使いなさい。
説明はメンドイんでググレ
636デフォルトの名無しさん:2005/10/29(土) 14:53:23
C++で通るように書くと
class CHoge {
public:
    bool (CHoge::*pFunc)();
    bool Func() { return false; };
    void test();
};

void CHoge::test()
{
    pFunc = Func;
}
こんな感じだが…
あまりに低脳なミスが多すぎてやる気なくす
637632:2005/10/29(土) 14:58:27
>>635
ぐぐったら詳しいページが見つかりました。ありがとうございます。
>>636
納得・・・お恥ずかしい限りです。
638デフォルトの名無しさん:2005/10/29(土) 14:59:02
>>632
大体そんな認識でいいけど、Funcの型はbool (hoge::*)();
メンバへのポインタを使うとこうなる。
class CHoge {
public:
    typedef bool (hoge::*FuncType)();
    FuncType pFunc;
    bool Func();
    void test();
};
void CHoge::test() {
    pFunc = &CHoge::Func;
}
これを使うときには
CHoge obj;
obj.test();
FuncType pfn = obj.pFunc;
(obj.*pfn)();
下2行は勿論(obj.*obj.pFunc)();とまとめられる。

あるいはboost::mem_funとboost::functionなどを使うとするとこうなる。
class CHoge {
public:
    boost::function<bool ()> Func1;
    bool Func();
    void test();
};
void CHoge::test() {
    Func1 = boost::bind(&CHoge::Func, this);
}
これだとobj.Func1()と呼べる。
639デフォルトの名無しさん:2005/10/29(土) 17:22:26
コンストラクタとデストラクタを集中的に勉強したいのですが、
どこかいいサイトがあったら教えてください。
640デフォルトの名無しさん:2005/10/29(土) 17:26:27
>>639
Effective C++辺り読むのがオススメ
どっちにしろ必読書だし
641デフォルトの名無しさん:2005/10/29(土) 22:27:17
WindowsXP SP2 MFC使用 VC++ .Net 2003です。

Aという基本クラスを作り、Aクラスを派生したクラスを100個ほど作ります。
その際、派生クラスの名前をA_00, A_01, A_02....A_99というふうに、基本クラス名の後に2ケタの数字がつくようにします。
そしてそのAの派生クラス達をあるクラスで生成し、それぞれの呼ぶのですが、
その生成の個所が以下のようになってしまいます。

pA[0] = new A_00();
pA[1] = new A_01();


pA[99] = new A_99();

で、質問なのですが、クラス名の文字列から、クラスオブジェクトを生成できないでしょうか?
それができると生成の個所が
for( int i = 0; i < 100; i++ )
{
  CString className;
  className.Format( "A_%02d", i );
  pA[i] = (A*)new XXXX( className );  ←これが不明
}
というふうに簡素化できるのですが…。
642デフォルトの名無しさん:2005/10/29(土) 22:33:19
>>641
名前にはきちんとした意味を持たせろ。話はそれからだ。
643デフォルトの名無しさん:2005/10/29(土) 22:41:06
>>641
100個となると少々設計に問題がある気がするけど、
boost::preprocessorがそういったループ展開可能なマクロを提供しているから
それを使えば簡潔に書くことはできると思う。
644629:2005/10/30(日) 00:09:21
>>630
説明書て、ダイナミックヘルプのこと?
>>631
#include <windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
char szClassName[] = "main01";  //ウィンドウクラス
int WINAPI WinMain(/*略*/)
{
    BOOL bRet; //メッセージループで使う
    MSG msg;
    WNDCLASSEX wc;

//ウィンドウクラスの登録
    wc.cbSize = sizeof(WNDCLASSEX);
    //以下略

    if (RegisterClassEx(&wc) == 0)
        return FALSE;

    DialogBox(hCurInst, "Top01", (HWND)wc,(DLGPROC)WndProc); //ダイアログリソースは"Top01"で扱った

//メッセージループ
    //(略)
}
こんな感じにすれば良いんですか?
いや、動かないんで間違ってるんですけど…(--;
645デフォルトの名無しさん:2005/10/30(日) 00:26:24
>>644
いいや。
RegisterClassEx云々はそうもできると言う話であって、今回の話とは別個。
普通にRegisterClassExしないで、DialogBoxを使いな。
646デフォルトの名無しさん:2005/10/30(日) 00:26:48
pthreadをC++(UNIX系)で使ってるんですが、

void func(MyClass *myclass)

pthread_t t[10];
int res,i;
MyClass myclass[10];
for(i=0;i<10;i++)
res = pthread_create(&t[i],NULL,(void *)func,&myclass[i]);

とするとエラーがでてコンパイルが通りません。

何がいけないのか教えてくれませんか?
647デフォルトの名無しさん:2005/10/30(日) 00:35:50
>>646
pthreadが許可する関数エントリはvoid*を受け取りvoid*を返すように決められているから、
funcをキャストするなら(void *)ではなく(void *(*)(void *))にキャストする必要がある。

実際のところ、 void *func(void *arg) としておいて、内部で
MyClass *myclass = (MyClass *)arg;
とするのがいいんじゃまいか。

そうすればpthread_createの無駄なキャストが消えて
pthread_create(&t[1], NULL, func, &myclass[i]);
と出来るかと
648デフォルトの名無しさん:2005/10/30(日) 00:37:42
仕事でプログラムやってる方に質問。

納期が近くなって数時間を争う状況になったとき、
@納期後のメンテナンス性を考えたコーディング→ある程度改修が必要で時間がかかる
Aべた書きのスパゲッティコード→すぐ書けるがメンテナンス性皆無

のどちらかの方向を選ばなくてはならなくなったら@,Aのどちらの道をとるのが
ベターなんですか?
649デフォルトの名無しさん:2005/10/30(日) 00:51:14
>>648
みんな(2)を選ぶから保守が大変なんだろうて。
650デフォルトの名無しさん:2005/10/30(日) 00:55:24
>>644
おとなしくVB/VC#/Delphi/BCB/VC++.net(Windows.Form)のどれかを使う。
651デフォルトの名無しさん:2005/10/30(日) 02:25:10
>>648
納期が数時間単位でヤバイなんて時期になって、
@かAかを選択する余地は普通無いと思うが。

それに、@を選択するのなら、最初からそういう設計になっているべき。
ということで、そういう状況になるとすればほぼAを選択することになる。

というか、そういう選択を迫られる状況にならないように、
出来る限り先回りで対応する事と、今日出来ることを明日に延期しない心がけが大切。
652デフォルトの名無しさん:2005/10/30(日) 02:29:28
明日できることを今日やらないで済むようにスケジューリングするものです。
653デフォルトの名無しさん:2005/10/30(日) 02:31:32
>>648
> 納期が近くなって数時間を争う状況
でまだ「コーディング」をやっている、というのがそもそも論外。
654デフォルトの名無しさん:2005/10/30(日) 05:05:31
仕事でって… まあ作業の内容にもよるだろうが(!?)、その段階で1,2という
選択どころか「コーディング」自体に意味が無い。
たとえテストやデバグ改修にしてもなあ…
(実態はともかくか?)設問自体が意味をなさない(はずだが)。
655デフォルトの名無しさん:2005/10/30(日) 06:14:42
00 int *num:
10 num = new int;
20 num = new int;

という風にnewで動的に確保したメモリのアドレスを、ひとつのポインタに
入れちゃうと10行で確保したメモリはdeleteできなくなっちゃうんですかね?
それとも
delete[] num;
でdeleteできるんですか?
656デフォルトの名無しさん:2005/10/30(日) 06:42:27
>>655
delete できない。いわゆるメモリリークってやつ。

その行番号、 BASIC みたいだな。
657職業プログラマ(自称):2005/10/30(日) 11:24:21
>648

B自動実行できるテスト と リファクタリング で後の事は気にするまでもない
だな

ちなみにそんな切羽詰まった状況なら確実にA’←Aでもテストを実行するコードは付けとく
きれいだが動かないプログラムは意味がない。
汚くても動くプログラムとテストコードがあれば、後になって救える。
658デフォルトの名無しさん:2005/10/30(日) 11:39:35
>>647
感謝です。
動きました。でも自分で理解できてないのが悔しい・・・
659デフォルトの名無しさん:2005/10/30(日) 11:48:29
>>658
単純な話で、任意のポインタからvoid *への変換は許可されているけど、逆は不可(キャストが必要)
>>646のように書いてしまうと

(void *(*)(MyClass *))を(void *)にキャスト // ここはOK
(void *)を(void *(*)(void *))に変換しようとする // ここでエラー

となっているだけ。
660デフォルトの名無しさん:2005/10/30(日) 12:26:56
>>659
う〜ん、少なくとも俺には十分難しいです。
引数のオブジェクトにアクセスできん・・・
661デフォルトの名無しさん:2005/10/30(日) 14:32:10
>660
状況いまいちつかめないけど、
C++規則として、
・派生クラスから基本クラスへはキャスト無しでいけるが、逆はキャストしないと不可。(Javaだと逆になる)
・参照の変数に代入する時の右辺値は変数で無ければならない、またこれは、関数の引数が参照の時も同じで、
参照の引数を採る関数には、その引数に変数を介さなければ値を渡せない。
というところで。
662デフォルトの名無しさん:2005/10/30(日) 14:35:49
失礼、Javaでも同じでした。
663デフォルトの名無しさん:2005/10/30(日) 16:38:35
void swap(int *a,int *b)
{
int t;
t = *a;
*a = *b;
*b = t;
}

int GCD(int *a, int *b)
{
if(*b>*a) swap(a,b);
while(*b != 0){
*a = *a % *b;
swap(a,b);
}
return(*a);
}

int LCM(int a, int b)
{
if( a==0 || b==0)
return(0);

return((a/GCD(a,b))*b);

}

上記のような関数で最大公約数と最小公倍数出そうとしたのですが
どうしても最小公倍数が0になってしまいます。
どこが間違っているのかご教授ください
664663:2005/10/30(日) 16:40:14
GCD(a,b)じゃなくGCD(&a,&b)です。
それでもできない・・・うーん
665デフォルトの名無しさん:2005/10/30(日) 16:40:58
>>663
GCDにLCMのaとbのポインタを渡してるから、
LCMから戻ったときにはaとbの値が変わってる。
具体的には、bが0になってる。
666デフォルトの名無しさん:2005/10/30(日) 16:48:19
>>663
ポインタを受け取るようなGCD()が蛸。
667デフォルトの名無しさん:2005/10/30(日) 16:49:13
>>665
まじ素早いレスありがとう
ホントですね。GCDでbが0になっちゃってる。
ポインタ使わずにGCD作っとこ。
ありがとうございました
668デフォルトの名無しさん:2005/10/30(日) 16:50:47
>>666
バグを探せ、という課題だったのですが
GCDがポインタ扱ってるのが問題だったのですね。
GCDはちゃんと出るからずっとLCMに問題があるかとおもって必死に試行してました(汗
669デフォルトの名無しさん:2005/10/30(日) 17:51:59
宿題かよ
670デフォルトの名無しさん:2005/10/31(月) 03:51:29
質問です。XP、.NET です。

STL の list のソートを使っています。

 list<CHoge*> hogeList;

のように、ポインタのリストを作成すると、

 hogeList.sort();

としても、オブジェクトのアドレス順にソートされてしまい、
当然、CHoge クラスに "<" 演算子を定義しても意味がありません。

好みの順にソートさせるには、"<" 演算子ではなく、ソート用の関数を作成して渡すか、
list<CHoge> hogeList; とできるよう設計しなおすしかないでしょうか。

よろしくお願いします。
671デフォルトの名無しさん:2005/10/31(月) 04:34:39
その通りです
672670:2005/10/31(月) 04:39:19
>>671
素早い回答ありがとうございました。
673デフォルトの名無しさん:2005/10/31(月) 10:49:29
VC7.1で、

//foo.h
template <typename T>
class foo
{
public :
  void bar(void) ;
} ;

//foo.cpp
#include "hoge.h"
template<typename T>
 void foo<T>::bar(void) {}

//main.cpp
#include "hoge.h"
int main()
{
  foo<int> hoge ;
  hoge.bar() ;
}

LNK2019: 未解決の外部シンボル "public: void __thiscall foo<int>::bar(void)" (?bar@?$foo@H@@QAEXXZ) が関数 _main で参照されました。

なぜかリンクできないのですが、どうすればいいのでしょうか?
674デフォルトの名無しさん:2005/10/31(月) 10:55:50
>>673
テンプレート関数やクラステンプレートのメンバ関数は、ヘッダファイルに定義を書くか、
exportキーワードを付けてcppファイルに定義を書く必要がある。

ただし、VC7.1はexportキーワードに対応していない。
675デフォルトの名無しさん:2005/10/31(月) 10:57:18
>>673
テンプレートクラスはコンパイル時に型ごとに別の実体を生成します。実装はヘッダに書きましょう。
676673:2005/10/31(月) 11:04:36
exportキーワードってそういう風に使うものだったんですか。
存在だけは知っていたんですが。


今、exportをサポートしているコンパイラってあるのでしょうか?
677デフォルトの名無しさん:2005/10/31(月) 11:21:00
678デフォルトの名無しさん:2005/10/31(月) 12:39:39
VC6使えば?
679デフォルトの名無しさん:2005/10/31(月) 16:07:02
質問です。
CやC++で、一度も使っていないローカル変数は
「一度も使われていません」と警告がでるわけですが、
「この変数は使って無くても、使われたことにする」ための記述方があったかと思います。

int a;
a = 0;
など代入をするのではなく、またpragmaなどで警告を非表示するわけでもありません。
use a;
こんな感じ?だったかと思うのですが…。
680デフォルトの名無しさん:2005/10/31(月) 16:20:55
その変数に対して積極的な最適化をしない、という意味の、

volatile int a ;

のこと?
681デフォルトの名無しさん:2005/10/31(月) 16:25:27
>>680
volatileは関係ないかと
682デフォルトの名無しさん:2005/10/31(月) 16:34:10
>>679
単に a; とだけすればいい。
SDKにそんなマクロがあったような気がするが、名前忘れた。
683デフォルトの名無しさん:2005/10/31(月) 16:42:48
>>682
それだと参照されね?
実行速度もったいない。
684デフォルトの名無しさん:2005/10/31(月) 16:43:30
最適化で取り除かれるかと
685デフォルトの名無しさん:2005/10/31(月) 16:47:22
>>679
Windowsならこのあたりですね。
・UNREFERENCED_PARAMETER
・DBG_UNREFERENCED_PARAMETER
・DBG_UNREFERENCED_LOCAL_VARIABLE

下2個はヘッダを見てはじめて存在を知った。
686デフォルトの名無しさん:2005/10/31(月) 16:49:46
>>682
最適化はともかく、それじゃ普通別の警告になる罠。
687デフォルトの名無しさん:2005/10/31(月) 16:58:50
皆様ありがとうございます。
意外とメジャーじゃないもんですね。Google使っても全然ひっかからなかったのでそうかなとは思ってたのですが…。

>>685
マクロなんですね。C/C++の標準機能だと思ってました。
688デフォルトの名無しさん:2005/10/31(月) 17:05:12
つーか、使われてねぇんだからコメントアウトでもしときゃいいだろ?
なんでわざわざ使われても無い変数を残しときたがるんだか・・・
689デフォルトの名無しさん:2005/10/31(月) 17:13:05
実行時に読み込むDLLや、別のプロセスが書き換えるのかもしれないぞ。
690デフォルトの名無しさん:2005/10/31(月) 17:14:30
>>688
システム側からコールされるお定まり型の関数が、使わない(使い道あるんでしょうけど)変数まで引数にしてるんです。
691デフォルトの名無しさん:2005/10/31(月) 17:32:32
そりゃしかたないな
692デフォルトの名無しさん:2005/10/31(月) 17:33:24
引数の変数はその時点で使ってるから使ってないなんて警告されないぞ?
693デフォルトの名無しさん:2005/10/31(月) 17:35:51
>>692
コールバックの中身を書いてるんじゃないの?
694デフォルトの名無しさん:2005/10/31(月) 17:42:10
WinMainの二番目の引数みたいなものだろ。
もちろん、実際には使うのかもしれないが。
すくなくともコード中で使うことはありえない。
695デフォルトの名無しさん:2005/10/31(月) 17:43:26
だから使わないからって引数が警告になること無いって
696デフォルトの名無しさん:2005/10/31(月) 17:44:54
exeファイルを実行して、デバッグしてみると DLL initialization Failed
という出力が出てくるのですが、これはどういったものなのでしょうか?
exeファイルを実行しても何も起こらないのは、これが原因だと思う
のですが。
697デフォルトの名無しさん:2005/10/31(月) 17:46:27
必要なDLLが読み込める場所に無いんじゃね?
698デフォルトの名無しさん:2005/10/31(月) 17:47:13
>>695
多分コンパイラによるんだと思いますよ。
WindowsのVS6.0のコンパイラは出さないみたいですね。
699デフォルトの名無しさん:2005/10/31(月) 17:49:36
>>695
C++では引数に名前を与えないことができるから、
親切なコンパイラは警告してくる。
700デフォルトの名無しさん:2005/10/31(月) 17:53:20
あの、生きる意味がわからないヒキコモリなのですが、どうすれば良いでしょう?
高卒で国立医療系に入ったのは良いけど中退しました。特技は特にないです。
漢検と英検が学生の頃に両方とも二級があります。後、車くらい。
それと友達に誘われて自分は興味は無いけど色彩二級があります。
これが自分の持ってる全部の資格です。学生ならまだしも、
社会人になっては意味のない資格しか無いので路頭に迷っていますorz
プログラムは5年前から興味を持っていて、本も何冊か買っていますが、
実際には組んだことはありません。Eclipseも入れたけど2のままです。
誰か助けて、鬱が止まらないです。どうしたら良いんだろう。
701デフォルトの名無しさん:2005/10/31(月) 17:58:35
5年も興味があるのに組まないってことは、興味が無いんでしょ。
何か別のことはじめた方が良いと思われ。

ちなみに、本は買うだけじゃ、ソフトは入れるだけじゃ何の役にも立たない。
702デフォルトの名無しさん:2005/10/31(月) 19:47:27
コピペにマジレスすんなよ
703デフォルトの名無しさん:2005/10/31(月) 20:10:27
マジレスもコピ(ry
704デフォルトの名無しさん:2005/10/31(月) 21:35:27
------------------------------------------------
ここまでコピペ
705デフォルトの名無しさん:2005/10/31(月) 22:00:10
>>690
たとえばその関数がint hoge(int foo, int bar) {}だとして、
barを使わないのならint hoge(int foo, int) {}と書けば、
引数を受け取るけど使わないと言う意思表示になりコンパイラも警告しなくなる。

>>694
というわけでこうすればいい。
int WINAPI WinMain(HINSTANCE hinst, HINSTANCE, PSTR pszCmdLine, int nCmdShow) {}
706デフォルトの名無しさん:2005/10/31(月) 22:08:31
ものすごい初心者なんですけど
PSTR型はいつでもLPSTR型と同一なの?
707デフォルトの名無しさん:2005/10/31(月) 22:18:44
>>706
昔のWin16では違ったのだが、今のWin32/64ではそのとおりで全く同じ。
708デフォルトの名無しさん:2005/10/31(月) 22:32:32
>>707
サンクス
709デフォルトの名無しさん:2005/10/31(月) 23:31:49
Effective C++ってそんなにいい本なのですか?
持ってないともぐりと言われそうで、買った方がいいのかなぁ。
710デフォルトの名無しさん:2005/10/31(月) 23:48:39
>>709
基本的に、C++を使うならば知っておかなければいけない内容が書いてある。
もちろんEffectiveC++で全てを網羅してあるわけじゃない。
ネットで同じ内容をかき集めることは可能だけど、
俺個人としては紙媒体でまとまった情報を持っていた方がいいと思うので
目次を立ち読みして知らない・分からない内容があったら買ってもいいと思う。
711デフォルトの名無しさん:2005/11/01(火) 01:04:02
>>709
参考になるかは判らんが、C上級者がC++を始めて半年間あれこれ試行錯誤して判ったことが、
全てEffectiveC++に書かれていた。
712デフォルトの名無しさん:2005/11/01(火) 01:16:36
>>711
何か感心する様な一例きぼん。
713デフォルトの名無しさん:2005/11/01(火) 02:19:13
>>679
一般的には (void)a; じゃないのか?
親切なコンパイラなら警告も出なくなるし
最適化されてコードも生成されないはず。
714デフォルトの名無しさん:2005/11/01(火) 05:03:59
while (TRUE) {
GetMessage(&msg , NULL , 0 , 0);
if (msg.message == WM_LBUTTONUP) break;
DispatchMessage(&msg);
}
これってDispatchMessage(&msg);が意味なくないですか?
GetMessageでメッセージを取得してDispatchMessageで送出してからbreakする方がいいと思うのですが。
715デフォルトの名無しさん:2005/11/01(火) 05:57:42
つーか、なにがしたいのか分からん。
716デフォルトの名無しさん:2005/11/01(火) 06:31:32
普通はウインドウプロシージャでやるべきことだ。
そもそもその方法だと、マウスクリックが発生せずにウインドウが閉じられた場合、どうするつもりだ?
717デフォルトの名無しさん:2005/11/01(火) 07:20:17
GetMessageの位置とか、足りて無いAPIとか、色々とバカなループだな
718デフォルトの名無しさん:2005/11/01(火) 16:25:16
>>698
VC++6.0のデフォルトの警告レベルが低すぎるので警告が出ないだけだったかと。
719デフォルトの名無しさん:2005/11/01(火) 16:34:39
質問させてくれ。
例えば
CHoge p = new CHoge();
p->hoge();
とすれば
・メモリーが割り当てられ
・コンストラクタが呼ばれ
・その後hoge()が呼ばれる

で、
CHoge p = malloc(sizeof(CHoge));
p->hoge();
とした場合どうなるのだろうか?
コンストラクタが呼ばれないのは知っているのだが、hogeは(標準仕様上)正しく呼ばれることは保証されるのだろうか?
720デフォルトの名無しさん:2005/11/01(火) 16:40:05
>>719
hogeがvirtualだったりすると、仮想関数テーブルが初期化されてないから落ちるな。
そうでなくても、コンストラクタが呼ばれてないオブジェクトに対して操作するのは鼻から悪魔が(ry
つーか CHoge p じゃなくて CHoge* p だろうと。
721デフォルトの名無しさん:2005/11/01(火) 16:44:41
>>720
*は書き忘れです。ごめん(;´Д`)

やっぱりキモいかー…。うし。初期化周り書き直すよ。ありがとう!
722デフォルトの名無しさん:2005/11/01(火) 16:45:14
そもそもmallocすること自体鼻から悪魔が(ry
723デフォルトの名無しさん:2005/11/01(火) 16:45:18
やってんのかい!
724デフォルトの名無しさん:2005/11/01(火) 16:46:43
せめてoperator newで
725デフォルトの名無しさん:2005/11/01(火) 17:11:16
operator new の中に自前メモリープールを作ってるのよ。
で、そのメモリープールを管理するクラスはMALLOCで確保しなきゃいけないんで(´・ω・`)
726デフォルトの名無しさん:2005/11/01(火) 17:13:53
CHoge::operator new、CHoge::operator deleteを作ればいい話じゃね。
727デフォルトの名無しさん:2005/11/01(火) 17:35:43
728デフォルトの名無しさん:2005/11/01(火) 17:38:10
>>727
mallocで確保すること自体は大丈夫だよ。
その確保した領域に配置newでオブジェクトを構築すれば無問題。
729デフォルトの名無しさん:2005/11/01(火) 17:54:27
>>726
それだ!!なんで気づかなかったんだろう。・゚・(ノД`)・゚・。
ありがとう!!!
730デフォルトの名無しさん:2005/11/01(火) 17:55:54
>>727
環境のせいでmallocしかないんYO!
731デフォルトの名無しさん:2005/11/01(火) 18:01:18
いや、すまん、悪かった、許せ
732デフォルトの名無しさん:2005/11/02(水) 09:04:54
Accelerated C++を読んでいるのですが、119ページのソースで
vector<hoge> hage()
{
vector<hoge> hogehoge;
return hogehoge;
}
このように関数内で宣言したオブジェクトを返していますが
この場合はint型のようにコピーが返されるのでしょうか?
733デフォルトの名無しさん:2005/11/02(水) 09:36:12
vectorの仕様を勉強してください
734デフォルトの名無しさん:2005/11/02(水) 11:13:47
>>732
うん
735デフォルトの名無しさん:2005/11/02(水) 13:39:23
ある構造のバッファを使い構造体のメンバを設定出来る様にする場合
memsetなどを使うよりoperator=を構造体に作った方が良いらしいのですが
具体的にはどうすればいいのか少し迷っています。
operator=(const Buffer* buf)
を構造体内で実装しバッファをそれぞれのメンバの型に変換し代入すればよいのでしょうか?
736デフォルトの名無しさん:2005/11/02(水) 13:46:43
>>735
placement newは?
737デフォルトの名無しさん:2005/11/02(水) 14:23:00
>>736
なるほど、これでコピーすればよいのですね。
ありがとうござ
738デフォルトの名無しさん:2005/11/02(水) 14:24:19
>>737
いや、コピーじゃないんだけど・・・・
739デフォルトの名無しさん:2005/11/02(水) 20:32:10
>>738
ちがうんですか?よくわからんとです・・・。
740デフォルトの名無しさん:2005/11/02(水) 20:44:22
ヒロシです・・
741デフォルトの名無しさん:2005/11/02(水) 21:18:59
>>735 何が不満なのかわからない。
742デフォルトの名無しさん:2005/11/02(水) 21:52:55
つ[operator=(const Buffer & buf)]
743デフォルトの名無しさん:2005/11/03(木) 02:50:16
>>741
自分でもよくわからなくなってきました。
とりあえず、>>736>>742を使って自分で実験しまくってみます。
ありがとうございました。
744デフォルトの名無しさん:2005/11/03(木) 17:18:32
質問です。XP、.NET です。
STL の deque から、ある条件を満たす要素を全て削除する良い方法はないでしょうか。

// イテレータを使った場合

deque<CHoge> que;
deque<CHoge>::iterator itr;

for(itr=que.begin(); itr!=que.end(); i++) {
 if ( /* 好きな条件 */ )
  que.erase(i);
}

こうすると、erase した時点で i の指すものが不定になり、
i++ が上手く動作しません。

// operator[]() を使った場合

deque<CHoge> que;

for(int i=0; i<que.size(); i++) {
 if ( /* 好きな条件 */ ) {
  deque<CHoge>::iterator itr == ( /* i 番目の要素のイテレータ */ )
  que.erase(i); //
 }
}

operator[] を使ってループを整数でまわそうにも、
n 番目の要素のイテレータを返す操作が見つからず、うまくいきません。

よろしくお願いします。
745デフォルトの名無しさん:2005/11/03(木) 17:23:13
>>744
n番目の要素のイテレータは
que.begin() + n

std::removeを使うという手もある。
746デフォルトの名無しさん:2005/11/03(木) 17:29:24
>>744
まだSTLやってないからdequeがどんなのか分かってないが
読み進めてるAccelerateC++に乗ってた奴から

remove_if(que.begin(), que.end(), hoge());
hoge()は好きな条件の時にTrueを返す
747デフォルトの名無しさん:2005/11/03(木) 17:34:48
>>746
それでは、削除しないものを前に集めるだけで、消去までされない。
que.erase(std::remove_if(que.begin(), que.end(), hoge()), que.end());
748デフォルトの名無しさん:2005/11/03(木) 17:38:25
>>747
すまない、後でiter以降をごっそり消すってのを書き忘れてた・・・

所でAcceleratedC++読んでて思ったが、C++って無茶苦茶楽しいな
Cでちまちまやってたのがアホらしい_| ̄|○
749744:2005/11/03(木) 18:05:19
>>745-747
++ ができてなぜ +n が思いつかなかったか謎ですorz
remove については詳細を調べてみます。
ありがとうございました。
750デフォルトの名無しさん:2005/11/03(木) 22:18:39
C++に関する質問です。環境はvisual C++6.0 WindowsXPです。

int *num = new int[0];
と書くと0個の配列を確保したことになるんでしょうか?
そして
delete[] num;
と書けば開放できるんでしょうか?

751デフォルトの名無しさん:2005/11/03(木) 22:20:50
>>750 そうだよ。
752750:2005/11/03(木) 22:24:33
>>751
即レスあざーっす!
753デフォルトの名無しさん:2005/11/03(木) 22:30:45
>>750コンパイル通ったんだけど(VC7.1)、
staticな要素数0の配列を禁止しといて
動的な要素数0の配列を禁止しない理由
って何かあるんですか?
754デフォルトの名無しさん:2005/11/03(木) 22:36:43
>>753
malloc(0)もできるからnew T[0]もできるようにしたというところだと思う。
755デフォルトの名無しさん:2005/11/03(木) 22:43:01
malloc(0)というのもなんか不自然だな…
使い道あるのだろうか。それともこれを許すと
何かがうまくいくのかな?
756デフォルトの名無しさん:2005/11/03(木) 23:03:16
>>755
つ[realloc()]
757デフォルトの名無しさん:2005/11/03(木) 23:28:53
ただしreallocの最初の引数はヌルポインタでも良いのだけどな。
758デフォルトの名無しさん:2005/11/04(金) 14:00:00
>>749
erase() が返す iterator の意味を調べると吉。

759デフォルトの名無しさん:2005/11/04(金) 21:46:42
関数の戻り値とコンストラクタについて質問です。
以下のようなコードを実行したところ
class A
{
int m_n;
public:
A::A(int n) :m_n(n){ cout << "コンストラクタ" << endl; }
A::A(const A& a):m_n(a.m_n){ cout << "コピーコンストラクタ" << endl; }
A::~A() { cout << "デストラクタ"<< endl; }
};
A func()
{
return A(10);
}
int main()
{
A a(func());
return 0;
}
Borland C++ では
コンストラクタ
コピーコンストラクタ
デストラクタ
デストラクタ

Visual C++ 6.0では
コンストラクタ
デストラクタ
となりました。なぜ、違った結果になるのかわかりません。
どちらも最適化はOFFにしてあります。どなたか助けてください。

760デフォルトの名無しさん:2005/11/04(金) 21:55:32
>>759
どこからどこまでを最適化というかは処理系依存。
一般に最適化をオフにしても定数部分の処理は勝手にやってしまう場合が多い。
func()が定数を引数に取るクラスを返すと考えるか、
返すクラスを定数と考えるかって所で変わってるんじゃないかな?
761デフォルトの名無しさん:2005/11/04(金) 22:00:17
>>759
VCのように一時オブジェクトの作成をしなくても良いと規格で定められている。
762デフォルトの名無しさん:2005/11/04(金) 22:00:55
なんでclass A{}宣言内にA::AとかA::~Aとか書いてんねん・・・
763デフォルトの名無しさん:2005/11/04(金) 22:04:02
>>760
>>761
なるほど。コンパイラ側で自動でやってくれる処理だったんですね。
ありがとうございました。


764デフォルトの名無しさん:2005/11/04(金) 22:24:51
RVO(Return Value Optimization)と言うやつだな
765デフォルトの名無しさん:2005/11/04(金) 22:39:21
VC6でもRVO効くんだな
766デフォルトの名無しさん:2005/11/05(土) 00:46:12
とっても初歩的な話かも知れなくて申し訳ないのですが、
double型などの浮動小数で、
指数だけをぐりぐり動かす事ってできるんですか?
例えば、
3.14159265e-010があったとして、
それを3.14159265e000とか、3.14159265e008とかに変換したいんです。
言って位置で変換するなら、*=1e10とか、1e18とかすれば良さげなんですけど、
持ってくる数値によって、動かす指数の幅を変えたいとき、
1eXとかにできないものですから…
767デフォルトの名無しさん:2005/11/05(土) 02:07:16
>>766
環境非依存の内容を要求しているのならば、* pow(10, x)とするしか
ないんじゃないかな。そもそも内部では仮数も指数も2進数で保持して
いるのが普通なんだし、正確には計算できないでしょ。今のx86のCPU
なら指数部(2進)と仮数部(2進)を分離する命令(FXTRACT)があるけど。
768デフォルトの名無しさん:2005/11/05(土) 09:05:20
>>766
標準関数だけならfrexpとlrexpがある。
769デフォルトの名無しさん:2005/11/05(土) 13:28:03
あるソケットが既に接続済みか調べる関数みたいなのありますか?
winsock2です
770デフォルトの名無しさん:2005/11/05(土) 14:03:28
質問です。XP、.NET です。

// Hoge.h
class CHoge
{
public:
 enum EHOGE { HOGE };
 EHOGE func();
};

// Hoge.cpp
EHOGE CHoge::func()
{
 return HOGE;
}

上記のようなコードのコンパイルが通りません。

Hoge.cpp(12): error C2143: 構文エラー : ';' が 'CHoge::func' の前にありません。
Hoge.cpp(13): error C2371: 'CHoge::func' : 再定義されています。異なる基本型です。
Hoge.h(10) : 'CHoge::func' の宣言を確認してください。
Hoge.cpp(12): error C2501: 'EHOGE' : 識別名を宣言するのに、型が指定されていません。
Hoge.cpp(13): error C2556: 'int CHoge::func(void)' : オーバーロード関数の戻り値は異なっていますが、引数リストは同一です。

列挙型は int 値ということで、戻り値を int 型にすれば確かにコンパイルは通りますが、どうも釈然としません。
列挙型を明示的に戻り値とすることはできないのでしょうか?
よろしくお願いします。
771デフォルトの名無しさん:2005/11/05(土) 14:08:10
772デフォルトの名無しさん:2005/11/05(土) 14:08:16
>>770
CHoge::EHOGE CHoge::func();
でないけ
773770:2005/11/05(土) 14:10:24
>>772
俺って・・・orz

ありがとうございました。
774デフォルトの名無しさん:2005/11/05(土) 17:36:18
>>771
英語わかんね(^−^;)
775デフォルトの名無しさん:2005/11/05(土) 17:42:43
読む努力すらせんのか
776デフォルトの名無しさん:2005/11/05(土) 17:44:02
>>775
わかんないもん(^o^;)
777デフォルトの名無しさん:2005/11/05(土) 17:47:18
じゃ、わからないままっつー事で
778デフォルトの名無しさん:2005/11/05(土) 17:56:11
努力する気が無いなら失せろ
779デフォルトの名無しさん:2005/11/05(土) 18:08:26
女子高生なので教えてください(^o^;)
780デフォルトの名無しさん:2005/11/05(土) 18:14:40
女子高生ならなおさら失せろ。
中学生以下か、女子大生なら歓迎だが。
781デフォルトの名無しさん:2005/11/05(土) 18:20:47
779の妹の絵美(12歳)でーす
馬鹿姉のためにお願いしまーす☆
782デフォルトの名無しさん:2005/11/05(土) 18:25:27
もういいです。すいませんでした
783デフォルトの名無しさん:2005/11/05(土) 18:29:37
女子高生なんてウザイだけだし
784デフォルトの名無しさん:2005/11/05(土) 18:32:16
女子小学生なら俺が手取り足取り教えt(ry
785デフォルトの名無しさん:2005/11/05(土) 19:09:04
小学生なら個人授業したいけどな♪
786デフォルトの名無しさん:2005/11/06(日) 00:22:59
>>785
今日、銭湯行ったら女子小学生(幼女)が3人ぐらいいた。
787デフォルトの名無しさん:2005/11/06(日) 00:27:11
>>786
ちゃんとwinsock2教えてきたか?
788デフォルトの名無しさん:2005/11/06(日) 00:34:58
>>787
一番下の子がトイレにいくのが面倒だったらしく放尿して、親父に軽くしかられてたからそれどころじゃなかったw
789デフォルトの名無しさん:2005/11/06(日) 01:11:53
私も昔銭湯で女の子が放尿して、
その子の父に「ばかやろう、汚いだろうが」叱られているのを見たことがあるが、
既にある程度ロリが開花していた私は、
「何もそこまで起こらなくても、むしろ私が飲んであげたい」とか思ったものだ。
うは、変態www テラヤバスwww
790デフォルトの名無しさん:2005/11/06(日) 02:36:47
>>789
それは正常wwwwっうぇww
791デフォルトの名無しさん:2005/11/06(日) 02:38:44
どこまで行けば異常なのか>>790に聞いてみたい
792デフォルトの名無しさん:2005/11/06(日) 03:17:15
おしっこ飲むのはいいがウンチなめるのはやっぱ異常だろ
お風呂上りの肛門なめるのは問題ないが
793デフォルトの名無しさん:2005/11/06(日) 06:04:43
( ・ω・)・・・
794デフォルトの名無しさん:2005/11/06(日) 10:49:41
( ・ω・)・・・・
795デフォルトの名無しさん:2005/11/06(日) 11:03:41
( ・ω・)・・・・・
796デフォルトの名無しさん:2005/11/06(日) 11:07:30
( ・ω・)・・・・
797デフォルトの名無しさん:2005/11/06(日) 11:10:46
( ・ω・)・・・
798デフォルトの名無しさん:2005/11/06(日) 11:12:30
( ・ω・)・・
799デフォルトの名無しさん:2005/11/06(日) 11:16:58
( ・ω・)・
800デフォルトの名無しさん:2005/11/06(日) 11:20:38
( ・ω・)
801デフォルトの名無しさん:2005/11/06(日) 11:24:13
( ・ω・
802デフォルトの名無しさん:2005/11/06(日) 11:26:15
( ・ω
803デフォルトの名無しさん:2005/11/06(日) 11:26:54
( ・
804デフォルトの名無しさん:2005/11/06(日) 11:31:10
( ・ω・)・・・・・
阻止。
805デフォルトの名無しさん:2005/11/06(日) 11:36:21
そんな殺生な
806デフォルトの名無しさん:2005/11/06(日) 11:39:07
(
無視
807デフォルトの名無しさん:2005/11/06(日) 11:49:15

808デフォルトの名無しさん:2005/11/06(日) 11:53:23
(´ω`*)モキュキュキュ
809デフォルトの名無しさん:2005/11/06(日) 12:47:33
自分が正常なのか異常なのかここにいるとわからなくなる(笑
ちなみに私の正常と異常のラインは「幼女のおしりを舐められるか否か」です。
舐められる人は異常、舐められずおしっこを飲むくらいまでの人は正常。
私はおしっこを飲むくらいまではできると思いますけど、おしりはどう足掻いてもダメですね。
810デフォルトの名無しさん:2005/11/06(日) 12:51:31
>>809
たまってる?
811デフォルトの名無しさん:2005/11/06(日) 13:20:13
何この気持ち悪い流れ
812デフォルトの名無しさん:2005/11/06(日) 14:06:46
>>811みたいなことを言う方が気持ち悪い。
嫌なら見なければ良いだけ。
813デフォルトの名無しさん:2005/11/06(日) 14:17:42
と、いうか板違い
814デフォルトの名無しさん:2005/11/06(日) 14:21:05
うわあ出た「嫌なら見るな」理論!
公共の場を異常な言動で占有した挙句、文句言われたら「見るな」とチョーゴーマン理論展開。
つーか見たから嫌なんだっつーの!順序が逆だっつーの!
何かしら無理しないと見れない場所ならともかく、誰でも見れる場所でそんな屁理屈通用しないっての。
こういう輩って国立公園でアナルオナニーした挙句、とっ捕まっても同じ台詞言えるんでしょうかね?
815デフォルトの名無しさん:2005/11/06(日) 14:29:25
コピペ乙
816デフォルトの名無しさん:2005/11/06(日) 16:31:48
>>812
C/C++のスレでロリコン共がスカトロ談義なんぞしてるなんてことが事前に予想できれば最初から見に来ねえよ
マジキモい
817デフォルトの名無しさん:2005/11/06(日) 16:57:47
↓↓↓気を取り直して質問どうぞ↓↓↓
818デフォルトの名無しさん:2005/11/06(日) 17:00:06
ロリータ指向プログラミングやってる人は居ますか?
819デフォルトの名無しさん:2005/11/06(日) 17:07:34
>>818
鏡でも見てろ
820デフォルトの名無しさん:2005/11/07(月) 17:58:58
C言語なんですけど変数の宣言の時に変数は確保されるのですか
例えば変数を宣言するだけでそれを全く使用しないプログラムでも、その変数は確保されるのですか
821デフォルトの名無しさん:2005/11/07(月) 18:02:15
>>820
確保というのはスタック領域に確保するという意味かな?
だとしたら処理系による。
最適化の具合にもよる。
822デフォルトの名無しさん:2005/11/07(月) 18:03:36
一切使用されていないと、コンパイラの最適化で取り除かれるな
823デフォルトの名無しさん:2005/11/07(月) 18:06:25
じゃあ、ウィンドウプロシージャでstatic宣言なしに変数の宣言をすると、
毎回毎回(その変数を全く使用しない場合でも)確保されて、returnに達すると開放されるのですか?
かなり無駄な感じがするのですが
824デフォルトの名無しさん:2005/11/07(月) 18:07:44
釣り(・A・)イクナイ!
825デフォルトの名無しさん:2005/11/07(月) 18:08:13
ウィンドウプロシージャに限らず、staticの付いてないものはそうだよ
826デフォルトの名無しさん:2005/11/07(月) 18:09:26
使わない変数なら宣言しなければいいのに。

>>823
一般的に言って、スタック上のメモリ確保はものすごく速い。
827デフォルトの名無しさん:2005/11/07(月) 18:11:21
>>824
(^^)
>>825,826
わかった
828デフォルトの名無しさん:2005/11/07(月) 18:17:04
例えばint型変数の宣言のように、初期値を省略すると0を当てられるもの。
これは宣言時にメモリ上に実体ができている。
ポインタ変数の宣言は、逆にメモリ上に実体ができていず、名前が作られただけ。
更に、staticの場合は、プログラムの最初にメモリが確保される。
すなはちプログラム開始>static変数メモリ確保(場合によっては初期化も)>mainの開始
829デフォルトの名無しさん:2005/11/07(月) 18:28:26
>>828
ダウト
830デフォルトの名無しさん:2005/11/07(月) 18:30:33
ポインタ変数の宣言は、逆にメモリ上に実体ができていず、名前が作られただけ。
というのは、もっと明確に言うと、名前はあるけど、値を入れるメモリアドレス無し(入れ物なし、メモリ未確保)。
831デフォルトの名無しさん:2005/11/07(月) 18:34:16
>>830
超ダウト
832デフォルトの名無しさん:2005/11/07(月) 18:40:40
>>828->>831
めちゃくちゃおもしれぇなこのスレ。
833デフォルトの名無しさん:2005/11/07(月) 18:47:39
この辺がダウト。
>int型変数の宣言のように、初期値を省略すると0を当てられるもの
>宣言時にメモリ上に実体ができている
>プログラム開始>static変数メモリ確保(場合によっては初期化も)
>ポインタ変数の宣言は、逆にメモリ上に実体ができていず、名前が作られただけ
>名前はある
>入れ物なし
>メモリ未確保
834デフォルトの名無しさん:2005/11/07(月) 18:48:30
事故解決しました。
835デフォルトの名無しさん:2005/11/07(月) 19:35:51
そうか、大人しく家庭裁判所行ってこい
836デフォルトの名無しさん:2005/11/07(月) 19:54:49
:仕様書無しさん :2005/11/07(月) 19:47:39

http://homepage1.nifty.com/rucio/main/VBdotNet/AboutVB/WhatsVBdotNet.htm

Visual Basic.NETではどのようなアプリケーションが作れるのか
 

Visual Basic.NETではWindows上、Web上、モバイル上で動作するさまざまな種類のアプリケーションが作成できます。

ユーティリティやちょっとしたツール、データベースを操作するアプリケーション、ゲームなどアイディアしだいでさまざまなものが作れます。DirectXと連動して3Dやポリゴンを利用したゲームを作ることもできます。

ただし、プレイステーションなどの家庭用ゲーム機のゲームのほとんどはC++という言語で開発されていることに注意してください。このような本格的なゲームプログラマを目指している方はC++を勉強してください。

けれどVBに熟達すればC++にも通じるようになります。(とはいえC++が目的ならはじめからC++を勉強した方が早いです。)
837デフォルトの名無しさん:2005/11/07(月) 20:48:17
>>828>>830
ポインタ変数だって変数であることに違いはないのだから、ポインタ変数自体の実体がある。
838デフォルトの名無しさん:2005/11/07(月) 22:02:22
>>837
ゴミが入っているから、そこに値とか格納すると危なかったような。
下手するとフリーズやシステムを壊しかねない。
839デフォルトの名無しさん:2005/11/07(月) 22:05:41
参照先のアドレスは値とは言わないの?
840デフォルトの名無しさん:2005/11/07(月) 22:08:14
>>839
アドレスなんだから値じゃないの?
841デフォルトの名無しさん:2005/11/07(月) 22:11:27
鰻には山椒。
842デフォルトの名無しさん:2005/11/07(月) 22:13:16
ポインタ変数はアドレスを格納する変数
当然、ポインタ変数を宣言(正しくは定義)したときに
そのアドレスを格納する領域がメモリ上に確保される

ただし、宣言(正しくは定義)したポインタ変数に
適切な値(もちろんアドレスだ)を代入しない限り
そのポインタを逆参照することはできない
843デフォルトの名無しさん:2005/11/07(月) 22:17:41
>>838
それが「適切なアドレスが格納されてないポインタ変数を逆参照しようとした」ってこと
844デフォルトの名無しさん:2005/11/07(月) 22:20:04
基本的に対応する必要がないのは分かっているんですが、
_gcvt関数のようなもので、LPTSTR型にも対応できるようなものってあるんですかね?

そもそもLPTSTRとchar* で混ぜて使ってかまわないんでしょうか。
(そこら辺がどうもはっきりしなくて。Unicodeとかwchar_tとか)
845デフォルトの名無しさん:2005/11/07(月) 22:21:23
LPTSTRなら、TCHAR[]使えばいいとおもうが。
846デフォルトの名無しさん:2005/11/07(月) 22:22:53
>>844
TCHARは_UNICODEの指定があればwcharになり、なければcharになる
847デフォルトの名無しさん:2005/11/07(月) 22:35:21
>>844
UNICODEが定義されている/されていないに関わらず動作するコードにしたい
ならば、当然変換すべき。
そのための変換マクロその他がVC++には多数用意されてる。

ATLのCT2A他を使うなり、_bstr_tに頼るなり、まあ方法は色々あるが
好きにしる。
848デフォルトの名無しさん:2005/11/07(月) 22:40:40
WCHAR*とCHAR*の相互変換をするためだけにatlbase.hをインクルードするのって微妙かな?
849デフォルトの名無しさん:2005/11/07(月) 23:24:31
ポインタの説明をするのに、アドレスを持ち出すのは初心者の証拠
850デフォルトの名無しさん:2005/11/07(月) 23:25:14
上級者らしい説明期待age
851デフォルトの名無しさん:2005/11/07(月) 23:26:12
>>849に期待
852デフォルトの名無しさん:2005/11/07(月) 23:26:46
C++ の記述で、 変数の後に&があるケースは
どういう意味で解釈すればよいでしょうか?
アドレス? 変数の実体?
例:func(A& ,B&);
853デフォルトの名無しさん:2005/11/07(月) 23:28:14
コンパイルエラー
854デフォルトの名無しさん:2005/11/07(月) 23:29:21
>>852
そりゃ変数の後じゃなくて型の後だ

で、それは参照
855デフォルトの名無しさん:2005/11/07(月) 23:45:58
>> 854
勉強不足ですいません。
&は参照型を意味するでよいでしょうか。
856デフォルトの名無しさん:2005/11/07(月) 23:58:27
型名&って書いてあったらな
857デフォルトの名無しさん:2005/11/08(火) 00:00:46
変数の後に&があった場合はビット演算子の&かな?
858デフォルトの名無しさん:2005/11/08(火) 00:02:20
&変数名ならアドレス演算子

こいうところがC++のややこしいところだなw
859デフォルトの名無しさん:2005/11/08(火) 00:06:57
>>845
>>846
>>847
なるほど。やっぱりTCHARの方が良いのか…

そこで、
double型をLPTSTR(TCHAR *)の文字列に変換する関数ってありますか?
860デフォルトの名無しさん:2005/11/08(火) 00:08:27
>>859
ある。
861デフォルトの名無しさん:2005/11/08(火) 00:09:43
ところで>>848はどうなんですか?なんか他にスマートな方法ってあります?
862デフォルトの名無しさん:2005/11/08(火) 00:12:35
_bstr_tならATLはいらんよ
863デフォルトの名無しさん:2005/11/08(火) 04:00:13
int n = 1;
int& r = n;
int* pn = &n;
int* pr = &r ;
(pn == pr) == trueですか?
864チラシの裏:2005/11/08(火) 06:46:02
if((a && b) || (!a && !b))を短くしたく、if(a ^ !b)と書いてしまっていた。
if(!!a ^ !b)としないといかん。

文字列に文字や文字列を追加したく、
sprintf(str, "%s%c", str, 'a');としてしまっっていた。
VCではOKだが、BCCだと後ろの文字のみになってしまう。

多次元配列は、一応右の様に初期化するべし。hoge[5][5] = {0};
865デフォルトの名無しさん:2005/11/08(火) 07:25:38
>> 856 587 858
教えていただきありがとうございました。
866デフォルトの名無しさん:2005/11/08(火) 08:35:38
>>863
是非自分の目で確かめてみてくれ。
867デフォルトの名無しさん:2005/11/08(火) 08:41:25
>>864
>if((a && b) || (!a && !b))を短くしたく、if(a ^ !b)と書いてしまっていた。
>if(!!a ^ !b)としないといかん。
そのように書き直しても、厳密には未だ等価ではない。

>多次元配列は、一応右の様に初期化するべし
そうとも限らん。

>sprintf(str, "%s%c", str, 'a');
例えばこう書けばいい。
sprintf(strchr(str, '\0'), "%c", 'a');
868デフォルトの名無しさん:2005/11/08(火) 08:43:29
>>858
どこがややこしいの?
869デフォルトの名無しさん:2005/11/08(火) 09:58:20
慣れりゃどーってことないけど、もうちょっと別の方法もあったかもしれないね。
といった程度かと。
870デフォルトの名無しさん:2005/11/08(火) 11:45:50
>>863
そだよ。それが参照およびポインタ変数。
871デフォルトの名無しさん:2005/11/08(火) 11:54:28
>>864
ベン図描け
872デフォルトの名無しさん:2005/11/08(火) 12:05:17
こんなに保守のことを考えずに、コーディングしてるヤシが多いとは。
絶対に一緒に仕事したくねー。
873デフォルトの名無しさん:2005/11/08(火) 12:07:17
>>863
難解だと思ったら、そんな書き方やめりゃーいいじゃん。
874デフォルトの名無しさん:2005/11/08(火) 12:08:32
>>873
なんだその的外れなレス
875デフォルトの名無しさん:2005/11/08(火) 13:41:24
>>862
そんな便利そうなものがあったのか
キャストだけでどっちにも対応できるってのは良いな
876デフォルトの名無しさん:2005/11/08(火) 16:22:14
質問になります。
Windowsでこんな処理がある時、
while(1){
 printf("HelloWorld\n");
}

速度が落ちても良いのでCPU使用率を下げる為に
while(1){
 printf("HelloWorld\n");
 sleep(1);
}
こんな事をしています。

これをLinuxでやろうとするとsleepの単位が秒でした。
さすがに1秒は待てないのですが、なにか良い代案はないでしょうか。
877デフォルトの名無しさん:2005/11/08(火) 16:48:51
つusleep
878デフォルトの名無しさん:2005/11/08(火) 16:51:25
WinのSleepみたいに、sleep(0)とやると
残りのタイムスライスを他のプロセスに譲るようにはならないのか?
879デフォルトの名無しさん:2005/11/08(火) 17:21:40
>>877
調べてみました、うまくいきそうです。
ありがとうございます。

>>878
sleep(0)試してみました。
こちらもうまくいきました。

両方単純なプログラムで試してみたところ、
sleep(0)の方がCPU使用率5%位でかなり早い。
usleep(1)or(0)だと、CPU使用率がほとんど0%で遅い。sleep(0)の1/50位かなぁ。

用途に合わせて洗濯してみます。
ありがとうございました。
880デフォルトの名無しさん:2005/11/08(火) 17:26:06
じゃぶじゃぶと。
881デフォルトの名無しさん:2005/11/08(火) 17:42:15
綺麗好きはいいことよ
882デフォルトの名無しさん:2005/11/08(火) 18:45:29
あぁ洗濯になってるのか。
コンパイルエラーでなかったよ。
883デフォルトの名無しさん:2005/11/08(火) 19:39:38
new 演算子と delete 演算子
使うメリットは?
884デフォルトの名無しさん:2005/11/08(火) 19:43:28
スコープ解決演算って何?
885デフォルトの名無しさん:2005/11/08(火) 19:48:06
>>884
int+ nullpo;
int main()
{
    int* nullpo;
    nullpo = 0;
    ::nullpo = 0; /* こういうの */
    return *nullpo;
}
886デフォルトの名無しさん:2005/11/08(火) 20:37:19
class Hoge {
 public:
  int func(int a) {
    return a-::func(a); // こういうの
  }
}

int func(int a) {
 return a+5;
}

887デフォルトの名無しさん:2005/11/08(火) 21:25:10
コンパイルできない?


#include<stdio.h>



int+ nullpo;
int main()
{
int* nullpo;
nullpo = 0;
::nullpo = 0; /* こういうの */
return *nullpo;
}



↑これじゃだめなの?
888デフォルトの名無しさん:2005/11/08(火) 21:26:10
コンパイルできないならエラーが出てるだろ
そのエラー見て直せ
そして帰れ
889デフォルトの名無しさん:2005/11/08(火) 21:49:08
>>883
コンストラクタ・デストラクタが呼ばれる。
型安全。(new intとするとint *型で返してくれるのでmalloc()などと違いキャスト不要)
890デフォルトの名無しさん:2005/11/08(火) 21:53:37
>>867
採点してくれてサンクス。
勉強になった。

>>871
分かった。

>>872
個人製作だから、それは大丈夫だけど、
エラーチェックは特に気をつけるようにする。
891デフォルトの名無しさん:2005/11/08(火) 22:18:59
二次変数ってどうやるの?


#include<stdio.h>

void main(void)
{

int x[5.5];
x[0.2]=2;
printf ("%d\n",x[0.2]);

}


↑勘で作った・・・動かん!
892デフォルトの名無しさん:2005/11/08(火) 22:22:00
2次変数なんて聞いたことも無い
893デフォルトの名無しさん:2005/11/08(火) 22:28:56
>>891
勘で直した。


#include <stdio.h>

int main(void)
{
  int x[5][5];
  x[0][2]=2;
  printf("%d\n", x[0][2]);
}
894デフォルトの名無しさん:2005/11/08(火) 22:31:55
すみません、質問があります。

最近、Borland C++Compiler + Cpad環境で
Cを始めたのですが、

#include <stdio.h>

main()
{

printf("あいうえお");
return 0;

}

というプログラムを実行すると、Cpadではうまくいくのですが
windwsのdos窓からコマンドラインでコンパイル指示すると

Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
test.c:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

と出力され、命令した文字が表示されません。
これはどういう事なのでしょうか?
自分なりに調べてはみたのですが結局わかりませんでした。
895デフォルトの名無しさん:2005/11/08(火) 22:33:23
>>894
コンパイルは機械語への翻訳でしかない。
出来たexeファイルを実行しろ。
896デフォルトの名無しさん:2005/11/08(火) 22:34:30
IDEって便利だよね。
897デフォルトの名無しさん:2005/11/08(火) 22:39:09
>893
thx
898デフォルトの名無しさん:2005/11/08(火) 22:39:22
>>894
いちおー、今後のために専用スレを紹介しておく

タダで使えるBorland C++ Part4
ttp://pc8.2ch.net/test/read.cgi/tech/1091066805/l50
899894:2005/11/08(火) 22:41:02
>>895
そういう事なのですね。解決しました。
本当にありがとうございました!
900デフォルトの名無しさん:2005/11/09(水) 00:08:03
だれも言わないようなので俺が変わりに言っておく

>>894←お前馬鹿だろ?プログラムとかそういうの以前にw
901デフォルトの名無しさん:2005/11/09(水) 00:43:33
>>860
すまんです。 言葉足らずでした。
その関数はなんという名前でどういうものですか?
MSDNで調べても巧くヒットしなくて
902デフォルトの名無しさん:2005/11/09(水) 01:04:34
>>900

いやね、全くの初心者がサイトの情報だけではじめるとこうなっちゃうんだよ
それは仕方がない

だからちゃんとした入門書買えと繰り返し言うことになるんだが
903デフォルトの名無しさん:2005/11/09(水) 01:06:27
>>901
_stprintf
904デフォルトの名無しさん:2005/11/09(水) 09:46:35
質問です。

#define INPUT_MAX 19

があるとして、これを
printf()の文字幅(と言うのかな?)の指定に当てたいのですが、
""内に入れると、そのままINPUT_MAXが出力されてしまいます。

こういった場合はdefineは使えないのでしょうか?
905デフォルトの名無しさん:2005/11/09(水) 10:28:28
>>904
プリプロセッサを駆使すればなんとか出来る。

#include<stdio.h>
#define T(S) #S
#define TT(S) T(S)
#define INPUT_MAX 19
int main(){
    int x=10;
    /*
        Tを直接呼び出した場合、"INPUT_MAX"と展開されるので
        二重に展開するためにTTを使う。
    */
    printf("x = %"TT(INPUT_MAX)"d",x);
    return 0;
}
906デフォルトの名無しさん:2005/11/09(水) 11:09:39
>>905
回答ありがとうございます。

知識が追いつかないので、今回はdefineを使わずに行こうと思います。
907デフォルトの名無しさん:2005/11/09(水) 11:19:02
printf("x = %*d\n", INPUT_MAX, x);
908デフォルトの名無しさん:2005/11/09(水) 11:25:36
じゃあ、もっと簡単に理解そうな方法を。

printf の第一引数(たぶんchar*)に渡す文字列を、配列なりにしてあらかじめ用意しておく。
これならsprintfとかで INPUT_MAX の値を埋め込むことも出来る。

で、printf ( string , x ) とかすれば。


効率悪い? 速度遅い? ソースが汚い? 知るかボケ



909デフォルトの名無しさん:2005/11/09(水) 11:38:29
>>906
sprintf(a, "\%%dd", INPUT_MAX);
printf(a, ...);

printf系の書式指定はあくまで文字列
何もその場で""で囲んだリテラルを指定しなきゃいけないわけじゃないことを忘れるな
910初心者:2005/11/09(水) 11:39:23
VC6.0がgraphcis.hのheadfileのincludeできないでしょうか??
できなければこのheadfileついているプログラムはどうやってビルトしますか??
是非教えてください
911デフォルトの名無しさん:2005/11/09(水) 11:41:54
>>909
最後2行には同意だが、なんだそのイッちゃったプログラム・・・
912デフォルトの名無しさん:2005/11/09(水) 11:43:00
>>910
そのheadfileをおまえのVC6.0がファイル検索できるディレクトリに入れりゃいいだろ
913デフォルトの名無しさん:2005/11/09(水) 11:46:22
>>910はもはや日本語じゃないな。
ゆとり教育の弊害って奴か。

そもそもgraphcis.hってなんだ?
ぐぐったら、もしかしてgraphics.hと指摘されたが、
DOS時代の、Turbo C++付属のライブラリのヘッダのことか?
まさかいまどき、そんなはずはないし。
914デフォルトの名無しさん:2005/11/09(水) 12:00:00
>>909
printf("%*d", INPUT_MAX, ...
915デフォルトの名無しさん:2005/11/09(水) 12:11:49
>>907
>>914
こんな簡単な事だったんですね。


自分の書き方が悪かったばかりに、
皆さんに難しく考えさせてしまって申し訳ないです。
916デフォルトの名無しさん:2005/11/09(水) 15:13:21
>>915
違う、>>905が難しく考えすぎなだけ
917デフォルトの名無しさん:2005/11/09(水) 17:28:33
>>910は昔のゲームプログラミングの本で勉強している可能性があるな
むしろやさしく教えてあげるべき。俺はしらん
918デフォルトの名無しさん:2005/11/09(水) 17:37:39
何その怪しいべき論
919デフォルトの名無しさん:2005/11/09(水) 17:45:20
>>918
実は本人というオチ。
920デフォルトの名無しさん:2005/11/09(水) 22:43:16
>917の言ってることが正しいとしよう
>910には「その本捨てろウンコタレ」とレスしてあげるべきだな
921デフォルトの名無しさん:2005/11/09(水) 22:48:00
なんとくなクラスが分かったぞー
構造体の進化版なんだろー!
ハッハッハ
リスト構造わかんねー
ハッハッハッハッハ
922デフォルトの名無しさん:2005/11/09(水) 22:50:09
>>921
クラス使うのヤメレ。というかやめてくれ。
その理解でクラス使うと絶対に後悔する。
923デフォルトの名無しさん:2005/11/09(水) 23:13:47
>>922
周りがな
924デフォルトの名無しさん:2005/11/09(水) 23:17:52

ハッハッハッハ!
925デフォルトの名無しさん:2005/11/10(木) 13:31:34
質問です。
C++のテンプレートに興味を持ち色々試行錯誤しているのですが

template<class T>
void test(){
printf("%d\n", sizeof(T));
}

void main(){
test<int>();
test<char>();
}

とやると、testのprintfで両方とも 1 が出力されてしまいます。
私は
4
1
と表示されることを期待していたのですが、異なった引数を持たない場合関数が上書きされてしまうのでしょうか?
testの引数に test(T tmp)としたら期待通りの動きになりましたが…。

926デフォルトの名無しさん:2005/11/10(木) 13:53:53
template <class T>
void test(T x) {
 printf("%d\n", sizeof(x));
}

void main() {
 int a;
 char b;

 test(a);
 test(b);
}

やるならこうだろ

テンプレートクラスじゃねぇんだぞ?
927デフォルトの名無しさん:2005/11/10(木) 14:01:31
なるほど。やはり引数が同一になってしまうとそうなるわけですね。
テンプレートクラスのstatic関数にするという手もありますし、検討してみます。
928デフォルトの名無しさん:2005/11/10(木) 14:01:41
>>925
コンパイラのバグかと。
手元のg++では
4
1
と表示された。
929デフォルトの名無しさん:2005/11/10(木) 14:02:26
>>925
2003では期待通りの出力がされた。
VC6だったらコンパイラがヘタレなので投げ捨てろ。
930デフォルトの名無しさん:2005/11/10(木) 14:04:20
質問。
void* operator new[](size_t t);
でtの値を調べていたところ、
intやcharならそのままのサイズ。つまり4*x個や1*x個のバイト数になり
クラスだとさらに+4バイトだけかかることに気づいた。

この余分な4バイトは何なんでしょうか?
931デフォルトの名無しさん:2005/11/10(木) 14:05:16
>>928-929
VC6です(つД`)
まぁテンプレートクラスのstatic関数にしたらうまくいったので、こっち使います。
932930:2005/11/10(木) 14:07:52
補足説明。

new int [8]; // 4*8=32バイト
new char [4]: // 1*4=4バイト
new CHoge[4]; // sizeof(CHoge) * 4 + 4バイト
になります。
933デフォルトの名無しさん:2005/11/10(木) 14:09:11
>>930
コンパイラの実装しだい。
どのコンパイラのどのプラットフォームなのかもわからないけど、
thisじゃないのかな?
934デフォルトの名無しさん:2005/11/10(木) 14:10:10
>>930
多分配列の要素数。
クラスの場合 delete [] 時にデストラクタを呼ぶ必要があるので要素数が必要になる。
VCでは先頭アドレス-4の所に要素数が格納されているようだが、実装依存なんで気にするな。
935デフォルトの名無しさん:2005/11/10(木) 14:16:25
>>933-934
ありがとう。
助言をもとに返されるアドレスから4バイトさかのぼってintに変換してみたところ、わけのわからん数字が…。
[1] だと 4
[2] だと 5
[3] だと 5
[4] だと 6
[5] だと 11
うーむ、謎。まぁ実装依存ということで。


936デフォルトの名無しさん:2005/11/10(木) 14:18:25
要素数だとしたら、intやcharの時も入ってないと変じゃないか?
937デフォルトの名無しさん:2005/11/10(木) 14:19:20
その4バイト遡るってどうやって計算したんだ
938デフォルトの名無しさん:2005/11/10(木) 14:19:46
>>936
デストラクタが必要ないから要素数は必要ない。
939デフォルトの名無しさん:2005/11/10(木) 14:22:02
>>937
単純に
*(int*)((byte*)p - 4)
しただけなんだけど、間違ってたかな?
940デフォルトの名無しさん:2005/11/10(木) 14:23:40
>>939
これじゃだめなのかな。

*((int *)(p) -1)
941デフォルトの名無しさん:2005/11/10(木) 14:24:44
クラスでもデストラクタが無くPODなら領域を解放するだけなので要素数は無かった。(VC2003)
942デフォルトの名無しさん:2005/11/10(木) 14:25:28
>>940
sizeof(CHoge)バイト戻るのでダメ。
943942:2005/11/10(木) 14:26:11
間違った。忘れてくれ。
944デフォルトの名無しさん:2005/11/10(木) 14:41:30
>>939
デバッグでちゃんと4バイトだけ戻されてるの確認した?
945デフォルトの名無しさん:2005/11/10(木) 15:13:34
>>903
なるほど。TCHARを直接引数に定義してあるのばかり探してました…
こうやって、臨機応変にcharとwchar_tで使い分けられればよいわけですね?

int DtoS(char *buffer, double value) {
    return sprintf(*buffer, "%.18G", value);
}
int DtoS(wchar_t *buffer, double value) {
    return swprintf(*buffer, "%.18G", value);
}

や、

#ifdef UNICODE
#define DtoS(buffer, value)  swprintf(buffer, "%18G", value)
#else
#define DtoS(buffer, value)  sprintf(buffer, "%18G", value)
#endif

みたいなかんじで。
946デフォルトの名無しさん:2005/11/10(木) 15:41:50
>>945
??
後者を自動的にやってくれるのが、_stprintfですよね。
一度ヘッダを見てみることをオススメします。
947デフォルトの名無しさん:2005/11/10(木) 15:52:16
UNICODEなんてCOMでしか使わないだろw
つーかIWebBrowser2を使ってるときになんでわざわざ
WideCharToMultiByteを使ってSJISに変換しないといけないんだと・・
948デフォルトの名無しさん:2005/11/10(木) 15:52:20
const型を付けて受け取ったポインタを、const無しの同型ポインタに代入(or変換)する事は可能ですか?
コンパイル時にエラーになると思うのですが、constを外す事以外で回避できる書き方でもあるのでしょうか?

char *func(const char *a)
{
  char *b;
  b = a;
  return b;
}
949デフォルトの名無しさん:2005/11/10(木) 15:57:35
>const型を付けて受け取ったポインタを、const無しの同型ポインタに代入(or変換)する事は可能ですか?
可能。
char *b = (char *)a;

>コンパイル時にエラーになると思うのですが、constを外す事以外で回避できる書き方でもあるのでしょうか?
質問の意味がわからんので、説明してくれるか?
950デフォルトの名無しさん:2005/11/10(木) 15:57:46
>>947
今時UNICODE嫌いですか?w
951デフォルトの名無しさん:2005/11/10(木) 15:58:42
>>948
const_castを使う。

char *func(const char *a)
{
  char *b;
  b = const_cast<char *>(a);
  return b;
}
952デフォルトの名無しさん:2005/11/10(木) 16:00:42
>>950
うにうにしてて(´・д・`) ヤダ
953デフォルトの名無しさん:2005/11/10(木) 16:02:25
>>947
いずれすべて、UNICODEになるさ。
NTカーネルでは、ANSIのAPIは、ワイド文字に変換して、丸投げだからな。

でもなぜXPでもGetAddrInfoW()がないんだろう……。
954デフォルトの名無しさん:2005/11/10(木) 16:03:15
>>949,951
普通にキャストできたんですね。ただの勘違いでした。
ありがとうございました。
955デフォルトの名無しさん:2005/11/10(木) 16:05:02
VB.NETになると強制UNICODEだからな
956デフォルトの名無しさん:2005/11/10(木) 16:23:25
>948
エラーになるのは訳があるわけだが、ちゃんと理解してるのか?
const_castが必要というのは、基本的に設計が悪い。
957デフォルトの名無しさん:2005/11/10(木) 16:25:47
自分じゃなくライブラリの設計が悪いことも多いがな。、
958948:2005/11/10(木) 17:07:22
>>956
constをポインタに付けると、そのポインタを介した値を書き換えようとした時にコンパイラが警告を出す、で正しいでしょうか。
確かに設計に問題があると思ったので既に改善しましたが、気になったので質問させていただきました。
959デフォルトの名無しさん:2005/11/10(木) 17:29:32
>>946
あ、ホントだ…
全然、全く、知りませんでした…orz
960デフォルトの名無しさん:2005/11/10(木) 17:42:26
ところで、また根本的な質問なんですけど、
TCHAR と _TCHAR では基本的に同じものと考えて良いのですか?
961デフォルトの名無しさん:2005/11/10(木) 17:42:56
どう定義されてるか見ればいいだろ。
962デフォルトの名無しさん:2005/11/10(木) 17:53:38
質問です。
operator new と operator new[] をオーバーライドしているのですが、
char *p = new char [4];

とあるクラスの中ではoperator new に飛び、
とあるクラスの中ではoperator new[] に飛びます。
特に不具合は起きていないのですが、なんとも気味が悪いです。
原因の心当たりがある方はいらっしゃいませんでしょうか。

charの配列のため、生成しようとしているもののoperator newがオーバーロードされているわけでもありませんし…。
この現象が起こるのはVC6.0です。

友達の環境(すいません、聞きそびれました)では両方new []に飛んだそうです。
963デフォルトの名無しさん:2005/11/10(木) 18:06:45
>>962
直ちにVC6.0を使うのを止めて下さい。
964デフォルトの名無しさん:2005/11/10(木) 18:11:03
なんつーか、VC6ってアホなバグが多いよな
965デフォルトの名無しさん:2005/11/10(木) 18:15:13
サービスパックが6まで出てて、バグフィックスされてないの?
966デフォルトの名無しさん:2005/11/10(木) 18:22:06
もれはvc6からvc7.1に最近入れ替えたんだが
コンパイラの最適化の度合いが全然違うぞw
換えてよかったと思ってる
不満点はvc7.1のintellisenseが循環参照してる定義があるとフリーズすることぐらいだよ
967デフォルトの名無しさん:2005/11/10(木) 18:23:06
何その糞定義
968デフォルトの名無しさん:2005/11/10(木) 18:24:34
>>961
同じwchar_tですね。
ええ。同じだと分かりました。
969デフォルトの名無しさん:2005/11/10(木) 18:54:42
>>968
おい
970デフォルトの名無しさん:2005/11/10(木) 20:44:12
>>960
TCHARは<Windows.h>の中の中でインクルードされる<WinNT.h>の中で
UNICODEが定義されているかどうかでcharかwchar_tからtypedefされる。

_TCHARは<tchar.h>の中で_UNICODEが定義されているかどうかでcharかwchar_tからtypedefされる。

ところどころでUNICODEが定義されていれば_UNICODEを定義し、
_UNICODEを定義が定義されていればUNICODEを定義するように書かれているから両者はごっちゃにしても差し支えない。
実質的にTCHARと_TCHARも同一視して良いと思われる。
971デフォルトの名無しさん:2005/11/10(木) 21:41:53
>>969
え?

>>970
なるほど。一応別物なんですね。
取りあえずごっちゃにしても大丈夫そうだということなのは分かりました(笑)
どうもありがとうございます。
972デフォルトの名無しさん:2005/11/10(木) 21:47:12
どこをどうしたら別物になるのか・・・
973デフォルトの名無しさん:2005/11/10(木) 22:04:38
>>972
ありゃ?
どこでtypedefされてるかで違うんじゃないんですか?
>>970さんが言っているのは、
どこでUNICODEが定義されているかの違いがあるが、
別々(charとwchar_t)のものを指すことはないから同じと見て問題がない
という意味だと思ったのですけど。

…んまぁ 同じなのか。
難しく考えないようにします。(そんなに考えられるような知恵無いしw)
974デフォルトの名無しさん:2005/11/10(木) 23:42:51
命令一覧表とかってどっかないの?


975デフォルトの名無しさん:2005/11/11(金) 00:05:21
>>973
UNICODE/_UNICODEを定義するのは自身。
ソースコードでは#ifdefなどで切り分けているだけ。

>>974
C/C++に命令などありませんがなにか。
976デフォルトの名無しさん:2005/11/11(金) 00:10:38
printf
とかって命令じゃないの?
977デフォルトの名無しさん:2005/11/11(金) 00:12:22
それは関数
978デフォルトの名無しさん:2005/11/11(金) 00:16:40
へ〜
979デフォルトの名無しさん:2005/11/11(金) 00:50:23
>>795命令っていう言葉を辞書で100回調べて来てからその発言をしろ
980デフォルトの名無しさん:2005/11/11(金) 00:58:41
preprocessor directiveはあるけど他に命令なんてあったっけ?
981デフォルトの名無しさん:2005/11/11(金) 02:49:26
これって合法?駄目なケースとかある?

class Base {
 public:
    Base();
    virtual ~Base();
};

class Derived : public Base {
 public:
    Derived();
    virtual ~Derived();
};

void
foo(Derived& arg)
{
    Base local(arg);
}
982デフォルトの名無しさん:2005/11/11(金) 02:54:02
>>981
メンバ関数を仮想関数にすれば行ける。
983デフォルトの名無しさん:2005/11/11(金) 03:59:12
C++の例外処理には3種類あると聞き、困惑しています。

(catch(Exception *e){}) が当然だと思っていたのですが

ポインタで受ける(catch(Exception *e){})
コピーして受ける(catch(Exception e){})
参照で受ける(catch(Exception &e){})

の3種があると聞きました…。

この3つの使い分けって何でしょうか?
また、どれを使用するのが望ましいのでしょうか。
初心者房ですみませんがよろしくお願いします。
984デフォルトの名無しさん:2005/11/11(金) 04:07:52
>>876
sched_yield()
985デフォルトの名無しさん:2005/11/11(金) 05:13:33
>>983
効率の問題。
ポインタで受けるには、アドレスを投げる必要があるので面倒。
実体で受けると、例外オブジェクトが大きい場合、コピーコンストラクタの
処理が重くなる。

従って、参照で受けると良い。例外オブジェクトの変更の必要がなければ、
const参照で受ける。
986デフォルトの名無しさん:2005/11/11(金) 05:38:11
アドレスというか、newしたオブジェクトをポインタで受けるわけだ。
だから、catch節で、deleteしないといけないし。
987デフォルトの名無しさん:2005/11/11(金) 05:45:56
次のようなお馬鹿なコードは見たことがないが、deleteの必要がない。それだけ。

#include <iostream>
#include <exception>
#include <memory>

class A {
public:
 static char* what() {
  return "class A";
 }
};

int main()
{
 try {
  throw std::auto_ptr<A>(new A);
 }
 catch (std::auto_ptr<A> a) {
  std::cout << a->what() << std::endl;
 }
}
988デフォルトの名無しさん:2005/11/11(金) 08:52:18
>>985
アドレスを投げるのが面倒って、バカじゃねーの?
989デフォルトの名無しさん:2005/11/11(金) 11:17:51
990デフォルトの名無しさん:2005/11/11(金) 12:10:21
VS 2005のExpress Editionは事実上,無償提供へ

って本当ですか?
これ、仕事にも使っても大丈夫ですよね?
991デフォルトの名無しさん:2005/11/11(金) 12:19:35
>>990
商用利用も可だったはず。
992デフォルトの名無しさん:2005/11/11(金) 12:48:01
VCTKの時みたいに、最適化コンパイラのままであって欲しいねぇ。
993デフォルトの名無しさん:2005/11/11(金) 12:50:35
>>990
うわーいと言いたいところだけど、最近2003買ったばっかりなんだよね(´・ω・`)
994デフォルトの名無しさん:2005/11/11(金) 13:00:38
float fp;
fp = new float [5];
のようにfloat型へのポインタに5つの配列を宣言しました
この時はfp[0]...fp[4]まで初期化しないとおかしな数値が入っているのでしょうか?
printf("%f", fp[i]);のようにforでまわしてみたところ-44556.0000みたいになっておりました。
それとも値の参照の仕方が違うのでしょうか?
995994:2005/11/11(金) 13:01:54
最初の行は
float *fp; でした
996デフォルトの名無しさん:2005/11/11(金) 13:28:48
・領域確保時の値内容はプラットフォーム依存だろ
・参照の仕方はそれでいい

まぁ、確保時に明示的に0で埋めておくのが一番安全だろう
997994:2005/11/11(金) 14:12:14
ありがとうございます!
初期化って大切ですね(´・ω・`)
これに気づかず数時間も悩んでました
998デフォルトの名無しさん:2005/11/11(金) 14:30:57
>>997
vectorがおすすめ
994相当のことをして100で初期化するとすると

vector <float> fp (5, 100);
///
printf("%f", fp[i]);

こんな感じ
999994:2005/11/11(金) 15:02:01
ウホッ!いい初期化!

ありがとうございます
vector使うだけで見た目も量もいいですねぇ
1000デフォルトの名無しさん:2005/11/11(金) 15:37:29
次スレ
【初心者歓迎】C/C++室 Ver.24【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1131691023/
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。