トップページ⇒tech
1001コメント288KB

【初心者歓迎】C/C++室 Ver.95【環境依存OK】 [転載禁止]©5ch.io

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2015/02/14(土) 09:15:14.82ID:FDUkjNpd
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。

◆ソースのインデントについて
半角空白やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か に置換すると見栄えだけはよくなります。

【アップローダー】(質問が長い時はココ使うと便利)
http://codepad.org/ (コンパイルもできるし出力結果も得られる[]privateをチェック)
http://ideone.com/ (時間帯によってはcodepadが重い事があるのでここも利用)

前スレ
【初心者歓迎】C/C++室 Ver.94【環境依存OK】 [転載禁止]2ch.net
http://peace.2ch.net/test/read.cgi/tech/1417179292/
0153デフォルトの名無しさん2015/02/28(土) 11:03:43.60ID:yyMmVQQk
c++ってcでも書けるけどcとc++混ざったような書き方って一般的にどうなんだろうか?
0154デフォルトの名無しさん2015/02/28(土) 12:00:46.80ID:j5d61nKt
>>152
3つ数字入力させて、合計を表示してるのは分かるけど、これくらいなら、電卓とか、エクセルでやったはうが早くない?
0155デフォルトの名無しさん2015/02/28(土) 12:06:03.03ID:8paVhiek
>>153
ライブラリによる。GUIとか
オブジェクト指向かどうか
STLをつかうか
0156デフォルトの名無しさん2015/02/28(土) 12:29:41.22ID:C0E19LHH
>>153
やる必要があれば、それも可能なのがC++の利点
今でこそC++らしい書き方のほうが多くなったけれども
「better C」という、C言語風だけどC++の良いとこ取りもする、というスタイルは
昔はけっこうよく行われてたよ
0157デフォルトの名無しさん2015/02/28(土) 13:17:05.10ID:jpnAzhvw
iostreamのマニュピレータはどうしても慣れない
0158デフォルトの名無しさん2015/02/28(土) 13:22:59.63ID:pzuzIoSR
better Cは絶滅中
0159デフォルトの名無しさん2015/02/28(土) 13:33:07.23ID:3oOu8rEl
printf()ってすごいね
0160デフォルトの名無しさん2015/02/28(土) 13:37:26.92ID:0w0p4VdY
boost::formatをprintfみたいな感じで書けるテンプレート関数使ってるな
0161デフォルトの名無しさん2015/02/28(土) 14:13:05.54ID:nS9zO5v8
boost.formatビルドが重いねん
0162デフォルトの名無しさん2015/02/28(土) 14:38:37.66ID:9NkDqAQU
今時STLは無いな
0163デフォルトの名無しさん2015/02/28(土) 15:04:24.71ID:RGSE2jA1
数ヶ月かけてコツコツ自作のプログラムを作っているうちに、苦し紛れに即席で
使ったグローバル変数があっちこっちに
合計十数個出てきて、収集がつかなくしまいました。
グローバル変数を上手い具合に管理する方法有りますか?
グローバル変数を使うなという意見は勘弁して下さい。私の能力では使わずにはプログラム組めませんので。
よろしく。
0164デフォルトの名無しさん2015/02/28(土) 15:07:38.09ID:0lfA+oAx
まずは糞コテ付けろ
0165デフォルトの名無しさん2015/02/28(土) 15:08:19.96ID:VJzk6ZT6
クラスで包んで誰が所有、利用するかを明確にすべき
0166デフォルトの名無しさん2015/02/28(土) 15:20:13.40ID:RGSE2jA1
>>165
クラスも使っているんですが
幾つかのクラスの中ではstatic変数も
使っていて、それも混乱の一因です。
クラスの中でstatic変数使うのは駄目でしょうか。
0167デフォルトの名無しさん2015/02/28(土) 15:42:23.94ID:rkeHMBrB
外から見えなきゃグローバル変数static変数何個使おうが気にしないな
0168デフォルトの名無しさん2015/02/28(土) 15:49:56.35ID:RGSE2jA1
>>167
publicにしています。
0169デフォルトの名無しさん2015/02/28(土) 15:54:02.54ID:4l+NWV3B
単にグローバル変数とか言われてもアドバイスできる奴なんていないと思うが。
その場しのぎで追加するようなグローバル変数は実際は引数渡しで事足りる場合ばっかりだろうからそこを作り直せば数が減って収集がつくと思うよ。
0170デフォルトの名無しさん2015/02/28(土) 16:25:53.70ID:jpnAzhvw
>>163
とりあえずグローバル構造体かクラスにまとめて全量洗い出して取捨選択
0171片山博文MZ ◆T6xkBnTXz7B0 2015/02/28(土) 21:57:16.55ID:OFsucKZW
アライメントとビットフィールドの挙動不審で困ってる。
#include <pshpack1.h>
typedef struct {
int a : 8;
int b;
} X;
#include <poppack.h>
このとき、sizeof(X)==8になるが、
メンバーaをint a : 9;にするとsizeof(X)==6になる。
何でやねん! ビットを増やしたらサイズが減るのか!
0172デフォルトの名無しさん2015/02/28(土) 22:00:53.02ID:kDCn/ge4
>>163
いいきっかけだから他のプログラムでも使用できそうな機能は機能毎にしちゃう
0173デフォルトの名無しさん2015/02/28(土) 22:18:47.25ID:yyMmVQQk
一個パズル作ったんだがどんどん機能拡張していってもはや何のソフトか
分からなくなってきた。
そろそろクラスとかも覚えて使ってみたいし新たに1からつくるか・・
0174片山博文MZ ◆T6xkBnTXz7B0 2015/02/28(土) 22:30:33.27ID:OFsucKZW
>>171
これを馬鹿にもわかるように論理的に説明して下さい。
0175デフォルトの名無しさん2015/02/28(土) 22:36:30.21ID:TqhvQe1k
>>171
>>1も読めないバカは去れ
0176片山博文MZ ◆T6xkBnTXz7B0 2015/02/28(土) 22:38:52.76ID:OFsucKZW
環境はMinGWです。
0177デフォルトの名無しさん2015/02/28(土) 22:47:07.04ID:kDCn/ge4
>>176
VC++ 2010 EEで両方8になったんですが
0178片山博文MZ ◆T6xkBnTXz7B0 2015/02/28(土) 23:34:27.82ID:OFsucKZW
>>177
ありがとう。
VC++とGCCのABIの違いのため-mms-bitfieldsつけないとダメだと。
ビットフィールドのせいで一日つぶれた。。。
0179デフォルトの名無しさん2015/03/01(日) 13:55:28.56ID:YTVpAllV
やべぇ、継承でわからなくなった・・・Orz
public privert potected これわかりやすく
解説したサイト知りませんか?
0180デフォルトの名無しさん2015/03/01(日) 14:04:57.89ID:SZqmQTGe
public だれでもアクセスできる
private そのクラスだけアクセスできる
protected そのクラスと、派生クラスだけアクセスできる
0181デフォルトの名無しさん2015/03/01(日) 14:25:44.99ID:YTVpAllV
そういうことじゃなくて・・・orz
0182デフォルトの名無しさん2015/03/01(日) 14:33:42.98ID:VYwW9Vyn
「そういうことじゃなくて・・・orz」じゃねーよ
期待した解答と違うとおもったなら自分の質問にもっと具体的な補足をしろ
できねーなら死ね
0183デフォルトの名無しさん2015/03/01(日) 14:34:32.89ID:uDqKnlJ3
private 継承 元を全て private へ
protected 継承 元publicをprotectedへ 元protectedをprivateへ
public継承 元の状態を維持


