【初心者歓迎】C/C++室 Ver.47【環境依存OK】at TECH
【初心者歓迎】C/C++室 Ver.47【環境依存OK】 - 暇つぶし2ch413:407
08/01/24 21:47:10
単純な計算と比べてもほんど無視できる程度しか変わらなかったよ・・・

#include <iostream>
#include <time.h>
using namespace std;
#define N 10000
#define rd() (rand()&255)
#define rnd() rd()+(rd()<<8)+(rd()<<16)+(rd()<<24)

main(){
unsigned int *a=new unsigned int [N];
unsigned int *b=new unsigned int [N];
int n,cl,clsum[4],s=0,t=0;
for(n=0;n<4;n++)clsum[n]=0;
for(n=0;n<N;n++){ a[n]=rnd(); b[n]=rnd();}

for(int k=0;k<30000;k++){
cl=clock();for(n=0;n<N;n++)t|=a[n]&b[n]&1;clsum[3]+=clock()-cl;
cl=clock();for(n=0;n<N;n++)s+=(a[n]>UINT_MAX-b[n]);clsum[0]+=clock()-cl;
cl=clock();for(n=0;n<N;n++)s+=((a[n]>>1)+(b[n]>>1)+(a[n]&b[n]&1))>>31;clsum[1]+=clock()-cl;
cl=clock();for(n=0;n<N;n++){static unsigned int x=a[n],y=b[n];s+=((x>>1)+(y>>1)+(x&y&1))>>31;}clsum[2]+=clock()-cl;
}
cout<<"比較演算の速度 "<<clsum[0]<<endl;
cout<<"論理演算の速度1 "<<clsum[1]<<endl;
cout<<"論理演算の速度2 "<<clsum[2]<<endl;
cout<<"単純な論理演算の速度 "<<clsum[3]<<endl;
cout<<(s&t&1);
}

414:407
08/01/24 21:49:39
>>412
Nはランダムの2数を確保する数なので大きくすると
純正のメモリ外に書き込まれる可能性が出てきてしまいます
増やすときは、kの繰りかえし数を上げてみて下さい

415:デフォルトの名無しさん
08/01/24 21:53:01
>>414
ううん。微妙な結果。

if文の速度 1004
if無しの速度1 996
if無しの速度2 1112

416:デフォルトの名無しさん
08/01/24 21:58:55
安定して正確な速度がはかれるっぽいコードです・・・スタック領域に少量確保しました わずかに論理式のほうが速いかもしれないです

#include <iostream>
#include <time.h>
using namespace std;
#define kukikaesi 300000

main(){
#define N 1000
unsigned int a[N],b[N];
int n,cl,clsum[4],s=0,t=0;
for(n=0;n<4;n++)clsum[n]=0;
for(n=0;n<N;n++){
#define rd() (rand()&255)
#define rnd() rd()+(rd()<<8)+(rd()<<16)+(rd()<<24)
a[n]=rnd(); b[n]=rnd();}

for(int k=0;k<kukikaesi;k++){
cl=clock();for(n=0;n<N;n++)t|=a[n]&b[n]&1;clsum[3]+=clock()-cl;
cl=clock();for(n=0;n<N;n++)s+=(a[n]>UINT_MAX-b[n]);clsum[0]+=clock()-cl;
cl=clock();for(n=0;n<N;n++)s+=((a[n]>>1)+(b[n]>>1)+(a[n]&b[n]&1))>>31;clsum[1]+=clock()-cl;
cl=clock();for(n=0;n<N;n++){static unsigned int x=a[n],y=b[n];s+=((x>>1)+(y>>1)+(x&y&1))>>31;}clsum[2]+=clock()-cl;
}
cout<<"比較演算の速度 "<<clsum[0]<<endl;
cout<<"論理演算の速度1 "<<clsum[1]<<endl;
cout<<"論理演算の速度2 "<<clsum[2]<<endl;
cout<<"単純な論理演算の速度 "<<clsum[3]<<endl;
cout<<(s&t&1);
}

417:デフォルトの名無しさん
08/01/24 22:02:21
微妙すぎるのでこれにて終了します ありがとうございました

418:デフォルトの名無しさん
08/01/24 22:04:48
>>416
VC++2008EE Debugビルド
Vista Athlon Dual 4400+ 2.31GHz
比較演算の速度 2030
論理演算の速度1 2678
論理演算の速度2 1948
単純な論理演算の速度 1817

419:デフォルトの名無しさん
08/01/24 22:32:23
超初心者の質問なのですが、、、

#include <iostream>
int main() {
double a = 3.55;
int n = a * 100;
std::cout << n << std::endl;
return 0;
}

これの出力が354になります。355ではなく354になるのはどうしてなのでしょうか?




420:デフォルトの名無しさん
08/01/24 22:40:51
3.55は浮動小数点だと無限小数になって、Intに型変換すると切り捨て誤差が出る。
詳しい解説が読みたければ「浮動小数点 誤差」くらいでぐぐってみれ。

421:デフォルトの名無しさん
08/01/24 22:42:28
>>405

回数分足すのはさすがに重いだろ

一桁ずつ掛けて、そのあと和の繰り返しを使うんじゃないのか?
例えば112×235なら
5×112=560
3×112=336
2×112=224

560+3360+22400=26320
とか

まあ俺の力じゃプログラムは作れないけどなw

422:デフォルトの名無しさん
08/01/24 22:43:32
>>419
VC++ 2008 では355になる。

423:デフォルトの名無しさん
08/01/24 22:44:31
xに近い整数にするには、x +0.5を整数にすればいいのでは 変換時に切り捨てられる為

424:デフォルトの名無しさん
08/01/24 22:45:27
>>420
a * 100 ではintの100がdoubleに昇格して計算されて結果もdoubleだろ。
355になった後でintに変換されるから関係ないと思うんだが。


425:デフォルトの名無しさん
08/01/24 22:46:19
354.99999999999999999なら354

426:デフォルトの名無しさん
08/01/24 22:47:56
>>425
おお、そういうことか。あくまでも近似値なんだよな。

427:デフォルトの名無しさん
08/01/24 22:49:05
BYTE値を0.75倍し、その整数部のみを得たいのですが、
単に0.75を掛けて少数切捨てするより効率がよくて速度出る計算方法がありますかね
BYTE >> 1 のようなもの(これは1/2ですが…)があれば教えていただけませんか?

428:デフォルトの名無しさん
08/01/24 22:51:59
>>421
それ思いっきり筆算じゃね?

>>405
先生が何させたいかさっぱりわからんのだわ。
50桁くらいならFFTとか組むより筆算で十分な速度でる。
多倍長演算なら↓みたいなアルゴリズムのサイトあるけど
さすがにそんなとこまで求めてないと思うんだよな。
URLリンク(poset.jp)

429:デフォルトの名無しさん
08/01/24 22:56:19
>>427
コンパイラの最適化に任せる。

整数で処理する(最適化に負けるかもしれない)
int value = 123456;
value = value * 75 / 100;

シフト演算で頑張ってみる(1/2+1/4なので)
int value = 123456;
value = value >> 1 + value >> 2



430:デフォルトの名無しさん
08/01/24 22:56:25
>>427
(BYTE)(((WORD)x) * 3 / 4)

431:デフォルトの名無しさん
08/01/24 22:56:53
>>427
(BYTE + BYTE << 1) >> 2

432:デフォルトの名無しさん
08/01/24 22:59:31
(x + (x<<1)) >> 2

433:デフォルトの名無しさん
08/01/24 23:00:15
>>429-431
おおいろいろ方法があるんですね
みなさんありがとうございます!
早速試してみますね

434:デフォルトの名無しさん
08/01/24 23:02:56
>>428

スマン思いっきし筆算だった


435:デフォルトの名無しさん
08/01/24 23:07:35
1 の位 = 1 の位の積の 1 の位
10 の位 = (1 の位と 10 の位の積の 1 の位 + 1 の位の積の 10 の位) の 1 の位
100 の位 = 1 の位と 100 の位の積の 1 の位 + 10 の位の積の 1 の位 + (1 の位と 10 の位の積の 1 の位 + 1 の位の積の 10 の位) の 10 の位
   :
   :
   :

436:デフォルトの名無しさん
08/01/24 23:08:23
>>405
俺が思うに
お前の筆算の仕方が間違ってたんじゃないのか
筆算以外にやりようないと思うんだが

437:405
08/01/24 23:29:58
先生にまた聞いたら筆算のしかたが間違ってたみたいです、、
>>421 みたいなやりかたどうやるんですか?
ぼくのだと
「112*235=560+336+224=1120」になっちゃいます

438:デフォルトの名無しさん
08/01/24 23:31:59
桁シフトしとらんがな。
つーか、どうせならインド式実装してみたら?

439:デフォルトの名無しさん
08/01/24 23:34:32
newで配列として確保した後、その要素数を取得する方法はありますか?

440:デフォルトの名無しさん
08/01/24 23:36:15
基本的にはない。
つーか、大抵の場合は std::vector 使っておけば問題ない。

441:デフォルトの名無しさん
08/01/24 23:36:37
>>439
嫌になるほど繰り返し質問されていることですが、ありません。
newなんて使わずにstd::vectorを使いましょう。

442:デフォルトの名無しさん
08/01/24 23:36:46
ない。std::vectorでも使え。

443:デフォルトの名無しさん
08/01/24 23:37:56
std::vector 使え!

444:デフォルトの名無しさん
08/01/24 23:38:18
std::vector使えよ

445:デフォルトの名無しさん
08/01/24 23:39:02
場合によっては取得できるんだが・・・
そういう事はむやみに教えると悪い影響与えそうで困る。

446:デフォルトの名無しさん
08/01/24 23:40:03
std::vectorってなんですか?習ってないです。

447:デフォルトの名無しさん
08/01/24 23:40:19
増やした分を保持しておけばよいが、vectorは勝手に保持するからプログラムが簡単になる

448:439
08/01/24 23:40:37
みんなThx!ふと気になってレス見ないで書いちゃった、スマソ。。

449:デフォルトの名無しさん
08/01/24 23:42:03
#include <vector>
using namespace std;

main(){
vector < int > a(100);
a[0]=1; a[1]=2;
}

450:デフォルトの名無しさん
08/01/24 23:43:36
main.cpp:4: error: ISO C++ forbids declaration of ‘main’ with no type
main.cpp:4: error: ISO C++ forbids declaration of ‘main’ with no type
lipo: can't figure out the architecture type of: /var/tmp//ccLa7Foj.out
make: *** [debug/main.o] Error 1

451:デフォルトの名無しさん
08/01/24 23:48:58
今年のカレンダー表示ってどうやるんですか?

452:デフォルトの名無しさん
08/01/24 23:52:00
作って表示すれば?

453:デフォルトの名無しさん
08/01/24 23:58:43
エンディアンの勉強をしてまして、色々ググってみると、例えばリトルエンディアンの場合、
0x1234abcd の値をメモリーに格納する際、下位アドレスから順に、cd ab 34 12 と入りますが、
ここで疑問なのが、1バイトの中身のビット列はどのように扱われているのか?という点です。
1バイト8bit分のデータは、エンディアンにかかわらず常に、例えば 0x12 は、00010010 のビット列
が保たれているのでしょうか?


454:405
08/01/25 00:03:17
405ですが
筆算の問題、
>>421 
みたいに全部かけた後にまとめて足すってできるんですか?

それとも2桁ずつ掛け算して足してかないとむり?
例えば123*123だったら
123*3=369
123*2=246
  →369+2460=2829
123*1=123
    →2829+12300=15129

455:デフォルトの名無しさん
08/01/25 00:07:35
>>454
421のやりかたでできるだろ
下のだとめんどくさくないか?

よくわからんのだが

456:デフォルトの名無しさん
08/01/25 00:21:15
>>453
エンディアンは多バイトデータの配置の種類
1バイトは関係ない(同じ内容になる)

457:デフォルトの名無しさん
08/01/25 00:29:57
>>453
1バイトがどのように格納されていようが、
どうせ1バイト単位でしかメモリアクセスできないのだから、
違いは観測できないだろ。

