【初心者歓迎】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でのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か に置換すると見栄えだけはよくなります。
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:180728デフォルトの名無しさん
2010/05/04(火) 17:06:550729デフォルトの名無しさん
2010/05/04(火) 21:49:29スマポなんて,絶対つかっちゃだめ
0730デフォルトの名無しさん
2010/05/04(火) 21:54:390731デフォルトの名無しさん
2010/05/04(火) 22:05:24しないなら状況に最適化されたスマポを自作
カプセル化された環境で管理しきれるなら生ポ
0732デフォルトの名無しさん
2010/05/04(火) 22:07:01デストラクタで廃棄
0733急にごめんなさい。。。
2010/05/04(火) 22:10:50構造体を使い、メンバー変数に氏名、所属コース、出身高校を持つものを作成し
キーボードからこれらの変数を入力し、出力するプログラムを作成しなさい。
という実習課題がでたのですが自分が作成したプログラムでは
セグメンテーション違反です
と表示されるばかりで。。。
教えてください。どこがおかしいのでしょうか?
#include<stdio.h>
struct profile{
char *Name;
char *Course;
char *Koukou;
};
int main(void){
struct profile seito1 ;
printf("氏名を入力してください。\n");
scanf("%s",&seito1.Name);
printf("所属コースを入力してください。\n");
scanf("%s",&seito1.Course);
printf("出身高校を入力してください。\n");
scanf("%s",&seito1.Koukou);
printf("氏名:%s\n",seito1.Name);
printf("所属コース:%s\n",seito1.Course);
printf("出身高校:%s\n",seito1.Koukou);
return 0;
}
0734デフォルトの名無しさん
2010/05/04(火) 22:17:130735デフォルトの名無しさん
2010/05/04(火) 22:17:540736急にごめんなさい。。。
2010/05/04(火) 22:19:56セグメンテーション違反です。と表示されます。。。
どこを変えればいいんでしょうか?
0737デフォルトの名無しさん
2010/05/04(火) 22:20:21char Name[100]; //保存場所が無い。
scanf("%s",seito1.Name) //配列はポインタとして使える
0738デフォルトの名無しさん
2010/05/04(火) 22:22:58入力された文字列のデータはどこに格納してるつもりだい
0739急にごめんなさい。。。
2010/05/04(火) 22:26:27できました!!!ありがとうございます。
0740デフォルトの名無しさん
2010/05/04(火) 22:27:45リアルゆとりにそんなこというなよ
>>733は低脳日本人が生み出した超すごい世代なんだから
>>733 ゆとりだから質問するスレが分らないのはしょうがないけど、普通は
http://pc12.2ch.net/test/read.cgi/tech/1269438098/l50
で宿題関連は質問する。次回からそこで質問汁
0741デフォルトの名無しさん
2010/05/05(水) 01:01:51下記のようにすると、ビルドは成功するのですが
実行時に"The variable 't' is being used without being defined"
というエラーメッセージが出ます。
関数test(t)で*tに文字列を入れるにはどうしたらいいでしょうか。
教えてください。
int main(int argc, char *argv[])
{
char *t;
test(t);
cout << t << endl;
return EXIT_SUCCESS;
}
void test(char *t)
{
t = new char[100];
int i = 0;
cout << "step1" << endl;
t[i++] = 'a';
t[i++] = '\0';
}
0742741
2010/05/05(水) 01:09:57で質問しました。
0743デフォルトの名無しさん
2010/05/05(水) 01:18:04void test(char *t)
これはポインタを値渡ししてるからポインタを引数で返すことはできない
ポインタを返すにはポインタのポインタ
void test(char **t)
にしなければならない
後は自分で治して
0744デフォルトの名無しさん
2010/05/05(水) 01:31:13int main(int argc, char *argv[])
{
char *t;
test(t);
cout << t << endl;
return EXIT_SUCCESS;
}
void test(char *&t)
{
t = new char[100];
int i = 0;
cout << "step1" << endl;
t[i++] = 'a';
t[i++] = '\0';
}
0745デフォルトの名無しさん
2010/05/05(水) 01:32:30つ void test(char* &t)
0746デフォルトの名無しさん
2010/05/05(水) 01:34:56ポンタポンタ版もよろ
0747デフォルトの名無しさん
2010/05/05(水) 01:56:40int main(int argc, char *argv[])
{
char *t;
test(&t);
cout << t << endl;
return EXIT_SUCCESS;
}
void test(char **t)
{
*t = new char[100];
int i = 0;
cout << "step1" << endl;
(*t)[i++] = 'a';
(*t)[i++] = '\0';
}
0748741
2010/05/05(水) 02:04:30アドレス版(*&t)とポインタポインタ版(**t)共に
ビルドと実行がうまくいきました。
本当にありがとうございました。
いと難しいこと限りなし
0749デフォルトの名無しさん
2010/05/05(水) 03:42:08実装が↓みたいな感じで
かなり定型的で面倒なのですが,
こういうものなのでしょうか.
というより,もっと簡便な方法があったりするでしょうか?
char dst[256];
memset( dst, 0, sizeof( dst ) );
strncpy( dst, src, sizeof( dst ) / sizeof( char ) - 1 );
0750デフォルトの名無しさん
2010/05/05(水) 04:00:42char dst[256];
int len = strlen(src);
if (len >= sizeof(dst)) {
len = sizeof(dst) - 1;
}
memcpy(dst, src, len);
dst[len] = '\0';
か、
こうする
sprintf(dst, "%.*s", sizeof(dst)-1, src));
0751デフォルトの名無しさん
2010/05/05(水) 04:02:20マクロ使うぐらいじゃないかなぁ。 あとそのコードだとmemsetはいらないと思うけど。
Better CとしてのC++に移行するとちょっと楽になるよ。
0752デフォルトの名無しさん
2010/05/05(水) 04:11:46あとmemsetはdstの最後に終端文字を付けてるんですね.
0753デフォルトの名無しさん
2010/05/05(水) 04:18:390754デフォルトの名無しさん
2010/05/05(水) 07:05:54「定型的」ってことは、文字列を入れる配列は「とりあえず0クリア」
みたいに思ってるのかね。
文字列の後ろはゴミを入れたままでいいよ。
0755デフォルトの名無しさん
2010/05/05(水) 07:53:56他のメンバがあったりしてコンストラクタから例外が飛ぶと漏れることがあるから気をつけろよ。
0756デフォルトの名無しさん
2010/05/05(水) 08:55:01{
//初期化メンバ関数
this->init(hWnd, tyui, width, height);
}
C++の勉強をしていたのですが、とあるソースのコンストラクタの中に以上のような記述がありました
クラスの中で、コンストラクタとは別に初期化用関数を作るメリットなどがありましたら教えて頂きたいです
0757デフォルトの名無しさん
2010/05/05(水) 09:12:25コンストラクタ以外でも init() を使える
0758デフォルトの名無しさん
2010/05/05(水) 09:13:54引数違いのコンストラクタが複数ある場合には必須だとか
デフォルトコンストラクタを定義したいとか
色々あるだろうけど、this->厨は爆発すればいいと思う。
0759デフォルトの名無しさん
2010/05/05(水) 09:27:12参考になりました。ありがとうございます。
ちなみに「this->」は何が問題なのでしょうか・・・?
0760デフォルトの名無しさん
2010/05/05(水) 09:34:170761デフォルトの名無しさん
2010/05/05(水) 10:49:16とりあえず0クリアがコーディング規約になってる場合もあるからなあ
でも char dst[256] = ""; だけで0クリアできるんだけどね
配列の初期化では、初期化を行っている場合、値の指定されていない要素は0で初期化される
(明示的に初期化していない場合は実際に何も初期化されないので、とりあえず何かで初期化する必要はある)
0762デフォルトの名無しさん
2010/05/05(水) 10:52:16純粋にキモい
0763デフォルトの名無しさん
2010/05/05(水) 12:42:39でも例えばその文字配列を丸ごとどこかファイルに永続化するような場合には、
予めそこにゴミが残ってる事もわかった上で使わないといけない
気にするべきポイントなんてそんなもん
0764デフォルトの名無しさん
2010/05/05(水) 12:53:34今やってるのは
・keyの長さ(4 byte)
・valueの長さ(4 byte)
・key (x byte)
・value (y byte)
を1つのデータと見て
データの長さを読む→keyとvalueを読む→次のデータの長さを読む→・・・
といった感じで先頭から繰り返して欲しいkeyに対応するvalueをメモリに読み込みます
ですがこれだと死ぬほど遅いので効率をよくしたいです
なにか典型的な解決方法とかってありますか?
0765デフォルトの名無しさん
2010/05/05(水) 12:58:42ってか.
■ このスレッドは過去ログ倉庫に格納されています