だったっけか?
0184デフォルトの名無しさん2015/03/01(日) 14:45:45.97ID:5nggEOp/
>>182
0185デフォルトの名無しさん2015/03/01(日) 15:05:46.90ID:9nAO1Mr4
privateじゃなくてprivertだからな
そんなモン誰も知らねぇよ
0186デフォルトの名無しさん2015/03/01(日) 15:11:24.18ID:NOqABy0N
protected継承は割と新機能を車輪の使い回しで実装したい時に便利
0187デフォルトの名無しさん2015/03/01(日) 18:08:53.80ID:xHJpp+wq
自分のアクセスレベル以上のものを自分のアクセスレベルにする

public そのまま
protected publicだけprotectedへ
private 全部private
0188デフォルトの名無しさん2015/03/01(日) 23:34:19.53ID:VA+mmmdG
>>183-187はコミュ障
0189デフォルトの名無しさん2015/03/01(日) 23:47:53.89ID:NUTnmFf9
protected って本来は使うべきじゃないの?
メンバ変数は基本的に全てprivateにしてsetter getterを関数に書いて
派生クラスから基底クラスのメンバ変数を呼ぶときは全てsetter getterを通じて扱うのが本来のオブジェクト指向な気がするけどどうなんだろう
0190デフォルトの名無しさん2015/03/02(月) 00:05:32.07ID:XG6Dbdai
>>189
気にしないで、ガンガンPUBLIC使うべし。
いちいち代入のために関数作ってたら、生産性わろし

