【初心者歓迎】C/C++室 Ver.72【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2010/03/05(金) 16:51:13ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.71【環境依存OK】
http://pc12.2ch.net/test/read.cgi/tech/1264774545/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
http://codepad.org/ (コンパイルもできるし出力結果も得られるのでお勧め)
◆ソースのインデントについて
半角空白やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か に置換すると見栄えだけはよくなります。
0629デフォルトの名無しさん
2010/05/01(土) 22:58:06double avg(int *pt);
int main(void){
int test[5];
double ans;
printf("5人のテストの点数を入力してください。\n");
for(int i=0; i<5; i++){
scanf("%d", &test[i]);
}
ans = avg(test);
printf("平均点は%lf点です。\n", ans);
return 0;
}
double avg(int *pt){
double sum = 0.0;;
for(int i=0; i<5; i++){
sum += pt[i];
}
return sum/5;
}
平均を出すプログラムなのですがどこが間違ってますか?
平均点が0.0点担ってしまいます
0630デフォルトの名無しさん
2010/05/01(土) 23:05:14静的に確保されるメモリ領域の宣言は、「どのくらいの量を確保するのか」 決まっていないと確保のしようがない。
変数の値は動的に変わるので、そのような動的な線形リストを使いたい場合には、別途 std::vector などに頼るか、
あるいはストレートに malloc などでメモリ領域を確保しないといけない。
Perlなどのより高級言語の世界では、この辺の「メモリ空間の割り当て」などが人間向けに隠されているので
多分使っていても意識はしてなかったと思うけど、C/C++ の世界ではメモリの管理は自分でする。 あるいは、他人がした物を利用する必要がある。
お前さんは今、Perlとかの世界よりも、もっとCPUやメモリに近い所に立っているんだよ。
>>629
× int test[5];
○ double test[5];
0631デフォルトの名無しさん
2010/05/01(土) 23:07:520632デフォルトの名無しさん
2010/05/01(土) 23:08:37vc2008eeで試したが、ちゃんと平均出たぞ?
0634デフォルトの名無しさん
2010/05/01(土) 23:13:15それによって実行ファイルが環境に依存することはありえる
まあそんな処理系知らないけど
0635デフォルトの名無しさん
2010/05/01(土) 23:57:58>>632
なぜなんでしょうね…mingwというコンパイラを使ってるんですが、0.000000点と表示されてしまうんです
0636デフォルトの名無しさん
2010/05/02(日) 00:12:01%llfにしていたのが原因でした
0637デフォルトの名無しさん
2010/05/02(日) 00:12:24すみません、自己解決しました
%lfにしていたのが原因でした
0638デフォルトの名無しさん
2010/05/02(日) 00:15:530639デフォルトの名無しさん
2010/05/02(日) 00:19:59C++なら可変長配列にはvectorを使う。この辺はC++の方が簡単だからC++を勧めるよ。
#include<vector>
void func()
{
int n=10;
std::vector<int> a(n); //intの配列
a[3]=100;
int g=a[7];
}
0640デフォルトの名無しさん
2010/05/02(日) 00:48:45http://www.kijineko.co.jp/tech/superstitions/printf-format-for-double.html
0641デフォルトの名無しさん
2010/05/02(日) 01:38:290642デフォルトの名無しさん
2010/05/02(日) 07:45:33ifdefで自動的に切り替えられるようにしたいのですが
GCC、VC++特有のdefineで定義されている定数はありませんか?
0643デフォルトの名無しさん
2010/05/02(日) 07:52:25#include <string.h>
int main(void){
char str0[20];
char str1[20];
char str2[20];
strcpy(str1, "Hello");
strcpy(str2, "Goodday");
strcat(str0, str1);
strcat(str0, str2);
printf("str1の文字は%sです。\n", str1);
printf("str2の文字は%sです。\n", str2);
printf("str0の文字は%sです。\n", str0);
printf("str0の文字数は%dです。\n", strlen(str0));
return 0;
}
なぜかstr0の前に文字化けみたいなのがついて文字数もおかしくなります。
どうすればいいでしょうか?
0644デフォルトの名無しさん
2010/05/02(日) 07:52:40http://www.sra.co.jp/wingnut/gcc/cpp-j.html#Predefined
0645デフォルトの名無しさん
2010/05/02(日) 07:56:22strcpy(str1, "Hello");
strcpy(str2, "Goodday");
str0[0]='\0'; // ← これ
strcat(str0, str1);
strcat(str0, str2);
str0 の領域をゼロレングス文字列にしてから、strcat
0646デフォルトの名無しさん
2010/05/02(日) 08:03:17ありがとうございます。動きました。
0647デフォルトの名無しさん
2010/05/02(日) 08:03:26strcatは0を探して、そこから文字列を連結するってのは分かってるよな?
これを実行してみればいい。
#include <stdio.h>
#include <string.h>
int main(void){
int i;
char str0[20];
for (i = 0; i < 20; i++) {
printf("str0[%d] の中身は %d です。\n", i, str0[i]);
}
return 0;
}
0649デフォルトの名無しさん
2010/05/02(日) 08:08:331.単に char str0[20]; としただけじゃメモリ領域が確保されただけなので、
そこには既に何かの値が残っているかもしれない
2.printf や strlen など、「ここからここまでを文字列とみなす」 処理は、ASCIIコード 0x00 を終端として見ている
3.1と2から、中身をクリアしていない str0 を渡したらどうなるかは誰にもわからない
なので、先に 0x00 を置いて「空っぽの文字列」を表した。 と、言う事
str0[0]='\0'; とする代わりに strcpy(str0, ""); でもいいよ
0650デフォルトの名無しさん
2010/05/02(日) 08:09:13\0がなかったのが原因なんですね。
ところでこの滅茶苦茶な値はどっからきたんでしょうか?
0651デフォルトの名無しさん
2010/05/02(日) 08:17:13>>649 を見ろ。どこから来たんじゃなくて、既にあった何かだよ
メモリは有限なので常に再利用されてるだけ
0652デフォルトの名無しさん
2010/05/02(日) 08:19:00すみません、すぐ前の書き込みだったので見ずに投稿してしまいました。
ありがとうございました。
0653デフォルトの名無しさん
2010/05/02(日) 10:21:44「再利用を繰り返すことで、本来見えない部分を見ようとする」攻撃手法もあるので
それを見越してゼロクリアするようになってる環境もあったりする
0654デフォルトの名無しさん
2010/05/02(日) 10:43:21だいぶ間が開いてるけど指摘がないので。
>char foo[] = "XYZ"; // その2:char 配"列の先頭"の、アドレスを渡している
これ初期化だからアドレスを渡しているわけではない。
char foo[]={'X',Y'',Z'','\0'};
のシンタックスシュガーになっているだけ。
>char *bar = foo; // その3:その2の配"列の先頭のアドレス"を、コピーしてから渡している
これも微妙な表現。日本語で書くと以下のような感じ。
「配列fooの先頭要素をさすポインタを代入」
char *bar = &foo[0];
のシンタックスシュガーになっている。
0655デフォルトの名無しさん
2010/05/02(日) 10:52:110656デフォルトの名無しさん
2010/05/02(日) 11:19:12指摘が無いのは、話の流れ上じゃね。論点の違いというか。
・・・ただまぁ、横から見ただけの初心者がそのレスだけみたら誤解するかもしれないから
安価つけて補足や指摘しておくのはいいことだと思うけど
0657デフォルトの名無しさん
2010/05/02(日) 11:20:27"普通の"ってのが何なのか分からないけど
ただの計算関数とかならnamespace
オブジェクトに属するならclass
0659デフォルトの名無しさん
2010/05/02(日) 17:55:38char a[2] = "XY";
printf("%p ", a); //アドレスが表示される
printf("%c ", *a); //要素そのものを表示させる時は間接参照演算子をつける
ここまでは理解できるんですが
printf("%c ", *a[0]);
↑では正しくはa[0]と書くそうですが、なぜですか?
今までの流れだと*のついてないa[0]は配列aの先頭要素を表すポインタを表しそうなんですが…
実際には要素を現すみたいです。
0660デフォルトの名無しさん
2010/05/02(日) 17:59:250661デフォルトの名無しさん
2010/05/02(日) 18:11:26a[0]なら先頭の要素
a[1]なら2番目の要素
0662デフォルトの名無しさん
2010/05/02(日) 18:23:56>配列のポインタは、先頭の要素のアドレスが入るんですよね?
確実に勘違いしているが、どう勘違いしているのかよくわからない。
「配列のポインタ」が何を指しているのかが不明。
1)式の中で配列名のみを書くと、その配列の先頭要素を指すポインタとして評価される。
※例外は&,sizeofのオペランドと、char配列の初期化子として文字列を記述した場合。
2)
char *aStr[10]; // charポインタの配列
3)
char (pArray)[10]; // char配列を指すポインタ
>661
何を言っているかさっぱりわからない。>660をよく読むこと。
0663デフォルトの名無しさん
2010/05/02(日) 19:53:210664デフォルトの名無しさん
2010/05/02(日) 20:00:490665デフォルトの名無しさん
2010/05/02(日) 21:56:14関数Aに渡すデータは完全に別物
って場合は、スレッドセーフなの?
0666デフォルトの名無しさん
2010/05/02(日) 22:01:17いいえ
0667デフォルトの名無しさん
2010/05/02(日) 22:05:19それに加えて、関数内でstatic変数とかglobal変数とかを使っていないという縛りが入るな。
0668デフォルトの名無しさん
2010/05/02(日) 22:27:420669デフォルトの名無しさん
2010/05/02(日) 22:41:530670デフォルトの名無しさん
2010/05/02(日) 23:40:330672デフォルトの名無しさん
2010/05/03(月) 13:04:33お前らはどうしていますか?
0673デフォルトの名無しさん
2010/05/03(月) 13:06:30class fuga { int value_; };
class piyo { int value; void func(void) { this->value; } };
0674デフォルトの名無しさん
2010/05/03(月) 13:09:51単純な構造体は除くが
0675デフォルトの名無しさん
2010/05/03(月) 13:10:27int mVariable; メンバー
int aVariable; 自動変数
int cVariable; 定数
int rVariable; 参照
0676デフォルトの名無しさん
2010/05/03(月) 13:12:140677デフォルトの名無しさん
2010/05/03(月) 13:16:54引数は?
自動変数のconst参照は?
static constメンバは?
0678672
2010/05/03(月) 13:22:46ありがとうございます
0679デフォルトの名無しさん
2010/05/03(月) 14:24:390680デフォルトの名無しさん
2010/05/03(月) 20:24:57{
class Hoge;
}
ヘッダファイルにこれしか書いていないんですけど、何がしたいんですか?
0681デフォルトの名無しさん
2010/05/03(月) 20:27:540682デフォルトの名無しさん
2010/05/03(月) 20:39:290684デフォルトの名無しさん
2010/05/04(火) 09:57:42思いつく限りで↓
int* pVar[10];
int* pTblVar[10];
int* ppVar[10];
int* pVarTbl[10];
int* TblPVar[10];
0685デフォルトの名無しさん
2010/05/04(火) 10:08:100686デフォルトの名無しさん
2010/05/04(火) 11:37:52特別分かりやすくなるわけでもない
そんなの気にして命名しなくてもいいよ
0687デフォルトの名無しさん
2010/05/04(火) 12:18:070688デフォルトの名無しさん
2010/05/04(火) 12:20:58テキストエディタで作業する時は地味に頼りにする
0689デフォルトの名無しさん
2010/05/04(火) 12:23:160690デフォルトの名無しさん
2010/05/04(火) 12:25:480691デフォルトの名無しさん
2010/05/04(火) 12:28:040692デフォルトの名無しさん
2010/05/04(火) 12:30:50とか言ってシステムハンガリアンになりそうだな
0693デフォルトの名無しさん
2010/05/04(火) 12:33:40これってポインタかそうでないか
0694デフォルトの名無しさん
2010/05/04(火) 12:35:35com とか全部に p 付けるのはめんどくさい
0695デフォルトの名無しさん
2010/05/04(火) 12:38:29名前に書かれてるとわかりやすいですネ
0696デフォルトの名無しさん
2010/05/04(火) 12:39:30現役だったりするの?
0697デフォルトの名無しさん
2010/05/04(火) 12:40:19std::vector<CComPtr<IDirect3DTexture9>> textures;
これをpTexture、pTextureArrayとかにするのは嫌だ
0698デフォルトの名無しさん
2010/05/04(火) 12:49:14イニシャライザリストでもNULLに初期化かどうかで迷うし
0699デフォルトの名無しさん
2010/05/04(火) 12:53:19あとは特にprivate空間でとか割りと気楽に付けられる変数名は臨機応変。
0700デフォルトの名無しさん
2010/05/04(火) 12:56:40emacs使いだけどpなんてつけないな。
ポインタかどうかに限らず、初期化リストで値突っ込むときは型見るだろ。
0701デフォルトの名無しさん
2010/05/04(火) 12:57:010702デフォルトの名無しさん
2010/05/04(火) 12:58:450703デフォルトの名無しさん
2010/05/04(火) 13:01:320704デフォルトの名無しさん
2010/05/04(火) 13:05:080705デフォルトの名無しさん
2010/05/04(火) 13:08:010706デフォルトの名無しさん
2010/05/04(火) 13:12:400707デフォルトの名無しさん
2010/05/04(火) 13:44:120708デフォルトの名無しさん
2010/05/04(火) 15:12:22出力先の配列サイズをチェックしない関数で危険だから
safe関数使えって
0709デフォルトの名無しさん
2010/05/04(火) 15:17:15引数、ローカル変数、メンバ変数くらいしか確認する必要ないし
普通初めて使う変数の型くらい確認するだろ
>>693>>694
ATL使えでFA
スマポなしでプログラムしてるのが悪い
>>698
初期化リストに突っ込むときは基本的に変数を作る時だから
自分で型分かってるだろ
0710デフォルトの名無しさん
2010/05/04(火) 15:26:42>普通初めて使う変数の型くらい確認するだろ
だから、初めて使う時以外、その変数は使わないのかってww
全部型覚えとくの?それとも使うたびに毎回確認するの?p って付いてるだけで一手間減るなら別にいいじゃない
0711デフォルトの名無しさん
2010/05/04(火) 15:30:45型も分からない変数を扱おうとする人の気が知れない
0712デフォルトの名無しさん
2010/05/04(火) 15:34:13C++でポインタ使うのはライブラリの中だけだし
0713デフォルトの名無しさん
2010/05/04(火) 15:35:42関数の定義を見なくても引数のどれがポインタなのか分かるように関数名を修飾してるのか?
そもそもポインタかどうか以外にも確認すべき事はあるんじゃないか?
ポインタかどうかだけ分かっても仕方が無いんじゃないか?
ポインタ止めて参照にした時変数名変えるのか?
ってこと
0714デフォルトの名無しさん
2010/05/04(火) 15:36:47そう考えたらIDEって便利だよな。 どれだけ適当でも行ける
0715デフォルトの名無しさん
2010/05/04(火) 15:38:150716デフォルトの名無しさん
2010/05/04(火) 15:40:10少なくともポインタ止めて参照に変えるようなケースなら
そのタイミングでむしろ変数名変えたっていいんじゃね?
とりあえずおちつけ
0717デフォルトの名無しさん
2010/05/04(火) 15:58:28・どうせ変数の型は使うときに確認する
・名前の変え忘れが多い(ポインタじゃないのにpつける、ポインタじゃなくなったのにpのまま)
っていう実務上の教訓から、うちの会社はpつけんな、っていうコーディング規約になってるよ。
特にインテリセンスに慣れた輩は、変数名の記述ミス、スペルミスがあっても平気で放置するしな。
0718デフォルトの名無しさん
2010/05/04(火) 16:02:27読むだけならヒントにはなるかもね〜程度に考えた方がいい
そして読むだけなら周辺をチラ見すりゃポインタかどうかの判断ぐらいすぐつく
0719デフォルトの名無しさん
2010/05/04(火) 16:05:46Hoge hoges[num];
Hoge *hoge = new Hoge();
Hoge *hoges = new Hoge[num];
shared_ptr<Hoge> hoge;
vector<shared_ptr<Hoge>> hoges;
p つけると配列なのかそうでないのかとか
変数名の命名に困る
0720デフォルトの名無しさん
2010/05/04(火) 16:09:54名前付ける時点で型がわからないかもしれないじゃん
そういう時はpの人はどうしてるの?
0721デフォルトの名無しさん
2010/05/04(火) 16:34:29C++で今時生ポは無いだろう。
0722デフォルトの名無しさん
2010/05/04(火) 16:36:270723デフォルトの名無しさん
2010/05/04(火) 16:40:140724デフォルトの名無しさん
2010/05/04(火) 17:00:23今のC++でも普通に生ポは使うだろう。
俺はshared_ptr愛用するけども。
0725デフォルトの名無しさん
2010/05/04(火) 17:03:130726デフォルトの名無しさん
2010/05/04(火) 17:03:260727デフォルトの名無しさん
2010/05/04(火) 17:04:18■ このスレッドは過去ログ倉庫に格納されています