458:457
08/01/25 00:34:10
そういえば、ビットアクセス命令のあるCPUもあるか・・・

459:デフォルトの名無しさん
08/01/25 00:40:27
1byteが12bitの環境もあるわけで

460:デフォルトの名無しさん
08/01/25 00:41:05
環境がBCCDeveloperというものです。
hoge.txtという名前のテキストファイルを作るプログラムで
同じフォルダの中にすでにhoge.txtという名前のテキストファイルがあったら
もともとあったテキストファイルの名前をhoge1.txtとして変えて新しく作るテキストファイルを
hoge.txtとすることはできるでしょうか。
できる場合はどうしたらいいでしょうか。

461:デフォルトの名無しさん
08/01/25 00:45:23
>>460
hoge.txtがあるかどうかを調べる
あったらファイル名を変更する
hoge.txtを作る

System("if exist ren hoge.txt hoge1.txt");っていけるのかな?

462:デフォルトの名無しさん
08/01/25 00:51:48
>>461
すばやい回答ありがとうございました。
早速とりかかってみたいと思います。

463:デフォルトの名無しさん
08/01/25 00:54:52
>>454
とりあえず10桁で作ってやったぞ。わからんとこあったら聞いてくれ。
#define N 10
int main( void )
{
int a[ N ] = {0,1,2,3,4,5,6,7,8,9};// 9876543210
int b[ N ] = {0,1,2,3,4,5,6,7,8,9};// 9876543210
int result[ N * 2 ] = { 0 }; // 9876543210*9876543210=97546105778997104100
for ( int i = 0; i < N; i++ ) {
for ( int j = 0; j < N; j++ ) {
result[ i + j ] += ( a[ i ] * b[ j ] );
for ( int k = i + j; k < N * 2 - 1; k++ ) {
if ( result[ k ] < 10 ) break;
result[ k + 1 ] += result[ k ] / 10;
result[ k ] %= 10;

}
}
}
for ( int i = N * 2 - 1; i >= 0; i-- ) {
printf( "%d", result[ i ] );
}
return 0;
}

464:デフォルトの名無しさん
08/01/25 01:30:19
こんなかんじか

#define kosu 4

add(unsigned int *a, unsigned int *b, unsigned int *c){
int ketaagari=0;
for(int n=0; n<kosu; n++){
c[n]=a[n]+b[n]+ketaagari;
ketaagari=a[n]>UINT_MAX-b[n];
}}

seki(unsigned int *a, unsigned int *b, unsigned int *c){

}

465:デフォルトの名無しさん
08/01/25 01:34:37
50桁までカウントさせるのが面倒で積は諦めた

466:デフォルトの名無しさん
08/01/25 04:44:04
500メガ程度の複数のテキスト文書があるとします
これから単語の頻度を求めたいとします どのようにしたらいいでしょうか?
単語は最低4バイトのものを言います
配列でカウントできないし良い方法ありますか

467:デフォルトの名無しさん
08/01/25 04:46:06
3バイトの頻度なら、int

468:デフォルトの名無しさん
08/01/25 04:49:00
>>466
最低4バイトということは200Kバイトの単語がある可能性も考慮しないとだめですか?w

469:デフォルトの名無しさん
08/01/25 04:56:06
>>468
厳密に求めなくて良いです 高頻度の単語が抽出出来ればいいです 1単語しかなければもとめなくていいです

470:デフォルトの名無しさん
08/01/25 05:01:15
一回目で24bit列を配列でカウントして、
2回目でたとえば100回以上出現したものの後ろ10バイトずつファイルに切り出して
そのファイルごとにしらべればいいか

471:デフォルトの名無しさん
08/01/25 07:23:25
>>420
ありがとうございます。なので、
0.55, 1.55, 8.55 =>切り上げなので、上記現象なし
2.55 ~ 7.55 =>切り下げなので、上記現象あり
なのですね。

ところで、上記質問をしてから色々調べたのですが、浮動小数点(例えばC言語のdouble)の
仮数部の丸めについて、丁度中間の場合は偶数になるように丸める、というルールが
あるらしいのですが、これは小数点の場合にどういう風に当てはまるのかわかりません。
これって二進数だと全部あてはまってしまうような気が、、、
どうなっているのでせうか


472:デフォルトの名無しさん
08/01/25 07:36:58
>なのですね。
いいえ。

473:デフォルトの名無しさん
08/01/25 11:27:52
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void fileread(int,char * []);
int main(int argc ,char *argv[])
{ if(argc!=3){printf("次回から引数を入力してください\n");
return 0; }
if(!strcmp(argv[2],"r")){ fileread(argc,argv);
}
return 0;}
void fileread(int argc,char *argv[]){
FILE *fp;
char *buffer,*str,*n,*s;
fpos_t start_fpos;
int filesize,count=0;
fp=fopen(argv[1],"r");
fgetpos(fp,&start_fpos);
fseek(fp,0,SEEK_END);
filesize=ftell(fp);
fsetpos(fp,&start_fpos);
buffer=(char *)malloc(sizeof(char)*filesize);
str=(char *)malloc(sizeof(char)*1000);
printf("検索する文字列を入力してください\n");
scanf("%s",str);
while(s=fgets(buffer,filesize,fp)){
count++;
n=strstr(buffer,str);
if(n){printf("%d行目 %s",count,s) };
}
free(buffer);
fclose(fp);
}

474:473
08/01/25 11:30:38
>473
csvファイル検索プログラムを作ったのですが、ファイル名にワイルドカードが使えないので
実用性にかけます。上記のプログラムにワイルドカードの組み込むにはどうすればいいでしょうか?
ただし、ファイル名はmain関数の引数で取得いたします。_findfirst,_findnextを使うところまでは
なんとなく理解しました。

475:デフォルトの名無しさん
08/01/25 11:34:25
>>474
環境は?
場合によっては wildargs とか使える場合もある

476:473
08/01/25 11:41:30
OSはCENTOS 5です。コンパイラにはgccを使っております。

477:デフォルトの名無しさん
08/01/25 11:56:10
ワイルドカードはどんなのを?
そのままだとシェルが勝手に展開しない?

478:デフォルトの名無しさん
08/01/25 11:57:55
>>473
またお前か。あちこちおかしなプログラムなのは相変わらずだな。
最低でも、バッファオーバフローの可能性は排除しておけよ。

479:473
08/01/25 12:20:12
>>477
*.csvとかですね。
そのままでは無理でした。

>>478
その件については、なんか知らんけどプログラムができあがりました。
あらかじめ指定されている仕様でしか作ったらいけないことになっておりまして、
どのようにすればそのようにできあがるのか悩まされている次第です。
一応さきほどのプログラムは作りましたが、io.hは無いそうで、_findnextも使えないですね。
こういうときそのヘッダファイルをダウンロードしてヘッダファイルがたくさんあるところに放りこめばいけますか

480:デフォルトの名無しさん
08/01/25 12:37:23
ヘッダだけ持ってきたって実装したライブラリが無きゃ無理だろ。
通常は、シェルが展開するんだが、、、opendir、readdir使って
正規表現で検索するとかしてみては

481:473
08/01/25 12:49:24
>>480
ありがとうございます。
階層を一段間違えておりました。
普通に通りますね。よかった・・・

482:デフォルトの名無しさん
08/01/25 13:31:29
>>472
int main() {
double d = 3.55; // ここの数字を変更する
int n = d * 100;
cout << n << endl;
return 0;
}
でも上記プログラムでは、浮動小数点の規格上、

d = 0.55, 1.55, 8.55 =>それぞれ0.5500000....1, 1.55000...1, 8.55000...1
とかになるので、100倍しても減ったように見えたりしない。
d = 2.55, 3.55, 4.55, 5.55, 6.55, 7.55 =>それぞれ2.5499999...などとなるので、
100倍すると、(double)254.99999==>(int)254などとなってしまう。

と理解していたのですが、他の方も書いてくれてたように、Visual C++ 2008でやると
d=3.55の時、355と表示されました。(gccは354)





483:デフォルトの名無しさん
08/01/25 17:29:42
VC++がx86の80ビット浮動小数点数レジスタを使い回すからかと思ったけど、
一旦64ビットでメモリに書きだすように仕向けてもやっぱり355になるな。

484:デフォルトの名無しさん
08/01/25 18:42:42
関数に配列へのポインタへ渡してデータょ書いてもらう場合
std::vector buffer(1024);
hogefunc(&buffer[0]);
とかくのは違法ですか?

485:デフォルトの名無しさん
08/01/25 18:47:47
確保したバッファサイズをはみ出さないのなら問題ない

486:デフォルトの名無しさん
08/01/25 19:08:51
private:な物の位置調べて無理やり書き込むわけだが。

487:デフォルトの名無しさん
08/01/25 19:19:56
そういうことができるように、
vectorは生の配列同様、要素の連続性が保証されている。

488:デフォルトの名無しさん
08/01/25 19:41:51
ぬるぽ渡せば書かずに文字数返すくらいしてくれてもいいよな。
これみたいに。
URLリンク(msdn2.microsoft.com)(VS.80).aspx

489:デフォルトの名無しさん
08/01/25 20:07:37
>>488
Win32APIスレの誤爆か?

490:デフォルトの名無しさん
08/01/25 20:51:13
inline int nazo(void)
{
 return __LINE__;
}

呼び出すと戻ってくるのはどこのあれですか?

491:デフォルトの名無しさん
08/01/25 20:52:04
そこ

492:デフォルトの名無しさん
08/01/25 20:59:02
たぶん3

493:デフォルトの名無しさん
08/01/25 21:01:39
__LINE__やら__FILE__やら__func__はコンパイル時に埋め込まれる

494:デフォルトの名無しさん
08/01/25 21:02:18
__func__ マクロじゃなくて定数だったはず。