関数ひとつ追加するコストは、ドキュメントやテスト、IFの構成などの影響を考えると高くつく

学者のべき論と実戦は異なるのだよ
0191デフォルトの名無しさん2015/03/02(月) 00:09:11.15ID:hseo5gVd
>>189
お前アホか
本来のオブジェクト指向()とやらでは実現できない「実装の再利用」のために
friend/private継承/protected継承があるんだよ。
オブジェクト指向の考えに形式的に当てはめようとして
getter/setterにする方がクレイジー
0192デフォルトの名無しさん2015/03/02(月) 00:22:49.89ID:3n4sVnGf
>>191
そうなのか・・・
本とか一部サイトではsetter getterを通した方が値のチェックを行えて安全とかあるから混乱してたんよ
0193デフォルトの名無しさん2015/03/02(月) 00:29:21.36ID:fPhyyxiK
>メンバ変数を呼ぶときは全てsetter getterを通じて扱う

内部の変数へのアクセスを許すのは
オブジェクト指向の考えに反します
getterを作れば良いと言うものではありません
0194デフォルトの名無しさん2015/03/02(月) 00:51:01.27ID:/crQ+lAS
内部変数ありきで、内部変数の仕様から完成して、
それにあわせてgetter作ってたらオブジェクト指向じゃない
0195デフォルトの名無しさん2015/03/02(月) 00:57:41.76ID:g6u+STTf
折角privateにしてるのにsetterされたらそれもうprivateの意味無くね
0196デフォルトの名無しさん2015/03/02(月) 01:09:06.37ID:XG6Dbdai
>>195
それは、言語仕様の矛盾だよね。

でも現場ではpublicしか使わないから関係ないけどね(制御系とか金融のプロジェクトは知らないけど)
0197デフォルトの名無しさん2015/03/02(月) 01:12:04.73ID:/eLULHxy
だからと言って変数をpublicにしたらsetterにトリガ仕込んだり出来なくなるし
0198デフォルトの名無しさん2015/03/02(月) 03:22:53.77ID:Cc4ZXjAz
アクセッサ経由でしかアクセスしない親クラスなら、
そこから派生させるのではなくそのクラスのインスタンスを
メンバとして持てば十分でしょう。
その方が良いならそうすべきで、かつそのクラスを
テンプレート引数として汎用化できないかも考慮すべき。
0199デフォルトの名無しさん2015/03/02(月) 13:58:13.91ID:u4npGgFL
なに インヘリをうだうだ考えてると禿げになりますよ。
普通にクラスを作って楽しく使いましょう。
0200デフォルトの名無しさん2015/03/03(火) 10:05:19.01ID:k6QUuUZD
>>198
なかなか貴重で異常なご意見で
0201デフォルトの名無しさん2015/03/03(火) 22:53:35.90ID:E8cNZHFY
配列は、配列名でその配列の先頭アドレスが確保出来るということですが、
なぜ配列ではない関数も同じように関数名で先頭アドレス確保出来るのでしょうか?
関数名に「&」を付けるなら分かるのですが・・・

