【初心者歓迎】C/C++室 Ver.90【環境依存OK】
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.89【環境依存OK】
http://toro.2ch.net/test/read.cgi/tech/1390171944/ ◆ソースのインデントについて
半角空白やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か に置換すると見栄えだけはよくなります。
【アップローダー】(質問が長い時はココ使うと便利)
http://codepad.org/ (コンパイルもできるし出力結果も得られる[]privateをチェック)
http://ideone.com/ (時間帯によってはcodepadが重い事があるのでここも利用)
hogeは禁止します、使用しないでください。
万が一hogeが書き込まれても、スルーしてください。
相手にするとあなたも荒らしと同じ扱いになります。
なお、hogeはNGワードに追加しておくことが強く推奨されています。
----テンプレここまで-----
このスレで質問することを禁ずる
↑ いつものボット
このスレで質問するってことは無能である何よりの証拠
新スレhoge記念
8 :
デフォルトの名無しさん:2014/03/25(火) 21:01:46.39 ID:A1lqZyhT
hogeは禁止されていません
自由に使って構いません
ここはhogeスレニダ。ウリのスレニダ
10 :
デフォルトの名無しさん:2014/03/27(木) 21:24:22.59 ID:bJmMH0bS
私はBorland C++を使ってプログラミングしているのですが、
makefileの使い方が分かりません。
どなたか教えてくれませんか?
11 :
片山博文MZジェバンニ ◆T6xkBnTXz7B0 :2014/03/27(木) 21:55:02.97 ID:pkdNwHUQ
>>10 Makefileがあるコマンドラインでmakeまたはmake -f Makefileを実行すると、ビルドが開始される。
make cleanでコンパイル後のオブジェクトをきれいさっぱり消す。
make (ルール名)でMakefileに書かれたルールを実行する。ルールは次のように記述する:
ルール: 必要なファイルのスペース区切り
<タブ文字>実行するコマンド
詳しくは附属のヘルプを見ろ
make
と入力してEnterをおします
(誤)Makefileがあるコマンドライン
(正)Makefileがあるフォルダのコマンドプロンプト
>Makefileがあるフォルダのコマンドプロンプト
日本語でおk
コマンドプロンプトを開いて、CDコマンドとドライブ指定でMakefileのあるフォルダに移動して(以下略)
古くないWindowsならShift+フォルダ右クリックでコマンドプロンプトが開ける
16 :
デフォルトの名無しさん:2014/03/27(木) 22:10:06.86 ID:bJmMH0bS
コマンドプロンプトはスタートを押すと出てくるプログラムですか?
makefileというファイルに以下のように記述しました。
#
# Borland社のBorland-C++コンパイラ用のMakefile
#
CC=bcc
#
# フラグ
# -N -- スタックオーバーフローのチェック
# -v -- デバッグ可能
# -w -- すべての警告をオンにする
# -ml -- ラージモデル
#
CFLAGS=-N -v -w -ml
calc1.exe: calc1.c
$(CC) $(CFLAGS) -ecalc1 calc1.c
clean:
erase calc1.exe
17 :
デフォルトの名無しさん:2014/03/27(木) 22:14:20.02 ID:pkdNwHUQ
Borlandが古すぎる。BccInstでBCC55をインストールして使え
18 :
デフォルトの名無しさん:2014/03/27(木) 22:18:41.99 ID:pkdNwHUQ
コマンドプロンプトは、コマンドが入力できる黒い画面。古いWindowsならDOSプロンプト
何でそんな古いコンパイラ使ってるの? 馬鹿にされるよ
20 :
デフォルトの名無しさん:2014/03/27(木) 22:23:47.82 ID:bJmMH0bS
ドライブ指定してmakefileに移動しようとしたら
「ディレクトリ名が無効です」になります。
もうvisualstudio入れろよ
今更そんな古い環境使うとか苦行だろ
22 :
デフォルトの名無しさん:2014/03/27(木) 22:25:13.90 ID:pkdNwHUQ
「makefileに移動」じゃなくて「makefileのあるフォルダに移動」だよ
23 :
デフォルトの名無しさん:2014/03/27(木) 22:28:10.86 ID:bJmMH0bS
makeを入力すると、
'make'は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたバッチファイルとして認識されません
とでます。
24 :
デフォルトの名無しさん:2014/03/27(木) 22:28:38.98 ID:pkdNwHUQ
別のドライブに移動したいときは「D:」のように入力してEnter
パス通ってないだろ
26 :
デフォルトの名無しさん:2014/03/27(木) 22:32:03.27 ID:pkdNwHUQ
>>23 bccのインストールができてない。
まずは環境変数PATHを設定する。
「SET PATH=%PATH%;bccのあるフォルダへのパス」
古い!! ふるすぎる。。。(藁)
お前はそれでも地球人か!!!
29 :
デフォルトの名無しさん:2014/03/27(木) 22:44:32.34 ID:bJmMH0bS
インストールしました。
makeを押しても何の反応もありませんが。
ダメだこいつ…
エラーメッセージがなく、EXEが作成されてれば成功。
32 :
デフォルトの名無しさん:2014/03/27(木) 22:47:17.82 ID:bJmMH0bS
Copyrightが出てくるだけです。
タブ文字って知ってる?
34 :
デフォルトの名無しさん:2014/03/27(木) 22:51:15.73 ID:bJmMH0bS
.exeは対象のプログラム名で出てくるのでしょうか?
それとも、makefile.exeのように出てくるのでしょうか?
35 :
デフォルトの名無しさん:2014/03/27(木) 22:53:22.32 ID:bJmMH0bS
タブ文字・・・分かりません。
makefileに書く書式でしょうか?
36 :
デフォルトの名無しさん:2014/03/27(木) 22:58:18.30 ID:bJmMH0bS
タブ文字調べました。
プログラムのスペース文字のことですね。
37 :
デフォルトの名無しさん:2014/03/27(木) 23:04:46.62 ID:pkdNwHUQ
キーボードの左側にあるTabというキーを打つと入力できる。
Makefile中のコマンドの前にはTab文字を入力しないといけない。
「CD」で現在のフォルダの場所(パス)を確認しろ。calc1.cを右クリックプロパティで場所を確認しろ。
38 :
デフォルトの名無しさん:2014/03/27(木) 23:15:12.68 ID:iFr+67KQ
Tabをおしてもタブ文字がはいらなかった場合は…
たとえば、4個の半角空白を\tに置換します
しかしそれができるエディタなら、タブ文字がはいるだろう
39 :
デフォルトの名無しさん:2014/03/27(木) 23:19:21.00 ID:bJmMH0bS
Tabで打ってませんでした。
パスとcalc1.cの場所は同じです。
「DIR /W」した結果をここに貼れや
MakefileがMakefile.txtになってる可能性があるな
41 :
デフォルトの名無しさん:2014/03/27(木) 23:27:47.79 ID:bJmMH0bS
拡張子はつけてません
Makefileは同じ場所にある?
念のために「DIR」して確認してくれ。
uuエンコードしてup
44 :
デフォルトの名無しさん:2014/03/27(木) 23:39:08.03 ID:bJmMH0bS
同じ場所にあります。
45 :
デフォルトの名無しさん:2014/03/27(木) 23:39:22.57 ID:LrW8OE+k
俺、子供の頃地球に住んでたことあるよ。
>>24 変なこと教えるなよ。
ドライブごとのカレントフォルダーは
今となっては誰も欲してない機能なんだから
cd /d 移動先のパス
にしとけ。
47 :
デフォルトの名無しさん:2014/03/27(木) 23:45:04.99 ID:pkdNwHUQ
フォルダをZIP圧縮してアップローダーにアップロードしろ
古過ぎるコンパイラは馬鹿には無理。
It is impossible for fools to use too old compilers.
BorlandっていまやWin最強のコンパイラーだろ?
Clangになって一番すごいWinのコンパイラーに進化したらしいよな
VC++ EEじゃあかんのか
52 :
デフォルトの名無しさん:2014/03/28(金) 00:52:34.68 ID:vM8zXvpO
次のように表示されます。
bcc -N -v -w -ml -ecalc1 calc1.c
'bcc'は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチファイルとして認識されていません。
** error 1 ** deleting calc1.exe
>>52 じゃあパスが通ってないんだろう、環境変数のpathnの項を弄れ
やり方? bccの使い方を説明するサイトとか本にはだいたい載ってるだろと
>>52 違う,いまのBorlandは
clang -o calc1.exe calc1.c
おそらく、bccってやってるぐらいだからコンパイラ・リンカーのcfg設定すら出来てないだろうな
57 :
デフォルトの名無しさん:2014/03/28(金) 01:21:27.24 ID:ZLrJM0xQ
とりあえずフルパスでやってみろよ
58 :
デフォルトの名無しさん:2014/03/28(金) 01:27:34.35 ID:vM8zXvpO
cfg設定はしてます。
makeを入力すると52のように表示されます。
59 :
デフォルトの名無しさん:2014/03/28(金) 01:29:03.46 ID:vM8zXvpO
makefileは
>>16のように記述したのですが間違っていますか?
60 :
デフォルトの名無しさん:2014/03/28(金) 02:01:11.81 ID:vM8zXvpO
CC=bcc32
に書き換えたら行けました。
そしたら今度は
コマンドオプションの間違い -ml
というエラーが出ました。
-mlをとってmakeをしたら上手くいきました。ラージモデル-mlは認識されていないのでしょうか?
教科書通りにしてるのにおかしいですね。
>>60 俺Winの知識ないって自慢し過ぎ
bcc32に限らずwinのコマンドのオプションリスト表示すら出したことないだろ
winの経験が少しあれば普通はオプションリスト表示オプションを付けて起動して、
どんなオプション付けられ、それが何をするのか調べることぐらい出来ると思うが
winの場合のオプションリスト表示は /? ってのが普通(常識)
スモールモデル、ラージモデルは、16ビットの時代
>>62 16bitとはおいおいすぎ><
16bitのプログラムを開発したいから、わざわざBorlandを選んだのかな
つーか、おまえらバカにして遊んでるだけだろ
とんでもない。
馬鹿になんてしてないよ。
遊んでいることは否定しないけど。
>>64 そりゃsizeofをプリプロセッサが処理するような処理系を好んで使うような奴だもの
やっぱりねw
>>64 bccに-mlでバージョン出さない時点で普通に古いコンパイラを前提にするだろ
明示するだろ、JK
70 :
デフォルトの名無しさん:2014/03/28(金) 17:42:32.13 ID:vM8zXvpO
>>61 オプションリスト表示はどのように開くのでしょうか?
コマンドプロンプトに/?を入力しても反映されません。
単に
bcc32
と入力してEnterをおします
むかしBorland C++Builder バージョン5か6のおまけとして
コマンドラインコンパイラのオプションの表が付属していました。
それと異なります。たぶん全部を表示しないと思われます
calc1.cってなに?
74 :
デフォルトの名無しさん:2014/03/28(金) 21:02:05.81 ID:vM8zXvpO
>>71 表示されました。ありがとうございます。
>>73 今、オライリーのC実践プログラミングという教科書を使用しているのですが、
その中に例として出ているプログラムです。
>>72 そうそう、コードガードはわりと便利、評価版をダウンロードすればいいし
本が古いなら、それに環境をあわせないと。
煽られているように、とりまそれ最新じゃないよ
時代は便利になったんだ。
codepad, ideone もあるよ。
>>1
>>76 いわゆる分割コンパイルにも対応してほしいな、makefile いれとけるとか
78 :
デフォルトの名無しさん:2014/04/01(火) 18:44:18.29 ID:zkzJISd4
C++の基礎だけかじって、GUIプログラムも作ってみたいと思ってVisualStudioを触ってみると、様相がだいぶ違って困惑しています。
2つ教えてください。
1つ目
まず、MFCで自動作成されたソースファイルを見てもmain()?winmain()?_tmain()?すら見つかりません。
イベントドリブンだから、初期化とそれぞれのイベントに対応した部分以外は触る必要がないので隠されているのでしょうか?
なんとなくでも全体の流れを把握したいのでmain()にあたる部分を見たいのですが、どこに置いてあるのでしょうか?
2つ目
VisualStudioで作成したソースを、フリーで落とせる、C++の勉強に使っていたようなC++コンパイラでコンパイルすることはできるのでしょうか?
複数のファイルに分かれたようなプログラムを書いたことがないのでmakefileとかもよくわかってはいないし、目的があって他のコンパイラを使いたいわけでもないのですが、
VisualStudioで作成したソースはVisualStudioを使わないとコンパイルできない特殊な仕様なのか、
(ファイル間の関係を理解して正しくmakefileを書けば)あくまで普通のC++の仕様に従った、一般的なコンパイラが理解できるソースを作成しているのか知りたいと思っています。
79 :
片山博文MZジェバンニ ◆T6xkBnTXz7B0 :2014/04/01(火) 19:06:36.07 ID:28c8XDsv
1つめ。WinMain関数は自動リンクされるライブラリに含まれている。
有料VC++がインストールされているフォルダのどこかにMFCのソースがある。
初心者には膨大なのでgrepを使いこなさないと読めない。
WinMainとCWinAppを読めば動作がわかる。
2つめ。ソースプログラムやコンパイラによる。ソースがC++11なら
C++11に準拠したコンパイラでなければ使えない。
1つめはステップインで開始すればいい
ヒント:C:\Program Files
>>78 とりあえずVC++ExpressEdition触ってみたらいいと思う
rc とか mc が無いとguiは難しいでしょうね
>>84 初期プロジェクトで既にウィンドウ生成までできてるから
流れ見るのならいけるんじゃね?
関数はもちろん調べながら
>>82 VCでGUIソフトとなるとMFC使えないExpressは苦行だろ
MFCじゃなくてQtなら良いが
今時MFCとかMやな
レスありがとうございます。
ステップインで見てみると、appmodul.cppというファイルに_tWinMain()があり、そこからさらに
winmain.cppというファイル内のAfxWinMain()が呼ばれているようでした。
いきなり理解するのは難しそうですが、おいおい見ていこうかと思います。
ところで
>>82でVC++ExpressEditionを薦めていただきましたが、製品版とは何か違うのでしょうか?
今使っているのはDreamSparkで手に入れたVisualStudio2013を使っていますが、旧版やExpressEditionのダウンロードも可能です。
VisualStudio2013の情報はぐぐった限りまだ少ないので旧版を使った方がいいような気もしてます。
製品版あるなら製品版だけでいいよ
expressは製品版に比べ機能が少ない
製品版よりちょっと動作が軽い
MFCが付いてない
Expressに無料版MFCでいいじゃん。
ATLの方が簡単だけどな。
無料MFCて何の事だよ
それっぽい単語を並べただけなのでマジレスしないでください
てっきりMZCが出てくる流れかと思ったがそうじゃなかったw
マルチコアへの対応って、AfxBeginThreadでマルチスレッドにしたらOSが勝手にコアごとに振り分けてくれるという認識であってる?
ググるとParallelクラスがあるけど、ネイティブでは使えないっぽい。
AfxBeginThreadはある関数を新しいスレッドで開始するだけだから、
parallel forみたいなことをしたい場合は、
自分で各スレッドのforの範囲を決めたり、
スレッドが終了するのを自分で待ったりする必要がある。
ネイティブで使えるパラレルライブラリはちゃんと入っているから探すべし。
マルチコアまともに扱いたいならMFCなんか使わんやろ
OpenMPは楽して並列化させたい場合に威力を発揮するな
……OpenACCが使えるCompilerってフリーに無かったっけ?
マルチコアを真面目に使いたいときに
GUIフレームワークをわざわざ変える奴は
マトモな設計が出来ない奴
MFC関係ないよね
儂もそう思う。が、未だに世に知られていない新理論を
構築済みなのかも知れないのでもう少し語らせてみたいです。
>>101 OpenMPとかPPLとかBoostとかいろいろあるんだな
調べてみるよありがとう
char なら printf
w_char なら wprintf
TCHAR なら _tprintf
だと思うのですが、どうして三番目のやつは先頭に _ が付くのでしょうか?
マクロって_MAX_PATHとか付くやん
標準規格にはないWindows用の独自拡張だから
コンパイラメーカーや、ライブラリの作者は、_を多用します
プログラマは、先頭に、_をつかわないようにします(おれは、そういわれた)
>>100だけど、とりあえず何もしないループ回してCPU使用率見たら、特にマルチスレッド処理してないのに複数コアが仕事してるみたいだった。
マルチスレッドを意識してプログラムしなくてもwindows8は賢いからある程度勝手に対応してくれるのか?
かといって全コアが100%に張り付くというわけでもなく、60%弱くらいでよくわからん。
これを回しただけなんだけど
for (int j = 0; j < 100000; j++){
for (int i = 0; i < 100000; i++){}
}
>>113 空ループって最適化したら消えるんじゃねーの?
それ以前に裏で別のプロセス走ってるとか
コンパイラの自動並列化が効いちゃったとかのオチな気がする
>>113 1コアの100% =
2コアの50% =
4コアの25%
よくわからないがシングルスレッド高負荷処理で
同一コアと思われるハイパースレッディングの
論理CPUペアが50%ずつ(たまに60+40の非対称)
になるのはWindowsでよくあること。
表示が間違ってるのではないかと思ってるけど
コンパイラの自動並列化がそれっぽい、便利なんだな
もっと詳しくならないとマルチコアとか考えるだけ無駄ってことか……
118 :
デフォルトの名無しさん:2014/04/05(土) 12:06:18.53 ID:Vwyio/wC
マルチコアとマルチスレッドはべつ。
シングルスレッド・プログラムでも、OSがマルチコア使うかもしれないし
マルチスレッド・プログラムでも、OSが1コアしか使わないかもしれない。
プログラマが出来るのは主にスレッド管理だけ。
にほんごでおk
>>113 「マルチスレッドにすると勝手にコアごとに割り付けてくれる」ってのは正しい
正確には割り付けるんじゃなく、並列に実行される。
CPU使用率は、ツールやコマンドによって計算方法が違っている場合がある。
例えば4コアの場合、全CPUをフルで使った場合100%と表示するか、400%と表示するかはツール次第。
122 :
デフォルトの名無しさん:2014/04/05(土) 13:32:33.53 ID:Gtcr4gqx
>>122 型名の始めは大文字にしたほうがいいね。
124 :
デフォルトの名無しさん:2014/04/05(土) 13:38:16.05 ID:Gtcr4gqx
>>123 そうですね^^
型名以外には何か問題点とかありますか?
はい
126 :
デフォルトの名無しさん:2014/04/05(土) 13:39:59.09 ID:Gtcr4gqx
このやりかたでよろしいでしょうか?
はい
後何が必要なのか?
128 :
デフォルトの名無しさん:2014/04/05(土) 13:44:42.90 ID:Gtcr4gqx
>>127 ポインタの扱いが苦手でして
一応コンパイラもエラー吐かなかったので大丈夫みたいですがなにぶん心配性なもんで・・・
ライブラリとかで予め決まっている名前以外は _ をつけるべきじゃない
typedef struct 〜 の書式で宣言するなら struct の後のタグ名は不要
おまじない気分でつけるものじゃない
何よりまず、obj001からobj002にコピーしている意味がわからない
この後 obj002を使おうとしていますというオチじゃないかと非常に気持ち悪い
×ライブラリとかで予め決まっている名前以外は _ をつけるべきじゃない
○ライブラリとかで予め決まっている名前以外は 先頭に _ をつけるべきじゃない
> 何よりまず、obj001からobj002にコピーしている意味がわからない
いや、その点はどうでもいだろw
ポインタの勉強するときそういう代入してみるのってよくあることだろ。
本題以外にケチつける奴はただ優越感に浸りたいだけ
浸れてないけど
×ライブラリとかで予め決まっている名前以外は 先頭に _ をつけるべきじゃない
○ライブラリとかで予め決まっている名前以外は 先頭に _ をつけるべきじゃない、というのが持論です
改めて見直してみたらいろいろな慣習とか規約があるみたいだな
よし、今日のところは引き分けにしておいてやる
sprt使わずにdistance名乗るか
>>123 え?なんで型名を大文字で始めるの
定数と間違えてない?
>>141 実用上はいちいちsqrtしないだろ?
……ごめんなさい忘れてただけです
144 :
片山博文MZジェバンニ ◆T6xkBnTXz7B0 :2014/04/05(土) 19:22:03.80 ID:kCbCwa1D
>>142 例えばDogという型名とdogという変数名が衝突しないから、分かりやすいコードが書ける。
>>144 うん。そうです。自分が勘違いしていました・・・
型名と変数名が衝突しないルールなどこの世に無数にあるのに、
自分の使ってるルールがさも普遍的に良いものであるかのような
ミスリードをする奴の言うことなど真に受けてはいけない
char cszBuff
TCHAR tszBuff
int nCount
UINT unCount
typedef struct tagStructName{
} T_STRUCTNAME;
いろいろやってみて自分が納得行くの使ったらいいんや
>>147 システムハンガリアンさんちーす
まだ絶滅してなかったんすね!
頑張ってくださいね!
> 型名と変数名が衝突しないルールなどこの世に無数にあるのに、
ルール以前に、文法で型名と集成体タグ名と変数名は衝突し得ないんじゃね?
http://ideone.com/srhSui あと、typedefされた型名って_tってサフィックスつけるのが一般的だと思うんだけど
これもローカルなルールなんやろか
>>149 そのとおりだねえ
ISO/IEC 9899:1999 6.2.1p1
An identifier can denote an object; a function; a tag or a member of a structure, union, or
enumeration; a typedef name; a label name; a macro name; or a macro parameter.
集成体タグと typedef 名と変数は異なる名前空間だね
>>150 規約での確認、dです
>>151 > Such type names are reserved by POSIX for future extensions and should generally be avoided for user defined types.
…マジっすか orz
衝突ってのはコンパイルエラーではなくて
人が目で見て区別がつきやすいよう
同じ綴りを避けるって話だろうに
アスペなおまいらは
>>153 人の目で区別する必要があるシチュエーションってどんなの?
あえて言おう
処理系指定で組めばおk
初心者なんだろ、何か組みあがった快感って大事だぞ
別のものには違う名前を使うもので
名前を使い回すなって当たり前のことだろ
どんだけ馬鹿なんだおまえら
>Such type names are reserved by POSIX
本当にWikiは嘘だらけだな
byだと適用範囲がPOSIXでなくC全般と読めてしまう
byよりinの方が良いかもね…スレチだけど
A「こんな説明みつけたよ!
B「間違ってるねそれ。
やっぱりWikipediaはこらだから
A「直せるんだから直せよ
B「えっ、何で俺が?
A「えっ?
byの方がいいだろ
A「byだとPOSIX以外にもルールが適用されると読める
B「byの方がいいだろ
せめて意見するときは
そう考える根拠ぐらい書きたいものだ
byの方が良いのかorz
Wiki編集するところだったよorz
そもそもその後の for 以下を読めば C 全般に適用とかの変な解釈するわけないと思うんだが...
>Such type names are reserved by POSIX for future extensions and should generally be avoided for user defined types.
→
POSIXによって予約されているため
ユーザー定義型での使用は避けるべきである
POSIX準拠システムでのアプリケーションプログラムを超えて
POSIXと関係ないオペレーティングシステムのアプリケーションにまで言及しとりますがな
避けるべきということに変わりはないだろ
お前は移植性の事全く考えないの?
POSIXでないシステムの方が圧倒的に少ないというのに
で、どこに C 全般とか書いてあるんだ?
>>167 "by ISO/IEC"でなく"by POSIX"という時点でお察し(ry
なんでこんなに揉めるんだ?
Cのtypedefの説明に「_tはPOSIXで予約済」
って書いてあったら
POSIX系以外も従う必用性がある
ように読めるだろ。
>避けるべきということに変わりはないだろ
それは書いた人の主観であって
百科事典の説明に書くべきじゃないぞ。
技術文書書いたこと無いの?
「POSIXではオペレーティングシステムの為に予約」
という表現にすれば問題なくなると思うのだが
_t はタグのtなのかtypedefのtなのかどっちですか?
>>171 読めないよ
俺C言語で新しいOS書いたわー
そのOSでは大文字で始まる型名予約してるから使うなよ!って書いて、誰がC言語全般に影響あると思うんだ?
POSIXが何かわかってるやつはC言語全般に影響が〜なんて誤解しない。
POSIXが何かわかってない奴は(圧倒的多数であるPOSIXシステムで動かされる可能性を考慮して)無条件に従っておいた方がいい
なんの問題もない。
Wikipediaの内容についての議論はWikipediaのTalkページでやれよ
>>171 > なんでこんなに揉めるんだ?
単なるしきたりを
> POSIX系以外も従う必用性がある
> ように読めるだろ。
なんて言うアホがいるからだろ。
>>178 説明の文面が妥当かどうかの話をするときに
どうしてシキタリが出てくるんだよアホですか?
もうここで議論するべき内容ではないどっか行け
convention も読めないアホは口挟むなよ (w
>>181 「Cのsize_t(しきたりでtypedefには_tを付けたもの)は
POSIXによって予約されている」
などと言っている出鱈目なWikipediaの説明が
妥当だと思うアホはすっこんでろ
All rights are reserved by POSIX.
>>183 誰が妥当って言ってるんだ?
俺は単にそう書いてると言ってるだけだぞ。
まあ、しきたりで自爆したからごまかしたいんだろうけど (w
NG推奨ワード:
Qz
STL
ヘッダ
POSIX ←new
片山
hoge
CがNGワードになる日も近いな
>>186 え、いつの間にかSTLとヘッダもアウトになってたのかw
ここは酷いインターネッツですね
>>186 ついでに
スレが荒れるのでCやC++に関することはすべて厳禁
まどろっこしいな
ようは2ちゃんねるの禁止が落としどころだよね
p2使えないから2ch廃止でいいよもう
出先で書き込めなくてもどかしいったらありゃしない
●は使えるだろ
●が無いとスレ立てできない
浪人ってやつ?
買う気ないからひろゆきの新しい方に期待するわ
SYSTEMTIMEの引き算をしたくて
http://stackoverflow.com/questions/8699069/difference-between-two-systemtime-variable の回答4にある
SYSTEMTIME operator-(const SYSTEMTIME& pSr,const SYSTEMTIME& pSl)
をそのまま使って、
SYSTEMTIME ts,te,tdif;
GetSystemTime(&ts);
Sleep(1000);
GetSystemTime(&te);
tdif = te - ts;
としたら、最後の引き算の行で、
エラー 1 error C2676: 二項演算子 '-' : 'SYSTEMTIME' は、この演算子または定義済の演算子に適切な型への変換の定義を行いません。(新しい動作; ヘルプを参照)
と出るのですが、解決方法がわかりません。どうしたらよいでしょうか?
>>194 teのアドレス - tsのアドレスをtdifに入れるというおかしな事してる
>>194 operator-()の定義かプロトタイプ宣言を
WinMain()だかtmain()だかの前でやれば解決する、と予想
皆さん
アドバイスありがとうございました。
>>196 その通りでした。プロトタイプ宣言忘れていました。
無事に動いたのですが、実行結果がおかしいのです。
約1秒の差が計測できると思ったのですが、
tdifの中身を見ると、
wYear 1601 unsigned short
wMonth 1 unsigned short
wDayOfWeek 1 unsigned short
wDay 1 unsigned short
wHour 0 unsigned short
wMinute 0 unsigned short
wSecond 1 unsigned short
wMilliseconds 515 unsigned short
となっていますので
1601年1月1日0時間0分1.515秒
の差ということでしょうか?どういうことでしょうか?
>>197 SYSTEMTIME ってカレンダーの年月日時間みたいなもの。
それらの引き算をカレンダーの年月日時間にするってへんだろ。
結果のカレンダー年月日時間は0年0月0日0時0分1.515秒ですって、カレンダーではありえないだろ
期待する結果は年月日時間で表せる差じゃないか(1年2ヶ月3時間4分5秒違うとか)
>>197 SYSTEMTIMEの起点は1601年1月1日0時0分0秒
つまり、ゼロをSYSTEMTIMEとして解釈すると「1601/01/01 0:00:00」になる
どうでもいいけど、>199は説明が下手だな。
SystemTimeToFileTimeを使ってSYSTEMTIMEをFILETIMEに変換して、
ULARGE_INTEGERを使って64ビット整数に変換して、引き算をする。
時刻と時間の違いが分かってないタイプ?
>>202 194がやっているのがまさにそれなんだけど、問題は戻り値の型が時間間隔ではなく
時刻を表す型になっていることだから、
>>194 の operator-() の戻り値を __int64 にして v_res=v_right-v_left; 以下を
return v_res; に変えれば100ナノ秒単位の経過時間が得られるようになる。
100ナノ秒じゃ細かすぎるというなら、戻り値を double にして return v_res / 10000.0;
に変えるとか工夫しろ。
>>202 時間差(経過時間)を秒単位ではなくて、年月..秒で表すものにしたいから、
SYSTEMTIMEを戻り型にしているんじゃないのか
Winで経過時間を求めるのにSYSYEMTIMEを使うって普通なのか?
違うなら何を使うのが多い?
よく分からんがC++なら<chrono>使えばいいんじゃね?
Win依存でいいならtimeGetTimeとかQueryPerformanceCounterとかがあるし
「時間差(経過時間)を秒単位ではなくて、年月..秒で表すものにしたい」
という要求下で "年" の計算にうるう年の考慮は必要だろうか?
>>207 その辺難しいよね
365日とするか365.2425日とするか365.2422日とするか……
表示を日までに済ませておくのが無難かと
>>208 .NETのTimeSpanクラスはそうなってるね。
内部表現は100ナノ秒刻みの整数値で、ミリ秒、秒、分、時間、日への変換はするが
月、年への変換はしない。
>>207 それ以前に月が 30日でいいのかと...
>>210 あああああーーーーー
考えるほどマンドクサイっすな
どう考えても一番の荒らしです
片山やhogeよりPOSIXが上なのかw
質問いい?
switch構文のcase内で変数宣言したら、それについて
「'変数' の初期化が 'case' ラベルによって行われませんでした。」
って言われたんだけどどういうことなの……?
ついでにswitch部分に赤波線が付いて、「制御の転送は次の初期化をバイパスします」
って言われたんだけど何故エラーになるのか意味が分からない。誰か分かる人教えて下さい
(VS2013でコンパイルしている時に発生)
caseだけだとスコープが同じになる
ブロックをつければいい
switch () {
case A:
{ // ローカルスコープにしちまう
int a;
} break;
case B:
…
default:
…
}
>>216 ブロックを付けるって、要するに
case test:
〜
break;
を
case test:{
〜
break;
}
にするってことでいいの?
Yes
個人的にはbreakは外に出したいな
case test:としたときに
testにおけるのは何?
int a,b,c;
...
switch()
case (b=a+1, c++, C): なんてのでもOK(試してないけど)?
>>221 定数の整数式とscoped enumの値だけ
switch (a) case std::integral_constant<int, 6>::value:;
最近、よその板で、"「"だけで右を閉じてないのが流行ってるのか
すんげーむずむずするんだが
>>225 在日のおまえは知らないだろうが、明治時代からある用法だぞ。
>>226 (正直鬼物語で見たのが最初だなんて言えない)
エロゲーでは普通じゃないのか?
どんな使い方なんだ?
(ry なんかはときどき見るな
閉じていない括弧に違和感を持つのはある意味プログラマらしいか
カッコつけてんじゃね〜よ
つけてねーよ
case 1+1;
goto 2;
goto 1+1;
goto 2*1;
各環境でナニがドコまで許されるのか興味はあるな
>>229 プログラマは、半開区間が大好きさ!
[0, 4)
もう全て半角にして英語圏顔文字でも使っとけよ:D
236 :
デフォルトの名無しさん:2014/04/09(水) 04:45:08.14 ID:GDCkrjSs
roffとか気持ち悪いよな
>>236 UN*XやるまえにDOSでTeXやってたからあれは意外になんとも
かつては汗でパーサ書いてたっていうから、まあそういうことなら。
time関数は1970年からの秒数らしいですが
long型で格納するとなると、68年くらいで限界が来ませんか?
2038年くらいにいろんなプログラムやばいっすか?
2000年問題の時に話題にあがりました 「2038年問題」でぐぐれぇ
おーやべえ
でも今からプログラムつくろうとするとtime_tは64bitで定義されてるっぽいですね
3000億年まで安心か
炎上学習法は要りません
どこが炎上してんだよ
2000年の頃は見えないほど先の話だと思っていたが
既に3分の1消化してるんだな
1000年以上先の問題ならまだしも、38年だと分野によっては平気で使われ続けるからな
言わんとしてることはわかるからいいんだけど、64bitでコンパイルしてlongが32bitなのMSのコンパイラぐらいだぞ
互換性を優先したんだろうね
time_tは64bitになってるから許してやれ
typedefせずソースに直接intとかlongとか書いてるの?
251 :
デフォルトの名無しさん:2014/04/14(月) 11:00:15.74 ID:fXV0vjOD
vectorにクラスを格納するのって
#include <iostream>
#include <vector>
class c_myclass
{
public:
void myfunc(int num)
{
std::cout << "myfunc" << num << " が呼び出されました \n";
}
};
int main()
{
c_myclass temp;
std::vector<c_myclass> vec;
for(int i=0; i<10; ++i)
vec.push_back(temp);
for(int i=0; i<vec.size(); ++i)
vec[i].myfunc(i);
return 0;
}
このような感じでよろしいでしょうか?
ちなみに
サイズを指定する場合は
std::vector<c_myclass> vec(10);でしょうか?
よろしいです
しいて言えば
vec.push_back(temp);
より
vec.emplace_back();
の方がよろしいかと思われます
253 :
デフォルトの名無しさん:2014/04/14(月) 11:22:23.22 ID:fXV0vjOD
>>252 ありがとうございます
もしよろしければemplace_back()について解説お願いします
リファレンスを見てもよくわからなかったので
コンストラクタを直接呼び出してくれるpush_backでございます
コピーが発生しないので多少効率的になります
255 :
デフォルトの名無しさん:2014/04/14(月) 11:25:50.80 ID:fXV0vjOD
>>253 もしc_myclassにc_myclass(bool,double)みたいなコンストラクターがあったら、
emplace_back(true,1.23)とすることが出来て
かつvectorの中の格納領域上に直接c_myclassを作成できる。
と思う(想像)。
emplace*()はいいね。巨大なクラスを連想配列に放り込む時に重宝だよ。
258 :
デフォルトの名無しさん:2014/04/14(月) 16:17:06.14 ID:/qNJTuFi
open(2)したディレクトリを直接read(2)する方法ってあります?
日本語でおk
260 :
デフォルトの名無しさん:2014/04/14(月) 17:29:53.33 ID:aQsMBHRD
↓ちなみにひろゆきサイドの開発者はめちゃくちゃ臭い
4095 :名無しさん@13周年 :2014/04/14(月) 04:46:02.73 ID:wJLzpOd2P(4)
jimがさくらのクローラを遮断したみたいだな
迂回しても迂回→遮断のイタチごっこは目に見えてるので遮断できない方法でdatを引っこ抜くまでだ
具体的には専ブラっぽい挙動でnetからdat引っこ抜いてscに投げるスクリプト書いてやるからお前らそれブン回せ
たらこにはリクエスト+受け取り+改ざんチェック用のスクリプト書いてやるよ
あー久しぶりにemacs起動するわ
3時間で書いてやる
4209 :名無しさん@13周年 :2014/04/14(月) 09:22:21.15 ID:wJLzpOd2P(4)
あとちょっと書き足してバグとったらexeで配るよ
さしあたりdatの回収は俺がやっとく
C++で書きなおして独自の難読化施してるからnetの奴らにREできるかな?マカフィーでも無理なんじゃないかな
4210 :名無しさん@13周年 :2014/04/14(月) 09:24:13.59 ID:wJLzpOd2P(4)
今の時点で一つ言えるとしたら不特定多数を舐めるなってこと
あー久しぶりにemacs起動するわ()
3時間で書いてやる()
C++で書きなおして独自の難読化施してるからnetの奴らにREできるかな?マカフィーでも無理なんじゃないかな()
不特定多数を舐めるなってこと()
いちいち持ってくるお前も臭い
>>258 できるでしょ?readdir(3C)とかは内部ではreadを呼んでる
>>262 read(2) の manには
EISDIR fd refers to a directory.
Other errors may occur, depending on the object connected to fd.
POSIX allows a read() that is interrupted after reading some data to
return -1 (with errno set to EINTR) or to return the number of bytes
とある
最近C++勉強始めたんですが、質問があります。(Cは良く分っているつもりです)。
C++には参照渡しという記述方法があることを知ったのですが、Cのポインタ渡しに
慣れている私としては、参照渡しを使わずにすべてポインタ渡しでコードを記述する
ほうが見易いので、そうしようかと思うのですが、何かデメリットありますか?
参照渡しを使うほうがよい点などありましたら教えてください。
(個人的に思う)一般的に
ポインタで渡す=ヌルが渡ってくる可能性がある、つまり、常にヌルチェックが必要
ポインタで渡す=ヌルが渡せる、この引数はオプション的である
参照で渡す=なんかしらわたってくる、ヌルチェック不要
参照で渡す=この引数は必ず必要である
あと一時変数オブジェクトの寿命の関係とかあった気がするが忘れたw
>>264 ポインタ渡しと違い、参照渡しの場合、
・絶対に実体があるので、適当なアドレスが渡って
不正なメモリアクセスを行うことがない
また、参照する中身は変更できないので紛れがない
・普通の変数と同じように記述できる。構造体のメンバ関数にも
アロー演算子ではなくドット演算子でアクセスできる
また、関数の引数に使った際、呼び出す側としてはいちいち
アドレスを渡すということを意識せず使用できる
・ポインタと違い参照自体にはメモリ消費がない
こんなところか
返り値の話ではないとして。
参照渡しの一番のメリットは渡したオブジェクトの所有権が移動しない事がわかる事かな。
メモリ消費がないというのは不適切だろ
インラインで消えたりするが
>>268 いや、俺の持ってる本では
「ポインタと違って独自にメモリ領域が割り当てられない」
的なことが書いてあるんだが……違うの?
(お前が)(malloc/new等で)と読めなくもないが大丈夫か
271 :
デフォルトの名無しさん:2014/04/14(月) 21:55:35.64 ID:buURFUek
初期のC++はC言語へのコンバータで実現してたろ。
参照も内部的にはポインタ動作と変わらないかと。
>>271 それって「参照がポインタで実装されてる(ことが多い)」って話じゃなかった?
273 :
264:2014/04/14(月) 22:02:44.39 ID:DVvt3Ia1
みなさん解説ありがとうございます。
大変参考になります。
>参照渡しの一番のメリットは渡したオブジェクトの所有権が移動しない事がわかる事かな。
もう少し詳しく解説お願いします。
>>269 通常の実装では、呼び出し側ではスタックにアドレスを積むという点で全く同じだし、
呼ばれる側でもそこを参照するのに違いはないよ。
まぁ、インライン展開で消えれば話は別だけど。
一番のメリットは、(参照先ではなく)参照自体を書きかえられないことだね。
それもまた、ポインタでもconstにすればできるわけだけど。
278 :
264:2014/04/14(月) 23:14:28.51 ID:DVvt3Ia1
>276
サンプルコードありがとうございます。
>この例ではポインタで渡す気が起きない
すみません、まだよく分らないのですが、ポインタで
void WriteLine(const string *pstr)
{
printf("%s\n", pstr->c_str());
}
のようにすると何か問題があるのでしょうか?
>>273 ++や--の挙動がポインタと参照で違うんじゃね?
>>273 ポインタでオブジェクト返されると誰がdeleteすべきなのかドキュメント見るか返す関数の中身見るまでわからないよね?
参照にすると返したやつが所有している物の中身を見させて貰ってるってことがわかるからdeleteしなくていいって事がドキュメント見なくてもわかる。
引数でもポインタだと引数で渡されたポインタを内部で保持しておくから呼び出し側でdeleteや中身の変更をしてはだめになるのかとかわからない。
string *str = new string("hello");
....
delte str;
....
WriteLine(str); //deleteしてるけど、、、ポインタ値は生きてるから アッー
結局、コンテナをうまく使って生ポ(生new)は極力排除しようぜって流れ
>>282 なんで「何で参照使わないの?」と言われるのかその理由を書かないと意味ないだろ。
たとえば
http://codepad.org/wCMxFlfO 文字列を返す関数と文字列を引数にとる関数があるとする。
参照だったら文字列を返す関数を文字列を引数にとる関数の引数に直接書ける
ポインタだったら一度ローカル変数で受け取ってそのポインタを書かないとだめ
int& a = *(int*)0;
a = 0;
ポインター操作が目的でなく
null許可を表現させたいわけでもなく
読み取り用途限定の時に
わざわざポインターを使う方が不自然
>>285 一行目がダメコードって一目瞭然じゃないか。
ポインタだったらnullを渡すのが悪いのか?nullチェックせずに代入するほうが悪いのか?になる
>>286 ポインタしかない世界から来た人には多分通じないよ。
288 :
デフォルトの名無しさん:2014/04/15(火) 00:25:16.54 ID:hh7KqCRP
生ポ引数/戻り値なんて特別理由がある場合以外は使うなってこった
289 :
264:2014/04/15(火) 00:28:56.87 ID:7FIahpja
私なりに結論を出してみたのですが、
参照渡しをするのは、
void WriteLine(const string &str);
みたいに、その関数に値を読み取り限定で渡す場合に主に使う。
ただし、必ずconstを付けておく。
上記以外はポインタ渡しを使う。
で良いでしょうか?
290 :
デフォルトの名無しさん:2014/04/15(火) 00:35:43.12 ID:8L+RgIaL
参照はポインタの初心者版みたいなもの。
使い方が分からないのがあえて使わなくていい。
>上記以外はポインタ渡しを使う
いいえ。
その他にもムーブセマンティクスを達成
したいときにも参照を使います。
>>290 っていうC++初心者が書くコードはひどく読みづらいので真に受けたらだめ
ageる奴は碌なこと喋んねーな
>>289 漏れも俺様ルールで、const参照は読み取り用、
ポインタは値を変更する時と、使い分けている
格納場所という意味で>289が作った関数仕様を実装する場合も、自衛はするべき。
void readSome(Type * const result)
{
// ++result; // これがエラーになってくれる。
}
俺はしないな。
意味的にはそうなのだけれど
C++のconstは真面目に付けると可読性を著しく損なう
>>263 うん。262は間違いでした。
調べたらreaddirはgetdents(2)を呼んでた
そりゃそうか。ファイルシステムで構造違うしな
参照なら要らないのにね。
値渡しの引数にconstをつけるのはやりすぎな気がする
void f(const int x) なんてしないでしょ
する奴いるよ。きっと>296も同じタイプ。
303 :
KAC:2014/04/15(火) 13:26:56.79 ID:OYr23JgA
>>296 なんか違う事書いてるぞ。>289の仕様満たすならconstは*の左。
>>297 どんな所で可読性が落ちるって?
お前がまともに使えないだけじゃないの?
304 :
デフォルトの名無しさん:2014/04/15(火) 14:19:33.38 ID:SFbbbO6x
流れぶった切って悪いんですが
>>251の
c_myclassがインターフェースクラスを継承している場合は
継承元メンバ(インターフェースクラス)に仮想デストラクタを書いておけば良いのですか?
>>303 >296が言いたいことは、>289の仕様ならconst * string const strだろ。
いけね、Typo。
string const * const strね。
308 :
デフォルトの名無しさん:2014/04/15(火) 15:09:29.49 ID:SFbbbO6x
>>307 さらっと確認したので怪しいのですがたぶん
クラスAには仮想デストラクタが無い為に
newしたオブジェクトがデリートされる際、継承元のデストラクタが呼び出されていませんが、
クラスBは仮想デストラクタがメンバにあるので
deleteされる際に継承元のデストラクタが呼び出される訳ですよね
そこで、ベクターにオブジェクトを格納する話につながる訳ですが
>>251のc_myclassがインターフェースクラスを継承しているときには
やはり継承元のクラスに仮想デストラクタを記述しておかないと危険だという事ですよね?
だーね
310 :
デフォルトの名無しさん:2014/04/15(火) 15:32:30.40 ID:SFbbbO6x
確認しつこくてすいませんが
まとめると
>>307のdlvBを
dlvB temp
std::vector<dlvB> obj;
obj.push_back(temp);
みたいにしちゃっておkってことですよね
>>310 そうしたいなら仮想デストラクタとか仮想関数とか関係ない。
コピーコンストラクタを作ればいいだけ。
std::vector<clsB>にdlvB型のオブジェクトを突っ込むとスライシングでダメになるから気をつけるように
多態をコンテナ内で実現したいならstd::shared_ptrやunique_ptrを入れるのがよい
仮想デストラクタが必須なのは当然として
vectorに突っ込むケースを考えると
難易度としては
vetcor<Base>
vetcor<Base*>
vetcor<shared_ptr<Base>>
ptr_vector<Base>
こんな感じじゃね?
それぞれ注意点はあるが
一見簡単そうに見える
vetcor<Base>
が一番きつい
>vetcor<Base>
そもそも派生クラスを突っ込めない。
>vetcor<Base*>
所有権がどこにあるのか分からないので論外。
>vetcor<shared_ptr<Base>>
virtualデストラクタ不要で便利。
>ptr_vector<Base>
今更ptr_vector?unique_ptrでいい。
make_uniqueが標準に入らないと、記述量がちょっと面倒
>>314 たしかに
デザパタで
知らんかった
流行り廃りとかあるの?デザパタで
std::unique_ptrはvectorに突っ込めるのにboost::scoped_ptrは出来ないのはなんで?
moveできないから
319 :
デフォルトの名無しさん:2014/04/15(火) 23:53:29.68 ID:hh7KqCRP
noncopyableだからだろ
ユニポもそうだけど
321 :
デフォルトの名無しさん:2014/04/16(水) 00:00:41.11 ID:cUKcFdx2
>>320 すまん、そうだね、copyかmoveが出来ないとコンテナには入れられないということで
なるほど、unique_ptrの機能はC++11が前提なんですね
>>321 >copyかmoveが出来ないとコンテナには入れられない
ソースは?
vectorについてはその通りだとは思うが
324 :
デフォルトの名無しさん:2014/04/16(水) 01:55:04.23 ID:cUKcFdx2
325 :
323:2014/04/16(水) 06:52:53.53 ID:gRD8q33D
>>324 23.3.5p2でstd::listは23.2の仕様に従うとなっていて
そこで説明されるemplace_frontはEmplaceConstructibleであることが要求されていて
26.2.1p13のEmplaceConstructibleの定義は
コピー/ムーブを要求していないと読んだのだけれど
古い仕様からアップデートしてない人なんじゃね?
>>262 ジジイが昭和の知識でレスすんな
つーか、いい加減に死ねよ
329 :
デフォルトの名無しさん:2014/04/19(土) 15:31:58.78 ID:9tEZQcT3
>>329 ここ
// for(i=0;i<D && used[i]==0;i++){
for(i=0;i<D;i++){
if(used[i] != 0) continue;
>>330 あw
うっかりでした。ありがとうございます!
CYKのプログラム書きたいんだけどいまいちわからんわ
自作のプログラムにboostのregexのlibboost_regex-vc120-mt-sgd-1_55.libを
スタティックリンクして使いたいのですが、あるもうひとつ別のライブラリも
リンクしていてその中にparseという関数があり、.DEFファイルでexportして
います。そうすると、parseという関数が二か所にあるのでエラーするようで、
error LNK2001: 外部シンボル "parse" は未解決です。
となります。良い解決方法ありますか?VS2013です。
もう一つのライブラリはLoadLibraryでロードする
namespaceがあるのに競合するの?
パネーな
自作の方をLoadLibraryした方が融通利く気がする
衝突の時は別のエラーになると思う
衝突ではなく未解決のシンボルってことは
呼び出し規約の間違いとかかね?
定義が見つからないんだろう
extern "C"していないとか
アンダーラインが付いているとか
dumpbin /EXPORTS
すみません、ちょっと説明を間違えていました。自作のDLL (マルチスレッド デバッグ (/MTd))を作成中で、
その中にparseという関数があります。その関数は.DEFでExportしています。boostのregexを使いたいので
#include "boost/regex.hpp" をインクルードして、ビルドすると、そのparseは
libboost_regex-vc120-mt-sgd-1_55.lib で定義されていますというような警告が出てエラーします。
少し調べてみたところ、regexに限らず、boostの関数名と同じ関数を自作のDLLの中に作って、それを.DEF
ファイルに書くと、同じエラー出ました。
たとえば、boost::filesystem::exists()に対して、void exists()という関数を作り、.DEFに書くと
同じエラーします。とりあえず.DEFに書くのをやめると解決するのですが、昨日からboost使い始めたばかりなので
基本的なこと良く分っていません。解決方法ありましたら教えて下さい。
教えていただいたLoadLibraryやextern "C"やdumpbin /EXPORTS は初めてなのでいま調査中です。
>>342 MT,MD,Unicode,SJIS,debug,release,32,64...
うひゃー
>>342 .defの書き方が間違ってんだろ
ちゃんと=でマングリ名指定してるか?
そもそもLoadLibraryを使ってないのに.defなんて要るのか疑問
マングリって卑猥な響きだから「ング」まで書こうなw
C++だし名前が被ったからって問題になるとは思えんが
さっぱり分からんけど、boostのlib関数がextern "C"扱いになっているのか
>>342 ビシッと
using namespace boost::filesystem;
using namespace boost::regex;
ってしているか?
boost云々は関係なくてDLLとか装飾名のルールがわかってない
そしてその次は呼び出し規約の罠に嵌るだろう
マクロをグローバル変数に置き換えたいんですけど、
インクルードガードを使ったヘッダーにグローバル変数を定義すれば使えばexternを使う必要ないし
どこかでグローバル変数の定義を必要もないんじゃないですか?
どうやるのが普通ですか?
状況がよくわからんが、どうやるのが普通かと聞かれればマクロもグローバル変数も使わないのが普通。
#define ASPECT_RATIO 1.653
でも
const double AspectRatio = 1.653;
でもないとしたら
なにが正解ですか?
もしかしてstaticを知らん人かな
Asperger_ratio
何がしたいのかわからん
てにをはちゃんと使って
.hにはexternつけて宣言
どれかの.cで定義
元がマクロなら実体がいらないはず
C++なら constで問題ない
それとも"変数"にするのが目的なのか
ここで__declspec(selectany)で動作保証を得たQが
extern要らない珍説のために降臨です
質問します。
下記のようなプログラムを作ってみたのですが、バグ(?)が発生しています。
具体的に言いますと、5.6/0.8=7であるはずなのに、「商の整数は・・・」の所が「6」と返されたり、「あまりの結果は・・・」の所が「0.8」と返されたりします。
検索して解決方法を探してみましたが、自分では解決できませんでした。
ご教示よろしくお願いします。
#include <stdio.h>
#include <math.h>
int main()
{
int shou_int;
double x=5.6, y=0.8, shou, amari;
shou = x/y;
shou_int = (int)shou;
amari = fmod(x,y);
printf("商の結果は・・・%f\n",shou);
printf("商の整数は・・・%d\n",shou_int);
printf("あまりの結果は・・・%f\n",amari);
return 0;
}
動的確保について質問です
動的確保をした関数からは確保した配列を他関数に渡せますが
他の関数からは渡せません(Segmentation fault)
なぜでしょうか
また、回避策はありますか
http://codepad/ssrgksbZ
>回避策はありますか
なめてんのか。馬鹿に付けるクスリは無いわボケ
>void initMatrix(int **matrix,
↓
int **initMatrix(int **matrix,
matrix = initMatrix(…)
まちがえた
>void initMatrix(int **matrix,int m,int
n)
↓
int **initMatrix(int m,int n){…}
matrix = initMatrix(m, n);
>>366 なるほど
修正したところうまく動きました
ありがとうございます
初心者でよくわからないのですがなぜセグフォになるのでしょうか
関数が終わってしまうと自動的に開放されてしまうのですか?
>>361-362 そういう仕様(?)なんですね。
回答していただきありがとうございます。
>>367 関数呼び出し側と呼ばれた先でそれぞれ
printf("%p\n", matrix);
して出直せ
誤: printf("%p\n", matrix);
正: printf("%p\n", &matrix);
俺が出直してくるわボケ
in initMatrix: [matrix] == 0x1f70010
in main: [matrix] == (nil)
開放されたという認識であっていますか
Asperger_ratio = 100%
>>370 あ,なるほど
そういうことでしたか
これだと値渡しと一緒ということですね
理解しました
ありがとうございました
>ID:FOWeiF78
口調何とかしろ、それ以前にまずは落ち着け
>ID:Md9gKFL1=ID:WNesHxZT
>>366のように、ポインタを引数にするのではなく返り値をポインタにするのが常道
結果反映を 引数側への作用 として実装しなければならないのなら
やり取りしたい型の {C++ なら 参照} {Cなら ポインタ}
やり取りしたい型 TYPE
呼び出し元変数
TYPE a;
C++
関数 func_cpp(TYPE& arg);
呼び出し func_cpp(a);
C
関数 func_c(TYPE* arg);
呼び出し func_c(&a);
そういうのはC++向けにラッパー書くものじゃね
>>376 そもそもC++ならvectorあるけどな……
>>367 セグフォあーだこーだの前に、超シンプルにして
int a = 1;
関数change_aでこの変数aを100に書き換えたい。
void change_a(???){???}
?のところどうしたら良いと思う
>>371 「matrixは」解放されてるな、malloc()で得た領域は解放されていないが
#include <stdio.h>
void f(int arg) { arg = 2; }
int main() {
int v = 1;
f();
printf("%d\n", v); // さて、ここで表示される数は?その理由は?
return 0;
}
int **matrix;
initMatrix(&matrix, ・・・)
showMatrix(sxmatrix)
・・・
って動作をしたかったんだろな
sxはゴミだ忘れてくれ
MatrixT initMatrix(size_t m,size_t n) { MatrixT matrix;
return matrix;
}
これってNRVOを期待してるけど
最適化されなかったら大ダメージ?
384 :
383:2014/04/24(木) 08:47:09.71 ID:urYv0y/c
ああ、ムーブコンストラクターがあれば
大した問題ではないな。失礼
多次元配列が絡んだ場合がよくわかっていないようです
勉強してきます
>>378 void change_a(int *a){ *a = 100; }
>>379 1
値渡し
vの値をf()のargにコピーしているだけ
× vの値をf()のargにコピーしているだけ
○ 変更しているf のargはvとは別の変数(値は呼び出し時のvのコピー)であるため
void f(int arg)なのに呼び出しはf()かよ
ってのはおいといて
f(v)であったとしても
int arg = v;
arg = 2;
return;
と同義だからな
>>387 >呼び出しはf()かよ
f()が呼び出しだなんて誰か言ったっけ。
Cでの宣言(引数は言及しない関数の宣言)を使って
特定の関数のことを指しているのではないの?
>>385 じゃ
int* pa;
のpaを関数内で書き換えときは?
そして int** ppa;
のppaを関数内で書き換えるときは?
>>390 お前は宣言する時にわざわざ
int a, b;
int* c, *d;
とやっているのか
int a, b, *c, *d;じゃないのか
宣言....
この場合は定義だね、おっと、 extern は‥‥とかいう信者が湧いてくる
>>387 すまんコンパイル通さずにレスした俺が悪かった、修正ありがとう…
要するに、
>>364 ではポインタで分かりにくくなってるだけで
起きてるのはそれと同じことなんよね
>>391 > int a, b, *c, *d;じゃないのか
こんな書き方する奴、まだいるのか
どっちもでいいよ。
使用するintを1行で書きたいんでしょ。
398 :
デフォルトの名無しさん:2014/04/25(金) 01:52:47.62 ID:KcORG+H/
そもそも関数の先頭で未初期化変数定義するみたいな奴なんてまだいるのか
そりゃいるでしょうね
コンパイラを選びますし
400 :
デフォルトの名無しさん:2014/04/25(金) 02:08:33.86 ID:KcORG+H/
>>399 コンパイラのせいにして思考停止しているのか?
古い仕様のCで書くにしてもスコープ切ればよいだけで
未初期化変数、変数の使いまわしなんてバグの温床だからやっちゃダメ
> 古い仕様のCで書くにしてもスコープ切ればよいだけで
Cで書かれたメジャーどころでそんなイディオム使ってるのって存在するの?
そんな規約に出会った事はないし見たこともないのだが。
そんな古いコンパイラ使わされるとか苦行ですね。
どんな業界で残ってるんですか?
その業界には絶対に近づかないでおこうと思うので後学のために教えていただけると有り難いです。
必要無いのに初期化とか工程増えるだけやん
gcc に 未だに -pedantic オプションが存在していることを考えるんだ!
int a;
(分岐して分岐先でそれぞれ代入)
そんなところではろくなエディタやツールもないだろうし
空スコープの濫用でうっかり予期せぬ行連結かましたりする方がこわい
また随分な珍説が出てきたな。
>>402 教えてやろう。
お前の周りの家電のマイコンファームウェアだ。
ifやforと同じくらいスコープのネストが深くなるのが基本。
自動変数の領域をスコープ外れた時点で回収するコンパイラ少ないでしょ
少なくともオレは見たことない
組み込みこそスタック領域は貧弱だろ
回収っていうか、スコープはずれたら別のスコープの
変数に割り当てられるだけ。
例えばaとbは同じアドレスになる。
デストラクタとかないから、bの時点でaの値が
そのまま残ってる。
{ int a = 100; }
{ int b; }
規格できまっている挙動ではないし不毛だな
だな、
>>411 なんてアドレス同じ以前になにもしない可能性が高いし。
>>410 回収ってメモリのことだと思うが
そもそもスコープに入るときに確保されたものじゃないから
スコープ抜けるときに回収しないのは当然
417 :
デフォルトの名無しさん:2014/04/25(金) 15:27:09.22 ID:KcORG+H/
下等で奇怪、見慣れたコードとはまるで違うとおぼしきモノ達。
それら異形の一群を、ヒトは古くから畏れを含み、いつしか総じて“バグ”と呼んだ。
単にスタックポインタが動くだけなのに回収とか‥‥
そもそも回収という言葉は何を意味するのか
420 :
デフォルトの名無しさん:2014/04/25(金) 22:24:27.23 ID:NLMkqq4l
.cppの拡張子でc言語を使いたいのですが(関数のオーバーロードが出来る等 便利な機能があるので)
c++で拡張された部分を使わなければmallocを用いても平気でしょうか?
拡張が見極められるならいいんじゃね
ボクは平気です
言ってることがハチャメチャ
424 :
デフォルトの名無しさん:2014/04/25(金) 22:41:48.11 ID:NLMkqq4l
>>423 自分でも言ってて ん?って感じなんですが
for(int i; ; ++i)
みたいなものだとか
結構限定的に使うって感じなんですが
大まかには std空間とクラスを使わない
もっと言うと.cのものを.cppにかえちゃっても大丈夫でしょうかみたいな感じですかね...
C++ で、新たに予約語になったものが、
たまたまCで使われてると、書き換えが必要になる (new とか delete とか)
C経験者ですが例外・テンプレート・クラスを除く
C++の便利な機能を使いたいです。
C++コンパイラーを使ってCのスタイルでmallocを用いてもよかですか?
427 :
デフォルトの名無しさん:2014/04/25(金) 22:45:39.98 ID:NLMkqq4l
bool型があったりとか(intで代用すれば問題ないのですが)
//でコメントがサポートされてないのもあるし
cppのおいしい部分だけ使いたいんですよね...
>>427 >bool型があったりとか(intで代用すれば問題ないのですが)
C99にもそうでない環境でも、大抵stdbool.hが使えると思いますが。
>//でコメントがサポートされてないのもあるし
今時、そんな例外殆どないでしょう。そもそも、普通C99
430 :
デフォルトの名無しさん:2014/04/25(金) 22:50:46.85 ID:NLMkqq4l
>>429 すんません
ちょっと極端に言いたかっただけです
>>426 いわゆるbetter Cか……別に良いんじゃない?
ただ、mallocじゃなくてnew使おうな
それに、例外・テンプレート・クラスはC++の旨味の大部分だったりするけど大丈夫?
(STLは例外・テンプレート・クラスによる産物なので使わないって意味でOK?)
>>426 むしろ便利なC関数を使えるのがC++の利点だと思う
printfの代わりにcoutしかなかったら間違いなくハゲるし、
mallocの代わりにchar配列をnewするとか、やってられんよ
coutはそうだけどmallocじゃなくnewしようよ
後でオーバーロードしたくなったりするじゃんね
>>432 >printfの代わりにcoutしかなかったら間違いなくハゲる
確かにマニピュレータ使い倒して書式設定するのは慣れないとキツいかもね
でもただ表示させたいだけならcout(ストリーム処理)の方が修正も楽じゃん?
>char配列をnewする
悪いことは言わないからstring使っとけ
まぁ、std::stringの代わりにstd::vector<char>を使うこともあるが。
streamのいい点はstd::complexでも分かるように、自作のクラスも階層的に
一度出力処理を書いておけば事が足りる点だな。
初心者に対して「mallocじゃなくてnewを使え」とだけしか言わないと、free()使った
ままだったりdelete[]使わなかったり、コンパイルエラーにならないところではまりそう。
その手の馬鹿は何度も何度もハマればいいんだよ
malloc が駄目ならalloca を使えば良いじゃない
大抵その時は動いてしまうからたちが悪いんたよ。
VC使いに多いかと。
私も平気にfreadとか使ってました。
>>439 ガシガシ使わないとそうそう問題にはなりにくいからな……>メモリーリーク
こんなコードみつけたんだけど
static const LPCTSTR list[] = {TEXT("AAA"),TEXT("BBB"),TEXT("CCC")};
LPCTSTRの前にconstつけるのと、つけないのでどんな変化があるんですか?
443 :
デフォルトの名無しさん:2014/04/26(土) 01:35:06.71 ID:rnp+GXdW
LPCTSTRにコンストはいってるか?
そうだとしても明記したかったんだろ。
444 :
デフォルトの名無しさん:2014/04/26(土) 01:42:16.09 ID:fIjhv7f7
list[0]++;
>>441 malloc()なんて裸でつかうもんじゃないよ
446 :
デフォルトの名無しさん:2014/04/26(土) 07:47:28.76 ID:fKMdaZRq
// main.c
int main() {
Test test;
test.func();
}
// test.h
class Test {
void func();
};
// test.cpp
void Test::func() {
Test2 tes2;
test2.func2();
}
// test2.h
class Test2 {
void func2();
};
// test2.cpp
void Test2::func2(){
printf("hello\n");
}
447 :
デフォルトの名無しさん:2014/04/26(土) 07:50:59.21 ID:fKMdaZRq
というソースコードがあったときに以下のようなmakefileを書きました.
// makefile
main.o : main.cpp
g++ -c main.cpp
test.o : test.cpp
g++ -c test.cpp
test2.o : test2.cpp
g++ -c test2.cpp
libtest2.a : test2.o
ar crsv libtest2.a test2.o
libtest.a : test.o libtest2.a
ar crsv libtest.a test.o libtest2.a
program : main.o libtest.a
g++ -o main main.o libtest.a
448 :
デフォルトの名無しさん:2014/04/26(土) 07:52:03.99 ID:FDgGm5F+
malloc使うといけないのか?
449 :
デフォルトの名無しさん:2014/04/26(土) 07:56:41.06 ID:fKMdaZRq
ここで,make programすると,Test2::func2がundefined referenceとなってしまいます.
この理由を教えて頂けないでしょうか?
自分では,ar crsv libtest.a test.o libtest2.aでは,Test::funcとTest2::func2が
紐づかないのかなと考えているのですが,,,
尚,makefileの最終行をg++ -o main main.o libtest.a libtest2.aとすれば
成功することはわかっています.
不思議だねw
451 :
デフォルトの名無しさん:2014/04/26(土) 08:14:52.42 ID:qVfVXmNl
以下のコードがコンパイル出来ないのです。
std::make_sharedの引数にthisポインタを使用していることが問題っぽいのですが。。。
どなたかC++にお詳しい方、どうか御教授くださいまし。
#include <iostream>
#include <memory>
class T;
class TS;
class TS1;
class TS2;
class TS
{
public:
virtual ~TS() {}
virtual void change() {};
};
class T
{
public:
T() { ts_ = std::make_shared<TS>(); }
void f1() { ts_ = std::make_shared<TS1>(this); } // <= ここと
void f2() { ts_ = std::make_shared<TS2>(this); } // <= ここに問題がありそうなんです。
void ft() { ts_->change(); }
private:
std::shared_ptr<TS> ts_;
};
452 :
デフォルトの名無しさん:2014/04/26(土) 08:16:25.20 ID:qVfVXmNl
>>451の続きです
class TS1 : public TS
{
public:
TS1(T* t) : t_(t) {}
virtual ~TS1() {std::cout << "TS1 is dead" << std::endl; }
virtual void change() { t_->f2(); }
private:
T* t_;
};
class TS2 : public TS
{
public:
TS2(T* t) : t_(t) {}
virtual ~TS2() {std::cout << "TS2 is dead" << std::endl; }
virtual void change() { t_->f1(); }
private:
T* t_;
};
int main(void)
{
T t;
for (int i = 0; i < 20; i++) {
std::cout << i;
t.ft();
}
std::cout << "END" << std::endl;
}
エラーメッセージは?
454 :
デフォルトの名無しさん:2014/04/26(土) 08:22:01.61 ID:qVfVXmNl
shared_ptrに関するエラーが200行以上出てきます...
クラスも使わないbetter C利用者に対して
mallocの代わりにnewを使えというやつはバカ。
エラー処理の考え方が根本的に違って大きな見直しが必用になるのだから
過剰なものを「こちらがいいんだ!」と押しつける
ありがた迷惑
すいません
>>451 >>452です。
自己解決しました。
単純にstd::make_shared<TS1>とstd::make_shared<TS2>を呼び出す前に
TS1とTS2の定義がなされてなかったためエラーが出ただけでした。
あまりにも長いエラーメッセージだったのでとんでもないことをしでかしているのかと焦って質問したのですが、
なんともないような話でした。
すいません。。。 > <
make_sharedにthisって根本的に間違ってるぞ。
>>456 単にメンバー内のクラスに持ち主の参照を持たせたいだけだとおもう。
>>455 プリミティブ型なら文句は言わんがC++の構造体とかもmalloc使うのは嫌な匂いがするな。
mallocしか使えないなら大人しくC言語使ってた方がいいんじゃね?
そもそもクラス使わないC++に何のメリットがあんの?
ああ、単にコンストラクタの引数ってだけか
>>442 list[] 自体が const になるよ。
>>426 その条件を守っている限りは、問題ないと思いうよ。
*.c と混在させる場合は外部リンケージに注意ね。
C++の場合、構造体もクラスの一種だから
コンストラクタやデストラクタその他メソッドがあっても普通のことで
だから「構造体ならmalloc()でもいい」ってのは言えないんよね
…だから、その構造体が自分が管理するものであって
C形式の構造体としてのみ定義されるのなら、かなあ
上にも書かれてる通り、malloc()と違いnewのそれは例外になるから
例外処理を知らない人にはその場で強制終了みたいなもんなんよね
…まあメモリすら確保できないんなら、大概は強制終了で良いような気もするがw
mallocの件は、単なるメモリ領域を確保したいような場合に、C++なら
newよりもシンプルな手段を取れるってことだろう。
例外じゃなく返り値で判定できるのもいいところ。
当たり前だけど、C++のオブジェクトをmallocで確保するようなことはしないほうがいい。
>>460 なんだ甘えか。
だったらC言語使ってろよって話ですね。
C++の案件にCの知識だけでずっとやっていこうとか思ってるならしね。
>>464 型を決めずに単なるメモリ確保する事って殆ど無いだろ。
例外が嫌ならせめてnew(std::nothrow)使え。それでも例外発生するときはあるがその時はmallocで代替出来ないときだ。
466 :
デフォルトの名無しさん:2014/04/26(土) 15:36:17.91 ID:EyRxebkg
何熱くなってるのか知らんが
C++はベターCとしても使えるようになってるんだしmalloc/free使ってもいいだろ
ここの質問者はプログラミング専門とは限らないんだし
468 :
デフォルトの名無しさん:2014/04/26(土) 15:46:49.33 ID:rnp+GXdW
AsukaLib.rc 99 1 で、AsukaLibがundefined keyword or key nameでは
>>466 いや、だからクラスも使わないC++の何がベターなの?
メリットない使い方してmalloc使うことによって落とし穴にハマるぐらいならC言語使えばいいじゃん?C++覚える気もないみたいだし?
C++信者はこれだから・・・。
例えば、Cの文字列処理は初心者泣かせなので、文字列処理のみ
std::stringを使うのはありだよ
>>470 例外、テンプレート、クラスを使わないって前提で話してたんだけど?
std::string使う時点で全てに当てはまりますやん
472 :
デフォルトの名無しさん:2014/04/26(土) 16:24:09.22 ID:EyRxebkg
>>469 質問者が「関数オーバーロード」を上げてるでしょ
たとえ「それだけ」であっても便利だと思うけど
引数型ごとに関数名変えるのは確かに面倒だし
>>469 基本的には、とにかくやってみろ、でいいんじゃね。
本人が制限つけた上でオーバーロード機能を使いたいって言ってるだけなんだから。
仕事じゃないんだから、そこまで全力で反対しなくても。
>>466 ベターC的な要素って大抵最新のCには実装されているんだよな(例:ブロックの途中で宣言)
関数オーバーロードとかのようにほんのつまみ食いしかしないってんなら知らん
でもまあstd::stringとかstd::vectorとかはちょっと覚えるだけで楽できる機能の代表だったり……
>std::stringとかstd::vectorとかはちょっと覚えるだけで楽できる
例外安全はくそくらえってことですねわかります
考慮する必要がどこにある
バッファオーバーランに比べればどうということはない
std::vector、std::stringを使っただけで例外安全じゃなくなるわけでもなし。メモリ確保に失敗なんていう致命的な例外発生したなら大抵はそのまま終了でいいんじゃないかと思う。
そもそもC言語だけ使ってたら例外と無縁で居られるかと言えばそうでもないし、例えばWindowsだといろんなWin32APIがC言語で使ってても例外出す(SEH)。
kuso *p = (kuso *)malloc(sizeof(kuso)*100);
vector<int> a(100); // ここで例外出たらどうすんの
free(p);
>>479 そのままプロセス終了してなんの問題もないじゃん。
つまり例外安全はくそくらえってこと
はあ?
外に例外出さない事が例外安全ってわけじゃないぞ?
>>478 >Win32APIがC言語で使ってても例外出す(SEH)
参考までに、例外を出すAPIは何?
>>482 例外安全の段階:
[1]不送出保証→そもそも例外を外に出さない
[2]強い例外安全性→失敗しても副作用を起こさず、全データは元の値を保持
[3]基本的例外安全性→失敗すると副作用が起こるかもしれないがデータは有効な値である
>>474 > 関数オーバーロードとかのようにほんのつまみ食いしかしないってんなら知らん
恥ずかしくない?
ちょっと ROM ってなよ。
>>483 InitializeCriticalSection
>>483 int a = 1, b = 0, c;
c = a / b; // SEH発生。
RaiseExceptionでもSEH起こせる。
>>469 流石にクラス使っちゃうとbetterCどころかC++でしか無いと思うが…
>>474 そもそもbetterCって言葉自体が昔のCで生まれた言葉だからな
まあ、現代ではC++環境をC言語として使わざるを得ないケースもある
その結果C99ではなくbetterCに成らざるを得ないって事情もあるけど
>>487 undefined behaviorの挙動や
明示的に例外だすAPIの話をされてもねぇ
SEH の __try 〜 __finally を実装してる Cコンパイラで
どうSEHを捕まえてるのか良くわからんな
>>489 > 明示的に例外だすAPIの話をされてもねぇ
意味わからん
toupperやtolowerの全角文字版って有りますか?
>>492 全角文字の文字コードは何?JIS?shift-JIS(CP932)?, EUC?, それとも?
よくある、計算結果の下5桁を〜の問題をとく上で、
10進数で表すと5桁以内の数字A の二乗の下五桁をとって新しいAとし、・・・
をできるだけ早く何回も繰り返す計算をC言語で実現したいです。どんな方法が最適でしょうか?
素直に
int A = 765 //初期値
for(i=0; i<10000; i++){
A = (A*A) % 100000;
}
とするのが一番早いのでしょうか
gmpだな
最適化された式を求めるのは数学者がやるのか?
>>494 Aが符号付き32bitで 46341 以上の時、また、
Aが符号無し32bitで 65537 以上の時、
A * A はオーバーフローするね。
A = (A * A) % 100000;
で、次のAは 100000 の剰余なのでありえる。
Aを64bit値にするか、宿題の制限で32bit整数しか
使えないのなら自前でやるか
>>494 オーバーフローを回避するにはキャストすると良いよ
A = ((long long)A * A) % 100000;
ていうか素で計算しちゃ駄目な
パズル寄りの問題なんじゃないの
long double という128bitがあるのに
intには128bitがないのでしょうか?
long doubleが128ビットとは決まっていないし
intが128ビットでも問題ない
またこいつか
vs は80bitだったし、今はdouble と一緒だよ。
>>504 >vs は80bitだったし
本当か?単にFPUの内部処理桁というだけで、表からは触れないんじゃなかったか?
win16時代のms-c系は80ビットだった
508 :
デフォルトの名無しさん:2014/04/28(月) 20:08:02.05 ID:eYjErRwy
windows formに関してなのですが
//Form1.h
private:
PictureBox^ p;
System::void Form1_Load(System::Object^ , Sytem::EventArgs^ e)
{
p = gcnew PictureBox;
p->Dock = DockStyle::Fill;
p->BackColor = Color::White;
p->Paint += gcnew System::Windows::Forms::PaintEventHandler(this, &Form1::display);
this->Controls->Add(p);
}
void display(Object^ s, System::Windows::Forms::PaintEventArgs^ e)
{
draw(e, p);
}
//graph.cpp
void draw(System::Windows::Forms::PaintEventArgs^ e, System::Windows::Forms::PictureBox^ p)
{
System::Drawing::Graphics^ g = e->Graphics;
//描画処理
}
のように分割コンパイルしても大丈夫ですか(一応エラーは出なかったのですが)
省略する部分のチョイスがおかしいので読み取れないが
エラーも警告も無ければ大丈夫じゃない?
510 :
デフォルトの名無しさん:2014/04/28(月) 20:34:54.25 ID:eYjErRwy
>>509 ありがとうございます
たしかにチョイスしているところが微妙ですね...
要はForm1.hにガリガリ書きたくないので外部ファイルに委託したかっただけです
要はC++/CLIでポトペタし生成されたコードが
汚ならしく我慢できないって話でしょ?
それは昔から言われてる事で改善される気配もないから
GUI周りはC#で書くのが基本だよ
512 :
デフォルトの名無しさん:2014/04/28(月) 20:55:46.98 ID:eYjErRwy
>>511 そうなのでしょうね...
ところで あまりC#には詳しくないので、
.NETを使う上ではc++とc#の実行速度に違いとかは出てくるのでしょうか
基本同じと見ていいよ
ど忘れしたが3文字のなんだったかな、IronPythonで使われてるソレは遅い
でも、C#,C++/CLI,VB.NET,Boo,F#...なんかは同等とみていい
C++/CLIのメリットは
速度じゃなくて、P/Invokeでラッパー書かれることが無いようなマイナーな
C/C++なライブラリをそのまま扱えるので手抜きが出来る
正直それだけだと思うよ
514 :
デフォルトの名無しさん:2014/04/28(月) 21:12:51.02 ID:eYjErRwy
ありがとうございます
c#はシンプルに書けるので良いですよね
いままでC/C++を使っていましたが
確かにC#に移行してみるのも手ですね
>>513 3文字っつーとDLRかな
まああれが遅いのはしゃーない気がする
516 :
デフォルトの名無しさん:2014/04/28(月) 23:41:11.77 ID:rB8lTHTI
switch文で意図的なフォールスルーをするとき
なにかわかりやすい目印を書きたいんだけど
みんなはどうしてる?
517 :
デフォルトの名無しさん:2014/04/28(月) 23:42:52.41 ID:nYC6TNjH
// fall through
>>515 それそれ
しゃーない部分があるのは承知してるし
場合によっては使える状況もあるだろうから否定はしない
ただ、用途に合わない人にとって
裏切られたというか騙された感を持つのはこれもまたしゃーない部分なんじゃないかな
ソレ系のものはソレである事をなるべく目立たないよう擬態する傾向にあるよね
suffixにソレを付ける命名規則を義務付けて欲しいよマジで
手間が増えるだけで嫌がらせでしか無い
ガベコレが自動でほぼ制御できないjavaとC#で長く経験をつんできた開発者が
C++の原始的なリソース管理に慣れるにはどういう学習素材が推奨されますか?
メモリ以外のリソースに関しては
C++もJavaもC#も変わらないと思うのだが
コンストラクタ、デストラクタがあるからJavaより楽だよな。
Javaは原因を突き止めるのが非常に困難なメモリリークに弱い印象
実際すごく苦労している
>>520 質問がおかしい
> JavaとC#で長く経験をつんできた開発者
であるならばCは使えるでしょ
初歩的すぎる質問ですがVC++2010で標準ライブラリを使うとき
#include の前に必要な準備はありますか?
(どこかからヘッダファイルをダウンロードして突っ込むとか)
>>525 標準ライブラリなら何も要らないよ
普通に「#include <stdio.h>」とか書けばいい
と言うか他のコンパイラでも標準ライブラリは
デフォで組み込まれてるだろw
JavaとC#の経験しかなくて、オブジェクト指向の基本は理解してるつもりだけど
C++でコード書くと必ずメモリリークが起ります。
こんな私が読むべき基本書籍があればご教示ください。
528 :
デフォルトの名無しさん:2014/04/29(火) 05:58:15.66 ID:04fcb81y
newなどを使わず、STLを使う。
newしたものは必ずスマポに入れる
newしたものはグローバル変数にいれる。そしてdeleteしない。絶対にしない。
それじゃダメだろ
64ビットあれば使い切れないから大丈夫。使い切るころには128ビットになってる。
>>527 関数別にしてその関数をループで何回も呼んで
どの関数でリークしてるか確認
動的確保されたメモリのリークは_CrtSetDbgFlag使う
536 :
デフォルトの名無しさん:2014/04/29(火) 18:35:47.38 ID:lGzouSbD
素人だがvectorじゃだめなのん?
そんなレベルの素人は引っ込んでろ(`・ω・´)!
538 :
デフォルトの名無しさん:2014/04/29(火) 18:55:46.21 ID:lGzouSbD
540 :
KAC:2014/04/29(火) 19:16:34.41 ID:3cTlepGQ
>>527 その手の手法に関するいい書籍は見たこと無いな。
とはいえ、さほど難しい話じゃ無い。
忘れててもなんとかなるような案が上に色々紹介されてるが、
基本的にはdeleteを忘れなければいい。
処理の初めにnewしたら処理が終わってdelete
クラス生成時にnewしたらクラス消すときにdelete
というように、作るタイミングと消すタイミングは対にできる。
(初めに0初期化して適宜newする方法でも同じ考えでいい)
プログラムで何かをロックしてロック解除を忘れることは無いよな?
同じようなイメージで扱えばいいだけだよ。
541 :
デフォルトの名無しさん:2014/04/29(火) 19:17:16.90 ID:lGzouSbD
本末転倒ではあるがnewを使いたければ素直にgcのあるものを使えば良いと思うんだけど...
そもそもjava c#と違ってnew避けるべきだと思うんだが速度は落ちるし
一応gcを実装するライブラリもあったような記憶はあるけど
いきなりc++の設計に手を出すんじゃなくてcから手を出した方が良いと思うんだが素人だけど
>>539 あとスマポって万能なの?
循環参照はだめで、「弱い」参照とかいろいろ駆使している模様、というかそういうときは Boehm GC でいいと思う
543 :
デフォルトの名無しさん:2014/04/29(火) 19:27:46.11 ID:lGzouSbD
>>542 そうそれ
ところでBoehmGCには弱点とかある?
544 :
デフォルトの名無しさん:2014/04/29(火) 19:39:02.96 ID:04fcb81y
速度はどれだけ違うんだよ?
STLの標準装備のコンストラクタ、デストラクタでは不可能なことはなによ?
細かいことかもしらんが
>STLの標準装備のコンストラクタ、デストラクタでは不可能なことはなによ?
とはなんぞ
546 :
デフォルトの名無しさん:2014/04/29(火) 19:42:08.49 ID:lGzouSbD
>>544 速度はどれだけ違うんだよ←実行する環境によって変わるだろ
547 :
デフォルトの名無しさん:2014/04/29(火) 19:56:20.09 ID:04fcb81y
>>545 動的確保して自動で解放するが。
char *p = new char [10000];
int *q = new int [10000];
↓
string p(10000,'\0');
vector<int> q(10000);
速度は実測が基本
>>547 それはコンストラクタ・デストラクタとは言わない(だから細かいことかもと言った)
>>547 あと出来ないこととしてポリモーフィズムを使うクラスの動的確保が思いつかないのはどうかと
551 :
デフォルトの名無しさん:2014/04/29(火) 20:08:30.04 ID:lGzouSbD
クラスAと派生Bがあって
管理はAだけで行いとして
new/deleteを使わずvectorだけで行えるかと言ったら
行えないでしょ
553 :
デフォルトの名無しさん:2014/04/29(火) 20:26:46.08 ID:lGzouSbD
たしかに
554 :
デフォルトの名無しさん:2014/04/29(火) 20:33:46.15 ID:04fcb81y
わけわからん
できれば簡易なコードをのせてくれないか
class A
{
vector<B>とvector<A*>でおk
それはポリモーフィズムの有り難みがないなあw
スマポやptr_で突っ込めばいいじゃん
一応条件は満たしてるが誰もやらんわな
new使ってvector<unique_ptr<A>>にするわ
boost::ptr_vectorでしょポリモーフィズムしたいのなら
>>556 ああそれスラッシング起きてますわ
エラーにはならない
>>563 スライシングでは?
と突っ込んでみる。
スラッシングってメモリが足りなくて仮想記憶が動きっぱなしになってしまう状態だよな
スワップひどい常態か
vector<bool>で
1000番目だけtrueにしてあとは0にしたいんですけど、
push_backを1000回繰り替えさないと駄目なんですか?
まとめて入力する方法があれば数十回0をコピーするだけでいいと思うのですが。
>>567 そんなことは無い。いろんなメンバ関数があるからちゃんとドキュメント見て好きに使えばいい。
>>567 v.resize(1001,false);
v[1000]=true;
std::fillはvector<bool>に最適化されてますか?
いいえ
>>571 標準ではそんなことは規定されていない。実装によっては最適化されていることがあるかもしれない。
なんにせよ、速度は実測が基本。
2130706433を127.0.0.1の文字列に変換したいのですが、どのようにしたら良いでしょうか
よろしくお願いします。
>>575 256との剰余を取ってから割ることを繰り返せばおk
>>575 puts(inet_ntoa((struct in_addr){.s_addr = inet_addr("2130706433")}));
テンプレート関数をintやdoubleのような特定の型に制限する方法はありますか
Javaでいうとextends、C#でいうとwhere T :みたいなもの
enable_if
int i = 0; WCHAR num[2]={0}; LVITEM item = {0};
_itow_s(i,num,10,sizeof(num));
item.pszText = num;
↑
→_itow_s(i,num,sizeof(num), 10);
って誘導先のスレに質問が移動してくる前に書いちまったw
584 :
デフォルトの名無しさん:2014/05/01(木) 04:21:23.22 ID:w9/KPUlo
はいはーい
struct st1 {
int a;
struct st2 *b;
};
struct st2 {
int a;
struct st1 *b;
};
のような参照の仕方は仕様的に問題ありませんか?
一応gccではできたっぽいんですが、ほかのコンパイラとかで使っても大丈夫ですか?
どーも自信持てなくて、、、
おk
st1の前に、st2を前方宣言したら?
587 :
586:2014/05/01(木) 06:29:36.93 ID:9zM4+Fav
あ、ポインタは32, 64ビットのどちらかで、
型が決まっているから、前方宣言いらんのか
ポインタでも宣言は必要
ではない
>>582-583さんありがとうございます。こちらで答えてくれていたとは思いませんでした。
このレスを参考に
int i = 0; WCHAR num[2]={0}; LVITEM item = {0};
for(i=0;i<20;i++){
_itow_s(i+1,num,10,sizeof(num));
item.pszText = num;
item.iItem = i;
ListView_InsertItem(hList , &item);
}
としたところプログラムが起動しなくなってしまいました。
iの中を確認したところ_itow_sの時にiが初期化してしまうために無限ループが起きてしまっていると思うのですが、
_itow_s()にint変数を初期化する仕様があるのでしょうか?
初期化するようならint変数をもう1個用意すれば動くのですが、初期化の伴わないintからWCHARへの変換を行う関数というものは無いのでしょうか?
どなたかよろしくお願いします
ヌルターミネートまでいれると最低3文字は必要だろ
std::wstring strnum = std::to_wstring(i + 1);
item.pszText = const_cast<LPWSTR>(strnum.c_str());
バッファあふれが原因
itow_sの引数の順序を間違っているのと文字数を渡すべきなのにバイト数を渡している
ウィンドウHWND hWnd;をDestroyWindow()を使って破棄した場合、
再びhWnd=CreateWindow()という風に新しいウィンドウを作る事は出来るのでしょうか?
それともhWndというハンドル自体が破棄されるのでしょうか?
スイッチによって子ウィンドウを切り替えるアプリを作ろうとしているのですが、
スイッチを押す度にウィンドウを破棄→生成とする設計にするべきなのか
最初に子ウィンドウを複数作ってスイッチによって見えるウィンドウを変える設計にすべきなのかが判断付かないので質問しました。
どなたかよろしくお願いします。
597 :
デフォルトの名無しさん:2014/05/02(金) 15:42:03.73 ID:mphOrT6X
出来る
コリエイトしたものを使い回しているのではなく新たに生成しているのに
出来ないと思ったのが不思議
599 :
デフォルトの名無しさん:2014/05/02(金) 16:06:08.20 ID:WERRY4Df
C++で画像を表示する場合、どれを使ったらいいの?
DXライブラリを使わない場合で
gdip
>>601 最初に複数作成
→切り替えは表示非表示
→終了時に破棄
のがスマートと思う
603 :
デフォルトの名無しさん:2014/05/02(金) 16:50:12.77 ID:WERRY4Df
directdrawって使わない方がいいの?
代わりに何使えばいいの?
文字列の幅を求める関数を調べたらGetTextExtentPoint32()ってのが出てきたのですが、
この関数の第一引数の「デバイスコンテキスト」って何を入れたらいいのでしょうか?
また、文字列の幅を調べたい理由はリストボックスの横スクロールを使いたいと思ったからなのですが、
リストボックスの文字サイズってどうやって取得したらいいのでしょうか?
デフォルトのフォントを調べたところ、高さと幅の数値に0が入っていて自動的にサイズを調整する方式みたいなので困っています。
一度に二つ質問してしまってすみませんがよろしくお願いします。
int hoge(const string& str){
hoge<char>(str);
}
int hoge(const wstring& str){
hoge<wchar_t>(str);
}
template<class T> int hoge(const basic_string<T>& str){
//処理
}
みたいな書き方はありですか
>>606 コンパイルしてみればわかるんじゃないの?
そうじゃないなら、何がわからないのか書いてもらわないと。
C++のオーバーロード解決は明示的に指定しない限り
テンプレートより普通の関数優先で合ってる?
>>604 Windows プログラミングの「画面描画の基礎」を少し勉強したほうがいい
断片的な知識でやると地雷だらけのバグアプリになる
613 :
【重要】:2014/05/04(日) 15:17:55.72 ID:owW4rydZ
hogeは禁止されています、使用しないでください。
万が一hogeが書き込まれても、スルーしてください。
相手にするとあなたも荒らしと同じ扱いになります。
なお、hogeはNGワードに追加しておくことが強く推奨されています。
嫌hogeをNGIDにするととても見やすいなーこのスレ
615 :
デフォルトの名無しさん:2014/05/04(日) 16:16:35.49 ID:6pFdiYZZ
#include <pshpack2.h>
ってどういう意味あるの?
616 :
超重要:2014/05/04(日) 16:37:15.78 ID:Av6aDk2F
hogeは禁止されていません。hogeを妬むチョーセン人がチョーセンルールを押し付けていますが、
日本人は従う必要はありません。
>>615 pshpack2.hをインクルードファイルサーチパスから探してインクルードする。
俺に向かってhageと言うなよ、わかったな
619 :
超重要:2014/05/04(日) 20:19:26.89 ID:Av6aDk2F
このスレではハゲは尊称
620 :
デフォルトの名無しさん:2014/05/04(日) 23:03:47.87 ID:vSRu9IqQ
チョーンジン荒らしのくせにハゲとは生意気な
貴様が禿げるのは10年早い
622 :
デフォルトの名無しさん:2014/05/05(月) 12:30:19.69 ID:Mu2ScZdD
nullptrをdeleteしてもdelete[]しても問題ないですよね?
>>622 問題ない。
malloc()/free() で free(NULL); が「なにも起こらない」と定義されて以来の伝統だ。
初心者が nullptr とか口にする時代がきていた
VC++ 2010 EEを使用してる環境で
#include <math.h>と記入しているのに
acosh()が未定義になります
使用したい場合はどうすればいいですか?
>>626 1.2013に替える
2.
#include <math.h>
namespace std{}//他との互換のため
using namespace std;
static double unko = acosh(1.0);
3.
#include <cmath>
static double unko = std::acosh(1.0);
>>627 vistaなので1はできない
2,3も未定義と出たのでlog使った式に置き換えて対処しました
ありがとうございました
>#include <math.h>と記入しているのに
>acosh()が未定義になります
そりゃmath.hヘッダーはおろか標準ライブラリに
acosh()なんて無いからな
>>630 > 626 名前:デフォルトの名無しさん[sage] 投稿日:2014/05/05(月) 17:29:42.81 ID:ic/qAIV8 [1/2]
> VC++ 2010 EEを使用してる環境で
この手のやつはバージョン見て
boostあたりとプリプロセスで切り替えるのが定番なんじゃないの
> バージョン見て
ってのはちと適当すぎた
OS、コンパイラ、バージョン、スイッチ、envあたりも見なきゃならんね
Visual C++でコンパイル出来ているのにCライブラリがリンク出来ないとなると
/NODEFAULTLIBオプションしか思い当たらない。
VisualStudioでacoshが使えるようになるのは2012からなんですよ
なるほど
ISO/IEC 14882:2011およびISO/IEC 9899:1999
で規定されたacoshが無いコンパイラは捨てるしかあるまい
acosh(x) = log(x + sqrt(x2 - 1))
まさかの
>>637の頭の悪さ、コミュ障っぷりには脱帽するしかない
まさかの
>>638の頭の悪さ、コミュ障っぷりには脱帽するしかない
>>637 細かいが
acosh(x) = log(x + sqrt(pow(x, 2) - 1))
だな
VCで数値演算を気合を入れてするようなすごい奴いないから2012からサポートなんだろ
ついでにそんな奴がWin使いにいるのか?
精度的にはsqrt()の引き数はx * x - 1にしておきたいところだな。
興味本位で物理演算?
自由落下とか空気抵抗ありとか
644 :
デフォルトの名無しさん:2014/05/07(水) 15:46:20.67 ID:XxSBZtfo
>>641 学生?職業プログラマで普通に居るよ 例えば俺とか
別に凄いことでもなんでもない
ミサワ風イラストつけて頼む
2chの住民平均以下の生活水準の奴にはここが居心地良いのかと
>>644 5年前までは数値演算ならintelかPGIコンパイラと決まっていたんだが、最近MSも追い付いたのか?
648 :
デフォルトの名無しさん:2014/05/07(水) 23:04:31.89 ID:XxSBZtfo
>>647 まあスピードが必要なところは外部ライブラリ使うことになるけどな
それはVCだろうがICCだろうが同じ
649 :
デフォルトの名無しさん:2014/05/07(水) 23:15:32.84 ID:QqPD6ddY
お世話になります。
ロベールのC++入門本を2週しました。
プログラムはすべて打ち込んで動作確認したり一部改変したりして
学習したのですが、どうしても自作プログラムが書けません。
C言語でしたらプロとして通用するレベル(PG歴9年です)なのですが、
C++でまとまった意味のあるプログラムが書けません。
どのような訓練をすればいいでしょうか?
650 :
649:2014/05/07(水) 23:17:26.44 ID:QqPD6ddY
C++で書きたいのはH8のプログラムです。マイコンです。
>スピードが必要なところは外部ライブラリ使うことになるけどな
なんかワロタ
GMPとか勝てんだろ
パフォーマンスが必要なところは他任せで、自分がやるのはそうじゃないところ
ってゆとり開発なら当然だよね。 いまはゆとり開発が主流だしね
表計算をしたいという要求に対して
オペレーティングシステムと表計算アプリケーションの開発を
提案するんだろうか。
大切な所を購入ソフトに頼るのはゆとりとか言って
誰がそんな事を言っているのだろうか
よーしパパ、
FFTをループのアンローリングしゃうぞー
Haswellでループのアンロールやってみたけどあまり効果がなかった
Pentium4の時はすごく違ったのになあ
>>659 適当にWikipediaでアーキテクチャ見てみた限り、
分岐予測が改善されたのと、パイプライン段数が減ってるから
予測ミスのペナルティがpentium4ほど大きくないからかな
>>650 Cでなら書けると言い張るなら、Cで書けばいいじゃん。
どうしてもC++にしたいなら、一度Cで書いてから次の点に留意して書き直してみるとか。
・グローバル変数やデバイスのような単一資源はクラス化する。
・ネームスペースを活用する。
・GPIOのような固定値で表現できる資源はテンプレート関数化する。
いま思いつくのはこんなところかな。
662 :
デフォルトの名無しさん:2014/05/08(木) 01:42:39.49 ID:1wrEfjwT
実践で全く役立たずのゆとりにゆとり呼ばわりされちゃったよ(笑)
664 :
デフォルトの名無しさん:2014/05/08(木) 01:47:45.96 ID:1wrEfjwT
偉そうなことほざいてるゆとりはFFTWやIPPより高速なFFTコードをアップしてからにしてくれな
C言語で
int id=001;
のように変数に10進数を与えたいのですが、10進数ではなく8進数として判断されてしまいます。
この0から始まる値を10進数として与えるにはどうすればいいのでしょうか。
すみません。よろしくお願いします。
00を消せばいい
車輪の再発明して何になるん
パフォーマンス、サイズ、ライセンス諸々
用途次第でよくある話じゃない?
669 :
デフォルトの名無しさん:2014/05/08(木) 02:12:06.73 ID:1wrEfjwT
今時マイコンだって数値計算用のライブラリはチップメーカが最適化されたものを用意してるのが普通
C/C++の標準関数を使わなければいけないことのほうが稀
>>669 だからこそ、ゆとりやドカタでもそこそこのパフォーマンスを出せるものが作れる
非常に初歩的な質問で申し訳ないです
int st[10][10]という配列の一行目に、2014050810という値を代入したいのですが
書き方を教えていただけませんか
>>671 1行目とは何を指すのか。
配列を行列と見做すのならrow-majorなのかcolumn-majorなのか。
>>671 ・「2014050810」が配列の各要素の数字をまとめたものの場合→
素直に1つづつfor文で回してコピーしろよ
・「2014050810」が20億1405万810の場合→
10で割るのと剰余をとるのを繰り返して配列1個づつにコピーしろよ
(注:20億1405万810はint型変数1個にギリギリ入るので、
20億1405万810を配列の各要素に代入したい場合は
for文を回して(ry)
・「2014050810」が文字列(C言語ならchar型の配列)の場合→
'0'を引くとかstrtolとかで数字に変換しろよ
・
674 :
デフォルトの名無しさん:2014/05/08(木) 05:43:59.23 ID:G9NaZtKr
>>661 おー具体的なアドバイスありがとう!!
そうやってくんだねぇ
皮肉を書いたら感謝されたでござる。
>>673 てっきり1セルに入れる値と思い込んでいた俺のエスパー力はまだまだ未熟
>>676 charをintにキャストする場合を忘れてたんだぜ……
scanf関数が良く理解できないのですが、
何方かご教授いただけませんか
よろしくお願いします。
scanfってなんで未だに言語仕様の中に残ってるんだろう
少し前の入門書でscanfやgetsがかなり感情的に否定されてたから
洗脳されちゃった人かな
熟練者が内内で使う分には優れているが
入門書なんかで扱うべき代物ではないな
入力処理以外の部分にフォーカスされたトピックがあって
ちゃちゃーっと とりあえず入力するのに使うと
C++でゲームを作っているのですが
ゲーム本編のクラスに細かい機能のクラスを追加したかった場合
どのように追加したクラスを本編クラスにくっつけるものなのですか?
本編クラスのメンバーでその追加クラスを生成すれば良いですか?
c言語で、入力された値が1桁〜3桁までの、整数以外なら弾くプログラムを作りたいのですがどうしたらよいですか?
なるべくstdio.hのライブラリのみで作りたいです。
入力をchar型に入れればいいのは分かるんですが…。
宿題は、宿題スレへ・・・
687 :
片山博文MZバグロボ ◆T6xkBnTXz7B0 :2014/05/08(木) 16:30:35.39 ID:o5H0kOM9
>>684 本編との共通データと共通インターフェイスを分析せよ。所有、仮想関数、継承などを使う。
688 :
デフォルトの名無しさん:2014/05/08(木) 16:34:02.02 ID:PCqjElIP
C言語をプログラミングを始めたばかりなんですが
ピラミッドをfor文で作る際にln が段数で
for(i = 1; i <= ln; i++){
for(j = ln - i; j > 0; j--)
{
printf(" ");
}
for(j = i * 2 - 1; j > 0; j--)
{
printf("*");
}
putchar('¥n');
}
のi * 2 -1とかっていうのはパッと見て思いつくものなのでしょうか?
慣れればすぐに思いつけるものなのでしょうか?
689 :
片山博文MZバグロボ ◆T6xkBnTXz7B0 :2014/05/08(木) 17:04:48.57 ID:o5H0kOM9
>>685 1文字ずつ、0-9の数字かどうか確かめる
そしてそれが、1-3個あればよい
文字列(ascii)から数値(int)へ変換する関数
int atoi( const char *string );
これで数値へ変換できたら、0-999であるか確かめる
>>688 i * 2 - 1 は、1, 3, 5, 7, 9個の、"*"を表示する
なぜ、1, 2, 3, 4, 5じゃダメなのか?
理由はその作者にしかわからない
>>690 1,2,3,4,5じゃ綺麗なピラミッドにならないだろう。
>>688のコードを実行してみたら分かる
>>688は自分でそのピラミッドを表示するコードを書いてみて
他の人に見てもらったら、多分何人かはなんでそういうコードを
思いついたか疑問に思うだろう。
問題解決の道筋は一つとは限らない(最適解はあるだろうが)。
*を全角にすればイケるわけだから
結局の所は作者の好みだって言ってるんじゃない?
C++でzip/unzipのライブラリありますか?
DotNetZipみたいな便利なのがあればいいのですが。
zlib
>>682 それ言い出したらCの入出力なんて……
>>684 「細かい機能のクラス」ってなんなんだよ……
別にクラスは関数セットってわけじゃねーんだぞ
>>687も「設計しなおせ」(要約)って言ってるわけだし
>>690 atoiにはstdlib.hが要るんですがそれは……
つかstdlib.hにはstrtolがあるんだからそっちを薦めるべき
(宿題で利用できる関数が制限されてたら仕方がないが)
>>671は
int st[10][10] = { {2, 0, 1, 4, 0, 5, 0, 8, 1, 0} };
としたいんじゃないのか
ハッシュは可逆とか言ってた子まだいるのかなこのスレ
>>698 【レス抽出】
対象スレ:【初心者歓迎】C/C++室 Ver.89【環境依存OK】
キーワード:ハッシュ
検索方法:マルチワード(OR)
抽出レス数:0
【レス抽出】
対象スレ:【初心者歓迎】C/C++室 Ver.90【環境依存OK】
キーワード:ハッシュ
検索方法:マルチワード(OR)
698 名前:デフォルトの名無しさん[sage] 投稿日:2014/05/08(木) 20:22:44.38 ID:iWHr/ksT
ハッシュは可逆とか言ってた子まだいるのかなこのスレ
抽出レス数:1
誰がそんな事言ってるの?
cryptの挙動見れば無理ってわかるのにな
>>695 ありがとうございます。
zlibというのはDotNetZipみたいにmemory streamに対して
zip/unzip出来るでしょうか?
できるからググってドキュメント読んでこい
C++のMemoryStreamってなんだ
CHRNからおさらいした方が良さげだな
IStreamとか?
>>700 それに使われているのはバリエーションの一部であって
hash(...) { return ... }
こんな受けたものをそのまま生で返すのも
立派なハッシュ関数ですよ
std::vectorをバッファーにしたistreamとかたまに使うな。
派生と継承ってなにが違うの?
詳しく教えて
710 :
708:2014/05/09(金) 00:59:28.44 ID:S4GfSN5p
>>708 美文書の問題なだけなので、あまり気にしなくても良い気がする。
派生する・されるのはクラス
継承する・されるのはメンバ
ってだけの話。
Aを基にして出来たが同じではないBはAの派生
Aと同じBはAの継承
適当だが
英語では派生も継承も derived とかのようだが‥‥なんで訳を分けたの?
おまいは二つ前のレスも読めないのか
inherit(派生) と derived(継承した)
と言う用語が使い分けられている。
ついでに"derived"は規格中で特別な用語(10p2)
716 :
デフォルトの名無しさん:2014/05/09(金) 02:57:51.81 ID:1HcIeJu0
>>717 逆だった。
ちなみにinherit(継承)/derive(派生)の使い分けはC++・Java・C#で共通。
UMLだとクラス間の関係にもにinheritanceを使用していたような
クラス B はクラス A から派生しており、メンバー X を継承する
だろ?
雰囲気とか、大丈夫か?
"単継承"、"多重継承" の言葉が相手にしてるのはクラスだろうけど...
うーん?
10.1 Multiple base classes『Note:The use of more than one direct base class is often called multiple inheritance.』
※multiple inheritanceは斜体ではない
つまり多重継承はC++の規格の用語とは違う(たぶん)。
多重継承は
同じシグネチャを持つメンバをそれぞれの親から持ち込んで〜
っていう例の問題を指すんじゃないの?
> inherit(継承)/derive(派生)
単にこれシノニムとして読んだんじゃいかんのか。