495:デフォルトの名無しさん
08/01/25 21:09:16
ik88
ectuo\
}{([8
]\@p :
dcdc
dcdcdcfvfv7qa11111111111111111111111111111111
mnbcadcfvghujk,ol9iikurf4ed333333333333333331W2E3TR4G56







496:デフォルトの名無しさん
08/01/25 21:38:01
きーけぼーどのいちばんうきえらをうつと

12w3e4rgt5h6789o0:^\
!"#$G%H&'()~*=~|

とにゅうりょくされます。
こしょうですか?

497:デフォルトの名無しさん
08/01/25 21:41:14
pepper

498:デフォルトの名無しさん
08/01/25 21:55:26
スキンラインの短絡

499:デフォルトの名無しさん
08/01/26 03:17:03
APIについての質問です。
Visual C++ Express 2008で英単語印刷ソフトを作っているのですが、
ウインドウに、ネットの検索欄のような入力欄を作ることは可能でしょうか?
それを使って単語の検索機能などを追加したいのですが・・・。
もしよろしければ教授ください。

500:デフォルトの名無しさん
08/01/26 03:55:07
VCスレかAPIスレ池。

501:デフォルトの名無しさん
08/01/26 09:28:53
>>482
gccでも、-msse2オプションをつけてコンパイルすると、355を返すバイナリを作れました。
でも、80ビットでも、52ビットでも、切り捨てになるから、どちらでも同じと思うんですが。
なんでだろう。

502:デフォルトの名無しさん
08/01/26 11:06:09
>>501
>482のコードだけなら、最適化で定数は事前(≒コンパイル時)計算されるから不思議ではない。

503:デフォルトの名無しさん
08/01/26 20:29:17
>>502
以下のコードでも、dに3.55を入力すると、表示は354になりますが、
-msse2でコンパイルすると355になりました。

int main(int ac, char **av)
{
double d;
cin >> d;
int n = d * 100;
cout << n << endl;
return 0;
}


504:デフォルトの名無しさん
08/01/26 22:23:27
確認のために聞きたいんです
関数テンプレートについてなんですが。

template<typename T>
void func(){
 hoge = new T();
}
func<HogeClass>();

つう書き方に、何か問題はありますか?
一応BCCでは動いてるようなんですが、
検索しても基本的に引数のために使われていて、
こういう書き方を見つけられなかったので不安なんですが。

505:デフォルトの名無しさん
08/01/26 22:31:16
>>504
全然問題ない。それができないならテンプレートの魅力が半減ですよ。

506:デフォルトの名無しさん
08/01/26 22:48:00
>>505
どうもです。こういう使い方はやっぱり便利なんですね。
でも、混乱もしそう。使いこなせるよう精進します。

507:デフォルトの名無しさん
08/01/26 22:59:43
>>503
手元のgccだとそのコードでも355になるよ。354になるときの値をprintf("%.20g", d * 100)で出してみて。

508:デフォルトの名無しさん
08/01/27 03:55:57
C++ で、perl の Data::Dumper みたいなことするのがあれば
教えてください。

509:デフォルトの名無しさん
08/01/27 04:19:52
テキストファイルをchar型に読み込んだ場合って改行があったら\nもちゃんと格納されるの?

510:デフォルトの名無しさん
08/01/27 04:20:23
読み込みかたによる。

511:デフォルトの名無しさん
08/01/27 04:34:30
ありがとう。読み方によるのね
できれば\nが格納される読み方の例教えていただきたい

512:デフォルトの名無しさん
08/01/27 04:35:07
fgets

513:デフォルトの名無しさん
08/01/27 04:38:01
ファイルの開き方も重要じゃないか

514:デフォルトの名無しさん
08/01/27 04:42:08
>>512
ありがとうございます。
fgetsって\nの手前までしか格納されないかと思ってたけど\nもちゃんと入るんですね
とりあえず色々試してみることにします

515:デフォルトの名無しさん
08/01/27 04:44:40
gets以外なら大体¥nもコピーする。fgets、fgetln、テキスト指向ですらないfreadも勿論。というかgetsは絶対使わない方が良い。
C++は…誰かお願い。

516:デフォルトの名無しさん
08/01/27 07:26:38
C++でWindowsでのDLL作成に関して質問です。
C++のクラスをエクスポートする場合、純粋仮想クラスを利用するようですが、この際、
多重継承は可能なのでしょうか。具体的には以下のようなことをしたいのです。
class IFoo{
public:
virtual void fooFunc() = 0;
};

class IBar: public IFoo{
public:
virtual void barFunc() = 0;
}

class CFooFunc{
public:
virtual void fooFunc(){ /*...*/ }
};

class CBarFunc{
public:
virtual void barFunc(){ /*...*/ }
};

class CExport: public IBar, CFooFunc, CBarFunc{
};

__declspec(dllexport) IBar* createIBar(){
return new CExport();
}
__declspec(dllexport) IBar* deleteIBar( IBar* p ){
delete p;
}

517:デフォルトの名無しさん
08/01/27 09:21:25
>>511
istream& istream::get(char& c)
istreambuf_iterator
unsetf ios::skipws and istream_iterator

518:デフォルトの名無しさん
08/01/27 09:55:57
>>516
DLL でクラスを公開したいなら COM

519:デフォルトの名無しさん
08/01/27 12:57:31
COM なんて使いにくいもんじゃなくて
__declspec(dllexport) と __declspec(dllimport) を使おうぜ。
DLL と EXE で自動的に切り替えるマクロもあったけど忘れた。

520:デフォルトの名無しさん
08/01/27 14:30:07
C++の初心者向けサイトを教えてください


521:デフォルトの名無しさん
08/01/27 14:33:05
#ifdef PROJECTNAME_EXPORTS
# define DLL_EXPORT __declspec(dllexport)
#else
# define DLL_EXPORT __declspec(dllimport)
#endif

522:デフォルトの名無しさん
08/01/27 15:45:56
そういうやつ、自分で作らなくてもあったと思うけど、
自分で作った方が細かい制御ができていいかもしれん。

523:デフォルトの名無しさん
08/01/27 17:48:38
dllexportは所詮同じヴァージョンのコンパイラ相手でしか使えないからね。

524:デフォルトの名無しさん
08/01/27 18:11:43
しかし、COM は COM で色々と不便だからなあ・・・。
IA ← A の機能強化版として IB と B を別途作るとして、

 IA
↑ ↑
IB A
↑ ↑
 B

こういう継承したいけど無理っしょ?
仮想継承がないから・・・。

525:デフォルトの名無しさん
08/01/27 18:27:47
ATLみたいに実装をテンプレートに分離すれば解決しない?

526:デフォルトの名無しさん
08/01/27 23:15:08
wchar_t(unsigned char) に入ったUTF16の日本語を
ShiftJISに変換してxharに突っ込む処理を
STLだけで書くにはどう書けばいいですか?

527:デフォルトの名無しさん
08/01/27 23:26:27
std::codecvt使う例が
URLリンク(hw001.gate01.com)
にあるけど、UTF16、ShiftJISと指定した
std::codecvtをどう取得するのかは知らない

528:デフォルトの名無しさん
08/01/27 23:48:39
>>525
テンプレートは解決策の1つだとは思うけど、
ヘッダファイルに実装するのはどうもね・・・。
コードいじったときのコンパイル範囲が広くなると困るし。

529:デフォルトの名無しさん
08/01/28 00:07:40
OSに頼ったほうが安全

530:デフォルトの名無しさん
08/01/28 00:09:31
>>524
そのIAをIUnknown、Aを適当なインタフェースに置き換えれば、そんな例は山ほどある。

Aの実装をソースコードの形で手に入れられるなら、
普通にIBとAを多重継承して、細かいところを整えればいける。

531:デフォルトの名無しさん
08/01/28 00:28:36
>>530
むむっ。詳しくお願いします。

532:デフォルトの名無しさん
08/01/28 01:31:57
>>530
要は、本来Bでオーバーライドする必要のない関数も、B内から手動でAの実装を呼ぶようにすればいい。
インタフェースはメンバ変数ないから、キャスト関係くらいしか仮想継承の有無の違いはないといっても過言ではない。
struct IA : IUnknown {virtual HRESULT STDMETHODCALLTYPE FnA() = 0;};
struct A : IA {
    virtual HRESULT STDMETHODCALLTYPE QueryInterface(IID&, void**) {/*実装*/}
    virtual ULONG STDMETHODCALLTYPE AddRef() {/*実装*/}
    virtual ULONG STDMETHODCALLTYPE Release() {/*実装*/}
    virtual HRESULT STDMETHODCALLTYPE FnA() {/*実装*/}
};
struct IB : IA {virtual HRESULT STDMETHODCALLTYPE FnB() = 0;};
struct B : A, IB {
    virtual HRESULT STDMETHODCALLTYPE QueryInterface(IID&, void**);
    virtual ULONG STDMETHODCALLTYPE AddRef() {return A::AddRef();}
    virtual ULONG STDMETHODCALLTYPE Release() {return A::Release();}
    virtual HRESULT STDMETHODCALLTYPE FnA() {return A::FnA();} //オーバーライドしない気なら
    virtual HRESULT STDMETHODCALLTYPE FnB() {/*実装*/}
};
HRESULT STDMETHODCALLTYPE B::QueryInterface(IID& riid, void** ppv) {
    if (ppv == 0) {
        return E_POINTER;
    } else if (riid == IID_B)     {
        *ppv = static_cast<IB*>(this);
        AddRef(); //直接A::AddRef()でも可
        return S_OK;
    } else {
        return A::QueryInterface(riid, ppv);
    }
}
Javaのインタフェースの仕様だとBでのAddRef以下のようなことを書く必要がなかった気がする、ちょっとうらやましい。


533:デフォルトの名無しさん
08/01/28 01:34:43
委譲するわけですか。
うーん。委譲のコストが少し気になってしまいますね。
そんなもんなんでしょうか。

534:デフォルトの名無しさん
08/01/28 13:31:23
自分クラスに大小比較の演算子を定義して、<=を使おうと思ったら、
<と==の2つを定義するのではなく、<=を定義しないとだめだったのですが、
そういうものなのですか?


535:デフォルトの名無しさん
08/01/28 13:33:46
そういうものです。
そもそも、'<='が「小なりイコール」であると言う意味から再定義するわけですから。

536:デフォルトの名無しさん
08/01/28 13:35:16
>>534
つ[boost::operators]

537:デフォルトの名無しさん
08/01/28 14:14:23
>>534
以下は違う関数だからねえ
operator<()
operator=()
operator<=()
<=を使うということはoperator<=()をコールするわけで。

538:デフォルトの名無しさん
08/01/28 16:23:28
>>535-537
ありがとうございます。じゃあ自分クラスについては、なるべく「<=」は使わずに
<と==でなんとかするようにします。
boost::operatorsは、<と==をconst関数で定義して、publicでboost::operatorsを
継承すれば動きました。かなり便利そう。
ありがとうございました。

539:デフォルトの名無しさん
08/01/28 18:45:01
typedef struct { .... } hoge_struct;

#define TARGET_STRUCT hoge_struct
#define TARGET_STRUCT_STR ????????????

printf("type: %s\n", TARGET_STRUCT_STR );
printf("size: %d\n", sizeof(TARGET_STRUCT) );

表示
type: hoge_struct
size: 40

TARGET_STRUCTにあるhoge_struct部分は、任意の構造体名です。(色々変化します)
TARGET_STRUCT_STRが "hoge_struct" に(文字列)なるようにしたいのですが、
どんなマクロにすればいいのでしょうか?

540:デフォルトの名無しさん
08/01/28 18:52:07
言葉足らずでした。
型名であるTARGET_STRUCTを元に、文字列なTARGET_STRUCT_STRを作りたいという意味です。

541:デフォルトの名無しさん
08/01/28 18:58:47
# TARGET_STRUCT

542:デフォルトの名無しさん
08/01/28 19:11:51
>>541 ありがとうございました。

543:デフォルトの名無しさん
08/01/28 19:28:58
>>538
なんとかするとかじゃなくて「<」と「==」から「<=」を作ればいいじゃんか。
「<」と「==」が定義されてるならば「<=」は↓のようになる。
return A < B || A == B;
boost::operatorsは内部でそういうことをやってるだけ。


544:デフォルトの名無しさん
08/01/28 21:53:36
 よろしくお願いします。
 項書き換えを行うシステムを作るにあたって、今式の構造を木構造で表すことを考えています。
式は中値記法で書かれているので、基本的には一般的な構文木のように作ろうと思っています。
具体的には、ある内部ノードには演算子を格納し、その左と右の子供に項を格納するような2分木です。
 2項演算を表現するのにはこれで十分なのですが、 (X, Y, Z) のような三つ組みも表現しなければならないのです。
子供を3つ持つような木を作って、三つ組みを表現するときだけ3つ目の子供に項を格納すれば表現は可能になるのですが、
頻繁に三つ組みが現れるわけではないので、余分な子供はあまり持たせたくないと思っています。
 2分木で三つ組みを表現するうまい方法はないでしょうか。


545:デフォルトの名無しさん
08/01/28 21:56:16
演算子 A を考える場合に

   A1
   ∧
   X A2
    ∧
    Y Z

みたいにすればいいんじゃない?

546:デフォルトの名無しさん
08/01/28 22:00:04
単項演算子で無駄なノードが発生するのは別に構わんのん?

547:デフォルトの名無しさん
08/01/28 22:01:13
各ノードはふたつのポインタをもち、
それぞれは、
・自分の子供のひとつ(長男)
・自分のすぐ下の弟
を指すようにすれば2分木でいくらでも子供を持てる。
これは木構造を作るのに定番の方法なので覚えておくといいよ。

548:デフォルトの名無しさん
08/01/28 22:44:46
Visual Studio 2005なんですが、vector型の変数で名前をarrayにしたら、変数名が青くなってました。

intみたいに予約語なのかなとも思ったんだけど、特に問題なく動くんですが、青くなるのはなんでなんでしょう?

549:デフォルトの名無しさん
08/01/28 22:50:10
>>548
arrayはCLR配列の予約語だからじゃない?

550:デフォルトの名無しさん
08/01/28 22:59:40
>>549
即レスありがとうございます!
ほうほう、CLR配列で調べると確かに予約語っぽいですね。でも問題なしと考えてよいんでしょうか。

ついでにうかがいたいんですが、ちょい前までVC++6.0でつくっていたソースコードがあって、関数の引数にbool型をつかっていました。

そのソースを2005でダイアログベースで作っているプロジェクトで利用しようと思ったんですが、チェックボックスのValueがBOOL型になってまして、そのまま関数の引数にぶち込むと、次のように怒られました。

>warning C4800: 'BOOL' : ブール値を 'true' または 'false' に強制的に設定します (警告の処理)

これはどうすればよいんでしょう?

551:デフォルトの名無しさん
08/01/28 23:02:56
BOOL変数?true:false
とか。BOOLってintだからなー。
TRUE/FALSEの代わりに「エラー値」が入ってたりするし。

552:デフォルトの名無しさん
08/01/28 23:09:57
>>551
うわぁお!!

すげー、通りました、感動しています。

しかし6.0から2005にするといろいろ戸惑いますね。作業効率が半分くらいになった感じです。

553:デフォルトの名無しさん
08/01/28 23:37:08
>>545
 そうですね、こちらでも考えましたが、このような木の構造にするしかなさそうですね。

>>547
 アドバイス有り難うございます。
処理系を作るときに、こういう形で構文木を作るとネストされたリストも簡単に表現できるということで、
勉強したことがありました。確かに自分もよく使います。

 お二方、どうも有り難うございました。

554:デフォルトの名無しさん
08/01/29 00:09:40
>>552
6.0から2005だと色々変えないといけないところが出てくるだろうな。
new 失敗した時デフォで NULL 返すような古いコンパイラだからなあ。
まあ、変更が終われば大した違いはなくなると思うぜ。

555:デフォルトの名無しさん
08/01/29 00:46:03
LONG a=適当;
LONG b=適当;
LONG c=適当;

if(a*a + b*b > c*c) {
}

とした時に、
a*a等がLONGに収まる範囲を超えてしまったら、
どうなるのでしょうか?

556:デフォルトの名無しさん
08/01/29 00:56:45
>>555
LONGがlongのtypedefなら未定義

557:デフォルトの名無しさん
08/01/29 01:22:40
STLでウィンドウへ作ったり絵を描くクラスはどこにありますか?

558:デフォルトの名無しさん
08/01/29 01:23:49
ありません
gilを使ってください

559:555
08/01/29 01:32:29
>>556
Win32APIを使ったプログラムで、
LONGは<windows.h>に定義されているモノです。たぶん。
未定義というのは、どうなるか分からないということですか。

560:デフォルトの名無しさん
08/01/29 01:33:46
世界ランク14位おめw
URLリンク(2chcity.myminicity.com)

ランク   国名      街             人口  (前日比)  前日
--- 1   US1      LUELand         326354 (+211)   326143
--- 2   US2      GoonTown        179482 (+711)   .178771
--- 3   Germany1  .isnichwahr.de       119091 (-654)   119745
--- 4   US3      CreateMyCity Forum  .87380  (+1982)   85398
--- 5   Poland1    #debian.pl         79594  (+1043)   .78551
--- 6   Germany2  upOTia             52443  (+399)    52044
--- 7   France1    Reze'Les Nantes     .41960  (+246)    41714
--- 8   Canada1   J-C Satanas & CO   .40995  (+721)    40274
--- 9   US4      retromundi        .40604  (+788)    39816
--- 10  France2    FanaZ           .39902  .(+1268)   38634
2↑ 11  Germany3   deluxebits         38770  .(+3199)   35571
1↓ 12  US5      .isnichwahr.at        .38234  (+78)    38143
1↓ 13  France3    gravure-news       .37204  .(+765)    36439
2↑ 14  Japan1     2ch_city          35637  .(+1970)   33667
1↓ 15  Spain1     Media-Vida         .35205  .(+686)    34519
1↓ 16  France4    Sguy            .35083  .(+1456)   33626
2↓ 17  Ireland1    .prapikilty          .35067  .(+871)    34196
--- 18  Spain2     benidaver         .34505  .(+914)    33591
--- 19  Germany4   directupload       ..32490  .(+82)    .32408
-↑ 20  Slovakia1    Legionar City       32056

561:デフォルトの名無しさん
08/01/29 01:36:39
>>559
そういうことです。

562:デフォルトの名無しさん
08/01/29 05:15:49
doubleとintの丸め誤差について質問しているものです。
SSE2命令で計算するとどうして3.55*100が355になるのか、どうしてもわかりません。
IEEEの仕様どおりの浮動小数点の計算方法だと、レジスタのサイズが52でも80でも128でも
doubleの3.55は実際には2.54999999...となってしまうと思うのですが、、、
gccでSSE2命令を有効にして作成したバイナリの逆アセンブルの結果をみると、
<元ソース>
int main(void) {
double d = 3.55;
int n = d * 100;
printf("%d", n);
}

<続く>

563:デフォルトの名無しさん
08/01/29 05:17:36
<続き>
<main関数の逆アセンブル結果>
80483c4: 8d 4c 24 04 lea 0x4(%esp),%ecx
80483c8: 83 e4 f0 and $0xfffffff0,%esp
80483cb: ff 71 fc pushl -0x4(%ecx)
80483ce: 55 push %ebp
80483cf: 89 e5 mov %esp,%ebp
80483d1: 51 push %ecx
80483d2: 83 ec 24 sub $0x24,%esp
80483d5: dd 05 d8 84 04 08 fldl 0x80484d8
80483db: dd 5d e8 fstpl -0x18(%ebp)
80483de: dd 45 e8 fldl -0x18(%ebp)
80483e1: dd 05 e0 84 04 08 fldl 0x80484e0
80483e7: de c9 fmulp %st,%st(1)
80483e9: dd 5d e0 fstpl -0x20(%ebp)
80483ec: f2 0f 2c 45 e0 cvttsd2si -0x20(%ebp),%eax
<以下はprintfを呼んでいるだけと思うので略>
をみてもなんでこうなるのか全然わかりません。
cvttsd2siの命令が、「64ビット倍精度実数を整数値に変換して汎用レジスタに
コピーします。」という内容らしいので、この動作がキモと思うのですが、これは
中でどういう動作をしてるのだろう。誰かご存知ありせんか?

長々とすいませんどうかよろしくお願いします。


564:デフォルトの名無しさん
08/01/29 05:26:47
When a conversion is inexact, a truncated (round toward zero) result is returned.
と書いてあるから3.54になるはずなのに変だねえ。

565:デフォルトの名無しさん
08/01/29 08:06:51
>>563
逆アスじゃなく、gccのアセンブリ出力を載せてくれ。0x080484d8なんてアドレス書かれてもなんだか判らん。

566:デフォルトの名無しさん
08/01/29 09:06:52
>>565
すいません。Cのコードは先のものと同じです。
main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %ecx
subl $36, %esp
fldl .LC0
fstpl -24(%ebp)
fldl -24(%ebp)
fldl .LC1
fmulp %st, %st(1)
fstpl -32(%ebp)
cvttsd2si -32(%ebp), %eax
movl %eax, -12(%ebp)
movl -12(%ebp), %eax
movl %eax, 4(%esp)
movl $.LC2, (%esp)
call printf
<以下略>


567:デフォルトの名無しさん
08/01/29 09:35:25
だから、どうして.LC0とか.LC1の定義も省略するのかなぁ……

568:デフォルトの名無しさん
08/01/29 10:46:51
>>563
> cvttsd2siの命令が、「64ビット倍精度実数を整数値に変換して汎用レジスタに
> コピーします。」という内容らしいので、この動作がキモと思うのですが、これは
> 中でどういう動作をしてるのだろう。誰かご存知ありせんか?

ここまでくるとCPUアーキテクチャマニュアル見ないとわからん。
Intelのサイトにあると思うが、日本語であるかどうかわからん。


569:デフォルトの名無しさん
08/01/29 11:03:35
CVTTSD2SI--Convert with Truncation Scalar Double-Precision Floating-Point Value to Signed Doubleword Integer

F2 0F 2C /r  xmm/m64 切り捨てを使用して、xmm/m64の 1 つの倍精度浮動小数点値を r32 の 1 つの符号付きダブルワード整数に変換する。

説明
ソース・オペランド(第 2 オペランド)の 1 つの倍精度浮動小数点値を、デスティネーション・
オペランド(第 1 オペランド)の 1 つの符号付きダブルワード整数に変換する。ソース・オペ
ランドは、XMM レジスタまたは 64ビットのメモリ・ロケーションである。デスティネーショ
ン・オペランドは汎用レジスタである。ソース・オペランドが XMM レジスタの場合は、倍精
度浮動小数点値はレジスタの下位クワッドワードに置かれる。
変換が不正確な場合は、切り捨てられた(ゼロに丸められる)結果が返される。変換の結果が
符号付きダブルワード整数の最大値より大きくなる場合は、整数不定値(80000000H)が返さ
れる。

570:デフォルトの名無しさん
08/01/29 12:08:40
本当にありがとうございます。

自分もマニュアル見てみました。
結局動作としては、
1)3.55を80bitのレジスタ上で表現する。レジスタ上では3.55よりもわずかに小さい数として存在
2)fmulp命令を使って、1)の結果と100の積を計算する。
3)上の2)の結果をcvttsd2si命令を使ってint型に変換
になると。
>変換が不正確な場合は、切り捨てられた(ゼロに丸められる)結果が返される。
354.99999..からintへの変換はどう考えても「変換が不正確な場合は、」に該当すると思うのですが、
切り捨てると、354になると思うんですが、、、