int i[5]={1,2,3,4,5};
int* pi = i; // OK

int i=1;
int* pi = &i // &が必要

******************* こっから下が分からない *******************

void kansuu(char* str){
 std::cout << str << "\n";
}

void (*po[])(char* str)={kansuu}; // なぜ&kansuuでなくてよい?
po[0]("なぜじゃ");
0202デフォルトの名無しさん2015/03/03(火) 23:02:49.41ID:HsY4gQ31
>>201
一種の例外だし、それを好まずそう書かない人々もいる
0203デフォルトの名無しさん2015/03/03(火) 23:41:13.44ID:E8cNZHFY
>>202
&をつけてもコンパイル通るんですね。例外了解です。
0204デフォルトの名無しさん2015/03/03(火) 23:48:42.41ID:aTqVdZca
>>201
&なしは関数オブジェクトと関数が同じ表記法になれる
テンプレートの場合では&をつけるわけにはいかない

そのため付けないのが主流となる
0205デフォルトの名無しさん2015/03/04(水) 02:08:06.64ID:7qqVQ1bq
>>201
そもそも配列も関数と同じで、&をつけてもつけなくても同じ扱い。
http://ideone.com/bYtnim
0206デフォルトの名無しさん2015/03/04(水) 09:35:28.98ID:/apgWJr2
呼び出すときも funcptr() と (*funcptr)() どっちもいけるよね
0207デフォルトの名無しさん2015/03/04(水) 09:40:16.23ID:HeTEjgTn
>>206
ANSI-C以降の話しね。ポータブルCとかK&Rは駄目(豆)
0208デフォルトの名無しさん2015/03/04(水) 14:53:14.64ID:Ta/FEbLe
C暦3日目です
ここに自分が書いたソースコード張ったらダメ出しみたいなのしてもらえる?
テストの点数とそれに対応する順位をつけて、同じ点数は同じ順位にするってプログラムを組んだんですけど
一応目的の動作はしてくれます
0209デフォルトの名無しさん2015/03/04(水) 15:06:01.49ID:CTtxiq5X
>>1使って、どうぞ
0210デフォルトの名無しさん2015/03/04(水) 15:20:31.89ID:Ta/FEbLe
http://codepad.org/O06p0hW4
これだけのことに変数を使いすぎてる気がするのと
もっとスマートに書ける部分があったらおしえてほしいです
0211デフォルトの名無しさん2015/03/04(水) 15:50:29.68ID:HeTEjgTn
>>210
つ qsort
0212デフォルトの名無しさん2015/03/04(水) 16:57:59.31ID:mnA608p+
>>210
直してみたよ
http://codepad.org/vCg6eNwh

解説
・変数名はc0など意味の分かりにくいものにせず、pointとかorderとかにしよう(↑では変えてないけど)
・10や9や8といった定数は、配列の要素を後で増減させる時に修正しやすいよう、変数などに定義しよう
その際は、要素数(人数)に合わせて'10'を使うのがいい
基本的に、配列をfor文で辿る時は (変数=0; 変数 < 要素数; ++変数) という形になるのでこのまま憶えよう
本当は配列のサイズからも分かるけど、それはもうちょっと先のレベル
・同じ点数の人が同じ順位になるよう、順位を示す変数は途中では変えず、後でまとめて人数分増やす
そうすれば後半のややこしいループは不要
・main関数の引数と戻り値が間違い
0213デフォルトの名無しさん2015/03/04(水) 19:46:11.27ID:Ta/FEbLe
>>211
便利ですね覚えておきます

