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

このエントリーをはてなブックマークに追加
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。

【初心者歓迎】C/C++室【環境依存OK】
http://pc5.2ch.net/tech/kako/1059/10590/1059041347.html
【初心者歓迎】C/C++室 Ver.2【環境依存OK】
http://pc5.2ch.net/tech/kako/1067/10671/1067189450.html
【初心者歓迎】C/C++室 Ver.3【環境依存OK】
http://pc2.2ch.net/test/read.cgi/tech/1069719929/ (消滅?)
【初心者歓迎】C/C++室 Ver.4【環境依存OK】
http://pc2.2ch.net/test/read.cgi/tech/1073473867/ (消滅?)
【初心者歓迎】C/C++室 Ver.5【環境依存OK】
http://pc5.2ch.net/test/read.cgi/tech/1077102238/

【ラウンジ】質問が長い時はココを使うと便利
http://do.sakura.ne.jp/%7Ejunkroom/cgi-bin/megabbs/lounge/index.html
【関連スレ(処理系別)】
★初心者にVisual C++を教えるスレ★ Part11
http://pc5.2ch.net/test/read.cgi/tech/1077965179/l50
C++Builder相談室 Part9
http://pc5.2ch.net/test/read.cgi/tech/1080541814/l50
GCCについて part3
http://pc5.2ch.net/test/read.cgi/tech/1072484422/l50
Turbo C++ 5.0 プログラミング
http://pc5.2ch.net/test/read.cgi/tech/1030878794/l50
タダで使えるBorland C++ Part3
http://pc5.2ch.net/test/read.cgi/tech/1054390397/l50
タダで使えるVisual C++
http://pc5.2ch.net/test/read.cgi/tech/1082177340/l50
Borland C++ BuilderX
http://pc5.2ch.net/test/read.cgi/tech/1065260556/l50
■ VisualC++(MFC限定)相談室 MFC10.dll■
http://pc5.2ch.net/test/read.cgi/tech/1074104008/
【関連スレ(処理系別)】
★初心者にVisual C++を教えるスレ★ Part11
http://pc5.2ch.net/test/read.cgi/tech/1077965179/l50
C++Builder相談室 Part9
http://pc5.2ch.net/test/read.cgi/tech/1080541814/l50
GCCについて part3
http://pc5.2ch.net/test/read.cgi/tech/1072484422/l50
Turbo C++ 5.0 プログラミング
http://pc5.2ch.net/test/read.cgi/tech/1030878794/l50
タダで使えるBorland C++ Part3
http://pc5.2ch.net/test/read.cgi/tech/1054390397/l50
タダで使えるVisual C++
http://pc5.2ch.net/test/read.cgi/tech/1082177340/l50
Borland C++ BuilderX
http://pc5.2ch.net/test/read.cgi/tech/1065260556/l50
■ VisualC++(MFC限定)相談室 MFC10.dll■
http://pc5.2ch.net/test/read.cgi/tech/1074104008/
【関連スレ(その他)】
C言語なら俺に聞け! Part 76
http://pc5.2ch.net/test/read.cgi/tech/1081597375/l50
C++相談室 part29
http://pc5.2ch.net/test/read.cgi/tech/1082047479/l50
ぼるじょあがC/C++の宿題を片づけますYO! 21代目
http://pc5.2ch.net/test/read.cgi/tech/1078157730/l50
【C++】template 統合スレ -- Part3
http://pc5.2ch.net/test/read.cgi/tech/1066493064/l50
プリプロセッサについて熱く語るスレ。
http://pc5.2ch.net/test/read.cgi/tech/1058203590/l50
タダで最強!フリーC/C++コンパイラ
http://pc5.2ch.net/test/read.cgi/tech/1035882599/l50
C統合・質問スレッド
http://pc5.2ch.net/test/read.cgi/tech/1068359871/l50
くだらない質問でもべっちょ偉そうに聞いていいスレ
http://pc5.2ch.net/test/read.cgi/tech/1069530956/l50
スレ立て乙!
もつ鍋
関連スレ
タダで使えるVisual C++
http://pc5.2ch.net/test/read.cgi/tech/1082177340/l50
>>7
>>2に入れてあるから心配するな。
初心者すぎる質問ですがおながいします。

ボーランドC++コンパイラをダウンロードしてインストールしました。
WinXPで、環境変数のところに「C:\borland\bcc55\Bin」を追加しました。

早速、適当なプログラムを作ってみたのですが、
エラーE2209 が出て、インクルードファイル stdio.h をオープンできないとなってしまいました。

プログラムのソースは

#include <stdio.h>

int main (void)
{
printf ("hello\n");
return 0;
}

です。おながいします。
bcc32.cfgとかilink32.cfg作れ。詳しくはreadme.txt嫁。
>>9
http://www.cmagazine.jp/beginner/bcc/
[設定ファイルの作成]
bcc32.cfg
ilink32.cfg
129:04/04/17 23:02
>>10
>>11
禿げしくありがとうございます。
ちゃんとコンパイルできて、実行されました。
少しずつ勉強してみます。
13デフォルトの名無しさん:04/04/18 05:46
C言語の質問です。

ある関数内でmallocし、その関数から抜ける前にfreeしたいのですが、
関数内には条件分岐でreturnする部分が数ヶ所あります。この場合、どう書くのが
一番きれいなのでしょうか?

具体的には
---------------------------
int func()
{
void *p=NULL,*q=NULL;
....
if(...)
return a;
....

p=malloc(...);

....
if(...)
return b;
....
q=malloc(...);
....
/* 続く */
1413:04/04/18 05:46
/* >>13の続き */
for(...){
for(...){
if(...)
return c;
}
if(...)
return d;
}
...
free(p);
free(q);
return e;
}
--------------------------
みたいなものを書きたいのですが、このままだと、条件によってはp,qがfreeされません。
どうすれば、きれいに確実にメモリをfreeできるのでしょうか。

1513:04/04/18 05:47
一応、自分で考えたのは、

(1) return の前にfreeを付ける。
--- 付け忘れる可能性がある。見にくくなる。

(2) funcを包み込む関数(仮にdo_func)を用意して、do_funcでfuncを呼び出しとfreeを行う。
( p,q をglobal変数にしたり、 func に void **型で渡したり)
--- global変数はなるべく増やしたくない。二つの関数間で共有するためだけにglobal変数を使いたくない。
void **型にすると、func内で *p のような書き方をしなければならず、見にくい。