571:デフォルトの名無しさん
08/01/29 12:54:22
何度もすいません。

-msse2付きでコンパイルしても、不正確になってしまうケースがありました。
int main(void) {
double d = 32.55;
int n = d * 100;
printf("%d\n", n);
return 0;
}
あとは、512.55, 513.55とか、8192.55, 8193.55とか。(これ以外にもかなり多い)
SSE2を使ったところで完全ではないようだし、なんだか不毛な感じもしてきた。
3.55については、たまたまSSE2で上手く計算できたケース、ということかな、と。


572:デフォルトの名無しさん
08/01/29 13:05:19
>>571
>567
手元の多桁演算処理に喰わせてみようと思うのだが……

573:デフォルトの名無しさん
08/01/29 13:12:09
私の所でOptimization(最適化)レベルを切り替えて実験してみた所
-O0で354、-O1で355になりました。
コンパイラはg++3.4.5です。

ソースコードをのぞいてみると、-O0は律儀に計算していましたが、
-O1の方はいきなり定数355をロードして終了していました。

574:デフォルトの名無しさん
08/01/29 13:12:41
.file "IEEE1.c"
.def ___main; .scl 2; .type 32; .endef
.section .rdata,"dr"
LC2:
.ascii "%d\12\0"
LC3:
.ascii "pause\0"
.text
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
andl $-16, %esp
movl $16, %eax
call __alloca
call ___main
movl $355, 4(%esp) ←これ
movl $LC2, (%esp)
call _printf
movl $LC3, (%esp)
call _system
movl $0, %eax
leave
ret
.def _system; .scl 2; .type 32; .endef
.def _printf; .scl 2; .type 32; .endef

575:デフォルトの名無しさん
08/01/29 20:52:37
std::vectorを使った場合で指定した添え字番号のオブジェクトを消す方法ってありますか?

576:デフォルトの名無しさん
08/01/29 20:58:18
vec.erase(vec.begin() + i);

577:デフォルトの名無しさん
08/01/29 22:19:04
C言語って1から覚えるとなると難しいでしょうか?

プログラム関係の職(未経験可)どうしてもやってみたくて
就こうと思ってるんだけど理系学校出てないから無謀かな…

スレ違いだったら凄くすいません…

578:デフォルトの名無しさん
08/01/29 22:21:27
まぁアレだ。プログラマ板で聞けばいいんじゃね

579:デフォルトの名無しさん
08/01/29 22:22:16
>>577
どんな人も1から覚えるわけだが。

580:デフォルトの名無しさん
08/01/29 22:26:36
パソコンとインターネット環境持ってるなら、ただでプログラミングの
勉強できるから、やってみればいいんじゃないか。

難しいかどうかは、人によるからなんとも言えない。

また、理系かどうかは思ったより関係ない。

ただし、数字アレルギーとか英語まったく読む気ないですぅとか言うなら、
やめた方がいいと思う。