>>212
ありがとうございます、すごい参考になります
引数と戻り値は勉強しなおしておきます
0214デフォルトの名無しさん2015/03/05(木) 03:01:06.15ID:o2c8GLXQ
size_t (実体はunsigned int)からunsigned longへの変換でpossible loss of dataって言われたんだけど
intよりもlongのが扱える範囲は大きいはずだからおかしいよな・・・?
0215デフォルトの名無しさん2015/03/05(木) 03:25:16.98ID:+ThMXw+2
それだけじゃなんとも
size_tが_int64にでもなってたんじゃね
0216デフォルトの名無しさん2015/03/05(木) 03:34:33.64ID:lVmgOndi
今時 size_t が unsigned int と同サイズって少数派だもんな
0217デフォルトの名無しさん2015/03/05(木) 03:35:29.33ID:o2c8GLXQ
ホントだ
インテリセンス君はunsigned intだったけどたどっていってみたら__w64なる接頭句が
0218デフォルトの名無しさん2015/03/05(木) 03:46:27.62ID:lVmgOndi
たいていの x86_64 や arm64 のコンパイラは
LLP64 っていって、long long とポインタが64bit
そのあおりで size_t と ptrdiff_t (ポインタの差) も64bit

64bit CPU の先駆け Alpha AXP の頃は LP64 といって
long とポインタを 64bit にしてたけど、その時の経験で
long は 32bit のままの方が 64bit 化にあたってのコードの
修正が少なくて済むとわかってLLP64 が主流になった
0219デフォルトの名無しさん2015/03/05(木) 03:47:28.28ID:9F0iYt50
>>210
作業用ポインタとqsortを使った方法、こんな方法もあるよとだけ
http://codepad.org/FjFQ2dNL
0220デフォルトの名無しさん2015/03/05(木) 08:51:27.87ID:OANpNxqp
>>218
こう言うウソをしれっとつくバカは死んだ方が良い。
win16からの移行を容易にする為にすでにグダグダになっていたwin32
それからの移行を容易にするための選択がLLP64
0221デフォルトの名無しさん2015/03/05(木) 08:52:56.70ID:+Q5gJwG8
>>220
同じことを言ってる
0222デフォルトの名無しさん2015/03/05(木) 09:06:17.01ID:PF6nrNXa
64bit環境におけるデータモデルの話じゃなかったのか
0223デフォルトの名無しさん2015/03/05(木) 09:25:50.71ID:OANpNxqp
>>221
MS帝国(大分おちめ)の奴隷は引っ込んでいろ。
LLP64なんか採用してるのはwin64だけ。
0224デフォルトの名無しさん2015/03/05(木) 13:04:15.43ID:HSYDbrXJ
確かに218は不正確で220が正しい
64ビットの先駆けとなったDEC Alpha系もLP64だったような
0225デフォルトの名無しさん2015/03/05(木) 13:22:27.44ID:3j9lgICf
>>218
> たいていの x86_64 や arm64 のコンパイラは
> LLP64 っていって、

いやいや、そんな珍しいものは唯一windowsだけじゃないの?
0226デフォルトの名無しさん2015/03/05(木) 16:44:14.07ID:JyN3EgEg
//#define AAAA
//#define AAAA BBBB
#define AAAA CCCC

と記述した後に、任意の場所で、
AAAAがCCCCとしてdefineされているかを判定することはできないでしょうか?
0227デフォルトの名無しさん2015/03/05(木) 17:17:46.08ID:I89WrdEH
if (AAAA==BBBB) {
  return true;
}
0228デフォルトの名無しさん2015/03/05(木) 17:25:22.76ID:0g2YeNLY
値との比較で

#if(WINVER >= 0x0500)
#endif