(2') (2)と似ているが、do_func側でmallocもしてしまう。
--- func実行開始時点では mallocするサイズが決まっていないので、うまくいかない。

(2'') (2') と似ているがサイズが決まる前の部分をdo_funcに書いてしまう。
--- 一つの機能が二つの関数に分かれてしまうのは嫌

(3) return を全て goto に変える。
--- なんとなく嫌。

(4) 全体を do{...}while(0); で括り、 returnをbreakに変更。
--- forの内側ではbreakが効かない。

(5) #define RETURN(V) {free(p);free(q);return(V);} などとする。
--- 微妙…

という感じです。しかたなく(5)で行こうかと、あきらめかけているのですが、
もっとまともな書き方があったら教えてください。
1613:04/04/18 05:49
いい忘れましたが、C++ではなくCでお願いします。
それから、コンパイラ依存の機能を使うのもしない方向で。
>>13
漏れならgoto使うなぁ。
一番見やすそうだし、仕様変更にも柔軟に対応できそう。
でも最大確保サイズが分かってて、そんなに大きくないなら
スタック領域確保で対応するかな。

コンパイラ依存の機能はなしっていっても、
移植する必要がないならどんどん使った方がいいと思うよ。
今回の例でいうとalloca関数とか。
C/C++の質問です。

クラスや構造体を関数に渡すとき、ポインタで渡す場合と参照で渡す場合で
違いとかってあるんですか?
できれば"->"より"."を使ってメンバにアクセスしたいので参照渡しにしたいんですが。
>>18
参照にするかポインタにするかよりも、
関数の引数にconstつけるかどうかで、
関数内でデータが変化するかどうかを
関数を使うユーザーに暗示的に示せるので、
関数宣言の仕方に注意すべし。
>>18
機能的に違いは無いが、関数側から見ると、
ポインタはNULLが渡ってくる可能性を考慮する必要があるが、
参照は常に実体がある(ほんとは例外があるがそこまで気にしないでいい)。
どうせ参照渡しでもポインタ渡しでも同じコード吐くことが期待できるしね。
ポインタにせざる得ない場合を除けば参照でいいじゃん。
そのための参照でしょ。
2318:04/04/18 10:50
>>19
毎回忘れて後で読み直す羽目になってる・・・気をつけます。

>>20-21
NULLの場合を考慮しなくていいのは楽かも。
結果同じになるなら自分が使い易いほうでよさそうですね。
これから参照使って渡すようにします。

有難うございました。
>15
(2)推奨。次点で(3)。
func()内での*pでのアクセスを避けるには、
func(void **p_copy)
{
 void *p;
 ...
 p = *p_copy = malloc();
}
とすれば良い。これならレジスタ等もうまく使ってくれる。
もちろん、do_func()内でNULLを代入しておく。
引数の数によっては、void **を渡すのではなく構造体のポインタを渡すのも手。
25ラポ:04/04/18 20:14
C言語始めたばかりなのですがこの問題が全く分かりません。
すいませんが教えてほしいです。お願いします。
整数型配列 array に,先頭から n 個データが入っているとする.このようなときに,次の操作を行う二つの関数を作れ.


1、新しいデータ newdata を第 k 要素 array[k] の場所に挿入する(挿入前に array[k] 以降にあったデータは一つずつ後ろにずらす)関数
array_insert(int array[], int n, int newdata, int k)


2、第 k 要素の内容を削除する(削除前に array[k+1] 以降にあったデータは一つずつ前にずらす)関数
array_delete(int array[], int n, int k)

>>25
宿題丸投げはこちらにいきましょ

ぼるじょあがC/C++の宿題を片づけますYO! 21代目
http://pc5.2ch.net/test/read.cgi/tech/1078157730/l50
27ラポ:04/04/18 20:27
そちらの方に書き込むことにします。
ありがとうございました。
28デフォルトの名無しさん:04/04/18 20:29
ここは、SDLの話を振っても大丈夫ですか?
29デフォルトの名無しさん:04/04/18 20:43
構造化プログラミングと段階的詳細化の関係について教えてください。
この2つはどう関係しているのですか?
自分なりの解答としては

構造化プログラミングは構造の把握しやすいプログラムを作る方法のことで、
段階的詳細化はトップダウン法のことである。トップダウン法で作ったほうが
構造の把握しやすいプログラムができる可能性が高い、という点で関係している。

って感じなんですが、不安です。何かアドバイスお願いします。
>>29
あなたの質問 と このスレ の関係について教えてください。
この2つはどう関係しているのですか?
自分なりの解答としては

あなたの質問は環境に依存しない一般的な ことで、
このスレは環境依存もOKな優しいスレのことである。「すれ立てるまでもない質問はここで」 スレで聞いた ほうが
回答を得やすい質問である可能性が高い、と言う点で全然関係していない。

って感じなんですが、不安です。何かアドバイスお願いします。
キモい
>>28
Rubyなんかにもポーティングされてるのに何でここだと思ったか知らないが
専用スレはゲ製にある。

SDLスレ
http://pc5.2ch.net/test/read.cgi/gamedev/1005469181/
2次元のDCTのプログラムで、計算部分を
for(m=0;m<N;m++){
for(n=0;n<N;n++){
a=0.0;
for(v=0;v<N;v++){
for(u=0;u<N;u++){
if(u==0 && v==0)
c=0.5;
else
c=1.0;
a+=c*f[u][v]*cos(((2.0*m+1.0)*u*pai)/(2*N))*cos(((2.0*n+1.0)*v*pai)/(2*N));
}
}
g[m][n]=(unsigned char)a;
}
}
としているのですが、逆DCTをしても元に戻ってくれません。
画像に対してなのですが、これであっているでしょうか?
逆DCTが違う可能性もあるのですが。
>>32
ありがとうございます。
専用スレに逝ってきます。
>>33
アルゴリズムはよくわからないが
>g[m][n]=(unsigned char)a;
とやってる所を見ると精度がunsigned charになってしまう
からじゃないか?
36デフォルトの名無しさん:04/04/19 15:03
VC++6 で SetLayeredWindowAttributes を使うには、
ヘッダーファイル等をUPDATEしないといけないと思うんだけど、
MicoroSoftのどこで何をダウンロードすれば良いのでしょうか?
>>36
PlatformSDK
ここで聞くべきなのかもわからないのですが、
VC++6.0で簡単なグラフィックを使う場合には
C++の知識が必要なのですか?
Cまでの知識でグラフィックを扱えるものはありますか?
>>38
Windows APIの知識があれば。
>38
CかC++かで言えばC
c++でなんですが、
ヘッタファイルでconst int A = 1;とゆう風に定数を宣言してるのがよく見かけるのですが、
ヘッタファイルではexternをして、宣言はソースファイルに書くものじゃないんですか?
cでは大体ソースファイルで宣言されてたんですが、c++ではヘッタで宣言してるのをよく見るんです
>>41
ヘッタファイルって何?


という突っ込みはさておき、それこそ定数の宣言だけしたような、
対応するcppファイルの存在しないヘッダファイルじゃないの?
インクルードガードしてたら問題はない。
>41
とりあえず用語について。
×ヘッタファイル/○ヘッダファイル
あと、
>ヘッタファイルではexternをして、
こっちは「宣言」ですが、
>const int A = 1;とゆう風に定数を宣言
>ソースファイルに書くものじゃないんですか?
こっちは「定義」と呼ばれるものだと思います。

で、通常 C では #define で定数を定義するので、それを単純に
const に置き換えただけなのではないかと。
>>42
>>43
レスありがとうございます
どこかで、ヘッダファイルにはexternだけ書いて、定義はソースファイルで、という書き込みを見たのですが、
ヘッダファイルの方で定義してもいいんですね
どこでその書き込みを見たかも忘れてしまったので、混乱していました
>>44
コンパイラから見れば、ヘッダファイルとソースファイルに差異はない。
というか、ソースファイルにヘッダファイルが挿入されたものをコンパイラは処理するわけで。
ソースファイルの#include行が当該ヘッダファイルの内容にすり替わったものを想像すれ。
そしてヘッダファイルの存在は忘れれ。
コンパイラが見ているのはその状態だ。

ということですな>>44
俺は定数宣言はヘッダファイルでやるが…少数派なのかな?
>>47
#defineの代わりにしてるなら普通だよ
cでconst 変数を大量にインクルードファイルに書かれると結構迷惑だがな。
まあ enum のがいいだろうけどね
>>44に限らず、初心者レベルの方は

/* 世界で一番汎用的なプログラム */
#include <con>

を見て笑えるようになったら、ヘッダについては卒業だな。
>>51
原理も解るが、笑えんぞw
53デフォルトの名無しさん:04/04/21 01:43
「#include <stdio.h>
main()
{
printf("1 little ");
printf("2 little ");
printf("3 little ");
printf("4 little indian boys\n");
}                         」
これだと上手くコンパイル出来ないのですが、
「#include <stdio.h>
main()
{
printf("1 little ");
printf("2 little ");
printf("3 little ");
printf("4 little indian boys\n");
}                          」
これだとコンパイルできます、この二つの差は何でしょうか?
エディタはCPadでコンパイラはLSI C-86 Ver.3.30、OSは
winXPです。
コンパイル出来ないならエラーメッセージくらい書いて。
5553:04/04/21 23:10
使い方間違ってただけでした。
#include<stdio.h>
main()
{
int a;
a=54;
printf(">>%dスイマセン^^;\n",a);
}
56デフォルトの名無しさん:04/04/21 23:35
構造体をグローバルで使いたいんですが、
どこでincludeしたらいいのか悩んでます。
globals.hって作って、その中でテンプレート&宣言をしてるんですが、
うまくリンクできてないみたいで、どこが悪いのかさぱ〜り。
externつけるとリンクしないし、つけないと今度は挙動がヘンだし。
>>56
とりあえずモチツケ
>56
宣言と定義について解ってないと見た。
構造体について解ってないとみた。
言語仕様の理解自体も中途半端そうだな
>>56
ソース晒せ。話はそれからだ。

>どこが悪いのかさぱ〜り。
どしろうとが何処で引っ掛かってるのかなぞ、
ソース見なこっちもさっぱり判らん。
>>56のコミュニケーション能力が一番の問題ではないかと。
単に愚痴りたいだけなのか?
これで質問しているつもりなのか?
後者だったら、よく周りの人間が付き合ってくれるもんだと感心する。
ご心配おかけしましたが、なんとか自己解決しました。
とはいっても、総当たり方式で、ですが。
extrenつけたり外したり、別のヘッダに移したりしてるうちに
ビルドできちゃいました。
テンプレートは.hでやっといて、別ファイルの方で宣言したらうまくいきました。
自分の持ってる本だとそこまで書いてなかったんですよう。
>>63
>ご心配おかけしましたが、...
さらに>>63の将来が心配になった人がいると思われ
65デフォルトの名無しさん:04/04/22 01:09
Cでは、以下はエラーになりますが、C++では通ります。
int a;
a = int(-3);
printf("%d\n", a);

自分でやってて良く分かってないのですが、このように
データタイプ(値) というのは C++ 的にはどのような解釈
になるんでしょうか?
int型のコンストラクタint::int(int)という解釈。
>>65
キャストでねーの?
68A:04/04/22 10:03
最近動的メモリ割り当てを使い始めた者です。
環境依存かわかりませんが、borland bcc32 を使ってます。

2次元配列などを動的メモリで何個も使って、普通に動いてるように
見えるコードに、新たに別の配列を同様にして追加しようとすると、その前後で
メモリに書き込めない、というエラーがでるときがあります。
また開放しようとしたときに、メモリが読めない、と言われるときがあります。
ポインタでファイルをオープンしようとして、メモリが読めないとエラーが
出るときもあります。
配列の大きさ種類は色々ですが、最大で100 * 100 の double型の大きさで、
それを数個使う程度です。

何か全然初歩的なミスをどこかで犯してるのかもしれませんが、
もし何か気が付くことがあれば、教えていただけませんか?
お願いします。
>>68
新たに別の配列を同様にして追加 ってどういう意味?
できればソース出して。これだけの情報じゃあなんとも言えない。
mallocのNULLチェックはやってる?
確保領域のポインタの
扱い方を間違えてる
7268:04/04/22 12:38
>>69-71 早速どうもありがとうございます。
ソースは大体以下のような感じです。以下は2個しか書いてませんが、 double 型以外の配列も同様の形で作ったり、などとして配列の数を
増やそうとすると、そこでメモリの読み書きができない、 というエラーが出てきたのでした。

>>70
やっていませんね。NULL を出すということは、そこのメモリは読み書きできなかったということになるんでしょうけど、その場合は
別のところにメモリを確保してくれるのでしょうか?
それともただそこでプログラムは停止する、ということでしょうか?
>>71
きっと間違えてますね。もし以下で何かおかしいことがあれば、 お教えいただけると嬉しいです。
7368 (2):04/04/22 12:38
double **new_dmatrix(int M, int N);
void free_dmatrix(double **top);

int main() {
double **Array1, **Array2;
Array1 = new_dmatrix(100,100);
Array2 = new_dmatrix(100,100);
......
free_dmatrix(Array1);
free_dmatrix(Array2);
}

double **new_dmatrix(int M, int N){
double **top;
int i,j;
top = (double **)malloc(sizeof(double *) * M);
top[0] = (double *)malloc(sizeof(double) *M*N);
for(i=1; i<M; i++) top[i] = top[i-1]+M;
for(i=0;i<M;i++){
for(j=0;j<N;j++){
top[i][j] = 0.0;
}
}
return top;
}

void free_dmatrix(double **top){
free(top[0]);
free(top);
}
top = (double **)malloc(sizeof(double *) * M);
なのに、
topに1万回も書き込めば何があっても不思議じゃない。
>>73
ポインタと配列に対する知識不足だな。
7668 :04/04/22 14:14
>>74,75
どうもありがとうございます、
仰せの通り知識不足でどうやっていけばいいかは、
はっきりわかりませんが、危険な方法だという事ですね。
もうちょっと安全な書き方を考えてみます。
危険安全以前に、何をどうすればいいかが解ってないと思われ。
>>73のコードは、はっきりいってめちゃくちゃ。動くだけでも奇跡。
正しいプログラムが正常に動作するのは奇跡でもなんでもない。
俺には、このソースから特に問題を見つけられないのだが。
>top = (double **)malloc(sizeof(double *) * M);
>top[0] = (double *)malloc(sizeof(double) *M*N);

これがやりたいのかなぁ
top = (double **)malloc(sizeof(double *) * M);
for (i = 0; i < M; i++)
  top[i] = (double *)malloc(sizeof(double) * N);
81デフォルトの名無しさん:04/04/22 19:24
インスタンスが複数になる場合staticメンバ変数の初期化というのは
どのように行うのが一般的でしょうか?
アドレスの質問です。
メモリ内の0x41番地に'A'が有るという解釈は間違いですか?
(ASCII配列で)
83デフォルトの名無しさん:04/04/22 19:35
>>82
間違いです。
ASCIIにおいて、'A'の値が0x41なだけです。
俺も >>73 は拙くはない…つか、ちゃんと出来てると思うが。
なんで読めない奴がいるんだyp
>>80
そうやると sizeof(double) * N バイトのヒープが M 個できるだろ?
8584:04/04/22 20:32
× ヒープが
○ ブロックが
1次元配列でいいのではないかと…。
8733:04/04/22 21:00
>>35
レス遅くなって申し訳ないです。
あれから色々やってみたのですがいっこうに
元の画像に戻らずです・・・。
しかも貼り付けたやつは逆DCTのほうでした。
g[m][n]=(unsigned char)a;
の部分はg[m][n]がunsigned char型なのです。
画像を読み込んでDCTして出力という感じです。
>>87
元に戻らんってどの程度のレベルで言ってるの?
DCT変換後の結果をunsigned charで格納したらその時点で情報落ちするから、
逆DCTしても全く同じにはならないって事じゃないのか? >35は。
8933:04/04/22 21:24
>>88
ちょっとその辺考えてもう一回やってみます。
>>81
インスタンスの管理のしかたはわからんが普通に
class A;だとしたら

class* a;
a = new A;
a->Initialize();
delete a;
と、複数インスタンスとは別にツクってでいーんじゃない?
他の方はどーやっとる?
>>81 >>90

普通にはその変数を定義したところで初期化する。
込み入ったことをやりたかったら、初期化関数をstaticで用意する。
9233:04/04/22 22:26
>>88
元に戻らないというのは、逆DCT後全く違う画像になってしまいます。
砂嵐みたいな感じです。
>>92
んじゃ根本的なアルゴリズムの問題だろ。
まず正しくDCT出来てるか確認汁。
>>84
>double **top;
>top = (double **)malloc(sizeof(double *) * M);
>top[i][j] = 0.0;

藻前はどこをアクセスしていると思っているのか?と小一時間(ry
>>33

> if(u==0 && v==0)
> c=0.5;
> else
> c=1.0;

俺の本には
cu = u==0? 1.0/sqrt(2.0) : 1.0;
cv = v==0? 1.0/sqrt(2.0) : 1.0;
c = cu * cv;
みたいに書いてある。

あとDCT係数は負になることもあるし、256を超えることもある。
unsigned char じゃ無理。
概ね >84 に同意。>73 は確かにバグってるんだけどね。

>94
問い詰められるのはおまいだ。
>top[0] = (double *)malloc(sizeof(double) *M*N);
なんだから、メモリの確保自体はしてあるだろ?
落ち着いて図でも描いてみるべし。

>73
×for(i=1; i<M; i++) top[i] = top[i-1]+M;
○for(i=1; i<M; i++) top[i] = top[i-1]+N;
これでいけると思われ。
でも、どうせなら malloc(sizeof(double*)*M+sizeof(dobule)*M*N) にして
malloc 1回にしたい気もする。
あー、けどアラインメントを考えるとうまくいかない環境もあるか。
9794:04/04/23 09:14
>>96
藻前こそ型を考えて見ろ。
オマエモナー
オマエモナー じゃなく オマエガナー でしょ?
>>81
俺は複雑な初期化を必要とするstaticメンバ変数を使ったことはないが、
デフォルトコンストラクト可能なヘルパクラスをメンバに持つのはどうだ?
class A {
    static struct helper {
        helper() { /*...*/ }
        T member; /* 使いたいメンバ */
    } one;
};
101デフォルトの名無しさん:04/04/23 17:59
puts("OOOoooooOOOOOOoooOOOOOoooooooOOOOOOOoooOOOOOo");
102デフォルトの名無しさん:04/04/23 18:32
RECT r[2];
と宣言し、
RECT rec[2] = {{0,0,0,0},{0,0,0,0}};と初期化し
r = recとやるのが無理だったのですが
forでまわすしか方法はないでしょうか?
>>102
構造体にいれる方法もある。
>>102
  memcpy(r, rec, sizeof(r));
105デフォルトの名無しさん:04/04/23 23:05
C++で整数を文字列としてvectorに格納する時の定石はどのような感じなのでしょうか?

やはり
#include <cstdio>として
sprintfで一度文字列に変換してからvectorへ持っていくという方法がベストでしょうか?
>>105
boost の lexicial_cast 使うのもアリ。何がベストかは、何を重視
するかによるから何とも言えんが。

http://www.boost.org/libs/conversion/lexical_cast.htm#lexical_cast
>>100
スマートなやりかただな
108デフォルトの名無しさん:04/04/24 08:49
ども。
Solaris8+SunONE7 で ローカル時間にmsec(ミリ秒)を使いたい。
localtime構造体には、msecがなく、困ってます。
何か他のmsecのある構造体を教えてください。
また、time構造体から上の構造体への変換関数もお願いします。




出だしの「ども。」がなんかむかつくから教えない
>>108
μsec ならあるんだけどなー。
残念だなー。
>>106
thnks.
STLの範囲内でと考えていて、参考書では<c*>はなるべく使わない方が
いいと書いてあったので他の人はどうしているか知りたかったと言うところです。
>>110
どうせ精度はmsec以下だけどね。
>>111
標準ライブラリの範囲内なら、std::stringstreamがあるが。
num + ('0'-0)で回すとかでいいんでないかな
115デフォルトの名無しさん:04/04/24 13:58
>112
無知晒しage
116デフォルトの名無しさん:04/04/24 14:54
>>114
'0'-0は'0'じゃないの?
0をひく意味があるの?
割り算やmod演算のコストを考えるとsprintfのが早かった

>>116
ない。ボケボケだったよ。
VCなら_itoaとかね
11968 :04/04/24 17:08
>>96 その他皆様、どうも色々とありがとうございました。
恥ずかしながら、96さんのご指摘の通りでした。
常にM=N の配列を使っているので、ある所まではエラーが出なかった
ようです、お騒がせしました
120デフォルトの名無しさん:04/04/24 20:39
int型変数のケタ数を取得する関数ってあります?

int a=120; // 3ケタの整数
cout<<function(a); // 3が表示される

こんな感じです。
>>120
cout << boost::lexical_cast<std::string>(a).length() ; // (゚д゚)ウマー
122121:04/04/24 20:49
ってめちゃくちゃ遅いでしょうな。
/=10 で数えたほうがよろしいと思われ。
速度だけで言ったら
if( a < 10 )
//1桁
とか比較したほうが
124デフォルトの名無しさん:04/04/24 21:36
文字列の中に四つのうちいずれかの文字があると実行する、としたいのですが
文字列の中に+を入れて
if(str[i] == ('+' || '-' || '*' || '/'))
こうすると思った通りに動きません。
if(str[i] == '+')
こうだと正常に動作するので上の論理演算が正しくないと思うのですが
なにがおかしいのかが解らないのでご教授ください
ネタっぽく見えるが…
if(str[i] == ('+' || '-' || '*' || '/'))はif(str[i] == 1)と等価。
if(str[i] == '+' || str[i] == '-' || str[i] == '*' || str[i] == '/' )と書くか
if( strchr("+-*/",str[i]) )と書く。
>>124

switch(str[i])
{
case '+': case '-': case '/': case '*':
    /* 処理 */
break;
}
>124
括弧で式が括られている場合の演算子の優先順位を考えてみましょう。
一段階ずつ自分の手で、式を計算していってみると分かりやすいですよ。
例えば、>124の場合、

1. if (str[i] == ('+' || '-' || '*' || '/'))
まず、('+' || '-' || '*' || '/')の中が評価される

2. if (str[i] == (true || '-' || '*' || '/'))
'+'は非ゼロである為、論理演算ではtrueとみなされる

3. if (str[i] == true)
||は先頭から評価されていき、ひとつでも真となる条件があった場合、
後ろの式は評価されない

4. if (false)
str[i] == trueが成り立たない場合、評価の結果はfalseとなる
ネタではないです…
回答有難う御座います。
ifとswitchではどちらが速いんでしょうか?
>>127
解りやすい解説有難う御座います。
>>128
そんなことを気にするよりも前に、もっと他に気にすることがあるでしょ。。。
PC内の時計から乱数を作る方法どうやってやるんでしたか誰か教えてくれませんか?
132デフォルトの名無しさん:04/04/24 22:42
>>131
srand(time(NULL));
srand((unsigned int)time(0));
while (1) {
printf(rand() % 2 == 0 ? "まいう" : "まいう〜");
}
たびたびすみませんが、
int a;
a=(srand(time(NULL))/3)*100 + (srand(time(NULL))/13) +1;

ってできるでしょうか?できない気がしてしょうがないんですが、

百の位を0〜3、十と一の位に1〜13の数が入るようにしたいのです
%でした
>>134
ネタですか?
>>134
はげしくワロタ。というかコーヒー吹いたじゃねぇかゴルァ!
> ってできるでしょうか?できない気がしてしょうがないんですが、
srandを知った瞬間からsrandをGoogleなりでちゃんと学習しようよ
自分で検証もせずに相手にデバッグさせるのは、この手のスレで一番のノーマナー
>>134
srandはいわばトランプの札をシャッフルする。
札を配る(乱数を返す)のはrand()。
ヘルプなり入門書なりきちんと読もうや、をい。

なお、やりたいことはトランプっぽいな。
もし、それなら0-51の範囲で扱った方が楽かも知れんぞ。
トランプだとしたら、不定延期するよくないアルゴリズムのような気もする。
入力した順と逆に表示する関数がつくれない・・・
関数しないなら出来るけど。
#include <stdio.h>
#define NUMBER5

void rev_intary(int vc[], int no)
{
int i;
int back = vc[0];
for(i=NUMBER-1; i>=0; i--)
back = vc[i];

}
int main(void)
{
int i;
int a[NUMBER];/*値*/
int temp;

printf("%d個の整数を入力してください。\n", NUMBER);
for (i = 0; i < NUMBER; i++) {
printf("%d番目:", i + 1); scanf("%d", &a[i]);
temp=a[i];
}
puts("逆に並べると、");
printf("%d\n", temp);
puts("です。");
return (0);
}
こんばんは。
>>141
>入力した順と逆に表示する関数がつくれない・・・
そうか。オレは作れるけどな。それがどうかした?
>>141
#define NUMBER5
//スペースが不足してませんか

あと仕様が微妙に不可解。テンポラリ変数使っても意味ないのでは?
配列を逆回ししてあげればそれでおしまいのような。

puts("逆に並べると、");
for (i=NUMBER-1; i>=0; i--)
  printf("%d\n", a[i]);
puts("です。");
人間としての器の大きさの差だな
>>144
なんか i-- とか >= とかが個人的に気持ち悪いので、

puts("逆に並べると、");
for(i=0; i<NUMBER; i++)
printf("%d\n", a[(NUMBER-1)-i]);
puts("です。");

こうしません?

>>141
つうか rev_intary はどこで呼ぶのさ。
>>146
最近のコンパイラなら、それをデクリメント方式に直してくれるのかな?
そうでないなら、加算コストが無駄で、俺は逆に引いてしまう・・・(まぁDBでもないかぎりは変わらんけど)
てか大抵のループはダウンカウンタにされる。気にすんな。
>>144, >>146
前者は内容の可読性、後者はコードの可読性を重視してるってことさね
気にすんな
むしろ関数のどうやって呼び出してどうやって出力するかが
本を見ても意味不明なわけで
>>141=150?
そのレベルだったら配列を関数に渡すのはちょっと難しいかもしれない。
まずは簡単な関数作ったり、ポインタと戯れてみよう。
もしくはいい本を探そう。
>>150
最初から、
「数値配列を逆順に出力する関数を作りたいのですが、
具体的にどう配列をわたし、どう出力したらよいかわかりません。
教えてください。」
と質問しろ。
プログラミングは初心者でも日本語は十年以上使ってるんだろう?

言葉足らずの質問は、こちらが補完して回答するより
本人にきっちり明確に再質問させたほうが、
結局双方のためだと思うが?>all
とても歓迎する雰囲気ではない罠
まあ、カリカリすんな。
ここは初心者スレだ。
相手のレベルにあわせてやるのも必要だろう。
うざければスルーすればいいしな。

あと本人の今後など誰も気にしとらん。
そこに質問があったから、それに答える。
ただそれだけのことだろう。
質問内容のレベルはどれだけ初歩的でも歓迎するが、
質問内容をできるだけ明確にするってのは
初心者スレでも当然要求されるもんだと思うが?
プログラム初心者は歓迎するが、ネット初心者は排斥でいいよ。
何が分からないのか分からない場合は、質問しないのがネチケットですし。
頭を整理してでなおしてきなさいってこった。
コンストラクタについて。

class Hoge{
public:
Hoge(int a){...}
...
};

のようなクラスがあったとき、

Hoge fuc(){
...
return Hoge(x)
}

ってな感じで return文のあとにコンストラクタを
直接書いているコードを良く見ますが、コンストラクタって
戻り値ないのになぜ?

動作は確認したし、すっきり書けるので自分は
すでにこの書き方が身についてしまったのですが、
理由をはっきりさせたいです。

よろしくお願いします。
>>120
遅レスだが、boostよりは速いだろw

n = 1+(int)log10(a);
>>158
それはコンストラクタを直接呼んでいるのではなくて
無名オブジェクトを構築してそれを返しているだけ。

{
 Hoge hoge(x);//hogeという名前のHogeオブジェクト
 Hoge(x);//名前は無いけどHoge型のオブジェクト
}

スコープにそのオブジェクトがあるだけでよい場合は
よく使う手段のような気がする。
コピーコンストラクタによる値渡しならスコープの制約はない。
=演算子のオーバーロードが仕込んで在るんじゃないの?
>>158

たとえばこんな関数があったとき、
void hoge_func( const Hoge& h ) { ... };

こんな風に使うことができる。
hoge_func( Hoge(any_value) ); //Hogeの無名オブジェクトを引数にしている。


>>161
コピーコンストラクタ、operator=()が定義されていなくても基本的には動作する。
当然、メモリイメージそのままのコピーになるけど。
うまくいけばRVOが働くだろうしな
オブジェクトの値渡しか・・・
ボトルネックにならないと分かりきっていない限りはやらないな。
try-throw-catchとか。
マルチバイト文字(Shift_JIS)をうまく置換してくれる関数はどのようにすればよいのでしょうか?
自作しようとして挫折しました。ご教授ください。
166165:04/04/25 20:29
具体的にはスペースやタブを&nbsp;で全置換する関数です
複数の変数を用意して、
それを小さい順に並び替えるにはどうしたらいいでしょうか?
もし同じ数があれば連続して並ばせる
>166
1.自分で作る
2.人のソースからぱくる
3.ATLなどのライブラリを使う
>167
配列やソートという言葉を知ってますか?
170167:04/04/25 23:06
すみません、ちょっと説明不足でした

仮に
a=7
b=3
c=5
d=3
とあったとすると、

a=3
b=3
c=5
d=7
となるようにしたいのです。
この例だと4つですが
それが、ころころ変わるのです
数が決まっていれば何とかなりそうですが・・・
>>165
自作するなら ctype.h のマクロを使う。
あるなら開発環境その他のライブラリを使う。
>>170
作業用の配列に入れてソートして戻せば良いのでは?
>>170
プログラム中に同じ型の変数が不定個存在するわけ?
ちょっと想像できない。
素直に配列なり(C++が使えるなら)std::vector/std;;setなりを使うように
書き直したほうが早いぞ。
>170
配列を使わない理由は?
クリップボードの内容を、MessageBoxによるウィザードへの返答によって書き換えるプログラムを作成しています。
何とか完成したかに見えたのですが、VC上で実行すると上手くいくのに、
exe単体を起動すると何故か書き換えは行われず無視されてしまいます。
何が原因と考えられるのでしょうか?

環境はWinXP、VC++6.0SP6です。
三重婚
>>166
スペースとタブに限定するなら、何もしなくてもいいんじゃ?
>>166
素直にエディタの置換機能使うか、
Perlで書いた方が速いぞ。
>>174
使わないというより、使えないのです。
恥ずかしい話ですが、プログラミングを始めてからトントン拍子である程度これたのですが
配列、ポインタあたりからつまづき始め、いらだち始めてきたので気分転換に
今ある知識でちょいと簡単なプログラムを作ろうと思ったのです
>>179
総当りでやらなくちゃいけないから配列使わないと無理。
100個あったら100!分やらなきゃいけないわけで、配列以外では現実味が無い。
>>179
配列の勉強するいいチャンスだと思って。
>>179
ちょっとつまづいた位で勉強する気が失せるようだったら、
向いてないからプログラム辞めた方がいいよ。

そうでないなら、めげずにガンガレ!
つかな、配列でつまずくって、かなり早い段階でつまづいちゃったんだな(w
そら、本腰入れて配列の勉強しろよ。
きちんとした入門書を読むこと。これが一番。
>>179

俺も>>182-183と同意見。
配列C/C++に限らず、プログラム全般で基本かつ習得必須の概念。
ここでつまずいてちゃ、まともなプログラムはかけないよ。
「ここまでとんとん拍子」っていっても、その段階ではほとんど意味がない。
185デフォルトの名無しさん:04/04/26 11:16
gets()などで文字とかを入力させるとき
Entを押す前にBsとかDelを押しても文字が消えません
一度打ってしまうと修正できないんですか?
>>185
環境による。
187185:04/04/26 11:29
scanf()に代わる関数をうp汁
>>188
なんで?
190デフォルトの名無しさん:04/04/26 19:11
>>185
ioctl()で消したりすることができるようになるかなぁ?
ちなみにgets()は使っちゃあかんぞぃ
fgets() (+scanf())にすべし。
>>186
異議なし。
191190:04/04/26 19:20
ところで今長い数字を並べた文字列を8文字ずつ分割関数作っているんですが
初心者なんでどうも動作がおかしいんです。
(tokenはvector<int>として定義)
int BigInt::ceil_int(int numerator,int denominator)
{
int result = numerator/denominator;
if((numerator%denominator)!=0){
if(result>0)
result++;
else
result--;
}
return result;
}
192190:04/04/26 19:21
BigInt::BigInt(stirng s)
{
set(s);
}

int BigInt::set(string s)
{
for(int i = 1;i <= ceil_int(s.length(),INTERVAL_BI);i++)
{
if((s.length()-i*INTERVAL_BI) < 0)
token.push_back(atoi(s.substr(0,s.length()%INTERVAL_BI).c_str()));
else
token.push_back(atoi(s.substr(s.length()-i*INTERVAL_BI,INTERVAL_BI).c_str()));
DEBUG(cerr<<i<<","<<token[i]<<endl);
}
}
これでBigInt bi("83758647673487563");とすると正しく分割されないんです。
どうしてでしょうか?
>>180-184

暖かい言葉ありがとう。
今回のプログラムは結果的にまったく完成せずに幕を閉じる、
創る楽しさを再発掘できたよ
ガンガってみる
そしたらまた、そうのうち作り直してみる
>191
まず、同じことをC++ではなく、Cで書いた場合、
ちゃんと動くものを書けるか?
>>191
if((s.length()-i*INTERVAL_BI) < 0)

if((s.length() < static_cast<size_t>(i)*INTERVAL_BI)
あるクラスAが属性としてクラスBを持っていて(非ポインタ)、
クラスAで(new等で)明示的にクラスBを生成しない場合、
クラスBのコンストラクタはどの時点で呼ばれるのでしょうか?
あるいは呼ばれないのでしょうか?
#inlucde <iostream>
class B {
 B() { std::cout << "B::B()" << std::endl; }
 ~B() { std::cout << "B::~B()" << std::endl; }
};
class A {
 A() { std::cout << "A::A()" << std::endl; }
 ~A() { std::cout << "A::~A()" << std::endl; }
 B b;
};
main() {
 A* a = new A;
 delete a;
}
こんな感じで試した方が数段早く理解できると思う。
198デフォルトの名無しさん:04/04/27 12:06
クラスAの基底クラスのインスタンスをを初期化した後。
199デフォルトの名無しさん:04/04/27 16:24
boostのビルド方法を教えてください。
環境は、Visual C++ 7.1 + STLport 4.6.2。
これでboost 1.31.0をビルド・インストールしようとしています。

以下のように一部書き換えたvsvars32.batを実行して、
------------------------------------------------------
@set STLPORT_PATH=C:\STLport-4.6.2
@set STLPORT_VERSION=4.6.2
@set INCLUDE=%MSVCDir%\INCLUDE\stlport;%MSVCDir%\ATLMFC\INCLUDE;
%MSVCDir%\INCLUDE;%MSVCDir%\PlatformSDK\include\prerelease;
%MSVCDir%\PlatformSDK\include;%FrameworkSDKDir%\include;%INCLUDE%
@set LIB=%MSVCDir%\ATLMFC\LIB;%MSVCDir%\LIB;
%MSVCDir%\PlatformSDK\lib\prerelease;%MSVCDir%\PlatformSDK\lib;
%FrameworkSDKDir%\lib;%LIB%
------------------------------------------------------

bjam "-sTOOLS=vc7.1-stlport"
"-sBUILD=debug release <runtime-link>static/dynamic
<threading>multi <stlport-version>4.6.2"
"--without-python"

とやると、regex以外はビルドに成功するのですが、
200199:04/04/27 16:25
ライブラリファイルをインストール後、
http://www.kmonos.net/alang/boost/classes/posix_time.html
記載のコードが、LNK2019エラーとなって
ビルドできません。

date_timeのビルドでエラーは出ないものの、
どうも、time_from_string()など、
一部の関数がライブラリファイルに含まれていないようです。

どなたか、同じ環境で正常にビルドできた方、
ビルド方法を教えて頂けるとありがたいのですが。
201191:04/04/27 18:57
>>195さん、
どうも、ありがとうございました。ソースコードにtoken[i-1]の-1を忘れている
のにも気づかず、話もできません…
それでもバグを修正してくれてありがとうございました。
202199:04/04/27 19:46
>>199-200
すみません。
以下のスレで訊いた方がよいような気がしてきたので、
質問を移しました。

【C++】template 統合スレ -- Part3
http://pc5.2ch.net/test/read.cgi/tech/1066493064/l50
203196:04/04/27 21:27
>>197,198
ありがとうございました。
B()→A()→~A()→~B()
なのでちょっとびっくりしていました。
>>203
それ仕様。そうでないといろいろ困る。
Aが作られた時にBのインスタンスがないと、
Bのプロパティを初期設定したい場合どこで呼べばいいのかわからなくなる。
同様に、Aが破棄される際にBが先に破棄されていると
Bに終了処理が必要な場合、以下同文ということだな。
その辺のタイミングはコンパイルの仕方変えれば何とかなるだろうけど、
でも、現行の仕様が一番シンプルで分かりやすい。
207196:04/04/27 21:52
なんとなく A()→B()→~A()→~B() かと思っていました。
>>205
激しく納得です。感謝。
VC++で、実行したときにどの変数にどんな値が入っているのかリアルタイムで下方に表示する方法教えてください
スレッドが違います。
環境依存OKじゃなかったの?
211デフォルトの名無しさん:04/04/27 22:49
環境依存というか環境そのものについてだから↓あたりが適当と思われ。
★初心者にVisual C++を教えるスレ★ Part11
http://pc5.2ch.net/test/read.cgi/tech/1077965179/l50
環境依存OKな『C/C++室』なわけだな。
IDEだのデバッガの使い方はさすがにスレ違いだ。
つか、専用スレで聞いたほうが早いし。
213デフォルトの名無しさん:04/04/28 07:28
// Box.h Definition of the Box class
#ifndef BOX_H
#define BOX_H

class Box {
public:
// Constructor
Box(double lengthValue = 1.0, double widthValue = 1.0, double heightValue = 1.0);

// Function to calculate the volume of a box
double volume();

private:
double length;
double width;
double height;
};

#endif

これの5行目のクラス宣言の部分でエラーが発生しコンパイル出来ません。
ちなみに、環境はウインXP、ボーランドbcc55です。サンプルは下のサイトからDLしたものです。
http://www.apress.com/book/bookDisplay.html?bID=218

どこがおかしいのでしょうか???どなたかお教え下さい。
エラーぐらい張れ
いやだからエラーなんです、という返答を少なからず期待してしまう俺はだめぽ。
.cからインクルードしているなどの理由でcとしてコンパイルしてたりして。
217デフォルトの名無しさん:04/04/28 08:19
>>214
エラーメッセージは以下の通りです。
Box.h 5: 宣言の構文エラー

>>216
Box.hでコンパイルしてます。
・・・・・・
219デフォルトの名無しさん:04/04/28 10:34
こりゃだめだ
状況がよくわからないけど
ヘッダをコンパイルしても意味ない
対になるbox.cppを探してコンパイルしる
221デフォルトの名無しさん:04/04/28 10:48
>>220
一緒にコンパイルしようとしてますが、最初のヘッダの時点で、上記の
メッセージが出てコンパイル出来ません。
ちなみにコンパイルの際の入力方法としては、例えば、sample12_04であれば
bcc32 Box.h Box.cpp prog12_04.cpp
って入力してますけど。このやり方がおかしいんでしょうか?
必ず、Box.h 5: 宣言の構文エラー ってメッセージが出て進みません。
どうかお教え下さい。
・・・おいおい・・・
bcc32 -e prog12_04.exe prog12_04.cpp Box.cpp
224デフォルトの名無しさん:04/04/28 11:15
>>223
すいません、ありがとうございます。Box.hはどうするんですか?これは指定する必要無いんでしょうか?
225デフォルトの名無しさん:04/04/28 11:28
どうもお騒がせしました。こういうファイルがいくつかに分かれてる場合に
どうやってコンパイルするのかが分からなかったもので。
要するに、bcc32 prog12_04.cpp Box.cpp
で、ヘッダ以外をコンパイルし、それから、prog12_04.exe で実行すれば
良かった訳ですね。納得しました、どうもすいませんでした。
>>224
ヘッダファイルはこんなクラスや関数がある、と示すもので
インクルードして使う。コンパイルする必要がない。
http://www.nifty.com/webapp/digitalword/word/007/00721.htm

分割コンパイル、プロトタイプ宣言、ヘッダファイル、
オブジェクトファイルなどをキーワードにして勉強しませう。
いやー
何割かの人間が通る道かな?これはw
俺、ヘッダはコンパイルしたことないぞ・・・。
質問です!
C++のコンパイルエラーの一覧表みたいなものって
あったりしますかね?
解説付だとうれしいんですけど。

ググってみてもMLの記事ばっかりひっかかってしまいます。
>>229
VC++ならMSDNに付いてますよ。
コンパイラのヘルプ見れ。VCなんかはMSDNに載ってる。
>>229
割れ厨ならば通報しまつよ
bcc には付いていたっけ?
gcc は? man じゃ出てこないよね。
234デフォルトの名無しさん:04/04/28 22:21
Cで質問です。
Visual C++.net使って、「独習C」読み進めてます。

以下のような文で、数字を文字として取得した際に、
何故、コメントアウトした文が必要なのかわかりません。
この式を抜いてコンパイルすると、
「n(数)」といれたはずが、「nn」となるのはカクニンしましたが・・・。

(前略)
char num;
printf("数字を入力:");
num = getche();
printf("\n");

/* num = num - '0'; */

if(num>=0 && num<10) printf...
(後略)
数字という0〜9までの「文字」と、数値は異なるものなので変換が必要です。
>>235
x = 0 と x = '0' の違いは分かる?
前者は 0 という数値を、後者は 0 という文字コードを x に代入している。
printf("value = %d, character code = %d\n", 0, '0'); を実行して確認してみると良い。
後は↓の二つを読んでちょ。

ASCII 文字コード表
http://e-words.jp/p/r-ascii.html

「−'0'」の部分の働きがよくわかりません。
http://www.jtex.ac.jp/qa_p34.html#Q12
238デフォルトの名無しさん:04/04/28 23:24
絶対値を計算する関数absoluteの作成を手伝ってください。
なお、abs等のあらかじめ用意されている算術関数は利用せずに作らないといけないです。
239235:04/04/28 23:24
>>236-237
あ、わかりました!
英字でなら、以前にやったことがあるかも。。。

ASCIIコードで '5' - '0' だったら、
53 - 48 ってことですよね。

スッキリしました、ありがとうございます〜。
>>238
どこが分からないのか言ってくれないと手伝えないよん。
241デフォルトの名無しさん:04/04/28 23:34
absを使わずに計算するってところがわからないんです
>>238
int absolute(int a) {
if(a<0)
return -a;
else
return a;
}
とりあえずintで

int absolute(int n) {
return n < 0 ? -n : n;
}
>>241
それは日本語が分からないと言う事か?
245240:04/04/28 23:37
おいいいい宿題スレじゃないべ。まあsoccer見てくるけど・・・。
連休前のせいか、どのスレでも「宿題やってちょ」厨がわいてるな。
247デフォルトの名無しさん:04/04/28 23:42
どうもお騒がせしましたm(__)m
error C2143: 構文エラー : ';' が '型' の前にありません。
ってなんてことないところで出るんですが、なぜなんでしょう?
問題の行をコピペしてほかの所に貼り付けても、エラー出ませんでしたので
どうも二次エラーじゃないかと思うんですがどうでしょうか?

二次エラーだとしたら、一般的にどの辺を見直してみるとよいでしょうか?
>>248
一概には言えないが、大抵はその直前の行が終了していない(';'がないなど)。
250248:04/04/29 17:20
mian内で宣言した変数名と
引数に持っていった関数の変数名が同じだと、その後、main内に戻ってきたときにその変数の値は受け継がれるのですか?

int yakugime(int te[])
{
int flush = ch_flush(te);
printf("%d\n",flush);

int straight = ch_straight(te);
printf("%d\n", straight);

return 0 ;//実験のため0
}
とかくと、6行目にエラーが出て、試しに4行目を//消してやってみると
なぜかch_flush内で配列teをいじってそのまま、
ch_straightにもっていかれるのです

たぶんこの二つのエラーは何か関係があるんじゃないかと思うのですがどうでしょうか?
>>250
いや、全く関係ない。
変数の宣言はブロックの先頭で行ってみればいいんじゃない?
それと、関数の引数の配列はポインタと同じなので、関数側でいじってるなら、それが反映される。
もちろん、それは変数名とは何の関係もない。
なるほど!配列も関数側で反映されるんですか。通りでおかしかった訳ですね
迅速な対応ありがとうございました
宣言を先頭で行ってみたらできました。
BCCで作っています。
ポインタ配列を拡張して、その拡張した先にstrcpyで文字列をコピーさせたいのですが、
アプリケーションエラーが出てしまい、strcpyが実行出来ません。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
char **ppData;
int i;

if ((ppData = (char **)malloc(sizeof(char *))) == NULL) {
exit(1);
}
ppData[0] = "aaaaaaaa";

// 配列を拡張
if ((ppData = (char **)realloc(ppData, sizeof(char *) * 10)) == NULL) {
exit(1);
}

// ココで落ちる
strcpy(ppData[1], "bbbbbbbb");
strcpy(ppData[2], "cccccccc");
strcpy(ppData[3], "dddddddd");
strcpy(ppData[10], "kkkkkkkk");
free(ppData);

return 0;
}

どのようにすればstrcpyを行うことが出来るのでしょうか…?
>>254
strcpy(ppData[1], "bb..."); とあるが、ppData[1] はどこ指してると思う?
>>254
ポインタの配列の領域は確保しているが、文字列が入る領域を確保してない。
>>255さん、>>256さん
ご指摘ありがとうございます。

配列を拡張した後にcallocをすることで、
ちゃんとstrcpyを実行する事が出来ました。

ありがとうございました。
258252:04/04/29 21:52
配列を引数に渡しても値が変動しない方法ってないでしょうか?
いろいろ考えたのですが、どうもよい方法が思いつきません

一回一回、初期化しなおすか、配列を使わないでやるぐらいしか・・・
>>258
受け取る側でコピーしてやればいいわけで。
>>258
配列はポインタとして関数に渡されるってのは基本だよ。ちゃんと覚えとかな。
無理やり値渡ししたかったら構造体にすると言う手もあるが。
書き換えを許さない場合、C++ならconst修飾して関数側で必要に応じコピーを
作るってのが普通。
pureCはどうするのか分からん(w
OSはWindowsXPHomeEdition コンパイラはbcc5.5を使っています。

boostを勉強してみようと思い、サンプルを探してコンパイルしてみようと思ったのですが
boost関連の.hppファイルと、rpcnsip.hファイルを同時にインクルードしようとすると、
rpcnsip.hの構文エラーがでてコンパイル出来ません。
どちらとも別々に使った場合はエラーが起こりません。
例えば
#include <rpcnsip>
#include <boost/config.hpp>

int main() {
return 0;
}
のようにするとエラ−が起こります。
どなたか解決方法を御存知ないですか?
>>261
エラーについて相談するときはエラーメッセージ貼れよ。
bccでboostか。
264261:04/04/30 05:05
>>262
>>261にかいてあるコードをそのままコンパイルしたときのエラー(一部)です。
エラー E2303 c:\Borland\Bcc55\include\rpcnsip.h 30: 型名が必要
エラー E2139 c:\Borland\Bcc55\include\rpcnsip.h 30: 宣言に ; がない
エラー E2303 c:\Borland\Bcc55\include\rpcnsip.h 31: 型名が必要
エラー E2139 c:\Borland\Bcc55\include\rpcnsip.h 31: 宣言に ; がない
エラー E2303 c:\Borland\Bcc55\include\rpcnsip.h 32: 型名が必要
エラー E2139 c:\Borland\Bcc55\include\rpcnsip.h 32: 宣言に ; がない
エラー E2141 c:\Borland\Bcc55\include\rpcnsip.h 40: 宣言の構文エラー
エラー E2238 c:\Borland\Bcc55\include\rpcnsip.h 47: 'RPCNSAPI' の宣言が複数見つかった
エラー E2344 c:\Borland\Bcc55\include\rpcnsip.h 40: 一つ前の 'RPCNSAPI' の定義位置
エラー E2141 c:\Borland\Bcc55\include\rpcnsip.h 47: 宣言の構文エラー
エラー E2238 c:\Borland\Bcc55\include\rpcnsip.h 55: 'RPCNSAPI' の宣言が複数見つかった
エラー E2344 c:\Borland\Bcc55\include\rpcnsip.h 47: 一つ前の 'RPCNSAPI' の定義位置
エラー E2141 c:\Borland\Bcc55\include\rpcnsip.h 55: 宣言の構文エラー
エラー E2238 c:\Borland\Bcc55\include\rpcnsip.h 63: 'RPCNSAPI' の宣言が複数見つかった
エラー E2344 c:\Borland\Bcc55\include\rpcnsip.h 55: 一つ前の 'RPCNSAPI' の定義位置
エラー E2141 c:\Borland\Bcc55\include\rpcnsip.h 63: 宣言の構文エラー
>>261
そらboostのせいじゃなくてrpcnsip.hに必要なマクロが定義されないだけ。
>>265
では、どのように対処すればいいのでしょうか。
試していたところ、windows.hでも同様なエラーが発生しました。
rpcnsipやwindows.hと.hppファイルを同時にインクルードしなければ、
エラーは発生しないようなのですが…。
>>264
>>261にwindows.hを追加すれば、うちではエラーは出ないで正常にコンパイルできる。
やはり問題はboost以外にありそうな気がするが。
BCCの設定は間違いないのか?


あと、自分から情報は提示しようとせず、ソースすら晒さずに
「どのように対処すればいいのでしょうか」と聞かれても、
「知るかボケッ、自分で考えろ!」としか回答のしようがないのだがね。
268デフォルトの名無しさん:04/04/30 13:53
C++標準ライブラリ チュートリアル&リファレンス等に
算術関数は浮動小数点に対して定義してあるので整数 x に対して用いる場合
std::sqrt( float(x) );
とすると良い、とあるのですがこのfloat(x)というのはどこで定義されていて、
どれほど可搬性があるのでしょうか。またstatic_cast<float>(x)とはどう違う
のでしょうか。
>>268
floatじゃなくてdoubleじゃないんかという話はさておき。

それはC++標準のキャストの1つ。
変換先が組み込み型であればstatic_castと同じ。
>>269
多謝。組み込み型なら同じなんですね。fortranみたいな表記でびっくりです。

ちなみにC++標準ライブラリ チュートリアル&リファレンス by Nicolai M. Josuttis
では float, double, long doubleにオーバーロードされているのでこれらの内
ならどれでもOKとして、サンプルではfloat(x)を使っていました。

Anjuta使っているのですが、Anjutaの型表示では確かにdoubleと表示されます。
そのまま解釈するとint→float→doubleに変換されそうだ…。
最適化してくれると思うけど。
>>271
だからオーバーロードされてるって言ってるだろ。
273デフォルトの名無しさん:04/04/30 22:37
質問です。
あるクラスが異常にでかくなってきたので、
サブクラスを作って分割したいのです。
特殊な処理を行う機能を追加したら、そのサブルーチンが
相当な量になってしまっとるような状況なんですよ。
できればその処理だけ別のクラスを作ってやりたいの
ですけど、いい方法教えてください。
>>272
オーバーロードされているといっても、
たいていの実装のfloat版sqrtはfloat型の引数を
doubleにキャストしてdouble版sqrtを呼んでいるだけだから、
最適化が無ければint→float→doubleの2度手間になってしまう。
>>273
そのクラスの設計を最初からやり直す。
>>274
最適化を施しても精度をfloat相当まで落とす処理が無駄な手間になる。
>>273
それだけじゃ、誰も答えられんだろ。
といって、その膨大なクラスのソースコードを見せられても読む気しないし。
デザパタでも勉強してください。
>>273
書籍「リファクタリング」を読む。
>>274
そういう書込みが、doubleとfloatの速度が同等もしくはdoubleの方が速いという誤解を蔓延させている。
>>279
脊髄反射でレスしないで、ちゃんと元発言からの話の流れを把握してから書き込もうね。
だれも速度の話はしていないよ。>>268-272 >>274 >>276
>>279
そりゃ一概に言えないだろ…特定環境の話をしているのかね?
ちなみにうちのWindowsマシンの浮動小数演算コプロセッサは80bitバスで、
それ以下のbitの場合はすべてそれにキャストして演算されているようですが…。
あ、もしかして、短い分だけキャッシュに乗りやすくなるとか、
メモリのフェッチ時間が短くなるとか、そういう話かな?
それならほぼ正しいかも知れず…。
脊髄反射って?例えば射精とかか?
あー、あれは違ったか。
ん、>279って射精したの?
279じゃないけど射精しました。
C++が使える環境で、バイナリデータを取り扱うときにどんな型/クラスを使うと楽?
やっぱりchar配列?
じゃないの?
ビットマップみたいに大量のバイナリデータをぐるぐる回す場合は、int使ったほうがいい場合もある。
289デフォルトの名無しさん:04/05/01 09:38
OSはWindows2k sp4 
環境はVC++6.0です

string型を格納するlistを含むclassを作ってコンパイルすると
エラーはでないんですがWarningが出てきます.
warning C4786: '?$reverse_bidirectional_iterator@Viterator@?$list@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$
allocator@D@2@@std@@@2@@std@@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@3@AAV43@PAV43@H' : 識別子が '255' 文字に切り捨てられました (browser 情報内)。

こんなのが何個も出てきます.
ソースはこんな感じです.

#include <list>
#include <string>
using namespace std;

class Base
{
list<string> lst;
list<string>::iterator p;
};

解決方法はありますか?
pragma warning disable 4786
291デフォルトの名無しさん:04/05/01 09:45
warning 4786で検索したら出てきた.
スマソ
いままでlistとかstringで調べてた
>>290 thx!!
>>286
>>288
BMPデータで一ドットが32bitだったりする場合ね
24bitだと逆に遅く…
>>292
いや、場合によるだろ。
ピクセル単位の処理じゃないかもしれないし
次のピクセルのバイトはとっておくとかもできる。
294デフォルトの名無しさん:04/05/01 22:29
「20L(リットル)以下は80円/L、20Lを超えた分については、
1割引になる」というプログラムを作成してみたのですが上手くいきません。
何処がおかしいのか教えていただけませんか?


#include <stdio.h>
main()
{
double fuel;
double rate;
double charge;
printf("給油量");scanf("%d",fuel); /*給油量の入力*/
printf("石油の単価");scanf("%d",rate);
if(fuel<=20){charge=fuel*rate;} /*給油量が20L以下の時*/
else{charge=(fuel-20)*rate*0.9+rate*20;} /*給油量が20Lを超える時*/
printf("料金%d",charge); /*料金を出力*/
}
>>294
scanf関数の使い方
296デフォルトの名無しさん:04/05/01 22:42
printf("給油量");scanf("%d",&fuel); /*給油量の入力*/
printf("石油の単価");scanf("%d",&rate);

&をいれなおしてやってみましたがどうしても料金が0円
になってしまいます。
297デフォルトの名無しさん:04/05/01 22:47
>>296
%dじゃなくて%lf
298デフォルトの名無しさん:04/05/01 22:50
ああ、そうか・・
double型ですもんね^^;
解決しました、ありがとうv
// a.h
static int a = 1;

// b.h
#include "a.h"
static int a = 2;

aが再定義されていますというエラーがでるのですが、
staticにするとそのファイル内だけで有効になって、他のファイルで定義されていても被らないんではないんですか?
>>299
#includeは単純にファイルを挿入するだけで、それはプリプロセッサの仕事。
コンパイラはそんなことは知らない。
>>300
なるほど。ありがとうございます。
2つの値を保持するテンプレートを作って、SIZEやPOINTにキャストできるようにしたり
以下のように演算子を定義しました。(部分抜粋です)
friend UPair<T1, T2> operator +(const UPair<T1, T2> &up1, const UPair<T1, T2> &up2){
UPair<T1, T2> ret;
ret.m_t1 = up1.m_t1 + up2.m_t1;
ret.m_t2 = up1.m_t2 + up2.m_t2;
return ret;
};
friend UPair<T1, T2> operator -(const UPair<T1, T2> &up1, const UPair<T1, T2> &up2){
UPair<T1, T2> ret;
ret.m_t1 = up1.m_t1 - up2.m_t1;
ret.m_t2 = up1.m_t2 - up2.m_t2;
return ret;
};

コンパイルすると
fatal error C1001 : 内部コンパイラエラー が出てしまいます。
operator-の部分をコメントアウトすると無事通るのですが、何が悪いのでしょうか?
おしえてください。
すいませんVC++6.0です。
>>302
それを見る限りでは問題なし。
はて、ソースのほかの部分に問題があるのか、VCの問題なのか。
>>304
どうもです。

他の部分と言うと
メンバ変数とコンストラクタ、デストラクタ、
POINTとSIZEへのキャスト演算子ぐらいしかないです。

operator-の部分に何かあるらいと思い、
動作(差を取って返す)はそのままで"operator *"や"operator /"に変えたらコンパイルできました。
また、operator-であっても、第2引数をintやdoubleなど変えれば通ります。
駄目元でリビルドもしました。
なんか非常に特殊な状況のような気がしてきました...
>>305
VC7.1ではすんなり通りました。VC6.0固有の問題かと思われます。
部分特殊化をしてないかチェックしましょう。
VC6は部分特殊化はサポートしてないはず。
308302:04/05/02 03:52
試しにやった、Win98+6.0Standardで通ったのでバージョン固有なのかと思い、
WinXP+6.0Enterpriseにsp6を導入したところ無事通りました。
お騒がせしました。

ところで部分特殊化とは何でしょうか?是非教えてください。
俺はVC6の場合はテンプレート/STLは信用しないので使わないようにしてる
>>308
こんなのかな、特殊化の中でもまだTとかの残っているもの
template <typename T>
struct Isvector{
    enum{value=0};
};
template <typename T,typename A>
struct Isvector<std::vector<T,A> >{
    enum{value=1};
};
template <int i,int j>
struct static_gcd{
    enum{value=static_gcd<j,i%j>::value};
}
template <int i>
struct static_gcd<i,0>{
    enum{value=i};
}
ふむふむ...
特殊化 ≒ テンプレートのオーバーロード
部分特殊化 ≒ ↑の型が任意である余地の残っている場合
...でなんとか理解できてるのでしょうか?
自信は無いです_| ̄|○
>311
テンプレートのオーバーロードという表現は分かってる人になら通じるし、
そういう見方も出来るのは分かるんだけど、テンプレートとオーバーロードは
本質的に異なるものなので、あんまりその表現はお勧め出来ない。
質問させてください。

C++なんですが、たとえば下のようなクラスを定義します

class test{
private:
int a:
int b;
public:
test(void){
a = 0;
b = 0;
}
test(int c,int d){
a = c;
b = d;
}
};

で、宣言の際に
test myclass(1,2);
としてconstructorに値が流れた場合、メモリはどのように確保されていくのですか?
constructorが呼ばれた段階でcとdが作られるのはわかるのですが、aとbが生成される
タイミングがわかりません。どなたか教えてください
>313
もし、コンストラクタが呼び出された後に、aとbが生成されるとしたら
コンストラクタの中で何が起こりますか?
>>313
int f
{
  test myclass(1,2);
}
このように書いたときは、
1.fのスタック上にaとbとを格納する領域が連続して確保される。
2.この領域へのポインタが引数の1, 2とともにtestのコンストラクタに渡される。
3.testのコンストラクタは、渡されたポインタを元にa, bに代入する。
つかコンパイラ依存じゃないの?
>>313の環境も聞かずにわかることなの?
C++についての質問です。
newを使って2次元配列を確保しました。
その中に値を入れたいのですが、
{{1,1},{1,1}}のように一回ですべての配列に値を入れる方法はありますか?
CとC++ではどちらの方が実行速度が速いコードになるんですか?
完全にコンパイラに依存することですか?
C++でクラスを使うと遅くなるって聞いたんですが、
本当なんですかね。
319デフォルトの名無しさん:04/05/03 15:51
Cのenumについて教えてください。

enumはdefineと違ってプリプロセッサが処理するわけではないということのようですが、
では、実際にどんな風に処理されるのでしょうか?
例えば、

enum{ hoge, foo, bar};

と書いておいて、

int n;
n = bar;

とすれば、nは2になるわけですけれど、hoge、foo、barは変数ではないし、defineを使う場合のように、
プリプロセッサが具体的な数字に置き換えてしまうわけでもないわけですよね。
hoge、foo、barは変数でないけれど、それぞれをconst変数のようにメモリの一部に格納すれば
実現可能ですが、それもなんだか変な感じがします。

単に疑問に思っただけで、具体的に何か困っているわけではないのですが、
気になったので、識者の方々、ご存知でしたら教えてください。
#環境はgccでもVCでもbccでもなんでも良いです。

よろしくお願いします。
>>319
hoge, foo, barは「定数」。
コンパイラにとっては"bar"も"2"も似たような物だと言えば分かりやすいかな?
実際多くの環境でn=2;と書いた時と全く同じコードが生成されると思う。
Cとプリプロセッサは同時に出来たわけじゃないってことだーね
322デフォルトの名無しさん:04/05/03 17:15
>>320
今、C言語の本の定数のところを読み返してみました。
なるほど、enumが定数表現の一種と思ったらすんなり理解できました。
本の最後の方にあるプリプロセッサのところを読むころには
最初の方に書いてあった定数のことが頭から抜けていた私です。

どうもありがとうございました。あーすっきりした。

>>321
えぇ?これは私へのレスですよね?
うーん、なんか難しすぎて意味が良くわかりません。
もすこし勉強してきます。
ANSI Cとただの昔のCの事か?
#include <stdio.h>
int
main(argc,argv)
int argc;
char *argv[]
{
printf("Hello");
}
>>317
無い。
カーソルキーとスペースキーの押下状態を調べる
コンソールプログラムなんですが、
http://venus.aez.jp/uploda/dat/upload6824.lzh

[←][↓][SPACE] や、[↓][→][SPACE] の同時押しを実行すると、
押されているにもかかわらず押されていないと判定されるキーが
出てきてしまいます。

Win9xでは問題なく動作していたのですが、XP に乗せ替えた途端に
このような状態になってしまい、どうしたものかと。皆さんの環境では
問題なく動作しますでしょうか。お手数でなければご報告よろしく
お願いします。

プログラムを終了するときはエスケープキーを押してください。
326デフォルトの名無しさん:04/05/03 22:10
#include <stdio.h>
main()
{
int im;
im=0;
while(im<11){
printf(" HELLO ");
im = im+1;
}
}

このプログラムを実行する際に「HELLO」が表示されたりされなかったり
して不安定なんですがなぜでしょうか?
環境のせいだと思うんですが・・・
自分はXPをつかっていてエディタはCPad、コンパイラはLSI C-86
です。
>>326
printf(" HELLO \n");
328デフォルトの名無しさん:04/05/03 22:14
>>327
だめでした;;
本来なら表示されているはずのところに何も表示されません、
行間はちゃんととられてるのでプログラム自体は正常に動いている
ようですが・・・
コンパイルし直すと違うの?それともコンパイルし直さなくてもそう?
330326:04/05/03 22:20
しばらくしたら自然に治りました^^v、特に設定変えたわけでもないのに
わけわかりません・・・^^;
>>328
漏れんとこじゃ表示できたんだけどなぁ。
printfで表示できない環境なんて聞いたことはないけど、
絶対ないとは言い切れないから、それかもね。
332326:04/05/03 22:22
>>329
ほんとに突発的になるんですよ・・・、
文字の表示に関する設定のどこかだと思うんですが・・・
>>326

あんまり意味ないとは思うけどprintfのあとに
fflush(stdout);
とかつけてみたら?
>>326

えと、326ではりつけてるプログラムが実は説明用のプログラムで
本当はもっと複雑なプログラムで問題が起こっているなんて事は
ないですよね。

もっと複雑なプログラムでprintfでデバッグなんかしてて、
プログラムを実行すると途中で落ちちゃうんだけど、
どのprintfも実行されてないなぁ…おかしい!
なんてことはないですよね。

もし、「実は正にそうですた」ならば上で書いたfflushは有効かもしれません。
printfで出力したものは、実はバッファにためられてあとでまとめて出力されます。
プログラムの正常終了時にはちゃんと吐き出されますが
異常終了時には表示されないこともあります。
fflushをつかえば、その時点で出力されます。

なんてえらそうに書いちゃったけど、もし「そんなの知っていますよ」だったらごめん。
WindowsNT/2000上の CPad for LSI C-86 で、コンパイルはできるが、実行結果が表示されない
きときと - CPad - Q&A
http://hp.vector.co.jp/authors/VA017148/pages/cpadqanda.html#lsiconnt
336デフォルトの名無しさん:04/05/03 22:49
質問です。Cをかんばってるんですが・・・
#include <stdio.h>
int token[] = {387892,37428737,37468763};

void main(void){
int i;
char[1024] buf;
for(i=0;i <(sizeof(token)/sizeof(int));i++)
sprintf(buf,"%d%s",token[i],buf);
printf("%s\n",buf);
}
tokenを逆順に繋げていって文字列にしたいんですがうまくいきません。どうしてでしょうか?
337デフォルトの名無しさん:04/05/03 22:50
>>336
char[1024] buf; ←
338336:04/05/03 22:58
すみません。char buf[1024] = "";を間違えてかいていました。
なぜがコピーできなかったので自分でかいてミスしていました。
それにしてもどうしてでしょうか?
339デフォルトの名無しさん:04/05/03 23:01
>>338
最終的にbufの中はどうなってほしいんだ?
340339:04/05/03 23:03
3746876337428737387892
こうか?
341デフォルトの名無しさん:04/05/03 23:08
領域が重なる場合にstrcpyやmemcpyを使ってはいけないのと一緒。
なんでintで文字作ってるの?
343デフォルトの名無しさん:04/05/03 23:26
#include <stdio.h>
int token[] = {387892,37428737,37468763};

void main(void){
int i;
char buf[1024];
for(i=0;i <(sizeof(token)/sizeof(int));i++)
sprintf(&buf[i],"%d\0",token[(sizeof(token)/sizeof(int))-(i+1)]);
printf("%s\n",buf);
}
344336:04/05/03 23:36
>>340さん
そういう事なんですが・・・
>>343さん
どうもそのソースコードでもうまくいかないんです。
33387892となってしまいます;
ちなみに私の環境はLinuxコンパイラはgccです。本当に済みません;
345326:04/05/03 23:36
>>334-335
それぞれの追加してみたところなんとか安定動作するようになりました^^
fflushっていうのは初耳でしたが、次からは付けてみようと思いますv
ありがとうございました♪
346デフォルトの名無しさん:04/05/04 07:56
引数に座標がある関数、TextOut、SetPixelなどはx、yの順番ですが、
一般の二次元配列がhoge[y][x]とy、xの順番である以上、
同じようにy、xの順番にしたほうがいいと思うのですが、
なぜ逆になっているのでしょうか。
>>346
世間一般では、(x, y)というようにxを先行させるのが常識だねぇ。
二次元配列とは意味が違う。
348デフォルトの名無しさん:04/05/04 10:28
他スレから誘導されてきました。宜しくお願いします。
if(!x)という式は
xが0の時にif文が実行され、
xが0でないときは実行されないと解釈して宜しいでしょうか?
>>348
>他スレから誘導されてきました。宜しくお願いします。
誘導されたとは言え、向こうで書かれたことを頓着してないわけね。
>if(!x)という式は
それは式ではない。
>xが0の時にif文が実行され、
>xが0でないときは実行されないと解釈して宜しいでしょうか?
質問の意味が、下の例の場合にどっちが実行されるかと言う意味ならば、
xが0ならば 1のブロックが実行され、そうでないなら2のブロックが実行される。
if (!x) {
 /* 1 */
} else {
 /* 2 */
}
つーか試してみればわかるじゃん
351デフォルトの名無しさん:04/05/04 17:57
while文でのループの範囲ってどこにあたるところですか?
while(expr)/*ここから*/{

}/*ここまで*///だと思う
よそで質問したのですがレス貰えなかったので、ことわり入れて移動してきました。

Microsoft Visual C++ Toolkit 2003がDL出来る様になったので、PSDKなど
揃えBCC5.51でコンパイル出来なかったDXSDK8.1のサンプルのコンパイルに挑ん
でみました。が、その殆どがReleaseビルドではwarning吐きながらもコンパイル
できるのですがDebugビルドではリンカーエラーでEXEファイル作ってくれません。
ネットで検索したところ、Libファイルの取り込み忘れ等あるのですが、サンプル
付属のMAKEファイルをNMAKEで処理しているので、どうしていいのか解りません。
解る人おられましたら教えてください。
以下エラーです。

Microsoft(R) Program Maintenance Utility Version 7.10.3077
Copyright (C) Microsoft Corporation. All rights reserved.

Warning: cannot find "donuts3d.dep"
link.exe @C:\TEMP\nm5D.tmp
LINK : warning LNK4224: /PDBTYPE is no longer supported; ignored
d3dfont.obj : error LNK2019: unresolved external symbol __ftol2 referenced in fu
nction "public: long __thiscall CD3DFont::InitDeviceObjects(struct IDirect3DDevi
ce8 *)" (?InitDeviceObjects@CD3DFont@@QAEJPAUIDirect3DDevice8@@@Z)
donuts.obj : error LNK2019: unresolved external symbol __ftol2 referenced in fun
ction "protected: void __thiscall CMyApplication::ConstructMenus(void)" (?Constr
uctMenus@CMyApplication@@IAEXXZ)
.\Debug\donuts3d.exe : fatal error LNK1120: 1 unresolved externals
NMAKE : fatal error U1077: 'link.exe' : リターン コード '0x460'
Stop.

よろしくお願いします。
354325:04/05/04 18:41
すみません、前回のがうまくダウンロードできなかったかも
しれません。今度はバイナリだけです。多少変更しました。
http://www.uploda.net/anonymous/etc2/upload23193.lzh

たとえば、[←][↓]を同時に押した状態のまま、[スペース]を
押したとき、画面の "スペース" の横に○印が表示
されますでしょうか?
>>354
d3dx.libのリンクし忘れ
356325:04/05/04 21:26
>>355
DirectXは使っていなくて、GetAsyncKeyState() API でキーの状態を
チェックしています。>>355さんの環境でも、[←][↓]を押したまま
[SPACE]キーを押しても、スペースキーが押されていないような反応を
示しました?
>>356
>>355>>353へのレスだと思われ
っとと、すまん>>353な。

あと、キーボードの同時押しは組み合わせによって認識されないキーがあったはずだけど。
359325:04/05/04 21:32
>>357
どうりでかみ合っていないなと思いましたw
360325:04/05/04 21:37
>>358
>キーボードの同時押しは組み合わせによって認識されないキーがあったはずだけど

やっぱりそういうのがあるんですか…。
これらのキーを同時に処理しなければならないので困ったもんです。
こちらももう少し調べてみます。ほかにも何か情報をお持ちの方が
いらっしゃいましたらお願いします。
やねうらおのBM98の記事でその辺詳しく解説されてたと思うけど
キーボードを変えるしかない。
362353:04/05/04 22:40
>>355さんありがとう
MAKEファイルの記述はこうなっています。

CPP=cl.exe
CPP_PROJ=/nologo /MLd /W3 /Gm /GX /Zi /Od /I "..\..\common\include" /D "WIN32"
/D "_DEBUG" /D "_WINDOWS" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c
LINK32=link.exe
LINK32_FLAGS=d3dx8dt.lib d3d8.lib d3dxof.lib dinput.lib dxguid.lib winspool.lib oleaut32.lib
uuid.lib dxerr8.lib ole32.lib winmm.lib kernel32.lib user32.lib gdi32.lib comdlg32.lib
advapi32.lib shell32.lib /nologo /subsystem:windows /incremental:yes /pdb:"$(OUTDIR)\dmboids.pdb"
/debug /machine:I386 /out:"$(OUTDIR)\dmboids.exe" /pdbtype:sept

d3dx.libをd3dx8dt.libの前に追加しますと、

d3dx8dt.lib(d3dxmath.obj) : error LNK2005: _D3DXColorAdjustContrast@12 already d
efined in d3dx.lib(d3dumath.obj)
↑同様ERRORが山ほど出る
d3dfont.obj : error LNK2019: unresolved external symbol __ftol2 referenced in fu
nction "public: long __thiscall CD3DFont::InitDeviceObjects(struct IDirect3DDevi
ce8 *)" (?InitDeviceObjects@CD3DFont@@QAEJPAUIDirect3DDevice8@@@Z)
music.obj : error LNK2001: unresolved external symbol __ftol2
.\Debug\dmboids.exe : fatal error LNK1120: 1 unresolved externals
NMAKE : fatal error U1077: 'link.exe' : リターン コード '0x460'
Stop.
と違うエラー出る様になり、d3dx8dt.libより後に追加しますと、最初のエラー
と同じです。
DirectXサンプルの他に、ポリゴン扱うサンプルも試してみたのですが、
error LNK2019: unresolved external symbol __ftol2
このエラーで失敗します。
symbol __ftol2はlibc.libだと思うのですがよく分かりません。
コンパイラオプションに/QIfistを追加するとビルドできるのですが・・・・・・
>>362
Debug版ランタイムって確か入ってないと思ったけど…。
364353:04/05/04 23:33
>>363さんありがとう。
DXSDKインストールする時にDebug版で入れました。
libc.libはNODEBUG、DEBUG版はlibcd.libで、無ければコンパイル時に
CAN NOT OPEN FILEになります。(コンパイラオプション/MLdで自動読み込み
なのでMAKEファイルに記述してもしなくてもよい)
LIBPATH:通ってますしDirectXのファイル不足は無いと思います。
が、libcd.libにsymbol __ftol2があるかどうかと言う事なら、私には解りません。
DXSDKサンプルではない、他のポリゴン扱うサンプルでのReleaseビルドでも
LNK2001: unresolved external symbol __ftol2
が出て先へ進めない現状です・・・・・・
365353:04/05/04 23:43
d3dfont.obj : error LNK2019: unresolved external symbol __ftol2 referenced in fu
nction "public: long __thiscall CD3DFont::InitDeviceObjects(struct IDirect3DDevi
ce8 *)" (?InitDeviceObjects@CD3DFont@@QAEJPAUIDirect3DDevice8@@@Z)

これってsymbol __ftol2 が見つからないってエラーでは無く、
public: long __thiscall CD3DFontが見つからないって事でしょうか?(^^;
あるのならVC6.0とかでコンパイルしてみたら?
なんか、VCTK2003は標準ランタイムが足りないんじゃないかって思えてきた。
367353:04/05/05 01:21
>>366さんどうも。
おっしゃる通りVCTK2003だけでは全然足りません。
これにPSDK+DDK+サービスパック等で不足補いました。
見かけ上ファイルは揃いましたが、バージョン違いによるライバラリ等の整合性
が取れないのかもしれません。
ですが、DXSDKサンプルはReleaseでならビルド出きるわけでなんとも。
>>367
まあSDKとか足りてないのは当然なんだけど。
LINK : warning LNK4224: /PDBTYPE is no longer supported; ignored
とかあることだし、デバッグのサポートが無効になっていて
標準Cランタイムもデバッグ版は付属してないとか言うオチじゃないの?
>>368さんどうも。
Visual C++ Toolkit 2003付属コンパイラ(cl.exe)は、一部サポート無効とか
の廉価版では無く、制限の無い、一番上の物らしいです。
オプション/pdbtype:はVC6にはあった様ですがVC7からは変更になった様で、
デバッグサポートが無効というわけではないようです。
標準Cランタイムも全て揃っているのか私にはわかりません。
手掛かりは__ftol2とコンパイラオプション/QIfistでしょうか。
370デフォルトの名無しさん:04/05/05 04:15
全画面表示で開くウィンドウに何らかの文字を表示して、ESCキーを押すと
閉じるものを作りたいのですがどうすればいいのでしょうか
Cです。よろしくお願いします
371デフォルトの名無しさん:04/05/05 06:19
ただしその場合、質問者は必ず、環境を書きましょう。
372デフォルトの名無しさん:04/05/05 10:30
DirectX SDKってマイクロソフトの何所にあるのですか?
言われてもわからないのでリンク張ってくださるとありがたいです
>>372
自分で探せ。探せないのなら、DirectXなんか使えない。
>言われてもわからないので
プ
375370:04/05/05 11:08
OSはMeでLSI C-86試食版をつかっています
お願いします
>>375
諦めろ。
>>375
OpenGLでGLUTってことでいいのかな?

void displayfunc(void)
{ /* 何らかの文字を表示 */ }

void keyboardfunc(unsigned char key, int x, int y)
{ if (key == 033) exit(0); }
...
int main(int argc, char *argv[])
{
  glutInit(&argc, argv);
  glutInitWindowPosition(0, 0);
  glutInitWindowSize(glutGet(GLUT_SCREEN_WIDTH), glutGet(GLUT_SCREEN_HEIGHT));
  ...
  glutCreateWindow("hoge");
  glutKeyboardFunc(keyboardfunc);
  glutDisplayFunc(displayfunc);
  ...
  return 0;
}
LSIC-86は16bitコードしか生成できないのでは?
379デフォルトの名無しさん:04/05/05 12:29
お世話になります。
C++でコンソールアプリを作成しています。
プログラム実行時の設定を外部ファイルに持たせようとしていますが
ファイル構造や読み取り方などの定石はあるのでしょうか?

今設計しているファイル構造は以下のようなものなのですが
aaa=111
bbb=222
文法チェック、必須項目チェック、範囲チェックなど
結構手間がかかってしまいます。
>379
winな環境なら API も充実してるし、iniファイル使えよ
>>379
もし私と同じプロジェクトに参加している別会社の人なら、
その辺りはライブラリ化する予定がありますので半月ほどお待ちください。w
382デフォルトの名無しさん:04/05/05 13:28
>>381
お願いしちゃっていいですか?
半月ですか?時間かかりすぎです。
1日でできませんか?
すでに火が出ているのはご存知でしょう?w
383381:04/05/05 13:49
>>382
あ、プロジェクト違いだね。
火が出ているも何も、未だ仕様が確定してねぇもん。
お尋ねします。
Watcom C/C++ 11jというコンパイラを手に入れました。
これでWindows2000、XP上でI/Oポートをいじれるexe,dll等は作成出来るのでしょうか
差し迫っての問題ではないのですが、やはりVisual C++でしか開発できないのでしょうか
http://www.vector.co.jp/soft/win95/prog/se097101.html
こういうの有ったし、できるんじゃない?
タダで最強!フリーC/C++コンパイラ
http://pc5.2ch.net/test/read.cgi/tech/1035882599/
>>385
それ、NT系の2000/XPじゃ使えない様な気がする。

>>384
exeやdllだけでI/Oポートに直接アクセスすることはOSとして不可能。
Watcomだからっていう問題ではない。
フリーのドライバが有るのでそれ使え。
388384:04/05/05 18:25
レス付けていただいた方々、ありがとうございます。
I/Oポートに直接アクセスするのはドライバ開発になるのですね。
389デフォルトの名無しさん:04/05/05 19:20
int n;
cin >> n;

while( n <= 3 ) { cin >> n; }

説明するまでもないですが、入力した整数が3以下ならば
入力し直すというだけのプログラムです。もちろんnに適当な
整数を入力すれば期待通りに動きます。

ところでnの値を入力する際に、例えば5.4とすると
小数点以下は切り捨ててn=5として扱われるわけですが、
上記のプログラムにおいて例えばn=1.5と入力すると無限ループになってしまいます。
「n=1.5と入力したらn=1となる、よってwhileの条件はtrueとなる」と、ここまでは
いいのですが、何故whileの中の cin >> n を無視してしまうのかがわかりません。

どうしてこうなってしまうのでしょうか?

なお Borland C++ を使用しています。
>>389
nはintなので、cin >> n とやる時、1.5と入力するとストリームバッファ
に ".5" が取り残されてしまう。すると次のcin >> nは必ず失敗して
しまい永久ループになる。(nの値が変化しない)
従ってcinのストリームの状態を常に調べる必要がある。failbitが
立ったりして(cin)が0になったら、whileをbreakするなどの処置が
必要。
391370:04/05/05 19:42
レスしてくれた方ありがとうございました。

GLUTっていうのをもってない場合はインストールしなきゃいけませんね
それだったらDirectXを入手する方がいいでしょうか?
っていうか[ファイル]メニューの[新規作成]なんてどこにあるんだ
さっぱり分からん(つД`)
例えばこんな具合。

#include <iostream>
int main()
{
 int n;

 std::cin >> n;
 while (n <= 3) {
  if (!(std::cin >> n)) {
   std::cout << "An error has occured in operator >>" << std::endl;
   break;
  }
 }
}
std::cin.exceptions( std::ios::badbit | std::ios::failbit );
>>389
こんなのとか。
#include <iostream>
#include <sstream>
int main(){
    using namespace std;
    string buf;
    int n=0;
    while(1){
        cout << "4以上の整数を入力してください:";
        getline(cin,buf);
        istringstream(buf) >> n;
        if(n >= 4){
            break;
        }
        n=0;
    }
    cout << "入力された数字は"<<n<<"です\n";
    return 0;
}
395389:04/05/05 21:00
レスしてくださった方々、どうもありがとうございます。
非常に勉強になりました。
これはdo〜whileの出番かもしれない。
>>394
言ってみればC++でcinはCで言うところのscanf()、getline()+stringstrem
はCで言えばfgets()+sscaf()みたいなイメージだな。中身はもちろん全く
違うが。
>>393の例外は気に入った。
>>394
 付けすぎw
399デフォルトの名無しさん:04/05/06 04:07
Cでnamespaceとかclassのprivateみたいに、
関数のローカル化ができるものがあるなら教えてください。
static
401399:04/05/06 04:37
>>400
具体的にお願いします。

Cで長編物を作っていて管理に困ってC++を始めたのですが、
難しくて挫折してCで同じようなことが出来ないかなと思い質問しました。
2chのスレ数でいうと、c:cpp=2:1とCの方が多いのですが、
プログラマーの人はCで長編物を作る場合、
管理でどういう所に気をつけるのですか。
402デフォルトの名無しさん:04/05/06 04:41
あとに続く語りに強烈な説得力を与える
ナイスな一行目だな
403デフォルトの名無しさん:04/05/06 04:42
>>401
具体的もなにもstaticについて調べれば分かることだが。少なくともC++の経験があればな。

static int func(void){;}とすると、このfunc関数は内部リンケージを持ち、他のファイルからは呼び出せなくなる。
ゆえに同じものを複数のファイルに書いても衝突しなくなる。
404デフォルトの名無しさん:04/05/06 04:45
C++の一部が分かっているのなら、それだけを使えばいいような・・・
無理してC++のあらゆる機能を使うこともないと思う。
405399:04/05/06 04:52
ありがとうございます。

>>402
(^^)

>>403
できました。publicは普通の関数、privateはstaticを付ける
みたいな感じでいいのですか。

>>404
ローベルさんのページhttp://www1.kcn.ne.jp/~robe/で
勉強したのですが、基本的なあらゆる部分でCと違う感じがします。
406403:04/05/06 04:54
intなのに整数をreturnしてねぇ・・・・
長編、ねぇ。
本の1,2冊くらいは読んどけ。
403は親切だーね、
こんな失礼な奴に。
409399:04/05/06 06:20
すいません。出直してきます。
410河豚 ◆8VRySYATiY :04/05/06 12:20
TurboCなんですが、BGIをプログラム内に組み込む方法を
どなたか、ご教授下さいませんか?
>>401
>具体的にお願いします。
ワロタ
C++でメンバ関数内でstaticで変数を宣言した場合、
その変数はそのクラスの型の変数すべてで共有なのか
それとも個別に用意されるのか教えてください。
共有だよ
static宣言したらメモリ上の固定位置に配置されるんだってば。
それがわかってたら>>412のような疑問は湧いてこない。
クラス内での static inline と staticって等価?
>>414
インスタンスを定義したらだね。

>>415
違う。
417415:04/05/07 02:18
>>416
具体的にお願いします。
ひとところに関数を定義するなら、inlineが無効のような気がするのです。
> >>414
> インスタンスを定義したらだね。
クラスのインスタンスのことじゃないよね?
>>417
> ひとところに関数を定義するなら、inlineが無効のような気がするのです。

クラス定義内に関数の定義を書いた場合はinlineとみなされるので、
違いが無いように見えるかもしれない。

もしくは、最適化をかけていなければインライン展開されないので、
違いが無いように見えるのかもしれない。
>>415
static inline int x;
とは書けんぞ。
関数内のstatic変数の話と
クラスのstaticメソッドの話が混ざってるぞ。
>>421
混じってるのはお前の頭の中だけ。
プ
424353:04/05/07 03:59
DXSDKサンプルがLINK2019エラーでコンパイル出来ないと騒いでいたモンです。

あれやこれやとやったところ、使っていたlibcd.libに__ftol2が入っていなかった
というなんともおそまつな話。(だって知らんもんよぉ
それと、ネットうろついててVC6のライブラリ群見つけたので、それでコンパイル
してみたところ__ftol2入ってないlibcd.libでコンパイル出来ました。
VC6の(当時の?)ヘッダでは__ftolになるみたいです。
助言下さったかたありがとう御座いました。
425デフォルトの名無しさん:04/05/07 16:46
C++ でsize_tの扱いというのはどうなっているのでしょうか?
STLの解説書によると<cstdref>で「サイズの単位に使われる符号無しの型」
とありますが、#include <cstdref> としなくてもコンパイルが通ります(g++)

またsize_tはどの程度使用が推奨されるものなのでしょうか。
for( size_t i=0 ; i<vec.size() ; i++) ではなく、やはりループごとに
for( std::vector<vector<string> >::size_type i=0 ; i<vec.size() ; i++)
と書くべき? (typedef を使わなければ)
そこまでやらんでも大丈夫だと思うが、正確にはそうなるのかね。
size_t って unsigned int の typedef だし
int とは決まってないんじゃない?
そうか、intは漏れの環境での話か・・・VCのSTRING.H
>>427
具体的にお願いします。
430デフォルトの名無しさん:04/05/07 17:36
>>429
大きさを表すのに適切な符号無し整数なら、別にunsigned intでなくてもいい。たとえばunsigned long intでもいい。
431デフォルトの名無しさん:04/05/07 17:39
>>425
cstdrefじゃなくてcstddefな予感。
432425:04/05/07 18:14
>>431
仰せのとおり、cstddrefです。
/usr/include/string.hではsize_tを使うために#include <stddref.h>
とやっていました。(C用ですが)

結局>>430氏の言うあたりで結論なんですね。Thanks.
だからrはいらないと(ry
434デフォルトの名無しさん:04/05/07 19:51
c++の質問です。
a%b
でaやbを負の数にした場合どういった風に定義されているのでしょうか?
Cの質問ですが、
if (a % 100 > 0)
a += 100 - (a % 100);
例えばこのように書いたときに、
"%":不正な左オペランドです。
とでてしまうのですがどのようにかえるべきでしょうか。
%を同じように使ってもでないときもあるのです。
>>434
implementation-defined

Programming languages --- C++ (FINAL DRAFT)
http://www.kuzbass.ru/docs/isocpp/expr.html
5.6 の 4 を参照。
>>434
C++では確か処理系定義。
438437:04/05/07 20:15
かぶったスマソ。
>>435
aの型は整数型だろうな?
440434:04/05/07 20:32
>>436
ありがとうございます。けど英語わからないです・・・・
どういうことなのでしょうか?ほんとに教えて厨ですけど説明していただけるとうれしいです
>>440
"C FAQ" "処理系定義" でググれ。
442412:04/05/07 21:04
答えて下さった方ありがとうございます。
>>432
C++でのsize_tはstdの中にあるんで、std::size_tなどとしなければならないよ。
>440
規格の英語なんて大した英語じゃないぞ。
この程度の英語が読めないようじゃ、この先も苦労する。
まずは辞書引きながらででも読んでみて、その解釈が正しいのかどうかを
問うべきじゃないのか?

…と釘を刺しつつ
>441
それだとヒットしなさげ
>440
ここを参照しる!
ttp://seclan.dll.jp/c99d/c99d05.htm#dt19990607
なお、C++ では 14882:2003 においても処理系定義のままである。
今回のはポインタも示されてるからいいけど、
いくら規格の英語がたいした事無いとはいえ
量に圧倒されるのが、日ごろ英語に触れてない日本人なわけで。
斜め読みも出来ないから、目的の情報を拾いにくい。

規格は英語が基本だからなぁ…
まあガンガレ>>434
447434:04/05/08 16:31
みなさんホントにありがdです。
大学でプログラミングの勉強に困ったらまた来ます。そのときはどうぞよろしくお願いします。

英語もこれから勉強しようと思います!でわ!
448デフォルトの名無しさん:04/05/08 18:54
windowsのビルドナンバーのリストなんてありませんか?
windows2000sp3のバージョンが知りたいんです。
VCで取得するところはうまくいったんですけど、肝心の比較数値がわかりません。
ぐぐったら簡単に見つかるだろうとタカをくくってたら意外とみつからなくて…
自分でインストールして調べるしか無いかな…
もしわかったらおねがいすます!
>>448
SPがついていようがなかろうが、2195
450デフォルトの名無しさん:04/05/08 19:02
>449
レスありがとうございます。
マ、マジですか?
もしかして判別不可能ですか?
451デフォルトの名無しさん:04/05/08 19:03
C++の標準ライブラリの中で、
指数計算するpowみたいな関数と、
ランダムな数値を得る関数ってありますか?
>>450
OSVERSIONINFOEXのwServicePackMajor/Minorをみればいい
>>451
何をしたいのかいまいち理解できないのですが、powとかrandとかでは
いけない理由はなんでしょうか?
454デフォルトの名無しさん:04/05/08 19:35
>>453
すいません。最近C++の勉強を始めたんですが、
Cの時に使ってた、mathみたいなライブラリはC++で使ったらいけないのかな、と思いまして。
全然使ってもいいんでしょうか?
"全然"の使い方が間違っているが、Cライブラリを使っても問題ない
456デフォルトの名無しさん:04/05/08 19:37
>452
そんなんあったんですか!
アリガd!
全然は肯定にも用いられる副詞。
うそ!まじ?
役不足とかで得意げになってるアホが
よく知りもしないのに指摘して恥をかく好例。
>458
全然まじですよ?
1 (あとに打消しの語や否定的な表現を伴って)まるで。少しも。
2 残りなく。すっかり。
3 (俗な言い方)非常に。とても。
[大辞泉]


で、肯定?
2と3
残りなく使ってもいいんでしょうか?
すっかり使ってもいいんでしょうか?
非常に使ってもいいんでしょうか?
とても使ってもいいんでしょうか?


...ありえな〜い
言語はナマモノ。
>>463
はい、低脳

次。
Cをやろうと思いますが、今日Cを知ったような初心者にも読めるCに関する雑誌ってありますか?
(または本をお願いします)
467デフォルトの名無しさん:04/05/08 20:47
>>455
ありがとうー。
言葉には気をつけます。スマソ
独壇場 ← どくせんじょう で変換できない。
469デフォルトの名無しさん:04/05/08 20:50
470デフォルトの名無しさん:04/05/08 21:40
>>457
さらしあげ
>470
全然OK
>>463
ありえないが、流行語みたいなもん。
好んで使ってるジャリタレが消えれば消えるでしょ。
>>472
ありえない
         _ ,,, _  __               〃 ヽ`_7i⌒'⌒ii‐ー,   ヽ
        ノ-―-`、ヽ`ヽ-.、         i./ ,./-‐` """´'ー 、!   `ヽ、
      _,,/  , _---、`ヽ\ヽヽ、       ノ./, - ' ´  ̄ ̄`ヽ_ \  ヽ!
    , ‐'´ r-.    ̄ヽ、  \'、ヾ、\   ー'´イ/      _,. ィ,.、 `ヽ、ヽ i l
.  /    .l トヘ     ヽ.  ヽ ', ヽ   ,ク´   __,. - '/'´  ヽ  ヾヽl !
  / /   /l '、 \ ヽ、 \.  ヽ   ヽー'´7i ,  ,-'-`!/´ ヽ''ニ-`、   ',、〈
 l / /  /'´ヾヽ、_ ,\ ヽ_,. -‐、 ', ヽ、 ヽ//./ / __      __  i、  l ヾ
 リl // /  _,,.\`く'  `´<ヽ、 \ ヽ \ ーヽ.,.イ ', '´`ヽ    r '' ヾ_,!l  !l .!
 !l l l / l 、/"`ヾヽ\ ,' ‐''ヾー-、.\ ヽヾーi、l _l =! (゚;)     (゚;) l= ! _/  !
  l V./ゝ !=!  (゚;)   ` (゚;)  l=/_7ー、=,ヽ`!.ir、.', ' ,_,.   i   、_ ,、`./'r、i  !
  ヽll 'ヽ!!  , --  l   -- 、 `/r,ヽ  ヽ!  !ヽ'_,.!    __    i_ ) /  !
   ヽヘ、!l,!   , - 、 __,. -.、   ,i.l) ノ       !. ヽ.ヘ.    !'    ヽ  ノ、')´   .!
    _ゝlヘ  !'´     .i  /、リ)      ,'   `ヽ、 ヽ _ ノ / ./    i
  `>'=ノ , `ヽヽ      l,.ィ_、_\_    i ,.. - 、,-、.`_iー--‐.´レ' /,.へ、 _ ',
 〃   /,ヽ、r'こl` ー-‐ ',l´'Yヽヽ `ヾ´   l/   '´ /´  !  / ,// l    ヽ!
 l   / !.  ( ` ー=-´‐  ) ! '、   !  /    _l_. ! / // ./_,,L    i

        七_    七_  l l  二  ナ ゝ        i  ヽ |! |!
      (乂 )    (乂 )  ノ /し  cト   ̄ ̄ ̄   ヽ   ・ ・
>>455
「全然」を肯定に用いた例が芥川龍之介の文章の中に
存在するらしい(未確認)。

>>468
独擅場(どくせんじょう)は手偏。もともと独壇場(どくだん
じょう)は独擅場(どくせんじょう)の誤読である。
>>475
別に夏目漱石も森鴎外も普通につかっとるが。
とりあえず大辞林は漱石の文例を収録してた。
>以下大辞林から引用
ぜんぜん 【全然】
(2)あますところなく。ことごとく。全く。
「一体生徒が―悪るいです/坊っちゃん(漱石)」「母は―同意して/何処へ(白鳥)」
>引用終わり

高島センセも『お言葉ですが』でこのネタを扱ってたことがありましたな。
もちろん、「全然は肯定でも使う」って話。
あますところなく使ってもいいんでしょうか?
ことごとく使ってもいいんでしょうか?
全く使ってもいいんでしょうか?


...やっぱりありえな〜い
478デフォルトの名無しさん:04/05/09 00:39
最近C++を始めたばかりの初心者です。

いま、クラスのメンバ関数を作っているのですが、メンバ関数の作り方で悩んでいます。

戻り値でエラーコードを戻し、引数に参照型の変数を持つやり方はめんどくさいと思いました。
戻り値でコピーを渡しつつエラーを判定する何か良い方法はありませんでしょうか?

エラーフラグでも持ったクラスのコピーを返せばいいんとちゃうの?
>>474 久々に好ましいAAをみた。ありがとう。
481デフォルトの名無しさん:04/05/09 00:54
>>479
 お返事ありがとうございます。
 その方法は思いつきませんでした。ありがとうございます。

 しかし、intなどを戻す場合は新しいクラスを作らなければならないのでしょうか?
 それもちょっとめんどくさいような気がしました。
 なにかないでしょうか・・・。すみません。
482デフォルトの名無しさん:04/05/09 01:00
>>481
intの全ての範囲が必要なら無理。範囲外の値をエラーとする。
負の値がエラーを表すのはよくある。
483デフォルトの名無しさん:04/05/09 01:01
>>481
あるいは例外をスローすろ。
>>478
なぜに例外を使わない?
485デフォルトの名無しさん:04/05/09 01:27
>>482
 お返事ありがとうございます。
 やはりそのやり方が一番簡単だと思います。
 しかし、int現在はマイナス値を返す可能性があるので使えないかもです。
 intではないデフォルトのクラス自体を返すときも難しそうです。

>>483
 お返事ありがとうございます。
 例外ですか…。まだ勉強中です。

この中では例外が一番良いのかもしれませんね。精進いたします。
ありがとうございました。
エラー格納メンバ変数を持て
メンバ関数は戻る時にエラー格納メンバ変数を書き換える
487デフォルトの名無しさん:04/05/09 01:30
倉薫のC言語入門シリーズ
http://www.amazon.co.jp/exec/obidos/ASIN/488135843X/
http://www.amazon.co.jp/exec/obidos/ASIN/4881358448/

といっしょに、「珠玉のプログラミング」か「プログラミング作法」を買おうかと思っているのですが、初心者には早いですか?
488デフォルトの名無しさん:04/05/09 01:35
>>484
 すみません。まだ一度も例外を使ったプログラムを書いたことが無いのです。
 いかにも難しそうなので後回しにしていましたが…使うしかないのかも。
 
別に勝手もよかろう
>「珠玉のプログラミング」か「プログラミング作法」
理解できれば一人前だ
490デフォルトの名無しさん:04/05/09 01:40
>>486
 アイディアありがとうございます。
 それはいいですね。
 しかし、この機会を例外を使うチャンスと考えて、変更箇所は多いですが一度例外を使ってみます。
 失敗したら、そのアイディアを使いたいと思います。
>>489
理解できればということは、結構難しいのですか?
倉本は、かなり初心者向けのようで、間にクッション挟まないといけないかも。
>>490
グローバルなエラー変数を使うという方法もある。
errnoのように。あまり薦められないが。
難しいとは思わないが経験を積んでないと深い意味がくみ取れないかな
494デフォルトの名無しさん:04/05/09 01:55
>>492
 errnoですか。聞いたことはあるのですが一度も使ったことがないのでよくわからないです。
 勉強します。ありがとうございました。
ユーザからcinに入力された数だけvectorを宣言・初期化しようとして、つまずいています。
初期化に使う以上はconstでなければいけないと思うのですが、constだと初期化の時しか
値が設定できないので、入力の受付ができません。
別に入力を受け付けてからその値でconstなら問題ないのですが、この値は複数の外部関数
が参照するため、大域変数として置きたいとも考えています。

何か解決方法はありませんか?
>>495
vectorのテンプレート引数は何?
「cinに入力された数」に対応するにはvectorインスタンスの数?それとも一つのvectorの要素数?
「初期化に使う」って、何の初期化に何を使うことの話?「constでなければいけない」のは何?
そりゃ、constにしたら初期化以外のプログラム中でデータ入力できないわな。
std::cin >> という形では const 変数への代入は無理(解決策はいくつもあるが)。
そもそも配列と違って vector (の要素数は)定数でなくともかまわない。
ただ vector の要素数は可変だから
最初に要素数を指定する変数をグローバルで使いまわすのはおすすめできない。
メンバ関数 resize() や size() で vector 内部の要素数にアクセスしたほうがいい。
typedef std::vector<hoge> hoge_array;
const int n=5;//これをcinから取得したい
hoge_array arrays[n];

ってなことを考えてるような気がするんだが・・・
これだと配列をnewで確保するか、std::vector<hoge_array>を使えってのが答になる。
>495
ひょっとして宿題スレで最短経路を聞いてた人?
向こうでも軽く答えたけど、vector はそもそも動的配列だから、
要素数を指定するのに const 性は必要ない。
つか、(思いつくままに書いた)漏れの書き方が悪いんで、
グローバルにおかないように書き直した方がいいね。
501デフォルトの名無しさん:04/05/09 17:42
えー、ファイルオープンに関してなんですが
オープンするときに、ファイル名に動的に数字を置くことって出来ますか?
たとえば「test_01.txt」というファイルを作成してオープンする場合だったら

ofstream file( "test_01.txt" );

とするのではなく

int n;
cin>>n;

ofstream file( なんらかの処理 );

という感じで、ファイル名をいじりたいのですが。
よろしくおねがいします。
Cならsprintf()使うんだが、C++よー知らん
>>502
stringstream とか。個人的には sprintf 使ったほうが楽だと思うけど。
そこで boost::format ですよ。

ファイル数がすくなくて、ソースの寿命も短いんだったら
name[6] = '0' + ( i / 10 );
name[7] = '0' + ( i % 10 );
とかいう力技もありかな。
CString::FormatとゆーのはVC++か?
MFCだな。
C/C++使ってるのならsprintfを使えば問題なし
C++オンリーに拘る理由は余り無いよ、逆のケースならあるけど
strcpyではなくstrncpyを使え といったような、
よりセキュアなプログラムを組むために、いろいろ教えてください。
BOFのと、修正ポイントとか
sprintfなんて使うな、snprintf使え。
scanf使わないように徹底しててもsprintfなんて使ったら片手落ちもいいところだ。
>>508
strncpy() は

1) 末尾が '\0' 終端されない可能性がある
2) あまったバッファは放置するのではなく、必ず '\0' で埋められる

ので、単に strcpy() を置き換えるのに使うのはダメでしょ。*BSD から strlcpy() 移植して
使うべし。
>>510
その用途ならsprintf()で充分じゃん。
>>511
せめて snprintf() に
513マイク ◆yrBrqfF1Ew :04/05/09 22:16
>>508
最低限コードセクション以外を実行不可としてマップする

BOFってなんだ?
>>513
バッファオーバーフロー
515マイク ◆yrBrqfF1Ew :04/05/09 22:18
overflowは一つの単語だからBOが正しいだろ。
>>512
高々一つの文字列をコピーするならsprintf(dest, "%.*s", len, src)で充分。
>>516
分かりづらいのが問題。
>>515
バッファオーバーフローといえば、「NOP」という言葉が連想されるけど
その論理なら NO になってしまう罠w
>>517
あと printf() 系は str* 系関数に比べると重いし、async thread safe では
ないので使える場所に制約がある。普段はあまり問題にならんけど。
>>519
str*もスレッドセーフである保証は無い
printf系ももちろんそう、FILE*に適応する場合のみ顕著化する可能性がある
スレッドセーフで問題になる代表例は、strtok
>>520
printf() はともかく snprintf() はふつー thread safe になってると思うぞ。
たとえば Solaris 9 だと、snprintf() と同時に setlocale() を呼び出さない
限りは MT-Safe と規定されてる。

http://docs.sun.com/db/doc/817-0692/6mgfnkuql?q=sprintf&a=view

str*() 系が Async-Signal-Safe っつーのは私の勘違いだった。
522デフォルトの名無しさん:04/05/10 00:05
C++で正規表現を使いたくてboostをインストールしたいのですが
日本語のインストールドキュメントありませんか?
>>522
参照スレ
【C++】template 統合スレ -- Part4
http://pc5.2ch.net/test/read.cgi/tech/1083550483/
ファイルの一行に複数個のデータがあって、
データの個数はファイル読み込みまでわからないような場合、
どのようにコードを書けばいいか教えてください。

具体的にしたいことは、M×N行列のデータを書き込んだ、
以下のようなフォーマットのファイルを読み込みたい、ってことです。

1: M N // マトリクスの行・列数
2: ○ ○ … ○ // N個のデータ を H[0][0] 〜 H[0][N-1] へ

M+1: ○ ○ … ○ // ↑ 上記をM行繰り返し

可変引数とかを使ったことないもので・・・
あまり環境依存はないかもしれないですが、
いちおうコンパイラは gcc です。
>>524
各データ長が同じなら、行頭nバイトを固定で確保してそこにデータ数をいれとくとか
読み込んだ1行のバイト数をデータ長で割るとか
526524:04/05/10 02:13
>>525
> >>524
> 各データ長が同じなら、行頭nバイトを固定で確保してそこにデータ数をいれとくとか
> 読み込んだ1行のバイト数をデータ長で割るとか

すいません、データ型は double or float を想定していて、
データ長は不定です。
なおデータの区切りはスペースを想定してます。
>>526
1.ファイルの最初に全ての行の行毎のデータ数を書き込む。
2.行データの終わりを示す数字を決めて、それを書き込む。(最初のスペースまでとかね)
3.値データをなにも考えずスペースに挟んで一気に書き込む。
528527:04/05/10 02:43
何か微妙に矛盾した場所があるけど、まぁ眠いからいいや
>>526
データ本体にスペースと同じコードがあったらやばいくないか?
抽出方法は知らんが
gentoo linux を使ってますが、C を gcc でコンパイルするとき、
何も include しなくてもコンパイルできるのはなぜですか?
main()
{
printf("Hello, World\n");
}
>>530
Cだから。
いちおう聞いておくけど、コンパイルできるのがおかしいと思う理由は?
#include <stdio.h>
が、どのような意味なのか、教えてくださいまし。
意味というか、機能だな。
プリプロセッサに指定したファイルをインクルードするように指示する。
>530
うちのGentooでは通らんが?

test.cpp: In function `int main()':
test.cpp:3: error: `printf' undeclared (first use this function)
test.cpp:3: error: (Each undeclared identifier is reported only once for each
 function it appears in.)
535デフォルトの名無しさん:04/05/10 14:49
下記のコードが何をしているのかどなたか知りませんか
_wsetexit(_WINEXITNOPERSIST);

もしかしたら普通に自作関数なのかもしれませんが・・・

参考までにコンパイルエラーメッセージ
: warning C4013: 関数 '_wsetexit' は定義されていません。int 型の値を返す外部関数と見なします。
: error C2065: '_WINEXITNOPERSIST' : 定義されていない識別子です。
>>534
なんでC++にしてるの?
537大学1年(国立):04/05/10 15:28
C言語 大学の勉強の合間にやってます。(歴20時間
初心者には何がお勧めですか?
プログラマーはシステム考えるほうならいいけど、作成のほうだと40代になると使い物にならなくかると聞いたのですが どうなんでしょうか?
まだ簡単な計算しかできません。

いつかは世界大学プログラミングコンテストやハッキングコンテストに出てみたいです。
C言語のソフトどこで配布してる?
linuxのターミナルに、printfを使って文字列を出力させると
画面がどんどんスクロールして、次々に文字列が表示されますが、
画面をスクロールしないで、定位置に文字を表示させるにはどうしたら良いですか。

例えば、linuxは起動時にディスクのチェックをすることがありますね。
このチェックの進み具合が画面の右に%表示されますが、
これは数字が書き換えられても同じ場所に表示されています。
これと同じ事がしたいです。

よろしくお願いします。
curses
curses
ちょっとマンドクサイガ
改行しなけりゃいいだけ。

for (i = 0; i < 100; i++) {fprintf(stderr, "%3d%% completed.\r"); sleep(1);}
543デフォルトの名無しさん:04/05/10 18:32
>>531
オレは530じゃないけど、printfの定義はどこにあるの?
聞きたいんだけど、
int *func()
っていう関数で
int data[10];
return data;
とすると、問題のあるポインタ変換って出るんだけど、
dataは、&data[0]と同じ意味だよね?
こういう時どうしたらいいの?
いちいちmallocするの?
質問は基本的にageでよろしこ
 
        / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ \
       / ''''''     ''''''             ヽ
      |                       |
      | (●),   、(●)            |
      |    ,,ノ(、_, )ヽ、,,             |  
      |    `-=ニ=- '              | 
       !     `ニニ´               .! 
      |                     |
      .\ ______________ /  

547546:04/05/10 18:40
うわスマン!
激しく誤爆した
548544:04/05/10 18:41
>>545
ごめんなさい。

どなたかおしえてくだせー。
>>544 好きなのを選べ
1 いちいち malloc する
2 int data -> static int data にする
3 ワーニングは無視する。ただし戻り値は使わないこと
550デフォルトの名無しさん:04/05/10 18:48
>>549
わかりました。
でも教えてください。
int data[10]と宣言した場合、そのブロック中で
dataと書くことと、&data[0]と書くことは同じじゃないんですか?

>>544 は根本的な問題(バグ)に気づいてないわけで。
関数内に書いた
int data[10];
は、関数抜けたら無効になるわけだが。
で、いちいちmallocするって、大丈夫か? ちゃんとfreeもするのか?
普通はstaticだろ。
>>550
>dataと書くことと、&data[0]と書くことは同じじゃないんですか?

そんなことは今のお前さんにはどうでも良いことだ。
553544:04/05/10 18:57
そうか!わかったぞ!
staticはなんかやなんで、その関数の引数から渡せばいいですよね。
そんな方法は面白くもなんともないぞ。
考え直せ。
>>530

この場合、インクルードするということは、printfのプロトタイプ宣言を
そのファイルにとりこむことが主な目的になるわけですよね。
でも関数はそのプロトタイプ宣言がなくても、その実体があればいいのです。
だって、実体があればリンクできるからね。
つまり、あなたのプログラムをコンパイルしたときに、gccはprintfの実体を
みつけることが出来たので、エラーを出さずにコンパイルを完了することが
出来たわけです。

じゃあなんで、stdio.hをインクルードするのかというと、
関数のプロトタイプ宣言があるとその関数の引数チェックが出来るんですね。
もし、間違った型の引数を与えてたりすれば、gccはそこでエラーを出してくれます。
だから、インクルードした方が確実なのです。

ということを最近知りました。
嘘言ってたら、だれか指摘して!
556544:04/05/10 19:07
いまいちわかってないんで聞いていいですか?

配列がポインタに読みかえられるのは関数の実引数のときでいいんですか?
今回だと、ただの配列だからポインタには変換できんと。
>>556
今回問題になっているのは、
func()内にあるdata[10]はfuncから戻ったときにはすでに破棄されているから
funcの戻り値は使いようが無いってこと。
data[10]破棄されないようにするにはstaticにするか動的に領域を確保するかせよと。
個人的には int *func() のインタフェース自体を変更すると思うけど。

配列名がポインタに読み替えられるのは一部の例外を除き常に。
>>566
はぁ?
だから、今回のは、配列だのポインタだのとは 全く関係ないのだが。
559544:04/05/10 19:26
やっとわかりました。
普通の自動変数と同じような扱いってことですよね。
ブロック抜けたら消滅するっていうことで。
なんか配列とポインタがごっちゃになってました。
出直してきます
>>599
>普通の自動変数と同じような扱いってことですよね。

同じような扱い?
「扱い」じゃなくって、普通の自動変数そのものだぜ。
っていうか、「普通の」って言葉も変だがな。
561544:04/05/10 19:42
>>560
そうっすね。
つまり自動変数だと!
「普通の」っていうのは、オレが配列とポインタの関係をあさっての方向で認識していたからで。
配列はあくまで配列なんだと、ここにきてわかりますた。
文字列の末端にスペースをつける方法を教えて下さい

strcat(str[], )の右側に何か入れればできますか?
563sage:04/05/10 20:50
strcat(str[], " ");
564デフォルトの名無しさん:04/05/10 20:53
>>563
答えるならstr[]も直してやれよ。
スマヌ、ボンヤリシテタ。
>>562
それだけじゃあなぁ・・・
C++でstring使ってるならシンプルな解答で済むんだが。
Cだと、もうちっと前提がわからんとな。
strに一文字追加できる領域があるんなら strcat(str, " "); でも良いけど。
567デフォルトの名無しさん:04/05/10 21:38
http://homepage1.nifty.com/kaneko/water3.htm 水粒子サンプルプログラム3D版
http://homepage1.nifty.com/kaneko/nfight.htm 物理演算とIKベースの格闘ゲーム(になる予定)
http://homepage1.nifty.com/kaneko/missile.htm ミサイルデモプログラム

逮捕された
winny製作者が過去に作っていたフリーソフト

漏れプログラムとかしたことないから分からんけど
これってすごいの?それともこれくらい作れて普通?
物理とかの知識も要りそうなんだけど
>>567
プログラムとかしたことない奴がなんでこの板にいるの?
NekoFightの人だったんか・・・
か猫でし
>>570
泣いた
あのう、すいません
配列についてなんですが、
1bitだけ使う方法はありませんか?
cでお願いします。
ビットフィールド
別の関数作って、その関数に渡した値を増やして返すようにしたんですけど
コンパイルして実行してみても値がまったく変わってないようなんです
いろいろ試してみたんですけど、どうしても値が増えないようで
どうすればいいんでしょうか?
すいません
書き忘れましたがBCC++5.5です
↓はい!ここでエスパーさん、>574に答えてあげて!!
>>574
int hoge(int x)
{
    return ++x; //お前、ここでreturn x++;って書いていただろ
}
こういうこと?
>>574
ソース晒せ。
素人がどこで勘違いしているかなぞ、ソース見な誰にもわからん。
#include<iostream.h>
#include <cstdlib.h>
#include <ctime.h>


class r{
public:
int a(int point),b(int point),c(int point),d(int point),e(int point),f(int point),g(int point),h(int point);
};
int r::a(int point){
int aa;
cout<<"\n\n日本の首都は?\n\n";
cout<<"1.東京\n";
cout<<"2.京都\n";
cout<<"3.秋葉原\n\n";
cout<<"回答を入力してください:"<<endl;
cin>>aa;
if(aa!=2){return ++point;}else{return point;}
};

int r::b(int point){
int bb;
cout<<"\n\n日本の首相は誰?\n\n";
cout<<"1.小泉\n";
cout<<"2.巨泉\n";
cout<<"3.正日\n\n";
cout<<"回答を入力してください:"<<endl;
cin>>bb;
if(bb==1){return ++point;}else{return point;}
};
580574:04/05/11 20:39

int r::c(int point){
int cc;
cout<<"\n\nアメリカの大統領は?\n\n";
cout<<"1.ブッシュ\n";
cout<<"2.低脳\n";
cout<<"3.クリントン\n\n";
cout<<"回答を入力してください:"<<endl;
cin>>cc;
if(cc!=3){return ++point;}else{return point;}
};

main(){
srand((unsigned)time(NULL));
int point=0;
int q;
int i;
r question;
for(i=0;i<3;i++){
q=rand()%3;
cout<<point<<q<<endl;
switch(q){
case 0:question.a(point);break;
case 1:question.b(point);break;
default :question.c(point);break;
}
}
cout<<"あなたの点数は"<<point<<"/3点です。"<<endl;
return 0;
}
こんな感じで作ってました
乱数と関数の使い方覚えようと思って作ってました
582572:04/05/11 20:48
>>573さんありがとうございました
ビットフィールドで検索したら
1bitだけ使う方法が出てきました。
これから勉強してきます。
>>579-580
つっこみがいのあるプログラムだな(w
関数は間違いなく値を(条件に合えば)増やして返しているが、
返された値を無視してるじゃないか。
おかげさまでやっと理解できました
関数呼び出しただけでmainのほうの値も変わってると勘違いしてたみたいです。
>>579-580
コンパイルしてやってみた
入力形式を例示してけろ

よくわかんねーよ
本当は、マークじゃなくてスーツ、two,threeじゃなくてデュース、トレイ・・・が正しいけど

struct Card1{
int num
int mark;
} mycard1;
初期化
for(int i=1;i<=4;i++){ //マーク
for(int j=1;j<=13;j++) {
mycard1.num = j; mycard1.mark = num;
}}

上を下のようにしたら初期化はどうなりますか?

enum Num {Ace, Two, ... , King};
enum Mark {Hearts, .... };
struct Card2{
enum Num num;
enum Mark mark;
} mycard2;
>>586
一体そのループで何をしたいのか見当もつかないが、
列挙型変数に整数値を代入したいという趣旨であれば、

Cならそのまま代入できるんじゃなかったと思ったが良く分からん。

C++だと、直接代入しても多分警告が出るだけでコンパイルはできるはずだが、
正式には mycard2.num = Num(j); みたいにする。
多分 mycard1[52] とかだと思うんだが
多分トランプをつくりたいんだと思われ
多分 mycard2[52] (ry
591デフォルトの名無しさん:04/05/13 00:31
だれもこっちは突っ込まんのか?

mycard1.mark = num;
592539:04/05/13 01:42
>>540-542

どうもありがとうございました。
御礼のレスが遅れてすいません。

#ADSLがぶちぶち切れるようになってしまって、
#なかなかネットにつなげない。
for(yy=100; yy>=0; yy--){
putchar(str[yy]);
}

上の条件式で

警告:条件が常に真

と出てしまって困っています。
なぜなんでしょうか?

>>593
gcc、bcc32、cl
どれつかっても警告出ないよ。
あ、もしかして yy が unsigned なのでは?
>>595
そうですけど・・・
unsigned int yy;
だとなにかいけないんでしょうか?
ちなみにコンパイラはbcc32です。
>>596
unsigned int がとれる範囲を考えてみれば分かるが、
0より小さい値には絶対にならない。
598596:04/05/16 18:33
わかった!わかりました
yyが0になってから1引くと
(2^32)-1になるってことですね

もし、どうしても上の条件で書きたければ
for(yy=101; yy>0; yy--){
putchar(str[yy-1]);
}
ということなんですね

ほんとうにありがとうございました。
599デフォルトの名無しさん:04/05/16 21:23
質問です。
クラスの静的変数を初期化するために、アプリケーション開始時に一度だけ実行したいコードはどこへ書けばいいんでしょうか?
やはりmain関数から明示的に呼び出す必要があるのでしょうか?
クラスの実装部分に書いてなんらかの宣言をすれば自動的に一度だけ実行されるようコンパイルされるような方法が欲しいのですが…
>>599
その静的変数をクラスにまとめて、コンストラクタで初期化するようにする。
初心者的質問ですいませんが、私が使っているBorland C++ builderの開発環境で次の分を入力したのですが、
#include<stdio.h>

int main(void)
{
int n1,n2,D;

puts("二つの整数を入力してください。");
printf("整数1;");scanf("%d",&n1);
printf("整数2;");scanf("%d",&n2);

if(n1>n2)
D=n1-n2;
printf("二つの整数の差は%dです。",D);
else
D=n2-n1;
printf("二つの整数の差は%dです。",D);
return(0);
}

else 文のところでエラーが出てしまいます。どこがおかしいのでしょうか?
>>main関数から明示的に呼び出す必要があるのでしょうか?
ない

>>クラスの実装部分に書いてなんらかの宣言をすれば自動的に
>>一度だけ実行されるようコンパイルされるような方法が欲しいのですが…

class A {
static int nData; // 宣言
}

int A::nData = 3; // 定義

クラスの静的変数は、C++がmainの実行前(というか、そのクラスが
最初にインスタンシングされる前)に初期化する規格になっている。
(グローバルの静的変数はmainの前)
603602:04/05/16 21:33
>>599
間違えた。

× そのクラスが最初にインスタンシングされる前
○ その静的変数が最初に使用される前
>>601
if(n1>n2) {
 D=n1-n2;
 printf("二つの整数の差は%dです。",D);
} else [
 D=n2-n1;
 printf("二つの整数の差は%dです。",D);
 return(0);
}
>>604
Typo なのかネタなのかはっきりしろよ。

> } else [
     ^^^^
601です。
即答ありがとうございました。
コンパイルできました。
なぜ if文で{ や}が必要なのかよくわかりません。
なくてもコンパイルできるときがあったのですが.....。
607599:04/05/16 21:50
お答えありがとうございます。
>>600
それだとmainから明示的に呼び出すのと同じじゃないでしょうか?
>>602
配列の要素を定数あるいは一定の数列で初期化したいのです。
たとえば
static int anArray[100];
をforループで初期化するとか…

まぁ、クラスごとに初期化用の静的メソド書いて
Class1::Initialize();
Class2::Initialize();
   …
とかってmain関数に延々と書けば済むことなんですけど・・・
>>605
最近、shiftキーの調子が悪い・・・

>>606
君が読み間違ってる。
中括弧がいらないのは制御文の中身が短文の場合のみ。
>>606
コンパイラの立場になってみる。
}がなくて、どこまでがifの範囲とわかる?

{ }がないと、直後の1文だけを範囲とみなすしかないじゃん。
endifとかでもないかぎり
606です。
貴重な情報ありがとうございました。
これからいろいろとif文について詳しく学びたいと思います。
611600:04/05/16 21:59
>>607
class Class1
{
 struct Initialized
 {
  Initialized();
  int anArray[100];
 };
 static Initialized s;
public:
 // ...
};

Class1::Initialized Class1::s;

Class1::Initialized::Initialized()
{
 // 好きにしる。
}
612599:04/05/16 22:03
>>611
目鱗です。
ありがとうございました!
また、初心者の質問です。
条件演算子を使った文を書いているのですが、minに代入された値が利用できないとありコンパイルできません。どこがいけなかったのでしょうか?
#include<stdio.h>

int main(void)
{
int n1,n2,n3,min;
puts("三つの整数を入力してください。");
printf("整数1:");scanf("%d",&n1);
printf("整数2:");scanf("%d",&n2);
printf("整数3:");scanf("%d",&n3);

min=n1;
min = (n1<n2) ? n1 : n2;
min = (n2<n3) ? n2 : n3;
printf("三つの整数の最小値は%dです。",min);

}

初心者よ、エラーメッセージを貼れ。
615デフォルトの名無しさん:04/05/16 22:34
すいませんでした。
エラーメッセージは
警告 W8004 条件演算子を利用した三つの整数値の最小.cpp 12: 'min' に代入した値は使われていない(関数 main() )
でした。
>611
どうでもいいけど、struct Initializedってすげー違和感あるな
速攻でこさえてくれたからね
>>613
minに代入された値は利用されていない、ではないのか?

min = n1;
と代入しているが、次の行で、
min = (n1<n2) ? n1 : n2;
さらに、
min = (n2<n3) ? n2 : n3;
と代入しているので、上の行でminに代入された値はどこからも利用されてないよ、
というメッセージ。

ついでに言うと、このアルゴリズムは間違っている。
613です。
アルゴリズムの間違いを訂正してこう作りました。
#include<stdio.h>

int main(void)
{
int n1,n2,n3,min;
puts("三つの整数を入力してください。");
printf("整数1:");scanf("%d",&n1);
printf("整数2:");scanf("%d",&n2);
printf("整数3:");scanf("%d",&n3);

(n1<n2) ? min=n1 :min=n2;
(n2<n3) ? min=n2 :min=n3;
printf("三つの整数の最小値は%dです。",min);

}
11行目からエラーが出る始末です。もう泣きたくなります。
>>619
演算子について勉強し直せ。めちゃくちゃ。
ついでに、考え方を書いてみるので、その通りに作ってみな。

まず、二つの数を比較し、小さい方を覚えておく。
残りの一つと、先に比較した数を比較する。
>>619
なんでこうなっちゃうんだろう。不思議だなぁ。
>>621
まぁ、昔のチミも今のチミからみたらそんなもんじゃろ?
>>622
今もあまり変わって無くてな
こっちまでくるなよ。おまえら
>>613
「代入された値は利用されていない」はあくまで警告で、
それでコンパイル不能にはならない。
コンパイルできない原因は他にある。

あと、最小値を求めるアルゴリズムを考えるなら、
3数に限定しないで、配列とループを使った
アルゴリズムを考えたほうが勉強になるぞ。
つか、そのほうがたぶん簡単にかけるし。
619です。
問題解決できました。ありがとうございました。
こうするんですね。
#include<stdio.h>

int main(void)
{
int n1,n2,n3,min;
puts("三つの整数を入力してください。");
printf("整数1:");scanf("%d",&n1);
printf("整数2:");scanf("%d",&n2);
printf("整数3:");scanf("%d",&n3);


(n1>n2)?min=n2:n1;
(min>n3)?min=n3:n1;
printf("三つの整数の最小値は%dです。",min);

}
アドバイスありがとうございます。
ん?
625>>
本当にそのとうりです。
でも課題だったので仕方なく条件演算を使ってみました。
それ、 3,2,1って入力してみ。
違った、1,2,3だった。入れてみ。
とんでもねーなw

>>626
>(n1>n2)?min=n2:n1;
>(min>n3)?min=n3:n1;
min = (n1 > n2)? n2: n1;
min = (min > n3)? n3: n1;
ね。
(なんでmin <= n3のときにn1を代入するんだろう)
>>632
min = (n1 < n2) ? n1 : n2;
min = (min < n3) ? min : n3;

だと思うんだが・・・。
本当にそうでした....。
答えありがとうございます。
1,2,3、と入力して3が最小とは....。
代入に不安があったのであれこれやってみたのが間違いでした。
こんな問題に答えてくださってありがとうございます。
この>>613に始まる一連の流れを読んでいると、
プログラム習得のポイントが言語仕様よりも
アルゴリズムにあるということを強く感じた。
>>611
同じ翻訳単位の中に置くことを前提できれば、
anArrayはinitializedのメンバにする必要は無いと思うけど。
どんなもんだろ?
637600:04/05/17 02:52
>>636
初期化対象をメンバの外に出すのは、引数のかわりにグローバル変数を使うようで嫌なもんだな。
>>637
回答Thx.
うーん、そうか。
自分はinitializeがClass1の中で定義されてるなら
anArrayの所属は気にしたことが無かったよ。
まぁ、確かに嫌なもんだといわれると気持ち悪く感じてくるな(w
俺は将来C/C++をマスターして情報処理試験を合格してやる!!
をい、C++はでねぇぞ。
初歩的な質問ですみません。
配列の動作を確認しようとa[0]からa[4]まで0-4とカウントするように書いてみたのですが
実行してみると a[3] だけ 29637605 になってしまいしました。
ためしに桁数を変えてみると0-2までむちゃくちゃな答えになってしまいました
どこが悪いのでしょうか?

#include <stdio.h>

int main()
{
int a[5];
int tmp;

for (tmp = 0; tmp < 5; tmp++)
{
a[tmp] = tmp;
tmp++;
}

for (tmp = 0; tmp < 5; tmp++)
printf("a[%d] = %d\n" , tmp , a[tmp]);

return 0;
}
>>641
自己レスすみません。
とんでもない間違いをしていました。
そもそもtmp++が二度実行されていますね。
もう少し落ち着いてから書き込むべきでした。
失礼しました。
for (tmp = 0; tmp < 5; tmp++)
{
a[tmp] = tmp;
tmp++; /*この文不要*/
}
644643:04/05/17 17:36
ort
645643:04/05/17 18:43
dateの値として0x48494445をいれたんです。
期待していたのはHIDEと表示されることなんですが、
妊DE
と表示されてしまいます。
なぜなんでしょうか?

int date_out(unsigned int date)
{
    char date_o[4];
    int j;
    for(j=0;j<=3;j++){
        date_o[j]=date%0x100;
        date=date>>4;
    }

    for(j=3;j>=0;j--){
        putchar(date_o[j]);
    }
return 0;
}
>    date=date>>4;
これでわ。
647643:04/05/17 19:07
date=date/0x10;
にしてみましたがだめです。
648643:04/05/17 19:09
すいません
date=date/0x100;
で意図したとおりに動きました。

質問なのですが、
date=date/0x100;
と、
date=date>>4;
は同じ意味ではないのですか?
>>648
charは何ビット?
650643:04/05/17 19:20
わかりました
>>8
ということですね
ありがとうございました
651650:04/05/17 20:41
少し疑問に思ったので下にあるプログラムを実行してみたのですが、

<<:>>の処理にかかった時間: 3.250000秒
*:/の処理にかかった時間: 28.765000秒

と、あきらかな違いがありました。
コンピューターにとっては<<>> */は同じ作業ではないようなのですが、
なぜなんでしょうか?
652651の続き:04/05/17 20:46
#include <stdio.h>
#include <time.h>

int main(void)
{
clock_t start, end;
unsigned int i,t;

t = 1;
start = clock();
for(i = 0;i<0xffffffff;i++){
t=t<<31;
t=t>>31;
}
end = clock();
printf("<<:>>の処理にかかった時間: %f秒\n", (double)(end - start) / CLOCKS_PER_SEC);

t = 1;/*一応念のため*/
start = clock();
for(i = 0;i<0xffffffff;i++){
t=t*0x80000000;
t=t/0x80000000;
}
end = clock();
printf("*:/の処理にかかった時間: %f秒\n", (double)(end - start) / CLOCKS_PER_SEC);
return 0;
}
>>651
結果が同じでも、同じ処理ではない。
疑問に思ったらアセンブラで出力させてみ。
654651:04/05/17 21:25
http://www.geocities.co.jp/SiliconValley-Oakland/8878/lab12/lab12.html
のサイトでアセンブラで出力させる方法はわかりました。
そんでもって.asmファイルもでてきたのですが、
ファイルの読み方がわかりません。
どこかよいサイトを紹介していただけませんか?
シフトの方が実際にコンピュータが行なっている処理に近い。
だから効率の良いコードか生成される。
t*0x80000000からは、t*0x12345678と大して変わらない効率のコードしか生成されない。
#コンパイラの最適化によってもっとマシなコードを吐かせる事は可能かもしれないが
>>654
載せたら解説くらいしないでもないよ。
657651:04/05/17 22:46
658656:04/05/17 23:13
>>657
シフトの方は最適化で消えてなくなっている。
乗算除算の方は31ビット左シフト、31ビット右シフトに最適化されている。
そりゃぁ、速度差が出る訳だね。
一応擬似コードを書いておくと、
// シフト
eax = 0;
if (eax >= 0xffffffff) {
goto @3;
}
@2:
++eax;
if (eax < 0xffffffff) {
goto @2;
}
// 乗算除算
eax = 0;
if (eax >= 0xffffffff) {
goto @7;
}
@6:
edx = ebx;
edx = -edx;
edx <<= 31;
ebx = edx;
ebx >>= 31;
++eax;
if (eax < 0xffffffff) {
goto @6;
}
バッファオーバーフローっていうのはどういう仕組なんですか?
よく分からないので、危険だとおもわれるソースを張って見ます。
それを攻撃するようなプログラムを作って、どういう仕組か説明してもらえませんか・

-=-=-=-=-=-脆弱なプログラム-=-=-=-=-=-
#include <stdio.h>

int input(int day){
int d;
scanf("%d",&d);
printf("day - dは%d",day - d);
return d;
}

int main()
{
input();
return 0;
}
>>659
うーん、そのコードから脆弱なプログラムはできないな。
>>659
この手の質問には回答してええもんかいな? (w
>>659
とりあえずそのプログラムを実行し、"echo"という入力でも与えてみて。
663デフォルトの名無しさん:04/05/18 00:48
g++使っているのですが、ushortってどこで定義されているのでしょうか?
おそらくunsigned short の再定義だと思うのですが、STLの解説書にも
StroustrupのC++にも載っていません。
そのわりに -ansi -pedantic つけても警告出ずに通ってしまいます。
ぐぐるとVC++では定義されているようでMSのページがヒットします。
>>663
typedef unsigned short ushort g++
で検索してみ。
types.h:typedef unsigned short ushort; /* System V compatibility */
666ダミアソ:04/05/18 01:22
 
667デフォルトの名無しさん:04/05/18 01:33
>>662
それじゃ、なんの意味もねーじゃんよ
しったかぶってんなよ
>667
>660 ヨメ
int main(void){
long double nf=88;
printf("nf=%lf x=%d\n",nf,15+37);
return 0;
}
nfの値は意図した通り88が表示されるのですが、
xの値は52を表示してくれません。
何故でしょうか???
>>669 うちのコンパイラの結果↓
nf=88.000000 x=52
nf=%lfをLfにしたら直りました。
672599:04/05/18 06:39
ちょっと亀ですが事後報告です。
静的メンバの初期化の件ですが、>>611を参考にして以下のようにしました
ヘッダ部
class Ini;
class aClass {
 static int anArray[××];
 static .........
 static void staticInit(){ 初期化コード;}
 friend Ini;
};
実装部
class Ini{
 public:
 Ini(){aClass::staticInit();}
};
static Ini ini;

クラス自身のコンストラクタみたいな機能があればこんな事しなくて済むのに・・・
673599:04/05/18 06:46
というか、こんなコトしなきゃいけない漏れの設計が間違ってるんだなきっと_| ̄|○
イチから考え直します…
>>672
>>611みたいに IniはaClassの中で定義しちゃったほうが安全だし、
static IniもaClassのメンバにすべき。
aClassのスコープ外からIniが見えたら不味いでしょ。

あと、IniをaClassのfriendにするならstaticInit()自体Iniに持たせてもいいような気がする。
この辺は好みの問題だけど。
>>672
なんでわざわざ劣化させるんだ?
構造体の定義の仕方で教えてください。
あるライブラリのヘッダファイルを見ていたら、
下記の様に構造体の宣言がありました。
deviceを定義している宣言なのに、
宣言内部にdeviceが出てきます。

どういう事なのでしょうか?
どなたかアドバイスをお願いします。

struct device {

struct device *next, *prev;
char filename[PATH_MAX + 1];

}
>676
典型的(古典的)なリンクリストの宣言。
>struct device *next, *prev;
はポインタであり、device構造体のサイズに関係なく、
サイズが固定である為問題ない。
678デフォルトの名無しさん:04/05/18 13:04
struct hoge{
struct hoge *nexthoge;
・・・

つまり、hogemaxは???型のポインタ。
訂正hogemax→nexthoge
>677

10回位読んでなんと無く分かりました。
後は「リンクリスト」で調べて見ます。
ありがとうございました。

>678

???型のポインタとは、環境によって構造体へのポインタの型が
変わるので???と記述したということしょでうか?
intだったりlongだったりするということでか?
681デフォルトの名無しさん:04/05/18 13:19
>>680
ごめんなさい。
君の言う通り、???はstruct hogeで・・・
682デフォルトの名無しさん:04/05/18 13:35
すいません、デバックでプログラムの処理回数をカウントするにはどうしらいいのでしょうか?
>681

ありがとうございました。
>682
#include <iostream>
#include <fstream>
#define COUNT_FILE "count.hoge"
int read_count() {
 int count = 0;
 std::ifstream ifs(COUNT_FILE);
 if (!ifs.fail())
  ifs >> count;
 return count;
}
void write_count(int count) {
 std::ofstream ofs(COUNT_FILE);
 if (!ofs.fail())
  ofs << count();
}
int main() {
 write_count(++read_count());
 return 0;
}
訂正
×  ofs << count();
○  ofs << count;
>>676
自己参照構造体で調べれば良い。
687デフォルトの名無しさん:04/05/18 15:21
>684
ありがとうございました
688わー:04/05/18 15:39
すみませんが。画像を90度回転させるプログラム教えてください。。。
Visual C++です!
>>688
スレ違い。
VisualC++スレへどうぞ。リンクは>>2を参照。
>>688
というか、言語に依存する以前の問題じゃん。
ようはなーんにも知らないし知る気もないんだろ。
宿題スレにいくか、氏ね。
691599:04/05/18 18:36
>>675
まさに好みの問題です、すいませんm(__)m
ミリ秒単位でsleepしたいんですが、どのヘッダー内のどの関数を使えば良いでしょうか?
コンパイラはgcc2.9です。
693デフォルトの名無しさん:04/05/18 22:28
部内全員が使用できるようなグローバルな関数や文字列を集めて
libとか作ってるひといませんか?
common.hとcommon.cppみたいなのを作って配ろうと思ったんですけど
libのほうが良いみたいな意見もあって悩んでいます。

694デフォルトの名無しさん:04/05/18 22:40
>>693
あー、確か、前居た会社では使ってたな。
std.lib(スタンダードの意)だったはず。
何がはいってたか忘れた(;´▽`A``其の頃は駆け出しだったもんで・・・
ライブラリの中に変数の実体をいれといて、includeファイルで公開すればすむんじゃないの?
>>692
環境によりけり。

>>693
ライブラリの更新をちゃんと通知できる環境でないなら、
ソースのまま配布の方が安全。
但し、勝手にソースを変更する奴に注意。
697692:04/05/18 23:03
>>695,696
ありがとうございます。参考にします。

ついでに、チームで開発するのに参考になるようなサイトとか書籍ってありますか?
エラー処理とかログを吐く処理とか新人さんにふって、
これも共通のLIBみたいなものにしようと思うのですが。
下記のような使い方に対する解決法を、教えていただきたいのですが...

class A
{
 B b;
};

class B
{
 friend A;
};
設計を見直す
>>697
新人に共通処理は書かせない方が身のため。
結局書かせた本人が全部書き直す羽目になりかねない。

共通処理が綺麗にできているプロジェクトを見ると、大抵巧くいっている。
逆に共通処理に癖があるプロジェクトは大抵火の車になる。
701697:04/05/18 23:35
>>700
よく考えたら、仰るとおりですね。
いままで共通処理がいまいち(外注さんがつくった)だったので、新プロジェクトでは
基本的な部品から見直そうと思ってるのですが、参考になるものがなく
苦戦してます。
>>698

class A;
class B
{
 friend A;
};

class A
{
 B b;
};
703698:04/05/19 01:17
>>702
それぞれ別ヘッダだと、エラーになってしまうのですが、
そういう場合はどうすればいいのでしょうか?

自分としては、親ウィンドウ(classA)、子ウィンドウ(classB)として、
メニュー等は親ウィンドウ、描画等は子ウィンドウでそれぞれ管理したいのですが、
こういった場合、classBは自メンバーに対する外部用のアクセスメソッドを
必要な分だけ用意すべきなのでしょうか?
(メンバーをpublicにするというのは除いて)
>>703
>それぞれ別ヘッダだと、エラーになってしまうのですが、
それは多分ヘッダファイルが適切にインクルードされていないから。

>こういった場合、classBは自メンバーに対する外部用のアクセスメソッドを
>必要な分だけ用意すべきなのでしょうか?
外部からアクセスする必要があるものは当然そうする。
しかし、描画処理がclassBの中で完結するようにできれば、外部からのアクセスは
ごく限られたものになるはず。
705698:04/05/19 02:08
>>704
ありがとうございます。

最初は「適切にインクルード」の意味が理解できなかったのですが、
お互いが相手側のヘッダファイルをインクルードしていたのを、
片方だけにするとうまくいきました。
質問です。
基底クラスから継承したクラスを使ってて
途中で基底クラスを切り離したくなった時はどうすれば良いのでしょうか?
>>706
全部書き直す。
ってか、基底クラスを切り離したくなるってこと自体、クラス設計がむちゃくちゃってこと。
一から全部作り直したほうがよい。
>>706
「基底クラスを切り離す」とはどのような操作のこと?
自分言葉で表現されては誰も理解できない。
きちんとプログラミングの用語を使って明確に質問しなさい。
>>708
そもそも切り離す機能がC++に備わってない以上
そういう操作のプログラミング用語は存在しないでしょ。

>>706
設計に問題が有ると思われるが、どうしても という事なら
使用してるクラスに切り離したいクラスのインスタンスを渡すようにすればどうだろうか?
これだったら出来なくも無さそうだし
見えないようにする、のはできるけどねえ。。。
711デフォルトの名無しさん:04/05/19 10:33
どうすればみえなくなるの?
>>706
俺なりに解釈してみた・・・
インターフェイスだけ継承して、実装するのはコンポジション化した別クラスとする。
やりたいことによっては、どちらのクラス、あるいは両方とも継承は使わない。
(まあ、直接使いたいクラスはポリモフィズムとかの関係で継承はするだろうが)
class A{// このクラスのインターフェイスを使いたい
 virtual void Func();
}

class B : A{// とりあえず派生
 A * m_pA;// Aから派生したクラスのインスタンスを指している。
 C * m_pC;// Aから派生していないクラスのインスタンスを指す。

 void Func(){// で、こんな感じに
  if( m_pA != NULL )
    m_pA->Func();
  else
    m_pC->Function();// 派生していないのでAにとらわれない処理
 }
}
プログラミングをC言語で始めてまだ間もないのですが、いつごろになったら画像を扱えるぐらいになるのかという漠然とした疑問がありますが、
率直に聞くと、画像を扱うのは難しいでしょうか?画像ってのは写真とかじゃなくて、座標を用意して、
何か物体を座標上を動かしたりするようなもののことです。
シューティングの原型のようなイメージです
>>713
一時間もかからない。
GLUTによる「手抜き」OpenGL入門
http://www.center.wakayama-u.ac.jp/~tokoi/opengl/libglut.html
>>713
>座標を用意して、何か物体を座標上を動かしたりする

それは環境依存と思われるので、
標準 C の勉強だけではいつまでたっても扱えないでしょう。
というか、private継承にするだけで>>706の要求は満たせるような気がする。
>>713
入口に立つのは簡単だけど、極めるのは大変と。
まぁ、なんでもそうだな。
というか、>>706が実際のところ何を要求しているのかさっぱり判らんのだけど。
んなもん、質問の趣旨を推測して回答してもどうにもならんと思うのだが。

何をしたいのか具体的に書け。>>706
ttp://www.media-tech.co.jp/detail/la_c3.htm

これは
買おうと思うんですが、 ぶっちゃけお勧めですか?
>719
そのページ見てみたけど
> そこで本書では処理手順をPAD(問題分析図)で図式表現して掲載した。
> このPADを参照してプログラム作成に挑戦してほしい。
この一文で、地雷っぽい印象を受けた。
721デフォルトの名無しさん:04/05/20 23:47
田中 10
武田 20
梅吉 30

こう書かれたテキストファイルを読み込み、

最高値は 梅吉君 30です
最低値は 田中君 10です
平均値は       20です

と出力したいのですが、ifのところで、名前と数値を一緒に扱うにはどうしたらいいのでしょうか?
>>ifのところで、名前と数値を一緒に扱う
ここらへんをもっと詳しく。具体的のどういう扱いがしたいのか。
>>722
while(scanf("%s %f",name,&x)!=EOF)
if(m<=x)
{
m=x;
}

m=xのとき、xが誰か?を調べたいのです。
>>723
何とかなるかもしれません。
もうちょっと頑張ってみます。
比較するなら
if (strcmp(name,"梅吉") == 0)

コピーしたいなら
strcpy(m_name, name);
構造体を使えばいいんでないの?
>723
struct ScoreInfo
{
char name[256];
int score;
};

struct ScoreInfo score_info[32];

こんな感じの構造体を用意して score_info[] に点数を読み込む。
最高点・最低点をとったデータが score_info[] の何番目にあるかを
調べて、その番号 (仮に i としよう) を使って

printf("最高点は %sくん %d です\n", score_info[i].name, score_info[i].score);

とでも。

C++ なれてれば配列ではなく vector 使うとか、最大・最低点を探すのに
STL アルゴリズム使うとか工夫はいろいろあるが、まぁ大枠は変わらん。
>>725-727
構造体ですか・・・
ちょっと調べてみます。
皆さんの書き込みも参考にします。
どうもありがとうございました。
>>719>>720
>回数指定反復
>後判定反復
>無限ループ
ダメだこりゃ。
>728 だまされるな!
int max,min;
char maxName[256],minName[256];
とかするだけだ

while(scanf("%s %f",name,&x)!=EOF)
if(max<=x)
{
max=x;
strcpy(maxName, name);
}
これからVC++を始めようと思うのですが、良い入門書ってあるでしょうか…。
10年くらい前にアセンブラいじってたのですが、
object思考とかWindowsの波に乗り遅れてしまい、一から出直しです _| ̄|○
>731
どの本がいいとは言い切れないが
”Visual C++”じゃなく、標準C/C++について解説してる本を買いましょう。
あと、Win32についてはリファレンス以外はどれも似たようなもんだと思う。
猫でも〜なページと、MSDNでも読んどけば問題ないんじゃないと。
Windowsのコアな実装について深く知りたいなら、Advanced Windowsを推しとくよ。
a.h
#ifndef GUARD_A_H
#define GUARD_A_H

#include "b.h"
class A;
class A{
public:
B test(void);
};
#endif

b.h
#ifndef GUARD_B_H
#define GUARD_B_H

#include "a.h"
class B;
class B{
public:
A test(void);
};
#endif

このようなファイルをコンパイルしたいんですが
識別名を宣言するのに型が指定されていないとエラーが出ます。
どうすればコンパイル出来ますか?
>>733
コンパイルしてどーするんだ?
なぞなぞやってるんじゃないんだから、ちゃんと動くプログラム書こうぜ。
設計からやり直せ。
いや、決して謎々やってるわけではなくて
色々やってみて多分問題はここだろうと思ったので質問しました
設計からやり直せというのは
やはりこんなコードとおりませんか?
>733
前方宣言が逆になってるだけ

class B;
class A { public: B test(); };
>>736
前方宣言の意味を勘違いしていました。
ありがとうございます。
>>730
strcpyって言うの使う以外は、自分の書いたのと同じプログラムでした。
strcpy使えばいいのか・・・どうもありがとう。試してみます。
演習問題集、お勧めの教えてください
質問です。
while (scanf("%d",&dat)!=EOF)
は^Zを入力すれば止まるというのは理解できるのですが、

while (scanf("%d",&dat)!=-9999)
としても意味がない、というのが何故なのかわかりません

^Zは-1を返すと書いてあったのですが
while (scanf("%d",&dat)!=-1)
もダメなんでしょうか?
>>740
scanfは、変換前にエラーが発生した場合にEOFを返すというだけ。
それ以外の場合は変換した項目の数を返す。
お答えありがとうございました。
>732
ありがとうございました。頑張ります。
printf("[%d;%dH",y,x);を使っても
そっくりそのままこれが表示されるんですが、どうしたらよいでしょうか
(゚Д゚)ハァ?
746デフォルトの名無しさん:04/05/22 00:46
まえから思ってるんだけど、趣味がプログラミングって人っているじゃん
あれってなに?マゾですか?って話よ
>趣味がプログラミング
趣味が小説書き
趣味が作曲
趣味が工作

...別に問題ない
>>746
趣味と仕事は別物だが?
プログラミングにしろ小説にしろ作曲にしろ工作にしろ、何か物を作るという点で共通している

なにかを創造するのは人間だけの特権だ。オナニーが趣味だなんて言ってる奴はサルだな
趣味がマゾって人もいるだろうな。
仕事がマゾの人もいるし。
751デフォルトの名無しさん:04/05/22 01:13
漏れは一応プログラマだが、同僚で趣味がプログラミングって
奴そういないよ。会社で散々やってるのになにが悲しくて家で・・・
752デフォルトの名無しさん:04/05/22 01:16
n*nの行列の2つの行列をかけあわせるプログラムをつくり、これを用いてA^2^mを計算するプログラムをつくれ
そろそろ>>744に教えてやれよ
754デフォルトの名無しさん:04/05/22 01:19
一般的の趣味がプログラミングなんて椰子は
秋葉系ブサキモヲタです
趣味のプログラムは動けばよかったから楽しかった。
仕事のプログラムは動かす以外の作業が多くて大変だった。
そして今は辞めたくても辞められなくなった…。

職業プログラマーになる奴は、Cより日本語を学んでくれ…。
コメントは判るように書いてくれ。仕様書はちゃんと読んでくれ…。

>>744
エスケープシーケンスが使いたいのなら、頭に \x1b が必要。
たとえばカーソルをy行x桁めに移動したいなら、 "\x1b[y;xH"
ただし、Windowsであればエスケープシーケンスが使えるのは9x系のみ
NT系である2000やXPぢゃ使えない。
というかクライアント様になる奴は、仕様を決めてくれよ。
多少の仕様変更は受け付けますから…お願いですから。
プログラマな仕事してたけど辞めてプログラマでなくなったら(仕事でパソコンは使ってるが)
日曜プログラマに目覚めちまった漏れ。

動きゃいい「だけ」のプログラム書けばいいから結構楽しいよ?
前の仕事のせいか、大学ノートに柱になる関数の仕様やらコンポーネントダイアグラム
みたいなプログラム設計を鉛筆で殴り書きしたりするのも、なぜか楽しい

1バイト入魂!(゚∀゚)
>>749
サルの趣味がオ○ニーねぇ。そんなサルいたっけねぇ。ボノボ?
趣味がFlash作りならプログラマも報われる
仕事がindowsプログラマだから、日曜日はUnixとか、その逆とか。
組み込み系の業務やってる人が、webプログラミングするとか。
ありじゃなない?
デザイン性にとぼしい環境でしかPGしなくて、
余暇ではそのデザイン性のなさでPGする気が失せるのが大半だろう
仕事ではWindowsのGUIやらMotifでGUIやらその他非GUIアプリを書いている私、
それに反するものとしてちょっとした(プログラミングのための)ツールや
PDAのアプリを書くのが半ば趣味だったり。
#仕様書がちがちの仕事なんて趣味じゃやりたくなくってね。

とは言え鼬害だねぇ、この話題。
ビジネスアプリが全部POP体で表示されてたら職場は変わるのかな
((std::string)(tbl->cmd)).length()
ってやっても大丈夫ですか?
↑訂正
((std::string)("dir")).length()
>765
tbl->cmd の型と値によるが。tbl->cmd == NULL だったりしたら確実にアウト。

あと char* とか char[] に対して文字列長をとりたいなら、わざわざ std::string
の一時オブジェクトを作らずとも strlen() 呼べば?
試せばいいじゃん
プリミティブなchar[4]がクラス化するのは無理って叱られるんでないのかな
769767:04/05/22 13:17
そうそう、一時オブジェクト作りたいなら std::string("dir").length() ね。

770765:04/05/22 13:21
レスありがとうございます。一応VCでは正常に動きます。
char *とstringを頻繁に交換しているので、なるべくstringに統一したかったのですが、
stringとstring.hのように重複するようなライブラリ使うと太ったりとかはありませんか?
VCでやってるのですがgccで動かないとかなると痛いので、標準的な使い方が知りたいです。
>770
> stringとstring.hのように重複するようなライブラリ使うと太ったりとかはありませんか?
太るって、何がどうなることを指してるんだ?
772765:04/05/22 14:28
分かりにくくてすいません。
std::string + strlenといったようにコードのサイズが大きくなるという意味で使いました。
要するにstd::stringの中でstrlen等を呼び出してるのだろうか?ということに読み替えて下さい。
>772
> std::string + strlenといったようにコードのサイズが大きくなるという意味で使いました。
それを気にするほどの環境なのか? 組み込みとか制御系はともかく、Windows や

UNIX 環境なら標準 C, C++ ライブラリはダイナミックリンク (DLL, *.so) の形で提供
されているから、最終的な実行ファイルのサイズはほとんど変わらんし、実行時に
命令キャッシュのヒット率に多少の影響が出る可能性はあるが、ほとんど誤差だ。

そもそも実行ファイルサイズを数十バイト単位で気にする必要があるなら、STL
使わんでしょ。l
774デフォルトの名無しさん:04/05/22 15:14
>>721-730
構造体を使わないとすると、名前の検知はどういう風にすればいいでしょうか?
>>774そのレス範囲内に答えが出とる
>>774

すいません。勘違いしてました。スルーしてください。
777デフォルトの名無しさん:04/05/22 18:11
>>730
scanfだと、田中 幸雄 のように間にスペースが入っている名前を正確に検知できませんよね?
スペース入りの場合はどうすればいいのでしょうか?
入れさせなければいい
ホームページだって姓と名は分かれてるでしょ
>>777
空白以外のものをセパレータに使うのなら、姓名の間に空白を入れることはできるようになる。
#勿論scanf()を使用する条件で、だ。
C言語でバイオリズムのグラフを描くことになりました。
見本になりそうなソースをぐぐって探したのですが、JAVAのソースはあってもCのソースは見つけられませんでした。
参考になるソースをご存知の方いませんか?
そのJAVAのソースってのに使われている関数の仕様が分かれば十分では?
>>777
char str[256];
scanf("%[abcdefghijklmnopqrstrvwxyz ]", str);
ってすると'a'〜'z'と' 'から成る文字列をstrに格納できる。
>>780
だから環境書けって。
もしかしてグラフって
  *   *
 * *  * *
*  * *  *
*   *    *
こんな風に標準出力に吐かせる?
バイオリズムってサインカーブとは違うの?
785デフォルトの名無しさん:04/05/22 20:20
>>778
>>779
>>782
すでにデータが入力してあるテキストファイルを使うので、
スペースを入れさせないことはできません。

これだけ作ったのですが、うまく出てこないし、>>782を使ってもエラーが出てきて・・・
http://ccfa.info/cgi-bin/up/src/up1845.txt
>>782
こんなこと出来たんだ
scanfすげー
正規表現できたら神だな
Cマガ2004年6月号の添付プログラムを弄って
跳ね返る処理をつけようと思いつきました。
で、弄っているのですが、上手くいきません。

どうも、描画関連で躓いているようですが、
そもそも、私自身がCマガのプログラム自体理解できていないので
どうしようもありません。助けてくれませんか?


ソースはここ
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/lounge/file/1060403548_64/bound.c
int x, y;
bool a,b,c;

a = !(x & y);
b = c ? a : !a;

上記変換式(xor)を1行で書くとすると
b = c ? !(x & y) : !(!(x & y));

と書くしかないのでしょうか(a = (x & y); は 警告 が出てしまいます)?
790788:04/05/22 21:39
むしろ、sqrtの値がおかしいような木がしてきました
>>789
1行にする意味があるの?
>>789
なんでintをboolに代入してんだ?
何がしたいのかよく分からんが A xor B を1行で書くなら
A ^ B
でいいだろ。
794780:04/05/22 22:24
環境はWindowsXP、MicrosoftVisualC++です。
人の名前は数人分をあらかじめソースの中に入れておき、その中から選択して年と月を入力すると
その月から2か月分のサインカーブが表示するようにしたいのです。
>>788
thetaはラジアンなのかディグリーなのか?
実数を(int)にキャストする際は、切り捨てられる範囲の値が重要でないかをチェック。
単に描画関数に渡すためだけのキャストなら、計算用の変数は実数で持っておいて渡す時にキャスト。
796793:04/05/22 22:29
よくみたら!(int)だからboolなのか。
>>792
ありがとうございます。
半分理解できませんが、本とネットと睨めっこして翻訳してみます。
798788:04/05/23 00:51
>>795
bound関数以外はCマガの中の人のものなので・・・。
θはラジアン…と思っていましたが、
main関数とか処理を見てみるとラジアンに変換しているし、
勘違いが原因なのかもしれませんね。
ウィンドウ処理は良く分からないので、ぐぐって調べてみますが
処理を変更したら上手くいくかもしれないので 試してます
>>786
>782の場合、普通は"%[a-z ]"と書く。
ついでに言えば、空白以外の文字列と言う意味で"%[^ ]"とか
csvの読み込みでカラム数が決め打ちで良ければ"%[^,],%[^,]"なども使える。
#但し、後者の例では','の連続や'"'で囲うフォーマットには対応できないので注意。
>>785

1行読み込んで
数値の直前の空白文字をstrrchr()で探して、その前後で名前と数値に分けろ
>>785 まずwhile()はどこからどこまでを繰り返すのか分かれ
802782:04/05/23 07:27
>>799
"%[a-z ]"って実装依存じゃないの?

以下、ISO/IEC 9899:1999 §7.19.6.2より抜粋

If a - character is in the scanlist and is not the first, nor the
second where the first character is a ^, nor the last character, the behavior is
implementation-defined.
803799:04/05/23 08:27
>>802
あー、そういえばそうだった。多くの処理系で当たり前のように実装されているから失念していた。
失敬。
>>785
どうしてもscanf使わなきゃいけないの?
スペースは読み捨て
エンターは次の構造体へ移る
数字は数値に読み込んでそれ以外は名前に読み込んで
スペースを終了条件にする
char c;
while(1){
c=getc(fp)
if(feof(fp))
break;
if(!(c==' ')){
if(!(c=='\n')){
if(digitCheck(c)){
d_str[d_count]=c;
d_count++;
}
else{
n_str[n_count]=c;
n_count++;
}
}
else{
strcpy(structure[s_count].name,n_str);
strcpy(structure[s_count].value,d_str);
s_count++;
memset(0,d_str,sizeof(d_str));
d_count=0;
memset(0,n_str,sizeof(n_str));
n_count=0;
}
}
}
こんな感じ?
ごめん状態遷移にしないと駄目だったね
if(digitCheck(c)){
}
else{
}
この中で更にgetc()してスペースで抜ければいいと思われ
だっせーなー
もまえら >800 とか >792 とか読めよ
スマソ
ヘタレが出過ぎた真似した
811792:04/05/23 13:45
>>785
>>792のソースは
・一行が256文字以上だとダメ
・ctype.hインクルードし忘れた
から気をつけましょう。
812デフォルトの名無しさん:04/05/23 18:53
C言語なら俺に聞け! Part 80
http://pc5.2ch.net/test/read.cgi/tech/1084749585/
で解決しなかったのでこっちで聞きます。

MinGWで、Cしか使えません。
gmpが使えなくて困ってます。
ttp://www.mit.msn.to/devel/mingw-gmp.html
ここでできるようですが、わかりません。
MSYS のインストールで、MinGWにmake.exeがないと言われます。
GMP のインストールでも
$make
でmakefileがないと言われます。

別にMinGWに拘りません。gmp使うにはどうしたらいいでしょう?
あるいは、大きな数を扱うにはどうしたらいいでしょう?
DESとRASを作りたいです。
>>812
>MSYS のインストールで、MinGWにmake.exeがないと言われます。
これは正常。
>>812
ここより適切なスレがあるよ

cygwin + mingwn + gcc 相談室
http://pc5.2ch.net/test/read.cgi/tech/1058134693/
815812:04/05/23 20:42
>>813>>814
どうもです。そっちのスレ行ってきます。
BCCの5.5でレジストリをいじるプログラムを書こうとしてるんですけど実際に実行してレジストリエディタでみると無効な値と出てきてこまってます。
ソースは、
省略
DWORD set;
set=0x00000000
RegSetValueEx(
hKey,
"TEST",
NULL,
REG_DWORD,
(LPBYTE)&set,
10
);
省略
見たいな感じなんですけど
Googleで調べてDWORDにも注意したんですけどだめでした
>>816
10 → sizeof(set)
でないか?
818デフォルトの名無しさん:04/05/24 01:29
>>785
を利用して数値だけを出すのを作ってみましたが、固まります。
何が悪いのやら・・・
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1060403548&res=65

>>801
while()
{/*ここから*/
}/*ここまで*/

ですよね?
>818 固まるってなによ?

>printf("合計%7d点\n平均は%5lf点\n",sum,sum/i);
書式指定と変数があってない
>>818
初心者のためのポイント学習C言語
http://www9.plala.or.jp/sgwr-t/
>>819
>>820
解決しました。お騒がせしました
WindowsXPでborland使ってる初心者です。
sinカーブのグラフを書きたいのですが、ネットでソースを見つけたところ下のようなものを見つけました。

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

void main(void)
{
char p[21];
int ts,tc;
double rd,n;
rd=3.14159/180;
printf(" -1 0 1\n");
printf(" I....+....I....+....I\n");
for(n=0;n<=360;n=n+15){
strcpy(p," I ");
ts=(int)(10+10*sin(n*rd));
tc=(int)(10+10*cos(n*rd));
if(ts==tc)
p[ts]='+';
else{
p[ts]='*';p[tc]='o';
}
printf("%5.0f %s\n",n,p);
}
}
これをコンパイルしてみたのですが、テキストを使った擬似的なものしか表示できません。
普通のグラフのような滑らかな曲線を表示させるためにはどのような方法があるのでしょうか?
GUIなライブラリを使用する。
>>822
使っているのはBorland C++ BuilderなのかBorland C++ Compilerなのか?
Builderなら専用スレで聞いたほうが早い。
CompilerならWinAPIでWindowsに描画させることを考えるか、
いっそBuilderなりVCなり買うかどっちか。
Cの入門書をある程度こなせるようになってきたので、次なるステップに進もうと思うのですが、
C++かCオンリーのSDKかMFCかどうすればよいのでしょうか。
参考にしてる本やサイトで、つぎなるステップがまちまちだったりするので、是非このスレの
住人に意見を聞きたいです
>>826
C++がやりたかったらC++に行く。
C++いらねと思ったら別の道に行く。
念のために言うとC++はCとはまったく別の言語と思っといたほうがいい。
「Cがある程度わかるからC++も何とかなるだろう」とは思わないこと。

個人的な趣味でプログラミングをするなら、正直C++は必要ない。
それよかjavaとかC#とかにした方が、多分、幸せになれる。
>827
適当なこと言い過ぎ。

まず、CとC++は全く別な言語ではない。
Cで習得した内容はC++でも役に立つ。
が、根本的な部分で考え方の転換が必要になる部分があったりする。

あと、今は個人的な趣味でプログラムすることがある人にこそ、C++じゃないかな。
テンプレートなどを使い出せば、かなりディープな世界が待ってるし。
もちろん、Java/C#などでも問題ないけどね。

仕事でしかプログラム作らない/作りたくないという人はJavaにした方がいい。
その方が効率もいいし、仕事も多い。
C#はWeb関連で案件もぽつぽつ出てきてるようだが、まだまだ少数。

で、>826の質問への答えだけど、
あなたの実力がどれくらいか全く分からないので、どのサイトや書籍が最適とは言えない。
が、まずは今知ってるCでサンプルではなく、自分で考えて設計して何かを作ってみるべきだろうね。
そうやって得た土台が無いと、どの言語に移っても身についていかないよ。

個人的にはCで自分の作りたいプログラムが組めるようになってるなら、
Win32環境であれば、C++&WTLをお勧めする。
後はC++やりながら、Java/C#をかじっていけば、大して苦も無く覚えられるよ。
>828
> Win32環境であれば、C++&WTLをお勧めする。
どうでも良いが WTL って VC++ についてくる ATL ないと使えなかった
ような気がするんだが。気のせい?
WTLはATLがないとOTL
ていうか、この手の(>>826)次何やればいい厨にはちょっとうんざり。
技術本読むためにプログラム覚えてるんじゃないだろ。
プログラムで何がしたいかがあるから本読んでるんじゃないの?

スポーツでも車でも「次はどの本読めばいいですか」なんてこんな質問無いだろ?
832デフォルトの名無しさん:04/05/26 00:51
現在BCB6でインターフェースを試行錯誤してるのですが、
HeaderControlを用いてエクスプローラのようなリスト表示ができません。
どのパーツをどういう構成で仕上げればよいのか、教えてください。
>>832
スレ違い。専用スレへどうぞ。
リンク先は>>2を参照
834デフォルトの名無しさん:04/05/26 02:27
gccで使えるpragmaって丼なのがあるんでしょうか?
解説しているサイトなどあれば教えてください
>831 マヂレスすると、手段と目的をごっちゃにしてるんだよ
覚えるのが目的であって、実際に活用する事は思いつきもしない
>>836
その辺が趣味の趣味たる所以だが、
正直、C/C++なんぞ覚えないでもVBとかHSPとか使って
手軽に楽しんだほうが良さそうな気がするけど。
838デフォルトの名無しさん:04/05/26 05:07
C言語の質問です。

初歩的な質問でスマソ。
mallocで動的に確保したint配列にスペース区切りの数値入力を求める方法ってどうやるべき?

>>831
作りたいものが無いのに続く奴なんて居ないと思うけど。
それと共に自分のレベルを上げていきたいと思うのは当然だろ?
>>826 が何か目標があるのかどうかは別として
少し知恵がついてから目標決めても悪くないと思うけど。
初めはなんか作ってみたいってのでも良いでしょ。

あと、実際にC++を使うかどうかは別にしても
C++を勉強しておくことは無駄にはならないという気がする。
例えば、Cでプログラム組むときにグローバル変数を使う事に対して
自然に躊躇できるようになるとか、やたらに巨大な関数を
書かないようになるとかそういう副作用が期待できるような。
あと、オブジェクト指向言語を1つ知っておくと、他のオブジェクト指向言語に
入るときも割とすんなりいけるのでいいかも。
>>838
激しく意味不明なんだが、数値入力はファイルから?標準入力?
どっちにしても、mallocでメモリ確保したポインタなら、普通の配列と同じように使える。
ただCはインデックス漏れのチェックしないから、気をつけれ。
たとえば標準入力から読むなら
scanf("%d ", &h[i]);
みたいのをループでまわすか、普通に%d %d %d ....ってやってもいんでないか?
まあ普通はfgetsやってからsscanfやると思うけど、ちょっと作ってるだけならこれだけでおk。
>>838
宿題は宿題スレへ。
自分でも理解できないことを書いているのがミエミエ。

>数値入力を求める
日本語として破綻してます。
http://kerochan.no-ip.com/vcsdk/letsprog/subchap/chap10-1.htm

に書いてある「リソース スクリプト」ってのが私のVC++には存在しないのですが・・・
どうしたらよいでしょうか。
マニュアル嫁
845デフォルトの名無しさん:04/05/27 07:38
趣味でってw
家でまでもやりたくないだろ普通
オタクですか?
プログラマーでもない限り、家以外でプログラミングしてるほうがキチガイ。
電車の中でハンドアセンブルでもしていろと?
>>846
はぁ?
>831
>技術本読むためにプログラム覚えてるんじゃないだろ。
>プログラムで何がしたいかがあるから本読んでるんじゃないの?

>836
>覚えるのが目的であって、実際に活用する事は思いつきもしない

>837
その辺が趣味の趣味たる所以だが、




>845
>家でまでもやりたくないだろ普通




>846
>電車の中でハンドアセンブルでもしていろと?



... >847 にはげどう(w
Cを勉強し始めて2ヶ月の初心者です
質問させてください

ビット処理の勉強の優先度って高いのでしょうか低いのでしょうか?

なにと比べてとかそのへんの基準の設定もお任せします

私のあふぉな頭では難しくて爆発(ry

よろしくお願いします(´・ェ・`)

850849:04/05/28 05:09
すみません
説明不足でした

ビット処理の勉強というのは

ビット演算(論理和、論理積、左右シフト
ビットフィールド・・・
フラグのオン/オフ?!
符号拡張(??)

などなどです

勉強は必須。そんだけw
>>849
851の言う通りだと思う。

ビット処理がすぐにでも必要(理解したい)と思うのなら優先度は高いはず。

そういうのがあるって覚えておけば
必要になったときに使うと思う
ってか、そんなに面倒なものか?
一日あれば覚えられるやん。
>>853
禿げ堂

>>854
まぁ、そうだけど最初の頃はそのへんが泥臭い感じでとっつき難いのも分からんでもないじゃん。

>>849
俺が思いあたるビット操作がどうしても必要な場合って、例えば、CPUのポートたたくときとか
人のソースいじるときでビット操作が出てきちゃったときとかそんな感じだ。
後から覚えても良いと思うけど。
ビット演算は普通に使うでしょ。
つい先日、新人君がMFCでチェックボタンの真理値を数個分intに詰め込もうとしやがった。
それで私にビット操作の方法を聞きに来たわけだが、当然設計しなおしさせた。
>>857
ファミコン時代の再来だな。
VC6のMFCポトペタでアーカイバ作りたいのですが、ワークシート(プロジェクト?)
というのでしょうか? ウィザードで何を選べばいいのでしょうか?
>>859
好きなの選べ。
>>859
スレ違い。VCスレへどうぞ。→>>2
>>837
個人的な事で申し訳ないが
正直VBよりCやC++の方が色んな面で簡単だと思う。
ぶっちゃけVBはアイコンペタペタ、手書きコード少量のイメージがあるが
実際にはVBは無駄にコード多いよ、、
【初心者歓迎】C/C++室 Ver.6【環境依存OK】
864849:04/05/28 19:08
>>851>>856さん

私には>>855さんの言うとおり、どうもとっつきにくいので
後回しにしますー(苦笑

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


865デフォルトの名無しさん:04/05/28 21:52
C言語で

char *p;

としたときにpの内容は不定値になるのでしょうか?
それとも、この時点で静的領域の適当なアドレスが入っているのでしょうか?
どちらが正しいのかわからなかったので教えてください。
宣言場所によるが。

ローカルだったら不定だね。
ビット演算は存在を知ったときからエラーフラグとして使いまくったなぁ
こんな管理しやすい方法は他に無いだろってヨダレだらだらでしたよ
aってクラスとbってクラスがあります

a.h---------------------------
#include "b.h"

class a{
b hoge;
}
---------------------------

b.h-------------------------
#include "a.h"

class b{

}
---------------------------

ってやるとエラーがでるんですけど、これはどうしてですか?
無限に互いを呼び出し続けるから。
#ifndefあたりで回避できたかもしれない
>>868
FAQだなぁ(苦笑

インクルードは、指定したファイルの内容をその位置に挿入する、
つまり、ファイルの内容をまるまるコピー&ペーストするのと同じ。
a.hとb.hが互いに相手をインクルードしたら無限ループに陥るでしょ。

>>868のサンプルだとそもそも、b.hにa.hをインクルードする必要が無いわけだが、
もし、class bでもclass aを必要とするならこうする。
たぶん、まともな入門書なら書いてあるはずだが。

a.h---------------------------
class b; //先行宣言
class a {
 b* hoge;
};

acpp---------------------------
#include "a.h"


b.h-------------------------
class a; //先行宣言
class b {
 a* hogetta;
};

bcpp-------------------------
#include "a.h"
>869
回避できませんでした。
抜本的解決法とかありますか?
>870
どうもありがとうございます。
で、実はb.hでは

int fuga(a&);
ってな関数を使いたいんですけど、これで試してもうまくいかないんです。。
>>872
質問するときはそれを最初に書かんといかんぞ。次からは気をつけるべし。

で、a::hogeは、きちんとb*型に直してあるのか?
>873
すいません。今度から気をつけます。

で、だめでした。
error C2061: 構文エラー : 識別子 'a' がシンタックスエラーを起こしました。
といわれます。
875873:04/05/29 01:55
たびたびすいません。
できました。

acpp---------------------------
#include "a.h"

ここを勘違いしてました。
>>875
いや、スマソ、オレがタイポしてら。
当然、a.cpp b.cpp ともに a.h b.hの両方をインクルードすると。

あと、class bが b::fugaの引数としてしかclass aを参照しないなら、
a::hogeはb型のままでヲケなはず。
ttp://www.mit.msn.to/prime/prime6.html
ここのページにおいてある

ttp://www.mit.msn.to/prime/prime3_2-3-5-7.c
を実行すると

999962000357=999983*999979
において
素数と判定されてしまいます。
なぜなのでしょうか?
バグだろ、どうして判定されているのかを知りたければトレース汁
デバッガ持ってないのです。
gccでおすすめのデバッガありますか?
あの、すいません
unsigned int t=0xffffffff;のとき
x=t>>32;
としてx=0にしたいのですが
x=0xffffffffになってしまい困っています。
何か言い解決方法はありませんか?
c言語 コンパイラはbccです。
あと、bitシフトを使いたいんです。
あとってかまんまビットシフトじゃん
シフト演算子は処理系依存だったかね…。

>>880
2回にわけれ。
左オペランドの型のビット数を超えるシフトは未定義です。
unsigned intが32bitであれば32以上のシフトはできない。
x=t>>16>>16;
のように分ければうまくいく。
ひとつ勉強になった
アセンブリコードみてもちゃんとシフト命令
走ってるのにね。
やはり処理系依存(Intelの場合はCPUで未定義)なのね。。。
>>886 Intelの場合はCPUで未定義
はぁ?
888888:04/05/29 14:57
 
>>883さん>>884さん
ありがとうございます。
二回に分けることでうまくいきました。
vのnビット右シフトは v >> (n % 32) になる処理系が多いみたいだね。
>>884
細かいことだが、文章が矛盾している。
「左オペランドの型のビット数を『超える』シフトは未定義」ならば、「unsigned
intが32bitであれば32『を超える』シフト」が未定義なのであって、32のシフトは
振る舞いが定義されているはずである。では、どちらが正しいか。
規格には、"greater than or equal to"と表現されている。よって日本語では
「左オペランドの型のビット数『以上の』シフトは未定義」とすべきである。
よって32以上のシフトは未定義である。従って、32のシフトは未定義である。
>>891
細かい事だが、矛盾の使い方が間違ってる
この場合はただの誤りである。
>>892
>>884 は、「左オペランドの型のビット数を超えるシフトは未定義」の発言に
よって32のシフトによる振る舞いの定義の存在を肯定している。しかしながら、
「32以上のシフトはできない」の発言によって32のシフトによる振る舞いの
定義の存在は否定されている。これは一貫性を欠く発言であると考えた。
「矛盾」とは、「物事の道理が一貫していないこと」である。よってこの場合、
私は矛盾という言葉が適当と考えた。
にも拘らず私の「矛盾」の用法が誤っているのであれば、恥ずかしながら、
なぜ間違っているのか、後学のためにご教示を賜りたい。
ああすまん、890へのレスだと思ってた。
ttp://kerochan.no-ip.com/vcsdk/letsprog/chap11.htm

のメニューバー自体にIDを付けたいのですが、どうやったらできるのでしょうか?
MAINMENU MENU DISCARDABLE

MAINMENUを好きに書き換える。
VC6のIDEを使っているのなら、ツリービューから変更したいメニューを選択してF2
>>895
すでにMENUというmenuIDがついているように見えるが。
>>891
すまん、指摘のとおり、超えるは誤りで以上が正しい。
つか、そんな鬼の首をとったようにつっこまんでもいいじゃない。
>>898
まぁ、32がどうなるかってのが問題だったからねぇ。
プログラマはそのくらいは意識してなきゃダメでしょ。
いや意識も必要だし、指摘も大いに結構だと思うが。
わざわざ7行も費やする話か ?

> 左オペランドの型のビット数<del>を超える</del><ins>以上の</ins>シフトは未定義です。
> の間違いだろ ?

で、済む話だと思うが。
901899≠891:04/05/30 11:46
>>900
それにも同意。
リソースエディタで、

「!ほかのエディタで開く」になってしまって開くことができなくなったのですが、どうやったら解除できるのでしょうか?
すれ違い
>>902
ここはあくまで”C/C++室”なんで、ツールの使い方が判らないってのは守備範囲外。
そのツールのスレを探して聞いてくれ。この辺を見る>>2
猫でも〜のSDKイントロダクションで
指示通りコピペしたのですが、
myProg.hbrBackground =GetStockObject(WHITE_BRUSH);
ってとこで、 error C2440: '=' : 'HGDIOBJ' から 'HBRUSH' に変換できません。

ってでます。
>>905
(HBRUSH)GetStockObject(WHITE_BRUSH);
とキャストしてやればいい。
GetStockObject()はブラシ、ペンといったいろんな種類の
オブジェクトのハンドルを返す汎用関数だから、返り値も
HGDIOBJと汎用型になっている。
907デフォルトの名無しさん:04/05/30 22:54
>>905
猫でもわかるのに・・・
君C/C++辞めたほうがいいよ
908デフォルトの名無しさん:04/05/31 02:59
C言語で次のようにコマンドライン引数をmain関数で受ける場合について質問があります
#include <stdio.h>

int main(int argc, char *argv[ ])
{
char *p[2];

printf("%p: &p\n",&p);
printf("%p: p\n",p);
printf("%p: &argv\n", &argv);
printf("%p: argv\n", argv);
return 0;
}
/*実行結果
0012FF78: &p
0012FF78: p
0012FF8C: &argv
00430E50: argv
*/
pがアドレス演算子をはずしても同じアドレスを表示したのは
pは配列の名前なのでその配列の先頭アドレスをさしているからですよね?
しかし、main関数で受け取った文字列へのポインタの配列argvはアドレス演算子をはずすと同じアドレスを表示しなくなりました。
格納されている領域をアドレスから推測するとどうやらargvはポインタの配列ではなく、文字列自体をさしているようです。
この違いはどこから来るのでしょうか?
関数の仮引数宣言における('T p[])は(T *p)と等価
910908:04/05/31 03:59
>>909
レスありがとうございます
そういえばそうでした。思い出しました。

そこで追加質問です。
#include<stdio.h>
#include<stdlib.h>
int n;
int main(int argc, char *argv[ ])
{
   int a;
   char *p = (char *)malloc(8);

   printf("%p: コード領域\n",main);
   printf("%p: スタック領域\n", &a);
   printf("%p: ヒープ領域\n", p);
   printf("%p: データ領域\n",&n);
   printf("%p: argv\n",argv);
   return 0;

/*実行結果
00401005: コード領域
0012FF7C: スタック領域
00431DE0: ヒープ領域
004237A4: データ領域
00420F9C: 静的領域
00430E50: argv
*/
これからするとコマンドライン引数はどの領域でもないような気がしますが
どこの領域に確保されているのでしょうか?
911908:04/05/31 04:00
上の実行結果で静的領域は間違えです
気にしないでください
>>910
どこかに。
割と見る実装ではヒープに確保してるけど。
913908:04/05/31 13:04
質問文に、また訂正箇所発見しました
malloc関数でとったメモリは16バイトです
#include<stdio.h>
#include<stdlib.h>
int n;
int main(int argc, char *argv[ ])
{
   int a;
   char *p = (char *)malloc(16);

   printf("%p: コード領域\n",main);
   printf("%p: スタック領域\n", &a);
   printf("%p: ヒープ領域\n", p);
   printf("%p: データ領域\n",&n);
   printf("%p: argv\n",argv);
   return 0;

/*実行結果
00401005: コード領域
0012FF7C: スタック領域
00431DE0: ヒープ領域
004237A4: データ領域
00430E50: argv
*/

>>912
レスありがとうございます
ヒープ領域ですか。
だとしたらmalloc関数で確保した場所と4000Byteも離れてるのはなぜでしょうか?
本当の初心者です…。
本を読みながら独学を始めました。

先に結論を。

winMEで使えるフリーのコンパイラをご存じありませんでしょうか?


GCCというのは本で知り、
会社で使っているXPでは、使っているのですが、
その会社を辞めようと思って、Cの勉強を始めたので、
なかなか会社ではやりにくくて…。

家のPCはMEで、そのPCを買い替えられないくらい薄給なもので…。
その本では、GCCを使う際、
「XPで動くことを想定しています」
となっていて、MEでのことを書いていないもので。

「MEで使えるかやってみればいいじゃん」
は、今(会社にいる)思いつきました…。

すみません。よろしくお願いいたします。
>>914
タダで最強!フリーC/C++コンパイラ
http://pc5.2ch.net/test/read.cgi/tech/1035882599/l50


つか、聞く前にやってみろよ、ホントに。
916デフォルトの名無しさん:04/05/31 14:11
>>913
なんかけんか腰だな
917相談:04/05/31 14:32
サーバ側のファイル更新日付を取得したいのですが
サンプルコードがハングルでよくわかりません

助けてください
ttp://www.serious-code.net/moin.cgi/FileTime
>>900
アプリケーション側の管理する領域ではない、とは思いつかないのか?
919918:04/05/31 14:35
アンカーは910の間違いorz
920デフォルトの名無しさん:04/05/31 14:52
switch (pid = fork()) {
case 0:
・・・
_exit(1);
case -1:
perror(NULL);
exit(1);
default:
waitpid(pid, &status, 0);
if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {
fprintf(stderr, "pwd failed\n");
exit(1);
}
break;
}

このプログラムを改造して子プロセスから親プロセスに0以外のstatusを
送りたいのですがどうすればいいですか?
exitのあたりをいくらいじくっても無理なのですが・・・
>>910
環境変数かなんかと一緒のアドレス空間だった気がするが
なにぶん MS-DOS3.3B 使ってた当時のことだし記憶違いだとアレだなぁ
いやつまり OS や CPU によって違っても当然じゃないの? という。
OS もコンパイラもコンパイルオプションも書かないでどういうつもり? という。
>>912 の「割と見る実装」の意味は分かってる? という。
仮に DOS でも Tiny, Small, Large で違うだろうし、という。
素人に毛が生えた程度の俺はそんな風に思う。
922914:04/05/31 15:34
>>915
ありがとうございます。


>つか、聞く前にやってみろよ、ホントに。

この言葉も含めて、本当にありがとうございます。
頑張って勉強・実践します。
923デフォルトの名無しさん:04/05/31 15:44
>>921
キモい
924デフォルトの名無しさん:04/05/31 18:00
すいませんすごい初心者なんですが
5個整数入力して最小値と最大値求める
のって変数最低いくつでできますか?(配列までいってません)
3つ。
int i, max, min;
4つか。ユーザ入力を受け取る変数が必要だ。
>>925-926
サンクスです
たすかりました
928デフォルトの名無しさん:04/05/31 18:12
>>926
ループにしなければよい。
>>913

ヒープから確保する時って、頭の方から順番に取っていくもんでは*ない*んじゃなかったっけ?
空いてそうなところをえいって見当つけてとってくるんでしょ。
だとしたら、たかだか4kBくらい離れてても別におかしく無い気もする。

俺の言っていることがおかしいってことはあるかもしれんけどさ。
930913:04/05/31 19:41
>>929
そういうことなんですね
納得しました

その辺はOSが管理しているのでC言語だけじゃわからないってことですよね

プログラムを作っている環境は
WindowsXP Home
MS-VC++6.0
です。
MS-VC++6.0を使っててコンパイラを聞かれたらなんて答えればいいのでしょうか?
VC++6.0と答えればいいのでは?
>>930
「割れ物です」と答えとけ。
933913:04/05/31 20:20
>>931
そう答えればよかったんですね

>>932
お金を出してお店で買いました
あなたと一緒にしないでください
ネタにマジレス(略
ってか、まぁ、おまえ人間関係で失敗することが多いだろう、と
むしろ失敗してることすら意識しないか。