581:デフォルトの名無しさん
08/01/29 23:00:31
でも、ひでーアルゴリズムのコードを見ると、
理系ってのも大事だなあと思う。

582:デフォルトの名無しさん
08/01/29 23:06:11
>>578
プログラマ板か…、予備知識無くここにカキコんじゃったからな…
次からそっちで聞いてみます

>>579
まぁそうなんですよね…<どんな人も1から
それを承知で聞いてみたんで

>>580
色々サイト巡りして知識付けようとはしてます
数字アレルギーは全く無いけど、英語が学校成績で常に2付近だったから
それが不安材料でヤバイってのは承知済み…orz

今度からプログラマ板でも行ってカキコしてみます

レスどうもでしたm(__)m



583:デフォルトの名無しさん
08/01/29 23:12:35
プログラミング関係の英語ドキュメントなんて複雑な文法とか表現使ってないから学校の成績はほとんど関係ない

584:デフォルトの名無しさん
08/01/29 23:14:29
俺も数学と英語は毎回赤点だったが今では必要なだけは出来るようになったぞ。
まあ相性と経験次第。

585:デフォルトの名無しさん
08/01/29 23:44:01
>>581
理系でもひでー奴はいくらでもいる。

>>582
> 英語が学校成績で常に2付近だったから

>>580 をよく読んでくれ、英語ができないんじゃなくて、
「英語をまったく読む気がない」ならって書いてあるだろ。

君が必要に迫られたら何とかするタイプなら、心配はない。

>>583-584 が言うように、そんなに高レベルの英語が出て
くるわけじゃないし、しかもラッキーなことにここ数年で
機械翻訳がそれなりに進化して、技術文書ならなんとなく
意味が理解できるぐらいなってきたから、あまり心配しな
くても大丈夫だよ。

586:デフォルトの名無しさん
08/01/29 23:44:45
質問させてください。以下のソースをコンパイルしたところ、エラーが吐かれたのですが、その理由が良く分かりません。

#include <fstream>
#include <TCHAR.h>
#include <string>
#include <sstream>

using namespace std;
class zantei{
private:
  // 行動データ構造体
  class Action
  {
  public:
   int No; // 行動番号 (無しなら0)
   LPTSTR Type; // 行動種類 (無しなら0)
   LPTSTR Detail; // 行動詳細 (無しなら0)
   int Damage; // ダメージ(無しなら100)
   LPTSTR Color; // 色 (無しなら0)
   int X; // マルチプレイ用の遠距離行動(無しなら0)
  };
  Action action[32];
public:
  BOOL LoadAction();
};

587:デフォルトの名無しさん
08/01/29 23:45:15
エラー:
・error C2146: 構文エラー : ';' が、識別子 'Type' の前に必要です。
・以下、変数Typeが認識されないためと思われるエラー他たくさん(24個)

全角スペースや、Typeが実は予約語だったんじゃないかとも疑いましたが、
空白はすべて半角スペースとタブ入力でしたし、TypeをiやNumに変えても同じエラーが出ました。
…ということは、完全に知らないことか、思い至っていないことによるエラーだと思われる、ということまでは考えることはできました。
どなたかご教授いただけないでしょうか。

588:デフォルトの名無しさん
08/01/29 23:45:50
ほほう
何というコンパイラで、何というメッセージが吐かれたのだい?

589:デフォルトの名無しさん
08/01/29 23:50:01
コンパイラは、Visual Studio 2005 Academic Editionです。
エラーは、>>587以外もかくとすると…、ちょっと多いので、少々お待ちください。

590:デフォルトの名無しさん
08/01/29 23:51:06
>>586
そのコピペは全角だらけやな

591:デフォルトの名無しさん
08/01/29 23:51:32
このエラーだと、通常は Type の直前にある物がおかしいんだが、
tchar.h はインクルードしてあるしな・・・。
TCHAR が大文字でも何か起きると思えないし。

592:デフォルトの名無しさん
08/01/29 23:54:24
もしかすると、
#include <windows.h>
が無かったりだったりとか?


593:デフォルトの名無しさん
08/01/29 23:54:26
>>587
全角が入ってる。間違いない。絶対だ。

594:デフォルトの名無しさん
08/01/29 23:54:56
エラー 2 error C2146: 構文エラー : ';' が、識別子 'Type' の前に必要です。
エラー 3 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
エラー 4 error C4430: 型指定子がありません - int と仮定しました。
エラー 5 error C2146: 構文エラー : ';' が、識別子 'Detail' の前に必要です。
エラー 6 error C4430: 型指定子がありません - int と仮定しました。
エラー 7 error C4430: 型指定子がありません - int と仮定しました。
エラー 8 error C2146: 構文エラー : ';' が、識別子 'Color' の前に必要です。
エラー 9 error C4430: 型指定子がありません - int と仮定しました。
エラー 10 error C4430: 型指定子がありません - int と仮定しました。
エラー 11 error C2146: 構文エラー : ';' が、識別子 'LoadAction' の前に必要です。
エラー 12 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
エラー 13 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
警告 14 warning C4183: 'LoadAction': 戻り値の型がありません。'int' を返すメンバ関数とみなします。

これよりしたのエラーは、LoadAction()の実装部分で吐かれているエラーです。

595:デフォルトの名無しさん
08/01/29 23:55:00
>>592
そうか。撤回する。

596:デフォルトの名無しさん
08/01/29 23:55:42
>>594
全角入りのソースでそれと同じエラーを見たぞ。

597:デフォルトの名無しさん
08/01/29 23:56:36
全角はチェックしてるって書いてあるだろw

598:デフォルトの名無しさん
08/01/29 23:57:21
まず、LPTSTR を char* にしてコンパイルは通るか?
それをチェックしてみようぜ。

599:デフォルトの名無しさん
08/01/29 23:57:31
うーん、それじゃ、ちょっとソースをあっぷしてみますね

全角半角スペースを表示させても全角はは行っているようにみえないですが…
見落としかもしれないですし

600:デフォルトの名無しさん
08/01/29 23:57:43
あ、いや、wchar_t* か。

601:デフォルトの名無しさん
08/01/29 23:58:03
>>598
あ、はい、分かりました

602:デフォルトの名無しさん
08/01/30 00:01:02
マルチバイト文字セットに変えてchar*型、一応w_char*型にしてみても、
同じエラーが吐かれました(確認したのは大体のエラーの見た目と数だけですが)

ソースをアップする作業に入りますね

603:デフォルトの名無しさん
08/01/30 00:01:27
w_char じゃなくて wchar_t だぜ

604:デフォルトの名無しさん
08/01/30 00:17:01
お待たせしました。
URLリンク(www.youlost.mine.nu)
の、2968.zipです。

うp用に、配置しなおしたら、エラーが増えて涙目になってました(汗
他のアプリケーション用に書いてたものを、エラーはかれていたソースファイルを別プロジェクトでテストしながらなおそうとしたため、
プロジェクト別フォルダから読み込む方式になっています。
ヘッダがプロジェクトに入っていないのは、…えー、ごめんなさい、忘れました、試行錯誤の過程です。
いずれヘッダも戻すつもりではいました。
…ごめんなさい。

605:デフォルトの名無しさん
08/01/30 00:28:00
zantei の最後にセミコロンがない。

606:デフォルトの名無しさん
08/01/30 00:29:01
game.h の方のやつね。

607:デフォルトの名無しさん
08/01/30 00:31:11
「最大50文字で自然数を2つ入力し、その大小を求めるプログラムを作成せよ」
って問題なんですが、プログラム作ってみたけどわかりません
文字数が同じときの結果がめちゃくちゃになりました
誰かこのおしえてください(><)
cout << "文字数a:" << a_count << endl ;
cout << "文字数b:" << b_count << endl ;
if(a_count > b_count){
cout << "a>b" << endl ;
}else if(a_count < b_count){
cout << "a<b" << endl ;
}else if(a_count == b_count){
cout << "文字数が一緒なので一桁ずつ判断します" << endl ;
for(int i=0 ; i < a_count ; i++){
if(a[a_count-i] == b[a_count-i]){
cout << a[a_count-i] << "=" << b[a_count-i] << endl ;
}else if(a[Max_Length-i] != b[Max_Length-i]){
break ;
}
}
if(a[a_count-i] > b[a_count-i]){
cout << "a>b" << endl ;
}else if(a[a_count-i] < b[a_count-i]){
cout << "a<b" << endl ;
}
}
}

608:デフォルトの名無しさん
08/01/30 00:32:38
a[a_count-i-1]

609:デフォルトの名無しさん
08/01/30 00:33:17
(><)