こういうのは見たことがあるが、特定のシンボルに定義されているかどうかを
#if で判定してるのは、見たことがないな(&それが可能なのかは知らないな)
0229デフォルトの名無しさん2015/03/05(木) 20:57:00.72ID:l9SFIH0J
フォルダー(a)に複数入っている各csvファイルの行数を調べて表示するやり方を教えてください
0230デフォルトの名無しさん2015/03/05(木) 22:21:47.81ID:HeQ72Txg
>>229
スレチ
0231デフォルトの名無しさん2015/03/05(木) 22:26:38.06ID:/PZ+wdBr
質問のどのあたりがスレチだったのかkwsk
0232デフォルトの名無しさん2015/03/05(木) 22:37:42.95ID:4qwAFJaB
>>229
10 OPEN DIR("*.csv") AS #1
20 sizeof(#1)
30 GOTO 10
40 END
0233デフォルトの名無しさん2015/03/05(木) 23:13:15.75ID:LULabTRs
>>229
find . -name "*.csv" | wc -l
0234デフォルトの名無しさん2015/03/05(木) 23:21:23.33ID:puWRUP/J
>>229
$ find ./a -name "*.csv" | ruby -rcsv -lne 'p [CSV.read($_).size, $_]'

>>233
xargs
0235デフォルトの名無しさん2015/03/06(金) 01:14:22.96ID:Sg/+JleU
fopen(csv);

int i = 0;
while ( fgets( ) ){

  i++;

}

fclose();

return i ;
0236デフォルトの名無しさん2015/03/06(金) 03:51:20.50ID:+A6TrZmo
>>233,234
find a -name '*.csv' -exec wc -l {} \;
0237デフォルトの名無しさん2015/03/06(金) 05:54:19.35ID:ffY3VuPR
CSVと指定してるのが引っ掛けだったりして
ダブルクオートの中に改行が入る場合を考慮しないといけない
0238デフォルトの名無しさん2015/03/06(金) 07:24:52.70ID:GC5TMZRE
Excel仕様だと、( , )( " )( 改行 )等があると全体を( " )で括り、さらに( " )は( "" )とエスケープするという素敵仕様
0239デフォルトの名無しさん2015/03/06(金) 07:43:06.27ID:jAQDMMU6
そういう改行だとか , " への対応だと、
C#でTextFieldParserを使うのが一番簡単かな?
0240デフォルトの名無しさん2015/03/06(金) 08:06:38.46ID:dsDP5DeS
>>236
今は
find a -name '*.csv' -exec wc -l {} +
って、やるんだよ。
20世紀からきたおじいちゃん。
0241デフォルトの名無しさん2015/03/06(金) 08:34:58.66ID:zfR7oXUX
>>238
Excel仕様というか、今はそれでRFCになってるけどな。
0242デフォルトの名無しさん2015/03/06(金) 09:28:41.05ID:uUtd6mTH
csvデータ の行数なのか
(csv) ファイルの行数なのか
そもそも行数とは何か
難しい
0243デフォルトの名無しさん2015/03/06(金) 09:33:08.83ID:liXUjwAw
ファイルの行数=ファイル数と空目した。すまそ
0244デフォルトの名無しさん2015/03/06(金) 12:08:08.56ID:DihBiSVk
拡張子が.csvとは言ってないんだよなあ
02455602015/03/06(金) 21:01:06.91ID:n9/U+gAr
>>244
そこまで応用力のない奴は放置でいいだろ
腐ってもム坂だし
0246デフォルトの名無しさん2015/03/06(金) 21:02:18.67ID:FTmThQC8
データに改行がある時正しくないね
0247デフォルトの名無しさん2015/03/06(金) 22:15:46.04ID:CKRqkh4t
csvとテキストって区別つくんか?
02485602015/03/06(金) 23:29:41.77ID:rW0fbm/s
>>246
正しいかどうかは >>229 の行数の定義に依る

>>247
csv ⊆ テキスト
0249デフォルトの名無しさん2015/03/06(金) 23:53:29.97ID:2n7TyHez
エクセル起動してcsv読み込ませて行数だけ返してもらえばいいんじゃないですかね(名案
0250デフォルトの名無しさん2015/03/07(土) 00:35:11.21ID:Ya/TYd9L
FILE fp = fopen( csvファイル );

int c;

int i=0,行数=0;

while ( c = fgetc(fp) ){

  if( c == 区切り文字 ){

     i++;

    if(i >= 項目数){

      行数 ++ ;
      i=0;
     }

  }

}

fclose(fp);

return 行数 ;
0251デフォルトの名無しさん2015/03/07(土) 01:24:24.47ID:C8DOhXGu
セル内改行してたら、1レコードで二行使ってたりするんだぜ
0252デフォルトの名無しさん2015/03/07(土) 15:20:31.76ID:bUPPfM5U
それcsvじゃないだろ
■ このスレッドは過去ログ倉庫に格納されています