【初心者歓迎】C/C++室 Ver.6【環境依存OK】
スレ立て乙!
もつ鍋
初心者すぎる質問ですがおながいします。
ボーランド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嫁。
>>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(...);
....
/* 続く */
/*
>>13の続き */
for(...){
for(...){
if(...)
return c;
}
if(...)
return d;
}
...
free(p);
free(q);
return e;
}
--------------------------
みたいなものを書きたいのですが、このままだと、条件によってはp,qがfreeされません。
どうすれば、きれいに確実にメモリをfreeできるのでしょうか。
一応、自分で考えたのは、
(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)で行こうかと、あきらめかけているのですが、
もっとまともな書き方があったら教えてください。
いい忘れましたが、C++ではなくCでお願いします。
それから、コンパイラ依存の機能を使うのもしない方向で。
>>13 漏れならgoto使うなぁ。
一番見やすそうだし、仕様変更にも柔軟に対応できそう。
でも最大確保サイズが分かってて、そんなに大きくないなら
スタック領域確保で対応するかな。
コンパイラ依存の機能はなしっていっても、
移植する必要がないならどんどん使った方がいいと思うよ。
今回の例でいうとalloca関数とか。
C/C++の質問です。
クラスや構造体を関数に渡すとき、ポインタで渡す場合と参照で渡す場合で
違いとかってあるんですか?
できれば"->"より"."を使ってメンバにアクセスしたいので参照渡しにしたいんですが。
>>18 参照にするかポインタにするかよりも、
関数の引数にconstつけるかどうかで、
関数内でデータが変化するかどうかを
関数を使うユーザーに暗示的に示せるので、
関数宣言の仕方に注意すべし。
>>18 機能的に違いは無いが、関数側から見ると、
ポインタはNULLが渡ってくる可能性を考慮する必要があるが、
参照は常に実体がある(ほんとは例外があるがそこまで気にしないでいい)。
どうせ参照渡しでもポインタ渡しでも同じコード吐くことが期待できるしね。
ポインタにせざる得ない場合を除けば参照でいいじゃん。
そのための参照でしょ。
>>19 毎回忘れて後で読み直す羽目になってる・・・気をつけます。
>>20-21 NULLの場合を考慮しなくていいのは楽かも。
結果同じになるなら自分が使い易いほうでよさそうですね。
これから参照使って渡すようにします。
有難うございました。
>15
(2)推奨。次点で(3)。
func()内での*pでのアクセスを避けるには、
func(void **p_copy)
{
void *p;
...
p = *p_copy = malloc();
}
とすれば良い。これならレジスタ等もうまく使ってくれる。
もちろん、do_func()内でNULLを代入しておく。
引数の数によっては、void **を渡すのではなく構造体のポインタを渡すのも手。
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)
そちらの方に書き込むことにします。
ありがとうございました。
28 :
デフォルトの名無しさん:04/04/18 20:29
ここは、SDLの話を振っても大丈夫ですか?
29 :
デフォルトの名無しさん:04/04/18 20:43
構造化プログラミングと段階的詳細化の関係について教えてください。
この2つはどう関係しているのですか?
自分なりの解答としては
構造化プログラミングは構造の把握しやすいプログラムを作る方法のことで、
段階的詳細化はトップダウン法のことである。トップダウン法で作ったほうが
構造の把握しやすいプログラムができる可能性が高い、という点で関係している。
って感じなんですが、不安です。何かアドバイスお願いします。
>>29 あなたの質問 と このスレ の関係について教えてください。
この2つはどう関係しているのですか?
自分なりの解答としては
あなたの質問は環境に依存しない一般的な ことで、
このスレは環境依存もOKな優しいスレのことである。「すれ立てるまでもない質問はここで」 スレで聞いた ほうが
回答を得やすい質問である可能性が高い、と言う点で全然関係していない。
って感じなんですが、不安です。何かアドバイスお願いします。
キモい
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のどこで何をダウンロードすれば良いのでしょうか?
ここで聞くべきなのかもわからないのですが、
VC++6.0で簡単なグラフィックを使う場合には
C++の知識が必要なのですか?
Cまでの知識でグラフィックを扱えるものはありますか?
>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>
を見て笑えるようになったら、ヘッダについては卒業だな。
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です。
コンパイル出来ないならエラーメッセージくらい書いて。
使い方間違ってただけでした。
#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のコミュニケーション能力が一番の問題ではないかと。
単に愚痴りたいだけなのか?
これで質問しているつもりなのか?
後者だったら、よく周りの人間が付き合ってくれるもんだと感心する。
ご心配おかけしましたが、なんとか自己解決しました。
とはいっても、総当たり方式で、ですが。
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)という解釈。
最近動的メモリ割り当てを使い始めた者です。
環境依存かわかりませんが、borland bcc32 を使ってます。
2次元配列などを動的メモリで何個も使って、普通に動いてるように
見えるコードに、新たに別の配列を同様にして追加しようとすると、その前後で
メモリに書き込めない、というエラーがでるときがあります。
また開放しようとしたときに、メモリが読めない、と言われるときがあります。
ポインタでファイルをオープンしようとして、メモリが読めないとエラーが
出るときもあります。
配列の大きさ種類は色々ですが、最大で100 * 100 の double型の大きさで、
それを数個使う程度です。
何か全然初歩的なミスをどこかで犯してるのかもしれませんが、
もし何か気が付くことがあれば、教えていただけませんか?
お願いします。
>>68 新たに別の配列を同様にして追加 ってどういう意味?
できればソース出して。これだけの情報じゃあなんとも言えない。
mallocのNULLチェックはやってる?
確保領域のポインタの
扱い方を間違えてる
>>69-71 早速どうもありがとうございます。
ソースは大体以下のような感じです。以下は2個しか書いてませんが、 double 型以外の配列も同様の形で作ったり、などとして配列の数を
増やそうとすると、そこでメモリの読み書きができない、 というエラーが出てきたのでした。
>>70 やっていませんね。NULL を出すということは、そこのメモリは読み書きできなかったということになるんでしょうけど、その場合は
別のところにメモリを確保してくれるのでしょうか?
それともただそこでプログラムは停止する、ということでしょうか?
>>71 きっと間違えてますね。もし以下で何かおかしいことがあれば、 お教えいただけると嬉しいです。
73 :
68 (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万回も書き込めば何があっても不思議じゃない。
>>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 個できるだろ?
× ヒープが
○ ブロックが
1次元配列でいいのではないかと…。
>>35 レス遅くなって申し訳ないです。
あれから色々やってみたのですがいっこうに
元の画像に戻らずです・・・。
しかも貼り付けたやつは逆DCTのほうでした。
g[m][n]=(unsigned char)a;
の部分はg[m][n]がunsigned char型なのです。
画像を読み込んでDCTして出力という感じです。
>>87 元に戻らんってどの程度のレベルで言ってるの?
DCT変換後の結果をunsigned charで格納したらその時点で情報落ちするから、
逆DCTしても全く同じにはならないって事じゃないのか? >35は。
>>88 ちょっとその辺考えてもう一回やってみます。
>>81 インスタンスの管理のしかたはわからんが普通に
class A;だとしたら
class* a;
a = new A;
a->Initialize();
delete a;
と、複数インスタンスとは別にツクってでいーんじゃない?
他の方はどーやっとる?
>>81 >>90 普通にはその変数を定義したところで初期化する。
込み入ったことをやりたかったら、初期化関数をstaticで用意する。
>>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回にしたい気もする。
あー、けどアラインメントを考えるとうまくいかない環境もあるか。
オマエモナー
オマエモナー じゃなく オマエガナー でしょ?
>>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 memcpy(r, rec, sizeof(r));
105 :
デフォルトの名無しさん:04/04/23 23:05
C++で整数を文字列としてvectorに格納する時の定石はどのような感じなのでしょうか?
やはり
#include <cstdio>として
sprintfで一度文字列に変換してからvectorへ持っていくという方法がベストでしょうか?
108 :
デフォルトの名無しさん:04/04/24 08:49
ども。
Solaris8+SunONE7 で ローカル時間にmsec(ミリ秒)を使いたい。
localtime構造体には、msecがなく、困ってます。
何か他のmsecのある構造体を教えてください。
また、time構造体から上の構造体への変換関数もお願いします。
出だしの「ども。」がなんかむかつくから教えない
>>108 μsec ならあるんだけどなー。
残念だなー。
>>106 thnks.
STLの範囲内でと考えていて、参考書では<c*>はなるべく使わない方が
いいと書いてあったので他の人はどうしているか知りたかったと言うところです。
>>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とかね
>>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() ; // (゚д゚)ウマー
ってめちゃくちゃ遅いでしょうな。
/=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ではどちらが速いんでしょうか?
>>128 そんなことを気にするよりも前に、もっと他に気にすることがあるでしょ。。。
PC内の時計から乱数を作る方法どうやってやるんでしたか誰か教えてくれませんか?
132 :
デフォルトの名無しさん:04/04/24 22:42
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 はげしくワロタ。というかコーヒー吹いたじゃねぇかゴルァ!
> ってできるでしょうか?できない気がしてしょうがないんですが、
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)をうまく置換してくれる関数はどのようにすればよいのでしょうか?
自作しようとして挫折しました。ご教授ください。
具体的にはスペースやタブを&nbsp;で全置換する関数です
複数の変数を用意して、
それを小さい順に並び替えるにはどうしたらいいでしょうか?
もし同じ数があれば連続して並ばせる
>166
1.自分で作る
2.人のソースからぱくる
3.ATLなどのライブラリを使う
>167
配列やソートという言葉を知ってますか?
すみません、ちょっと説明不足でした
仮に
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を押しても文字が消えません
一度打ってしまうと修正できないんですか?
scanf()に代わる関数をうp汁
190 :
デフォルトの名無しさん:04/04/26 19:11
>>185 ioctl()で消したりすることができるようになるかなぁ?
ちなみにgets()は使っちゃあかんぞぃ
fgets() (+scanf())にすべし。
>>186 異議なし。
ところで今長い数字を並べた文字列を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;
}
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以外はビルドに成功するのですが、
>>195さん、
どうも、ありがとうございました。ソースコードにtoken[i-1]の-1を忘れている
のにも気づかず、話もできません…
それでもバグを修正してくれてありがとうございました。
>>197,198
ありがとうございました。
B()→A()→~A()→~B()
なのでちょっとびっくりしていました。
Aが作られた時にBのインスタンスがないと、
Bのプロパティを初期設定したい場合どこで呼べばいいのかわからなくなる。
同様に、Aが破棄される際にBが先に破棄されていると
Bに終了処理が必要な場合、以下同文ということだな。
その辺のタイミングはコンパイルの仕方変えれば何とかなるだろうけど、
でも、現行の仕様が一番シンプルで分かりやすい。
なんとなく A()→B()→~A()→~B() かと思っていました。
>>205 激しく納得です。感謝。
VC++で、実行したときにどの変数にどんな値が入っているのかリアルタイムで下方に表示する方法教えてください
スレッドが違います。
環境依存OKじゃなかったの?
211 :
デフォルトの名無しさん:04/04/27 22:49
環境依存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 で実行すれば
良かった訳ですね。納得しました、どうもすいませんでした。
いやー
何割かの人間が通る道かな?これはw
俺、ヘッダはコンパイルしたことないぞ・・・。
質問です!
C++のコンパイルエラーの一覧表みたいなものって
あったりしますかね?
解説付だとうれしいんですけど。
ググってみてもMLの記事ばっかりひっかかってしまいます。
コンパイラのヘルプ見れ。VCなんかはMSDNに載ってる。
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までの「文字」と、数値は異なるものなので変換が必要です。
238 :
デフォルトの名無しさん:04/04/28 23:24
絶対値を計算する関数absoluteの作成を手伝ってください。
なお、abs等のあらかじめ用意されている算術関数は利用せずに作らないといけないです。
>>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;
}
おいいいい宿題スレじゃないべ。まあsoccer見てくるけど・・・。
連休前のせいか、どのスレでも「宿題やってちょ」厨がわいてるな。
247 :
デフォルトの名無しさん:04/04/28 23:42
どうもお騒がせしましたm(__)m
error C2143: 構文エラー : ';' が '型' の前にありません。
ってなんてことないところで出るんですが、なぜなんでしょう?
問題の行をコピペしてほかの所に貼り付けても、エラー出ませんでしたので
どうも二次エラーじゃないかと思うんですがどうでしょうか?
二次エラーだとしたら、一般的にどの辺を見直してみるとよいでしょうか?
>>248 一概には言えないが、大抵はその直前の行が終了していない(';'がないなど)。
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を実行する事が出来ました。
ありがとうございました。
配列を引数に渡しても値が変動しない方法ってないでしょうか?
いろいろ考えたのですが、どうもよい方法が思いつきません
一回一回、初期化しなおすか、配列を使わないでやるぐらいしか・・・
>>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か。
>>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度手間になってしまう。
>>274 最適化を施しても精度をfloat相当まで落とす処理が無駄な手間になる。
>>273 それだけじゃ、誰も答えられんだろ。
といって、その膨大なクラスのソースコードを見せられても読む気しないし。
デザパタでも勉強してください。
>>274 そういう書込みが、doubleとfloatの速度が同等もしくはdoubleの方が速いという誤解を蔓延させている。
>>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); /*料金を出力*/
}
296 :
デフォルトの名無しさん:04/05/01 22:42
printf("給油量");scanf("%d",&fuel); /*給油量の入力*/
printf("石油の単価");scanf("%d",&rate);
&をいれなおしてやってみましたがどうしても料金が0円
になってしまいます。
297 :
デフォルトの名無しさん:04/05/01 22:47
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は単純にファイルを挿入するだけで、それはプリプロセッサの仕事。
コンパイラはそんなことは知らない。
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は部分特殊化はサポートしてないはず。
試しにやった、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");
}
カーソルキーとスペースキーの押下状態を調べる
コンソールプログラムなんですが、
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 だめでした;;
本来なら表示されているはずのところに何も表示されません、
行間はちゃんととられてるのでプログラム自体は正常に動いている
ようですが・・・
コンパイルし直すと違うの?それともコンパイルし直さなくてもそう?
しばらくしたら自然に治りました^^v、特に設定変えたわけでもないのに
わけわかりません・・・^^;
>>328 漏れんとこじゃ表示できたんだけどなぁ。
printfで表示できない環境なんて聞いたことはないけど、
絶対ないとは言い切れないから、それかもね。
>>329 ほんとに突発的になるんですよ・・・、
文字の表示に関する設定のどこかだと思うんですが・・・
>>326 あんまり意味ないとは思うけどprintfのあとに
fflush(stdout);
とかつけてみたら?
>>326 えと、326ではりつけてるプログラムが実は説明用のプログラムで
本当はもっと複雑なプログラムで問題が起こっているなんて事は
ないですよね。
もっと複雑なプログラムでprintfでデバッグなんかしてて、
プログラムを実行すると途中で落ちちゃうんだけど、
どのprintfも実行されてないなぁ…おかしい!
なんてことはないですよね。
もし、「実は正にそうですた」ならば上で書いたfflushは有効かもしれません。
printfで出力したものは、実はバッファにためられてあとでまとめて出力されます。
プログラムの正常終了時にはちゃんと吐き出されますが
異常終了時には表示されないこともあります。
fflushをつかえば、その時点で出力されます。
なんてえらそうに書いちゃったけど、もし「そんなの知っていますよ」だったらごめん。
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
すみません。char buf[1024] = "";を間違えてかいていました。
なぜがコピーできなかったので自分でかいてミスしていました。
それにしてもどうしてでしょうか?
339 :
デフォルトの名無しさん:04/05/03 23:01
>>338 最終的にbufの中はどうなってほしいんだ?
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);
}
>>340さん
そういう事なんですが・・・
>>343さん
どうもそのソースコードでもうまくいかないんです。
33387892となってしまいます;
ちなみに私の環境はLinuxコンパイラはgccです。本当に済みません;
>>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.
よろしくお願いします。
>>355 DirectXは使っていなくて、GetAsyncKeyState() API でキーの状態を
チェックしています。
>>355さんの環境でも、[←][↓]を押したまま
[SPACE]キーを押しても、スペースキーが押されていないような反応を
示しました?
っとと、すまん
>>353な。
あと、キーボードの同時押しは組み合わせによって認識されないキーがあったはずだけど。
>>357 どうりでかみ合っていないなと思いましたw
>>358 >キーボードの同時押しは組み合わせによって認識されないキーがあったはずだけど
やっぱりそういうのがあるんですか…。
これらのキーを同時に処理しなければならないので困ったもんです。
こちらももう少し調べてみます。ほかにも何か情報をお持ちの方が
いらっしゃいましたらお願いします。
やねうらおのBM98の記事でその辺詳しく解説されてたと思うけど
キーボードを変えるしかない。
>>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版ランタイムって確か入ってないと思ったけど…。
>>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
が出て先へ進めない現状です・・・・・・
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は標準ランタイムが足りないんじゃないかって思えてきた。
>>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なんか使えない。
>言われてもわからないので
プ
OSはMeでLSI C-86試食版をつかっています
お願いします
>>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
>>382 あ、プロジェクト違いだね。
火が出ているも何も、未だ仕様が確定してねぇもん。
お尋ねします。
Watcom C/C++ 11jというコンパイラを手に入れました。
これでWindows2000、XP上でI/Oポートをいじれるexe,dll等は作成出来るのでしょうか
差し迫っての問題ではないのですが、やはりVisual C++でしか開発できないのでしょうか
>>385 それ、NT系の2000/XPじゃ使えない様な気がする。
>>384 exeやdllだけでI/Oポートに直接アクセスすることはOSとして不可能。
Watcomだからっていう問題ではない。
フリーのドライバが有るのでそれ使え。
レス付けていただいた方々、ありがとうございます。
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するなどの処置が
必要。
レスしてくれた方ありがとうございました。
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;
}
レスしてくださった方々、どうもありがとうございます。
非常に勉強になりました。
これはdo〜whileの出番かもしれない。
>>394 言ってみればC++でcinはCで言うところのscanf()、getline()+stringstrem
はCで言えばfgets()+sscaf()みたいなイメージだな。中身はもちろん全く
違うが。
>>393の例外は気に入った。
399 :
デフォルトの名無しさん:04/05/06 04:07
Cでnamespaceとかclassのprivateみたいに、
関数のローカル化ができるものがあるなら教えてください。
static
>>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++のあらゆる機能を使うこともないと思う。
intなのに整数をreturnしてねぇ・・・・
長編、ねぇ。
本の1,2冊くらいは読んどけ。
403は親切だーね、
こんな失礼な奴に。
すいません。出直してきます。
TurboCなんですが、BGIをプログラム内に組み込む方法を
どなたか、ご教授下さいませんか?
C++でメンバ関数内でstaticで変数を宣言した場合、
その変数はそのクラスの型の変数すべてで共有なのか
それとも個別に用意されるのか教えてください。
共有だよ
static宣言したらメモリ上の固定位置に配置されるんだってば。
それがわかってたら
>>412のような疑問は湧いてこない。
クラス内での static inline と staticって等価?
>>416 具体的にお願いします。
ひとところに関数を定義するなら、inlineが無効のような気がするのです。
>
>>414 > インスタンスを定義したらだね。
クラスのインスタンスのことじゃないよね?
>>417 > ひとところに関数を定義するなら、inlineが無効のような気がするのです。
クラス定義内に関数の定義を書いた場合はinlineとみなされるので、
違いが無いように見えるかもしれない。
もしくは、最適化をかけていなければインライン展開されないので、
違いが無いように見えるのかもしれない。
>>415 static inline int x;
とは書けんぞ。
関数内のstatic変数の話と
クラスのstaticメソッドの話が混ざってるぞ。
プ
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
430 :
デフォルトの名無しさん:04/05/07 17:36
>>429 大きさを表すのに適切な符号無し整数なら、別にunsigned intでなくてもいい。たとえばunsigned long intでもいい。
431 :
デフォルトの名無しさん:04/05/07 17:39
>>425 cstdrefじゃなくてcstddefな予感。
>>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);
例えばこのように書いたときに、
"%":不正な左オペランドです。
とでてしまうのですがどのようにかえるべきでしょうか。
%を同じように使ってもでないときもあるのです。
かぶったスマソ。
>>436 ありがとうございます。けど英語わからないです・・・・
どういうことなのでしょうか?ほんとに教えて厨ですけど説明していただけるとうれしいです
>>440 "C FAQ" "処理系定義" でググれ。
答えて下さった方ありがとうございます。
>>432 C++でのsize_tはstdの中にあるんで、std::size_tなどとしなければならないよ。
今回のはポインタも示されてるからいいけど、
いくら規格の英語がたいした事無いとはいえ
量に圧倒されるのが、日ごろ英語に触れてない日本人なわけで。
斜め読みも出来ないから、目的の情報を拾いにくい。
規格は英語が基本だからなぁ…
まあガンガレ
>>434
みなさんホントにありが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
残りなく使ってもいいんでしょうか?
すっかり使ってもいいんでしょうか?
非常に使ってもいいんでしょうか?
とても使ってもいいんでしょうか?
...ありえな〜い
言語はナマモノ。
Cをやろうと思いますが、今日Cを知ったような初心者にも読めるCに関する雑誌ってありますか?
(または本をお願いします)
467 :
デフォルトの名無しさん:04/05/08 20:47
>>455 ありがとうー。
言葉には気をつけます。スマソ
独壇場 ← どくせんじょう で変換できない。
469 :
デフォルトの名無しさん:04/05/08 20:50
470 :
デフォルトの名無しさん:04/05/08 21:40
>470
全然OK
>>463 ありえないが、流行語みたいなもん。
好んで使ってるジャリタレが消えれば消えるでしょ。
_ ,,, _ __ 〃 ヽ`_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
485 :
デフォルトの名無しさん:04/05/09 01:27
>>482 お返事ありがとうございます。
やはりそのやり方が一番簡単だと思います。
しかし、int現在はマイナス値を返す可能性があるので使えないかもです。
intではないデフォルトのクラス自体を返すときも難しそうです。
>>483 お返事ありがとうございます。
例外ですか…。まだ勉強中です。
この中では例外が一番良いのかもしれませんね。精進いたします。
ありがとうございました。
エラー格納メンバ変数を持て
メンバ関数は戻る時にエラー格納メンバ変数を書き換える
487 :
デフォルトの名無しさん:04/05/09 01:30
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()で充分じゃん。
>>508 最低限コードセクション以外を実行不可としてマップする
BOFってなんだ?
overflowは一つの単語だからBOが正しいだろ。
>>512 高々一つの文字列をコピーするならsprintf(dest, "%.*s", len, src)で充分。
>>515 バッファオーバーフローといえば、「NOP」という言葉が連想されるけど
その論理なら NO になってしまう罠w
>>517 あと printf() 系は str* 系関数に比べると重いし、async thread safe では
ないので使える場所に制約がある。普段はあまり問題にならんけど。
>>519 str*もスレッドセーフである保証は無い
printf系ももちろんそう、FILE*に適応する場合のみ顕著化する可能性がある
スレッドセーフで問題になる代表例は、strtok
522 :
デフォルトの名無しさん:04/05/10 00:05
C++で正規表現を使いたくてboostをインストールしたいのですが
日本語のインストールドキュメントありませんか?
ファイルの一行に複数個のデータがあって、
データの個数はファイル読み込みまでわからないような場合、
どのようにコードを書けばいいか教えてください。
具体的にしたいことは、M×N行列のデータを書き込んだ、
以下のようなフォーマットのファイルを読み込みたい、ってことです。
1: M N // マトリクスの行・列数
2: ○ ○ … ○ // N個のデータ を H[0][0] 〜 H[0][N-1] へ
:
M+1: ○ ○ … ○ // ↑ 上記をM行繰り返し
可変引数とかを使ったことないもので・・・
あまり環境依存はないかもしれないですが、
いちおうコンパイラは gcc です。
>>524 各データ長が同じなら、行頭nバイトを固定で確保してそこにデータ数をいれとくとか
読み込んだ1行のバイト数をデータ長で割るとか
>>525 >
>>524 > 各データ長が同じなら、行頭nバイトを固定で確保してそこにデータ数をいれとくとか
> 読み込んだ1行のバイト数をデータ長で割るとか
すいません、データ型は double or float を想定していて、
データ長は不定です。
なおデータの区切りはスペースを想定してます。
>>526 1.ファイルの最初に全ての行の行毎のデータ数を書き込む。
2.行データの終わりを示す数字を決めて、それを書き込む。(最初のスペースまでとかね)
3.値データをなにも考えずスペースに挟んで一気に書き込む。
何か微妙に矛盾した場所があるけど、まぁ眠いからいいや
>>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' : 定義されていない識別子です。
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でよろしこ
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ \
/ '''''' '''''' ヽ
| |
| (●), 、(●) |
| ,,ノ(、_, )ヽ、,, |
| `-=ニ=- ' |
! `ニニ´ .!
| |
.\ ______________ /
うわスマン!
激しく誤爆した
>>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]と書くことは同じじゃないんですか?
そんなことは今のお前さんにはどうでも良いことだ。
そうか!わかったぞ!
staticはなんかやなんで、その関数の引数から渡せばいいですよね。
そんな方法は面白くもなんともないぞ。
考え直せ。
>>530 この場合、インクルードするということは、printfのプロトタイプ宣言を
そのファイルにとりこむことが主な目的になるわけですよね。
でも関数はそのプロトタイプ宣言がなくても、その実体があればいいのです。
だって、実体があればリンクできるからね。
つまり、あなたのプログラムをコンパイルしたときに、gccはprintfの実体を
みつけることが出来たので、エラーを出さずにコンパイルを完了することが
出来たわけです。
じゃあなんで、stdio.hをインクルードするのかというと、
関数のプロトタイプ宣言があるとその関数の引数チェックが出来るんですね。
もし、間違った型の引数を与えてたりすれば、gccはそこでエラーを出してくれます。
だから、インクルードした方が確実なのです。
ということを最近知りました。
嘘言ってたら、だれか指摘して!
いまいちわかってないんで聞いていいですか?
配列がポインタに読みかえられるのは関数の実引数のときでいいんですか?
今回だと、ただの配列だからポインタには変換できんと。
>>556 今回問題になっているのは、
func()内にあるdata[10]はfuncから戻ったときにはすでに破棄されているから
funcの戻り値は使いようが無いってこと。
data[10]破棄されないようにするにはstaticにするか動的に領域を確保するかせよと。
個人的には int *func() のインタフェース自体を変更すると思うけど。
配列名がポインタに読み替えられるのは一部の例外を除き常に。
>>566 はぁ?
だから、今回のは、配列だのポインタだのとは 全く関係ないのだが。
やっとわかりました。
普通の自動変数と同じような扱いってことですよね。
ブロック抜けたら消滅するっていうことで。
なんか配列とポインタがごっちゃになってました。
出直してきます
>>599 >普通の自動変数と同じような扱いってことですよね。
同じような扱い?
「扱い」じゃなくって、普通の自動変数そのものだぜ。
っていうか、「普通の」って言葉も変だがな。
>>560 そうっすね。
つまり自動変数だと!
「普通の」っていうのは、オレが配列とポインタの関係をあさっての方向で認識していたからで。
配列はあくまで配列なんだと、ここにきてわかりますた。
文字列の末端にスペースをつける方法を教えて下さい
strcat(str[], )の右側に何か入れればできますか?
strcat(str[], " ");
564 :
デフォルトの名無しさん:04/05/10 20:53
スマヌ、ボンヤリシテタ。
>>562 それだけじゃあなぁ・・・
C++でstring使ってるならシンプルな解答で済むんだが。
Cだと、もうちっと前提がわからんとな。
strに一文字追加できる領域があるんなら strcat(str, " "); でも良いけど。
567 :
デフォルトの名無しさん:04/05/10 21:38
>>567 プログラムとかしたことない奴がなんでこの板にいるの?
NekoFightの人だったんか・・・
か猫でし
あのう、すいません
配列についてなんですが、
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;}
};
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;
}
こんな感じで作ってました
乱数と関数の使い方覚えようと思って作ってました
>>573さんありがとうございました
ビットフィールドで検索したら
1bitだけ使う方法が出てきました。
これから勉強してきます。
>>579-580 つっこみがいのあるプログラムだな(w
関数は間違いなく値を(条件に合えば)増やして返しているが、
返された値を無視してるじゃないか。
おかげさまでやっと理解できました
関数呼び出しただけでmainのほうの値も変わってると勘違いしてたみたいです。
本当は、マークじゃなくてスーツ、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;
>>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より小さい値には絶対にならない。
わかった!わかりました
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の前)
>>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文で{ や}が必要なのかよくわかりません。
なくてもコンパイルできるときがあったのですが.....。
お答えありがとうございます。
>>600 それだとmainから明示的に呼び出すのと同じじゃないでしょうか?
>>602 配列の要素を定数あるいは一定の数列で初期化したいのです。
たとえば
static int anArray[100];
をforループで初期化するとか…
まぁ、クラスごとに初期化用の静的メソド書いて
Class1::Initialize();
Class2::Initialize();
…
とかってmain関数に延々と書けば済むことなんですけど・・・
>>605 最近、shiftキーの調子が悪い・・・
>>606 君が読み間違ってる。
中括弧がいらないのは制御文の中身が短文の場合のみ。
>>606 コンパイラの立場になってみる。
}がなくて、どこまでがifの範囲とわかる?
{ }がないと、直後の1文だけを範囲とみなすしかないじゃん。
endifとかでもないかぎり
606です。
貴重な情報ありがとうございました。
これからいろいろとif文について詳しく学びたいと思います。
>>607 class Class1
{
struct Initialized
{
Initialized();
int anArray[100];
};
static Initialized s;
public:
// ...
};
Class1::Initialized Class1::s;
Class1::Initialized::Initialized()
{
// 好きにしる。
}
また、初心者の質問です。
条件演算子を使った文を書いているのですが、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 まぁ、昔のチミも今のチミからみたらそんなもんじゃろ?
こっちまでくるなよ。おまえら
>>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のメンバにする必要は無いと思うけど。
どんなもんだろ?
>>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++; /*この文不要*/
}
ort
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/0x10;
にしてみましたがだめです。
すいません
date=date/0x100;
で意図したとおりに動きました。
質問なのですが、
date=date/0x100;
と、
date=date
>>4;
は同じ意味ではないのですか?
わかりました
>>8 ということですね
ありがとうございました
少し疑問に思ったので下にあるプログラムを実行してみたのですが、
<<:>>の処理にかかった時間: 3.250000秒
*:/の処理にかかった時間: 28.765000秒
と、あきらかな違いがありました。
コンピューターにとっては<<>> */は同じ作業ではないようなのですが、
なぜなんでしょうか?
#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 結果が同じでも、同じ処理ではない。
疑問に思ったらアセンブラで出力させてみ。
シフトの方が実際にコンピュータが行なっている処理に近い。
だから効率の良いコードか生成される。
t*0x80000000からは、t*0x12345678と大して変わらない効率のコードしか生成されない。
#コンパイラの最適化によってもっとマシなコードを吐かせる事は可能かもしれないが
>>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 */
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にしたら直りました。
ちょっと亀ですが事後報告です。
静的メンバの初期化の件ですが、
>>611を参考にして以下のようにしました
ヘッダ部
class Ini;
class aClass {
static int anArray[××];
static .........
static void staticInit(){ 初期化コード;}
friend Ini;
};
実装部
class Ini{
public:
Ini(){aClass::staticInit();}
};
static Ini ini;
クラス自身のコンストラクタみたいな機能があればこんな事しなくて済むのに・・・
というか、こんなコトしなきゃいけない漏れの設計が間違ってるんだなきっと_| ̄|○
イチから考え直します…
>>672 >>611みたいに IniはaClassの中で定義しちゃったほうが安全だし、
static IniもaClassのメンバにすべき。
aClassのスコープ外からIniが見えたら不味いでしょ。
あと、IniをaClassのfriendにするならstaticInit()自体Iniに持たせてもいいような気がする。
この辺は好みの問題だけど。
構造体の定義の仕方で教えてください。
あるライブラリのヘッダファイルを見ていたら、
下記の様に構造体の宣言がありました。
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;
687 :
デフォルトの名無しさん:04/05/18 15:21
>684
ありがとうございました
すみませんが。画像を90度回転させるプログラム教えてください。。。
Visual C++です!
>>688 というか、言語に依存する以前の問題じゃん。
ようはなーんにも知らないし知る気もないんだろ。
宿題スレにいくか、氏ね。
>>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 ライブラリの更新をちゃんと通知できる環境でないなら、
ソースのまま配布の方が安全。
但し、勝手にソースを変更する奴に注意。
>>695,696
ありがとうございます。参考にします。
ついでに、チームで開発するのに参考になるようなサイトとか書籍ってありますか?
エラー処理とかログを吐く処理とか新人さんにふって、
これも共通のLIBみたいなものにしようと思うのですが。
下記のような使い方に対する解決法を、教えていただきたいのですが...
class A
{
B b;
};
class B
{
friend A;
};
設計を見直す
>>697 新人に共通処理は書かせない方が身のため。
結局書かせた本人が全部書き直す羽目になりかねない。
共通処理が綺麗にできているプロジェクトを見ると、大抵巧くいっている。
逆に共通処理に癖があるプロジェクトは大抵火の車になる。
>>700 よく考えたら、仰るとおりですね。
いままで共通処理がいまいち(外注さんがつくった)だったので、新プロジェクトでは
基本的な部品から見直そうと思ってるのですが、参考になるものがなく
苦戦してます。
>>698 class A;
class B
{
friend A;
};
class A
{
B b;
};
>>702 それぞれ別ヘッダだと、エラーになってしまうのですが、
そういう場合はどうすればいいのでしょうか?
自分としては、親ウィンドウ(classA)、子ウィンドウ(classB)として、
メニュー等は親ウィンドウ、描画等は子ウィンドウでそれぞれ管理したいのですが、
こういった場合、classBは自メンバーに対する外部用のアクセスメソッドを
必要な分だけ用意すべきなのでしょうか?
(メンバーをpublicにするというのは除いて)
>>703 >それぞれ別ヘッダだと、エラーになってしまうのですが、
それは多分ヘッダファイルが適切にインクルードされていないから。
>こういった場合、classBは自メンバーに対する外部用のアクセスメソッドを
>必要な分だけ用意すべきなのでしょうか?
外部からアクセスする必要があるものは当然そうする。
しかし、描画処理がclassBの中で完結するようにできれば、外部からのアクセスは
ごく限られたものになるはず。
>>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 >座標を用意して、何か物体を座標上を動かしたりする
それは環境依存と思われるので、
標準 C の勉強だけではいつまでたっても扱えないでしょう。
というか、private継承にするだけで
>>706の要求は満たせるような気がする。
>>713 入口に立つのは簡単だけど、極めるのは大変と。
まぁ、なんでもそうだな。
というか、
>>706が実際のところ何を要求しているのかさっぱり判らんのだけど。
んなもん、質問の趣旨を推測して回答してもどうにもならんと思うのだが。
何をしたいのか具体的に書け。
>>706
>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 構造体ですか・・・
ちょっと調べてみます。
皆さんの書き込みも参考にします。
どうもありがとうございました。
>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
まえから思ってるんだけど、趣味がプログラミングって人っているじゃん
あれってなに?マゾですか?って話よ
>趣味がプログラミング
趣味が小説書き
趣味が作曲
趣味が工作
...別に問題ない
プログラミングにしろ小説にしろ作曲にしろ工作にしろ、何か物を作るという点で共通している
なにかを創造するのは人間だけの特権だ。オナニーが趣味だなんて言ってる奴はサルだな
趣味がマゾって人もいるだろうな。
仕事がマゾの人もいるし。
751 :
デフォルトの名無しさん:04/05/22 01:13
漏れは一応プログラマだが、同僚で趣味がプログラミングって
奴そういないよ。会社で散々やってるのになにが悲しくて家で・・・
752 :
デフォルトの名無しさん:04/05/22 01:16
n*nの行列の2つの行列をかけあわせるプログラムをつくり、これを用いてA^2^mを計算するプログラムをつくれ
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]がクラス化するのは無理って叱られるんでないのかな
そうそう、一時オブジェクト作りたいなら std::string("dir").length() ね。
レスありがとうございます。一応VCでは正常に動きます。
char *とstringを頻繁に交換しているので、なるべくstringに統一したかったのですが、
stringとstring.hのように重複するようなライブラリ使うと太ったりとかはありませんか?
VCでやってるのですがgccで動かないとかなると痛いので、標準的な使い方が知りたいです。
>770
> stringとstring.hのように重複するようなライブラリ使うと太ったりとかはありませんか?
太るって、何がどうなることを指してるんだ?
分かりにくくてすいません。
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 すいません。勘違いしてました。スルーしてください。
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
>>782 こんなこと出来たんだ
scanfすげー
正規表現できたら神だな
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); は 警告 が出てしまいます)?
むしろ、sqrtの値がおかしいような木がしてきました
>>789 なんでintをboolに代入してんだ?
何がしたいのかよく分からんが A xor B を1行で書くなら
A ^ B
でいいだろ。
環境はWindowsXP、MicrosoftVisualC++です。
人の名前は数人分をあらかじめソースの中に入れておき、その中から選択して年と月を入力すると
その月から2か月分のサインカーブが表示するようにしたいのです。
>>788 thetaはラジアンなのかディグリーなのか?
実数を(int)にキャストする際は、切り捨てられる範囲の値が重要でないかをチェック。
単に描画関数に渡すためだけのキャストなら、計算用の変数は実数で持っておいて渡す時にキャスト。
よくみたら!(int)だからboolなのか。
>>792 ありがとうございます。
半分理解できませんが、本とネットと睨めっこして翻訳してみます。
>>795 bound関数以外はCマガの中の人のものなので・・・。
θはラジアン…と思っていましたが、
main関数とか処理を見てみるとラジアンに変換しているし、
勘違いが原因なのかもしれませんね。
ウィンドウ処理は良く分からないので、ぐぐって調べてみますが
処理を変更したら上手くいくかもしれないので 試してます
>>786 >782の場合、普通は"%[a-z ]"と書く。
ついでに言えば、空白以外の文字列と言う意味で"%[^ ]"とか
csvの読み込みでカラム数が決め打ちで良ければ"%[^,],%[^,]"なども使える。
#但し、後者の例では','の連続や'"'で囲うフォーマットには対応できないので注意。
>>785 1行読み込んで
数値の直前の空白文字をstrrchr()で探して、その前後で名前と数値に分けろ
>>785 まずwhile()はどこからどこまでを繰り返すのか分かれ
>>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.
>>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 とか読めよ
スマソ
ヘタレが出過ぎた真似した
>>785 >>792のソースは
・一行が256文字以上だとダメ
・ctype.hインクルードし忘れた
から気をつけましょう。
812 :
デフォルトの名無しさん:04/05/23 18:53
>>812 >MSYS のインストールで、MinGWにmake.exeがないと言われます。
これは正常。
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
>818 固まるってなによ?
>printf("合計%7d点\n平均は%5lf点\n",sum,sum/i);
書式指定と変数があってない
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を用いてエクスプローラのようなリスト表示ができません。
どのパーツをどういう構成で仕上げればよいのか、教えてください。
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 宿題は宿題スレへ。
自分でも理解できないことを書いているのがミエミエ。
>数値入力を求める
日本語として破綻してます。
マニュアル嫁
845 :
デフォルトの名無しさん:04/05/27 07:38
趣味でってw
家でまでもやりたくないだろ普通
オタクですか?
プログラマーでもない限り、家以外でプログラミングしてるほうがキチガイ。
電車の中でハンドアセンブルでもしていろと?
>831
>技術本読むためにプログラム覚えてるんじゃないだろ。
>プログラムで何がしたいかがあるから本読んでるんじゃないの?
>836
>覚えるのが目的であって、実際に活用する事は思いつきもしない
>837
その辺が趣味の趣味たる所以だが、
↑
↓
>845
>家でまでもやりたくないだろ普通
↑
↓
>846
>電車の中でハンドアセンブルでもしていろと?
... >847 にはげどう(w
Cを勉強し始めて2ヶ月の初心者です
質問させてください
ビット処理の勉強の優先度って高いのでしょうか低いのでしょうか?
なにと比べてとかそのへんの基準の設定もお任せします
私のあふぉな頭では難しくて爆発(ry
よろしくお願いします(´・ェ・`)
すみません
説明不足でした
ビット処理の勉強というのは
ビット演算(論理和、論理積、左右シフト
ビットフィールド・・・
フラグのオン/オフ?!
符号拡張(??)
などなどです
勉強は必須。そんだけw
>>849 851の言う通りだと思う。
ビット処理がすぐにでも必要(理解したい)と思うのなら優先度は高いはず。
そういうのがあるって覚えておけば
必要になったときに使うと思う
ってか、そんなに面倒なものか?
一日あれば覚えられるやん。
>>853 禿げ堂
>>854 まぁ、そうだけど最初の頃はそのへんが泥臭い感じでとっつき難いのも分からんでもないじゃん。
>>849 俺が思いあたるビット操作がどうしても必要な場合って、例えば、CPUのポートたたくときとか
人のソースいじるときでビット操作が出てきちゃったときとかそんな感じだ。
後から覚えても良いと思うけど。
ビット演算は普通に使うでしょ。
つい先日、新人君がMFCでチェックボタンの真理値を数個分intに詰め込もうとしやがった。
それで私にビット操作の方法を聞きに来たわけだが、当然設計しなおしさせた。
VC6のMFCポトペタでアーカイバ作りたいのですが、ワークシート(プロジェクト?)
というのでしょうか? ウィザードで何を選べばいいのでしょうか?
>>837 個人的な事で申し訳ないが
正直VBよりCやC++の方が色んな面で簡単だと思う。
ぶっちゃけVBはアイコンペタペタ、手書きコード少量のイメージがあるが
実際にはVBは無駄にコード多いよ、、
【初心者歓迎】C/C++室 Ver.6【環境依存OK】
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' がシンタックスエラーを起こしました。
といわれます。
たびたびすいません。
できました。
acpp---------------------------
#include "a.h"
ここを勘違いしてました。
>>875 いや、スマソ、オレがタイポしてら。
当然、a.cpp b.cpp ともに a.h b.hの両方をインクルードすると。
あと、class bが b::fugaの引数としてしかclass aを参照しないなら、
a::hogeはb型のままでヲケなはず。
バグだろ、どうして判定されているのかを知りたければトレース汁
デバッガ持ってないのです。
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で未定義
はぁ?
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へのレスだと思ってた。
MAINMENU MENU DISCARDABLE
MAINMENUを好きに書き換える。
VC6のIDEを使っているのなら、ツリービューから変更したいメニューを選択してF2
>>895 すでにMENUというmenuIDがついているように見えるが。
>>891 すまん、指摘のとおり、超えるは誤りで以上が正しい。
つか、そんな鬼の首をとったようにつっこまんでもいいじゃない。
>>898 まぁ、32がどうなるかってのが問題だったからねぇ。
プログラマはそのくらいは意識してなきゃダメでしょ。
いや意識も必要だし、指摘も大いに結構だと思うが。
わざわざ7行も費やする話か ?
> 左オペランドの型のビット数<del>を超える</del><ins>以上の</ins>シフトは未定義です。
> の間違いだろ ?
で、済む話だと思うが。
リソースエディタで、
「!ほかのエディタで開く」になってしまって開くことができなくなったのですが、どうやったら解除できるのでしょうか?
すれ違い
>>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)と等価
>>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
*/
これからするとコマンドライン引数はどの領域でもないような気がしますが
どこの領域に確保されているのでしょうか?
上の実行結果で静的領域は間違えです
気にしないでください
>>910 どこかに。
割と見る実装ではヒープに確保してるけど。
質問文に、また訂正箇所発見しました
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で使えるかやってみればいいじゃん」
は、今(会社にいる)思いつきました…。
すみません。よろしくお願いいたします。
916 :
デフォルトの名無しさん:04/05/31 14:11
>>900 アプリケーション側の管理する領域ではない、とは思いつかないのか?
アンカーは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 で違うだろうし、という。
素人に毛が生えた程度の俺はそんな風に思う。
>>915 ありがとうございます。
>つか、聞く前にやってみろよ、ホントに。
この言葉も含めて、本当にありがとうございます。
頑張って勉強・実践します。
923 :
デフォルトの名無しさん:04/05/31 15:44
924 :
デフォルトの名無しさん:04/05/31 18:00
すいませんすごい初心者なんですが
5個整数入力して最小値と最大値求める
のって変数最低いくつでできますか?(配列までいってません)
3つ。
int i, max, min;
4つか。ユーザ入力を受け取る変数が必要だ。
928 :
デフォルトの名無しさん:04/05/31 18:12
>>913 ヒープから確保する時って、頭の方から順番に取っていくもんでは*ない*んじゃなかったっけ?
空いてそうなところをえいって見当つけてとってくるんでしょ。
だとしたら、たかだか4kBくらい離れてても別におかしく無い気もする。
俺の言っていることがおかしいってことはあるかもしれんけどさ。
>>929 そういうことなんですね
納得しました
その辺はOSが管理しているのでC言語だけじゃわからないってことですよね
プログラムを作っている環境は
WindowsXP Home
MS-VC++6.0
です。
MS-VC++6.0を使っててコンパイラを聞かれたらなんて答えればいいのでしょうか?
VC++6.0と答えればいいのでは?
>>931 そう答えればよかったんですね
>>932 お金を出してお店で買いました
あなたと一緒にしないでください
ネタにマジレス(略
ってか、まぁ、おまえ人間関係で失敗することが多いだろう、と
むしろ失敗してることすら意識しないか。