610:607
08/01/30 00:34:08
#include <iostream.h>
#include <iomanip.h>
const int Max_Length = 50 ; // 入力できる文字数の最大値
main()
{
char a[Max_Length] ; // 最初に入力する文字列
char b[Max_Length] ; // あとに入力する文字列
cout << "2つの自然数(最大50桁)を入力し、" << endl ;
cout << "その2数の大小を判定するプログラムです" << endl ;
cout << "数値を入力してください(最大50桁)" << endl ;
cout << "a>>" ;
cin.getline( a , Max_Length ) ;
cout << "b>>" ;
cin.getline( b , Max_Length ) ;
int a_count , b_count ; // 文字カウンタ
int i , j ;
a_count = 0 ;
b_count = 0 ;
i = 0 ;
j = 0 ;
// 文字数をカウントする
while(a[i] != '\n' && a[i] != '\0'){
a_count++ ;
i++ ;
}
while(b[j] != '\n' && b[j] != '\0'){
b_count++ ;
j++ ;
}

611:デフォルトの名無しさん
08/01/30 00:34:14
iostreamマジ見にくい

612:607
08/01/30 00:35:02
610が先で、607が続きです(><)

613:デフォルトの名無しさん
08/01/30 00:35:21
入力できる文字数の最大値が 50 なら、バッファは 51 以上必要だね。

614:デフォルトの名無しさん
08/01/30 00:40:17
std::lexical_compare使え

615:デフォルトの名無しさん
08/01/30 00:44:48
すみません、元からこんなに早くリアクションがくれると思っていなかったので、
質問してすぐ風呂に入る予定だったため、
アップロードしてしばらく返事がなかったので、急いでお風呂に入っていたため、反応が遅れました。
申し訳ありません。

>>605-606
ありがとうございます!

セミコロンを直し、game.hをプロジェクトを追加し、gamemain.cppにgame.hをインクルードし、
gamemain.cppのクラス宣言部分をコメントアウトしてコンパイルしましたが、
結局
error C2146: 構文エラー : ';' が、識別子 'Type' の前に必要です。
がヘッダで吐かれてしまっています…
ここの部分を改善する、考えられるミスはありませんでしょうか…

616:デフォルトの名無しさん
08/01/30 00:50:24
>>607
ヘッダファイルは <iostream.h> や <iomanip.h> ではなく
<iostream> や <iomanip> を使用する事が推奨されている。
cout とかが std::cout とかになっちゃうのが嫌なら、
この程度のプログラムなら using namespace std; と書いておけば std:: を略せる。
古いコンパイラなら知らんがね。

最大 50 文字なら、a のサイズは Max_Length + 1 にする。

cout の後 cin をする際には、cout を flush した方がいい。
cout << "a>>" << flush;
でないと、表示されない事もある。

getline は改行文字を格納しない。改行との比較は無駄。
50 文字以上入力したら次の cin.getline が失敗するのは無視してもいいのかな。宿題程度なら。
cin.clear(); して、改行まで読み飛ばすか構わず cin.getline するか・・・。

文字数カウントは strlen で可能だが、まだ習ってないのかな。
i と j という変数を作らなくても、直接 a_count と b_count 使えばいい。
while 文より for 文使った方がすっきりする。

i が 0 ~ a_count - 1 のループでは、
a_count - i は a_count ~ 1 になる。
これは意図する所ではないはず。
そして、a[Max_Length-i] != b[Max_Length-i] で何をやろうとしているのか分からないし、
このあたり全体的にちとおかしいと思う。
もうちょっとよく考えよう。

617:デフォルトの名無しさん
08/01/30 00:51:00
>>615
TCHAR.h → tchar.h

618:デフォルトの名無しさん
08/01/30 00:51:46
全角だろ。間違いない。全角なんだ。

619:デフォルトの名無しさん
08/01/30 00:53:17
>>615
風呂の予定なんかどうでもいい。
しかも二回も風呂って書きやがって。
風呂はゆっくり入れ。


620:デフォルトの名無しさん
08/01/30 00:54:03
インクルードガードがないのもすげー気になるが、
これだけのヘッダファイルだと BOOL は定義されてなくね?

621:デフォルトの名無しさん
08/01/30 00:54:56
#include <cstddef>
#include <tchar.h>

622:デフォルトの名無しさん
08/01/30 00:55:17
>>616
たくさんありがとうございます!
考え直してもういっかい来ます

623:デフォルトの名無しさん
08/01/30 00:58:12
>>615
とりあえず windows.h をインクルードしとけ。

624:デフォルトの名無しさん
08/01/30 00:58:29
#include <iostream>

int main(void)
{
    const int max_str = 50 + 1;
    char str1[max_str], str2[max_str];    
    std::cout << "数値a入力>";
    std::cin >> str1;
    std::cout << "数値b入力>";
    std::cin >> str2;

    int len1, len2;
    for( len1 = 0; len1 < max_str; ++len1 ){
        if( str1[len1] == '\0' )
            break;
    }
    for( len2 = 0; len2 < max_str; ++len2 ){
        if( str2[len2] == '\0' )
            break;
    }


625:デフォルトの名無しさん
08/01/30 00:59:29
    std::cout << "数値a 文字数:" << len1 << std::endl;
    std::cout << "数値b 文字数:" << len2 << std::endl;
    if( len1 == len2 ){
        std::cout << "文字数が一緒なので一桁ずつ判断します" << std::endl;        
        for( int i = 0; i < max_str; ++i ){
            if( str1[i] == str2[i] )
                continue;
            else if( str1[i] > str2[i] )
                std::cout << "a > b" << std::endl;
            else
                std::cout << "a < b" << std::endl;                
            break;
        }
    }else if( len1 > len2 )
        std::cout << "a > b" << std::endl;
    else
        std::cout << "a < b" << std::endl;

}

>>612
総書き直しすれば簡単

626:デフォルトの名無しさん
08/01/30 00:59:38
>>617
提案ありがとうございます。すみません、でもとおりませんでした
>>618
エディタでトリプルチェックしましたが、やはり全角はありませんでした…
>>619
う…(苦笑)。すみません、お気遣いありがとうです。
>>620
windows.hをインクルードすれば定義されるでしょうか?
>>621
これは、BOOLのヘッダでしょうか。すみません、レスを先にして、試してきます。

627:デフォルトの名無しさん
08/01/30 01:00:18
>>624
std::cin >> str1;

バッファオーバーフロー一直線!!!

628:デフォルトの名無しさん
08/01/30 01:02:38
>>625
無茶苦茶やな・・・。

629:デフォルトの名無しさん
08/01/30 01:04:36
>>621
試してみたら、エラーが13に減りました!
でも、
>>623
windos.hをインクルードしたら、もっと減りました(10)!

あとは、game.hに、using namespace std;をかけば、通りそうな雰囲気です。
ありがとうございました。
一応、最後に通るか確認してきますね。 

630:デフォルトの名無しさん
08/01/30 01:05:22
>>629
ヘッダファイルで決して using しないと俺と約束してくれ。

631:デフォルトの名無しさん
08/01/30 01:08:29
>>630
ごめんなさい。
gamemain.cppの方でした。
そして、通りました!皆さん本当にありがとうございました。そして、お騒がせしました!

ちなみに、ヘッダファイルでusingすると、どんな弊害がおきるのでしょう?
ちょっと考えれば分かるかもしれない気はするので、失礼な質問でしたらすみません。

あと、<TCHAR.h>より、<tchar.h>をお勧めになった理由もお教えいただけないでしょうか?

632:デフォルトの名無しさん
08/01/30 01:10:41
本来 tchar.h という名前のファイルだから気になっただけ。

ヘッダで using して、色々インクルードしまくってると、
どこで using されているかさっぱり分からない状態になる。
using されては困る状況が現れた時、どの using が原因で困ってるか分からない。

633:デフォルトの名無しさん
08/01/30 01:12:45
触っちゃダメよと言われてるヘッダファイルで using されてると泣くしかない。

634:デフォルトの名無しさん
08/01/30 01:16:32
usingされているヘッダファイルをインクルードすると、
その名前空間がインクルードしたファイルにもusingされてしまう、ということでしょうか?

それとも、usingされてると、呼び出すときに、どの名前空間に所属しているのが分かりにくくなり、
数が膨大になったときに、エラーからたどりにくくなる、ということでしょうか?

…後者ですよね?

635:デフォルトの名無しさん
08/01/30 01:17:47
両方。

636:デフォルトの名無しさん
08/01/30 01:21:19
おあ、両方ですか。
前者も、ということになると、確かに本当にヘッダファイルでusingしてしまう(されてしまう)と、困ってしまいますね。
絶対にヘッダファイルでusingしないと、>>630さんと指きりしてお約束します。

ありがとうございました!

637:デフォルトの名無しさん
08/01/30 01:24:53
namespace isolate { // isolate using directives and declarations
#include "hoge.h" // has using directives or declarations
}
using isolate::Hoge; // declared in hoge.h, and want to use in this source

と無理矢理隔離してみたり。

638:デフォルトの名無しさん
08/01/30 01:28:40
なるほど

639:デフォルトの名無しさん
08/01/30 01:46:32
STLとATLではどちらを覚えたほうがいいですか?

640:デフォルトの名無しさん
08/01/30 01:50:28
STL: どの環境でも使える
ATL: Windows でしか使えない

641:デフォルトの名無しさん
08/01/30 01:54:30
STL: 誰も使ってない
ATL: 90%くらいの環境で使える

642:デフォルトの名無しさん
08/01/30 01:57:43
両方覚えろよ

643:デフォルトの名無しさん
08/01/30 03:04:22
Windowsでプログラミングするなら両方。
そうじゃないならSTL。

644:デフォルトの名無しさん
08/01/30 03:39:23
>>642に一票

645:デフォルトの名無しさん
08/01/30 05:46:40
てゆーか二者択一するようなもんじゃないだろwwwww

646:デフォルトの名無しさん
08/01/30 07:02:37
関数内でnewでchar型の動的確保をしたいんだけど、他の全ての関数でもその宣言した
char型のを使えるようにするにはどうすればいい?

647:デフォルトの名無しさん
08/01/30 07:06:10
ごめん文章が変だったので追記
要するに関数内でnewで宣言したcharをグローバル変数みたいな感じで使いたい

648:デフォルトの名無しさん
08/01/30 07:07:01
外部変数にchar*型のポインタ用意してそこに代入すれば?

649:デフォルトの名無しさん
08/01/30 07:16:06
>>648
ああそうか。それでいけたw
staticみたいなので全範囲で使えるようになるのないかなって探してたよ
ありがとう

650:デフォルトの名無しさん
08/01/30 07:31:28
C++で開発をする際、他言語以上にいつもクラス設計で悩まされます

何かそこらへんを専門的に取り扱ったおすすめの本はないでしょうか?

651:デフォルトの名無しさん
08/01/30 15:11:37
ATLにSTLのコンテナ使う仕掛けが合ったよな。

652:デフォルトの名無しさん
08/01/30 15:12:25
有った

653:デフォルトの名無しさん
08/01/30 15:30:11
C言語の質問です。コンパイラはgccです。

while(fgets(buffer,filesize,fp)){
flug=strstr(buffer,str);
if(flug!=NULL)puts(flug);
}

これでなぜ出力文字列が検索できないのでしょうか。
教えてくださいませんか?

私の頭の中ではまず改行までのファイルの一行をbufferに読み込む。
その後、bufferに格納されている文字列とstr(検索したい文字列)を比較して検索。
その返り値がflugに入るので、NULLポインタ以外(失敗)のflugは出力。
これで検索した値からの文字列が出力されると思っておりました。

654:デフォルトの名無しさん
08/01/30 15:40:40
cin.getline
って文字列を入力させるときに使うの?
普通に50桁の配列に数字を入れたいときって
cin >> a[50]
でいいのかな??

655:デフォルトの名無しさん
08/01/30 15:43:25
きもい

656:デフォルトの名無しさん
08/01/30 15:49:42
>>653
その部分だけじゃわからん。
つーか、その部分に問題は無い。

657:デフォルトの名無しさん
08/01/30 15:50:58
>>653
・flugという変数名がキモい
・filesizeは本当にbufferが指すバッファのサイズ?

buffer, filesize, str の宣言や初期化などを詳しく開示しましょう。


658:デフォルトの名無しさん
08/01/30 17:03:00
>> 654
getlineの使い方(ファイルからの一行単位の読み込み)
string line;
ifstream ifs(filename);
while (getline(ifs, line)) {
lineには一行がはいってる。
}

> cin >> a[50];
これでは配列aの51番目の要素に代入してるだけでは?



659:デフォルトの名無しさん
08/01/30 18:54:56
>>658
やっぱりだめなんですね・・
cin>>a[50]
だと50桁も入力できないんです
ありがとうございました

660:デフォルトの名無しさん
08/01/30 19:19:46
例外がcatch{}の中では生存していると仮定して
関数でnew | malloc した文字列を返して
デストラクタでdelete[] | freeするのはありですか?

661:デフォルトの名無しさん
08/01/30 19:29:05
言っている意味が分からん。
コードで書いてくれ。

662:デフォルトの名無しさん
08/01/30 19:47:17
エスパーな俺が翻訳すると、

catch内で作ったインスタンスでもデストラクタは呼ばれるのか?

ではないかと。

663:デフォルトの名無しさん
08/01/30 19:59:41
ふつうにわかるだろ

664:デフォルトの名無しさん
08/01/30 20:03:22
>>660
文字列クラス返せば?

665:デフォルトの名無しさん
08/01/30 21:42:46
>>659
「桁」が何のことか分からん
配列のサイズのことならfor引数足してまわせばいいだけ
50桁の数値(10の50乗とか)を扱いたいなら普通には無理

666:デフォルトの名無しさん
08/01/30 21:43:28
引数じゃなかった添え字だ

667:デフォルトの名無しさん
08/01/30 22:27:02
自作クラス内に、CreateWindowというメソッドを作りたいんですが、エラーが出てしまいます。
エラーメッセージを見るとどこかで定義されてるようなんですが、
クラス内は独立した名前領域で、同じ関数名を使えるのではないのですか?
どなたか、回答をお願いします。

668:デフォルトの名無しさん
08/01/30 22:29:10
>>667
windows.h から同名のマクロが include されているのかも知れない

669:デフォルトの名無しさん
08/01/30 22:32:01
回答ありがとうございます。
windows.hは確かにインクルードしていました。
windows.hをインクルードしないわけにはいかないし、
CreateWindowという名称を使うのはあきらめたほうがよさそうですね。

670:デフォルトの名無しさん
08/01/30 23:10:41
すみません、質問です.
C++言語のソースを読んでいて、疑問に感じた所があります。
struct Hoge{
unsigned Wakeup(void) const { return wakeup_time; }
Hoge(Container& container);
~Hoge();
private:
unsigned int hoge_time;
Container& fuga;
};

これ構造体ですよね?クラスみたいですけど・・・。
本を読んだりしてクラスと構造体はまったく別物と認識していたんですが。
混乱しています。

671:デフォルトの名無しさん
08/01/30 23:12:12
C++では同じ
違いはデフォルトのアクセスがpublicな事

672:デフォルトの名無しさん
08/01/30 23:19:54
>>670
実装は同じだけど、考え方としては区別したほうが良いんじゃないかな、

673:デフォルトの名無しさん
08/01/30 23:21:02
>>671
もうちょい違うっしょ。

674:デフォルトの名無しさん
08/01/30 23:21:53
メンバ変数を public にした方が何かと便利そうなのは構造体に、
そうでないのものはクラスに。
そう考えると、自然と構造体を使う状況は限定される。

675:デフォルトの名無しさん
08/01/30 23:23:22
>>673
デフォルトで public 継承になる、というやつのことか?

676:デフォルトの名無しさん
08/01/30 23:30:12
テンプレート絡み。

677:デフォルトの名無しさん
08/01/30 23:32:36
最近どこかで目にした流れだな

678:デフォルトの名無しさん
08/01/30 23:36:09
はい、STLスレの受け売りです。

679:デフォルトの名無しさん
08/01/30 23:38:38
だからテンプレート引数の話とここの話とは
ちょっと違うんじゃないか、と。

680:670
08/01/30 23:43:33
C++だと若干の違いはあるにせよ、classの代わりにstructと書くこともできるんですね。
ありがとうございました。

681:デフォルトの名無しさん
08/01/31 00:26:32
newで多次元配列分の確保ってできない?
char *c;
int p=20;
c=new char[p][255];
こんな感じでしたいんだけどこれだとエラーでる

682:デフォルトの名無しさん
08/01/31 00:26:53
char (*c)[255] = new char[p][255];

683:デフォルトの名無しさん
08/01/31 00:32:46
>>682
ありがとうございます。原理はよく分からないけどできました
勉強してきます

684:デフォルトの名無しさん
08/01/31 00:36:46
配列へのポインタを使ってる。
typedef 使うと多少分かりやすいかと。

typedef char BUF[255]; // BUF は char 型 255 要素の配列型
BUF *c = new BUF[p];

やっぱそうでもないか。

685:デフォルトの名無しさん
08/01/31 00:40:26
つまり、char 型 255 要素の配列を p 個確保して、
c[i] とすると i 個目の配列が得られ、
c[i][j] とするとその配列の j 番目の要素にアクセスできる、と。

686:デフォルトの名無しさん
08/01/31 00:53:06
>>684-685
分かり易くありがとうございます。何となく分かったような気がする
とりあえずもう一度newについて再勉強してきます

687:デフォルトの名無しさん
08/01/31 01:23:02
newでもmallocでも同じだよ

688:デフォルトの名無しさん
08/01/31 04:56:35
template <int N, typename T>
struct array_str {
T array[N];
T &operator[](int n) {
return array[n];
}
};
int p = 20;
const int ssize = 255;
vector< array_str<ssize,char> > c(p);
として、以下のように使う方法は?
c[1][1];


689:デフォルトの名無しさん
08/01/31 05:15:04
>>688 使い方を示しながら使い方を聞く意味がわからん。

690:デフォルトの名無しさん
08/01/31 05:19:04
proxy classの話かな?

691:デフォルトの名無しさん
08/01/31 05:37:32
this->template func<type>(arg); という書き方を見たんですが、
this->func<type>(arg); との違いを教えてください。

692:デフォルトの名無しさん
08/01/31 05:48:03
>>691
template付けないとエラーでコンパイルできない場合がある。
.演算子、->演算子、::演算子の後ろにメンバテンプレート特殊化の
名前があり、それがテンプレート仮引数に属している場合がそう。

693:デフォルトの名無しさん
08/01/31 05:52:19
>>691
テンプレート内で、 this の型がテンプレート引数に依存するとき、前者のように
template を明示しないと、コンパイラは this->func<type という部分を
(this->func) < (type) のような比較式と認識してしまう。

694:デフォルトの名無しさん
08/01/31 08:21:51
"ab"でaとbの間に「"」を入れたい場合って「"a""b"」でおk?

695:デフォルトの名無しさん
08/01/31 08:23:28
>>694
"a\"b"

696:デフォルトの名無しさん
08/01/31 08:23:51
\"

697:デフォルトの名無しさん
08/01/31 08:29:43
ありがとう。あぶなく間違って使うところだった

698:デフォルトの名無しさん
08/01/31 09:05:56
まぁやったところで別に問題はないけどね、表示されないだけで

699:デフォルトの名無しさん
08/01/31 09:07:00
確かになw

エスケープを "" で表現するのって、どこの文化だっけ?
どっかで見た気はするんだが。

700:デフォルトの名無しさん
08/01/31 09:46:44
昔のBASICだろ

701:デフォルトの名無しさん
08/01/31 09:50:26
だっけか。全然覚えてないや。

702:デフォルトの名無しさん
08/01/31 10:45:56
試しにVBでやってみたら通ったわ。""

703:デフォルトの名無しさん
08/01/31 11:36:23
演算子の優先度と結合規則がいまいちよく分かりません。
下の式を意味が変わらない範囲でカッコを外すとどうなりますか?

a = ( b *= ( ( c+d ) << e ) )

( ( * ( a[b] ) ) . c ) -> d

( a - ( ( b-c ) * d ) ) - e

( + ( ++a ) ) + ( ( b&c ) << ( d+e ) )

( ( ( * ( a.b ) ) . c ) -> d ) ++

あと下の4つは順序を明確にするためにカッコを付ける問題です。

a + b * c - d

a <<= b << c <= d

a = b &= c ==d

* a . b * c


参考になるサイトとかありますか?アドバイスお願いします。

704:デフォルトの名無しさん
08/01/31 11:39:36
参考になるのは優先順位表
高低だけじゃなくて、右左にも注意

705:デフォルトの名無しさん
08/01/31 13:06:37
テスト問題とか、与えられた式を最適化するようなプログラムを作っているのでなければ
素直にカッコをつけておくというのはどうだろうか。

前提無視ですね、すみません。

706:デフォルトの名無しさん
08/01/31 13:40:09
言語仕様とはちょっと違うけど今でもDB2のSQLは文字列中の"を""で表すぞ

707:デフォルトの名無しさん
08/01/31 15:44:34
>>703
そんなの、K&Rにかいてあるだろ

708:デフォルトの名無しさん
08/01/31 19:40:40
ビット演算の優先順位をちゃんと把握してる人なんてそんないないわ。

709:デフォルトの名無しさん
08/01/31 20:09:03
>>703
優先順位がわかりにくいときは括弧つければいいと思うよ。別にかっこ悪くないと思うよ
括弧減らしてもバグが増えたら意味が無いしな。


710:デフォルトの名無しさん
08/01/31 21:35:35
VC++8使ってるんですけど、グローバルスコープの関数ってやっぱり
::CreateWindowEx とかスコープ演算子つけた方が良いのですか?
ネットにあるサンプルコードだと、両方見かけますが…

711:デフォルトの名無しさん
08/01/31 21:42:54
boostを使わずにstringの文字列を小文字の文字列に変換するにはどうすればよいですか?


712:デフォルトの名無しさん
08/01/31 22:06:34
>>711
string str("HeLLo");

for (int i = 0; i < str.size(); i++) {
str[i] = tolower(str[i]);
}
cout << str.c_str() << endl;
 あまりよろしくないかも。

713:デフォルトの名無しさん
08/01/31 22:12:35
std::transform(str.begin(), str.end(), str.begin(), tolower);

714:デフォルトの名無しさん
08/01/31 22:20:35
ざんねん、あなたのじっそうでは、tolowerは、「まくろ」だった

715:デフォルトの名無しさん
08/01/31 22:30:15
hoge.hで
// 構造体
struct POI{
int n;
float x;
};

// クラス
class hoge
{
public:
hoge(void ); // コンストラクタ
~hoge( void ); // デストラクタ
private:
POI poi[4];
};

と書き、
hoge.cppの
hogeコンストラクタ上で
poiの初期化を行いたいのですがうまくいきません。
今下のようにやっているのですがどのように直せばいいのでしょうか、どうぞよろしくお願いします。

poi = {
{ 1 , 0.5 },
{ 1 , 0.5 },
{ 1 , 0.5 },
{ 1 , 0.5 },
};



716:デフォルトの名無しさん
08/01/31 22:30:29
そ、そんな実装もあるのか・・・。

717:デフォルトの名無しさん
08/01/31 22:31:24
for(int i = 0; i < sizeof poi / sizeof *poi; ++i) {
poi[i].n = 1;
poi[i].x = 0.5;
}

718:デフォルトの名無しさん
08/01/31 22:37:12
>>710
好きなほうでどーぞ

719:デフォルトの名無しさん
08/01/31 22:40:15
>>715
poi = {
{ 1 , 0.5 },
{ 1 , 0.5 },
{ 1 , 0.5 },
{ 1 , 0.5 },
};
その形式が使えるのは宣言時だけなので
>>717
みたいにしないといけません

720:715
08/01/31 22:40:59
>>717
できれば
poi = {
{ 1 , 0.5 },
{ 1 , 0.5 },
{ 1 , 0.5 },
{ 1 , 0.5 },
};

こういう風に一括でやりたいのですがこれは無理なのでしょうか?

721:715
08/01/31 22:42:07
>>719
すいません、見逃しました。

そうですか、わかりました。ご丁寧にありがとうございます。

722:デフォルトの名無しさん
08/01/31 22:43:14
>>720
POI poi_src[] = {
{ 1 , 0.5 },
{ 1 , 0.5 },
{ 1 , 0.5 },
{ 1 , 0.5 },
};
std::copy(poi_src, pos_src + sizeof poi_src / sizeof *pos_src, poi);

723:デフォルトの名無しさん
08/01/31 22:44:45
POI poi_src[sizeof poi / sizeof *pos] = { ... };

とサイズ指定してた方が安全か。

724:デフォルトの名無しさん
08/01/31 22:45:24
それでもC++0xなら、C++0xならなんとかしてくれる……

725:デフォルトの名無しさん
08/01/31 22:47:00
static const POI poi_src[sizeof poi / sizeof *pos] = { ... };

とした方がいいか。

726:デフォルトの名無しさん
08/01/31 23:06:46
>>713
ありがとうございます。でもコンパイル通りません。
下のソースだと、
char my_tolower(char s) {
return tolower(s);
}
int main() {
string s = "Hello world";
transform(s.begin(), s.end(), m.begin(), toupper); // コンパイル通らない
transform(s.begin(), s.end(), m.begin(), my_tolower); // コンパイル通る

下のような結果になります。
test.cpp:14: error: no matching function for call to 'transform(__gnu_cxx::__normal_iterator<char*,
std::basic_string<char, std::char_traits<char>, std::allocator<char> > >,
__gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >,
__gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >,
<unresolved overloaded function type>)'


727:デフォルトの名無しさん
08/01/31 23:08:32
>>726
>>714 ということか。

728:デフォルトの名無しさん
08/01/31 23:10:03
何かオーバーロードされてるのか・・・

729:デフォルトの名無しさん
08/01/31 23:12:44
>>726
transform(s.begin(), s.end(), m.begin(), static_cast<int(*)(int)>toupper);

730:デフォルトの名無しさん
08/01/31 23:20:45
>>714
両方あるんじゃなかったっけ?

731:デフォルトの名無しさん
08/01/31 23:26:50
インクルードするヘッダによって違わなかったっけ

732:デフォルトの名無しさん
08/01/31 23:46:02
両方あるなら (tolower) でいいってことか

733:デフォルトの名無しさん
08/01/31 23:46:41
#undef tolowerじゃだめなの?

734:デフォルトの名無しさん
08/02/01 00:00:42
>>732
括弧無くても大丈夫だな。
後ろに ( ) がついてないから。

それにしても、うちの gcc じゃ >>726 みたいなエラーでないんだがなあ。
バージョンが違うのか。

735:デフォルトの名無しさん
08/02/01 00:11:15
tolower(int)のほかに、tolower(char)とかtolower(wchar_t)とかあるんでしょ。

736:デフォルトの名無しさん
08/02/01 00:20:07
Cとの互換関数だから、規格的にオーバーロード出来ないと思うが。

737:デフォルトの名無しさん
08/02/01 00:20:08
なら static_cast<int(*)(int)>(tolower) とかしないといけないのか。
面倒臭いな。

738:デフォルトの名無しさん
08/02/01 00:43:56
<locale>かどこかに、第2引数にロカールをとるバージョンがあったと思う。

739:デフォルトの名無しさん
08/02/01 00:45:47
古いヘッダ .h なら通るんだよな
謎だ

740:デフォルトの名無しさん
08/02/01 01:22:21
>>730
Cでは、関数に加えてマクロを用意しても良かったが、
C++だとそれは認められていない。
(JIS X3014:2003では17.4.1.2の6段落目。更に注(159)で明確に指摘されている)

741:デフォルトの名無しさん
08/02/01 01:28:39
double pai(){
double i,imax,n;
double x,y,pi;

n=0.0;
imax=10000000.0;
for(i=0;i<=imax;i++) {
x=rand()/(RAND_MAX+1.0);
y=rand()/(RAND_MAX+1.0);
if((x*x+y*y)<1.0) {
n+=1.0;
}
}
pi=n/imax*4.0;
return pi;
}
double px(double t){
double pi=pai();
double x,ans;
ans=exp(-x*x/2t)/sqrt(2*pi*t);
return ans;
}
としたら
エラー E2121 kadai1.c 27: 関数呼び出しに ) がない(関数 px )
と出ましたorz
誰か解決策わかるようでしたら教えてください(;´Д`)

742:デフォルトの名無しさん
08/02/01 01:34:28
exp(-x*x/2t)/sqrt(2*pi*t);

2t?

743:デフォルトの名無しさん
08/02/01 01:43:52
あとx初期化してないよね。

744:デフォルトの名無しさん
08/02/01 01:44:15
c++でswitch文のcaseの中では変数宣言できないですか

745:デフォルトの名無しさん
08/02/01 01:46:26
case HOGE:
{ int t = 0;}
break;

ブロックで囲めばいいんじゃね


746:741
08/02/01 01:58:11
>742
解決しましたw
あざす!!

747:デフォルトの名無しさん
08/02/01 03:31:40
>>745
こっちも解決しました。ありがとう酢。



748:デフォルトの名無しさん
08/02/01 18:16:42
空を自由に飛びたいな
はーい つLSD

749:デフォルトの名無しさん
08/02/01 19:11:19
LoadLibraryでもらったHMODULEはCloseHandleで処分できますか?


750:デフォルトの名無しさん
08/02/01 19:24:52
どこで質問すればいいのかわからないほどくだらない質問なのですが、
よく引数であるchar* pszMessageのpszってどういう意味ですか?
Pointer Stringはわかるんですが、Zがいったいなんなのか・・・

751:デフォルトの名無しさん
08/02/01 19:27:11
zはzero、szはヌル終端文字列のこと。

752:デフォルトの名無しさん
08/02/01 19:29:52
pointer string zero-terminated

753:749
08/02/01 19:30:06
間違えました。

754:デフォルトの名無しさん
08/02/01 19:31:13
>>751-752
なるほど・・ゼロでしたか
謎がとけました、ありがとうございます!

755:デフォルトの名無しさん
08/02/01 21:29:40
c++のプログラムを書いてます。
コンソールからstringを入力させたいのですが、getline()とcinを併用すると
何回目かのcinがユーザの入力待ちにならずにそのまま長さゼロの入力を受け取った
と誤解して処理が先に進んでしまうようです。何かフラッシュとかの処理が必要なので
しょうか?

756:デフォルトの名無しさん
08/02/01 22:01:29
エラーが発生したなら
cin.clear(); するまで関数に失敗するが、
そういうわけではなくて?

757:デフォルトの名無しさん
08/02/02 01:13:42
Pointer to a String terminated by Zero

758:デフォルトの名無しさん
08/02/02 01:38:32
std::map<CString, CComPtr<ID3DXFont>> fonts;
に問題はありますか?

759:デフォルトの名無しさん
08/02/02 01:39:47
エラーが出なければ問題は無い。
エラーが出るなら問題。

760:デフォルトの名無しさん
08/02/02 01:41:21
質問させてください.
c言語でscanfで入力を受けるプログラムをつくりました.
バッチファイルとかシェルスクリプトで入力してやりたいのですが、つまづいています.
要するに、
(実行ファイル)enter(入力)enter
では無く、
(実行ファイル)(入力)enter
のような感じに書く方法がありますか?ということです.


761:デフォルトの名無しさん
08/02/02 01:46:08
int argc, char* argv[]
でググれ。

762:デフォルトの名無しさん
08/02/02 01:48:35
>>760
そのレベルは……ぐぐるとかじゃなくて、本を読んできちんとした知識を身に付けた方が良いよ。
いや、マジで……

763:デフォルトの名無しさん
08/02/02 01:54:08
>>758
STLのこんてなにオートポインタの類入れると

764:デフォルトの名無しさん
08/02/02 01:59:29
とりあえず>>だとコンパイルエラーになったりするので> >にしとけ。

765:デフォルトの名無しさん
08/02/02 02:37:31
760です.確かに知識は無いです.
実は数値計算だったので簡単に済ませたかったんです.
リダイレクトでパラメータをいれる代わりに、
そのまま数値を書く方法があるのかなと思って質問してみたんですが.

どうやら場違いでした.

766:デフォルトの名無しさん
08/02/02 03:34:39
ウィンドウつくったり図を表示したりするのってWin32API勉強しないとできない?

767:デフォルトの名無しさん
08/02/02 03:49:03
>763
std::aut_ptrが例外的にダメなオートポインタで、
大抵のスマートポインタは入れても大丈夫じゃねーの。

768:デフォルトの名無しさん
08/02/02 12:09:24
VC6 だが、std::vector に CComPtr 入れると
resize でアサーションエラーが出た。

769:デフォルトの名無しさん
08/02/02 12:31:21
intrasive_ptr?だっけ?
まさにCOMみたいに自前でカウントしてるクラス用のスマポ

770:デフォルトの名無しさん
08/02/02 12:46:10
string型の変数の中身をlistコンテナに一文字ずつ移そうとしてます。
for_each(string.begin(), string.end(), XXXX);
みたいにfor_eachを使って書けないでしょうか?


771:デフォルトの名無しさん
08/02/02 12:49:16
push_backとmem_fun_ptr

772:デフォルトの名無しさん
08/02/02 12:50:12
mem_fun_refだったorz

773:デフォルトの名無しさん
08/02/02 13:03:58
これはだめ?
std::list<char> l;
std::copy(string.begin(), string.end(), std::back_inserter(l));

774:デフォルトの名無しさん
08/02/02 14:48:54
std::list<char> l(s.begin(), s.end());
または
l.assign(s.begin(), s.end());
だろ。

775:デフォルトの名無しさん
08/02/02 15:35:03
for_each(s.begin(), s.end(), mem_fun_ref(v.push_back));
ということですか?
でもこれはコンパイルできなかった。

776:デフォルトの名無しさん
08/02/02 16:06:20
>>775
>>773は正しい処理だが、
効率が悪いということじゃないの?

初期化の話だよな?

>>775
そりゃ、あらゆる点で無理だ。

777:デフォルトの名無しさん
08/02/02 16:16:22
v.push_backではなくて&std::list<char>::push_backだろ
まあstd::back_inserterを使うのが最適なわけだが

778:デフォルトの名無しさん
08/02/02 16:18:57
最適は774だって。 EffectiveSTL嫁。

779:デフォルトの名無しさん
08/02/02 16:20:27
元の質問は for_each が使いたいらしいから、 >777 でも間違いではない。

780:デフォルトの名無しさん
08/02/02 16:51:44
>>777
それでもダメ。引数の数が一致しない。
せめてbind1stを使えといいたいところだが
ほとんどの実装でunary_functionで参照の参照が
発生してはじかれる。


781:デフォルトの名無しさん
08/02/02 16:55:14
>>778
範囲指定のイテレータか

782:デフォルトの名無しさん
08/02/02 17:07:39
ぶっちゃけ、メンバ関数をforeachみたいな連中に渡すのは
面倒くさいのでboost使おう、という話になるw

783:デフォルトの名無しさん
08/02/02 17:11:23
だからfor_each使わずに>>774でいいって。

784:784
08/02/02 19:38:53
質問です。

//正規分布を求めるメソッド
float BestFitInfo::norDis(float x, float mean, float var){

return 1 / ( sqrt( 2 * 3.14 ) * sqrt(var) ) *

exp( - (x - mean) * ( x - mean ) / ( 2 * var ) );
}

//BestFitInfoというクラスを作って、
//正規分布を求めるメソッドを書いたところ、

warning C4244: 'return' : 'double' から 'float' への変換です。データが失われる可能性があります。

と言われました。すべて引数は float だし、
exp や sqrt の戻り値もそれに合わせて float のはずなので、
どこで double 型が発生しているのかわかりません。

なぜこのようなエラーとなっているのでしょうか?
分かる方がいらっしゃいましたら教えてください。
よろしくお願いします。

785:デフォルトの名無しさん
08/02/02 19:45:47
>>784
>exp や sqrt の戻り値もそれに合わせて float のはずなので、
本当か?
floatのはsqrtfとかexpfじゃないのか?
あと、3.14はdouble型だ。float型リテラルは3.14fと書く。

786:784
08/02/02 19:59:47
785さん、お返事ありがとうございます。

3.14fと書いたら「データが失われる可能性があります」と言われなくなりました。

sqrtについて調べたところ、

double sqrt(
double x
);
float sqrt(
float x
); // C++ only
long double sqrt(
long double x
); // C++ only
float sqrtf(
float x
);

このように sqrt は多重定義されているようです。
sqrtf はC言語のときの名残のようですね。

解決しました。みなさまありがとうございました。

787:デフォルトの名無しさん
08/02/02 22:11:07
質問です
僕はインクルードガードシンボルにuuidを含ませる事があるんですが
Cのプリプロセッサで処理するシンボルは最大何文字までいけるんでしょう?
#define HOGEHOGEHOGEHOGEHOGEHOGEHOGEHOGEHOGEHOGEHOGEHOGEHOGEHOGE
ぐらいのものは処理できるならまぁ十分なんですが気になります
あと変数名や名前空間名も何文字までいけるか気になります
ADLバリアを使うと結構文字数増えますし、
もしあまりに少ない文字数(例えば31文字)だったとしたら怖いんで

788:デフォルトの名無しさん
08/02/02 22:23:36
プリプロセッサの制限はわからんけど、
C89までは厳密には識別子は先頭6文字位じゃなかったっけ
C99で32文字になったような気がしないでもない

789:デフォルトの名無しさん
08/02/02 22:39:22
プリプロセッサの制限はわからんけど、

内部識別子は最低32
外部が8くらいだったと思う。6かもしれん。
VC6なんかでは外部256とかで、複雑なtemplateとかで警告が出るね。

790:デフォルトの名無しさん
08/02/02 22:40:07
あ、これはC89ね

791:デフォルトの名無しさん
08/02/02 23:21:31
完全にうろ覚えだけど、マクロ名などの内部識別子は、
C89が31文字で、C99は63文字だったと思う。

792:791
08/02/02 23:50:16
C++98ではCにはあったtranslation limitの既定がなくなって、長さに制限はないと明記されているね。
付録のBで内部外部ともに1024文字以上を推奨ってことになってる。(これは一応調べてきた

793:デフォルトの名無しさん
08/02/03 00:14:52
クラスあったら構造体いらないと思うんですが、構造体で宣言する利点って何ですか?

794:デフォルトの名無しさん
08/02/03 00:20:15
メッセージループ(DispatchMessage)に入る前にウィンドウプロシージャにメッセージが飛んでしかも処理されてるっぽいんですが
当たらしく作られた別スレッドで動いてるんですか?このウィンドウプロシージャってやつは

795:デフォルトの名無しさん
08/02/03 00:26:14
ある種のAPIは、直接プロシージャを呼び出して配送する。
有名なのは、UpdateWindowのWM_PAINTなど。

796:デフォルトの名無しさん
08/02/03 00:32:13
ほかにもWM_CREATEやそれより前にやってくるメッセージはCreateWindow(Ex)内部で呼ばれるし、
Send系で送る場合も同一スレッドなら直接呼ばれる。

797:デフォルトの名無しさん
08/02/03 00:33:50
>>795
ああ、なるほど、そういうことですか
そういうパターンをすっかり見落としてました

798:デフォルトの名無しさん
08/02/03 00:37:05
>>793
ただの構造体が欲しいときかな。
たとえば
APIにパラメータを渡したいとき。
ハードウェアをアクセスするとき
オフセットをがっちりあわせたいとき




次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch