スレを勃てるまでもないC/C++の質問はここで 22

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
2デフォルトの名無しさん:2014/05/13(火) 01:21:53.71 ID:BK7bod/g
< `∀´>ニダー
3デフォルトの名無しさん:2014/05/13(火) 18:18:10.74 ID:A9K77IIM
さんだーぼるとー
4デフォルトの名無しさん:2014/05/14(水) 05:50:20.23 ID:Xzsp2rfd
CでUnixコマンドと同じ機能を持ったプログラムを作りたいんですけど
何か良い解説が載ってある本かサイトはないでしょうか?
5デフォルトの名無しさん:2014/05/14(水) 08:15:17.76 ID:+P9aBJqU
該当するUnixコマンドのGnu実装のソース読めば?
Cで書かれてるの多いし。
6デフォルトの名無しさん:2014/05/14(水) 11:48:07.31 ID:mJzoB0fa
system();関数でコールするとかw
7デフォルトの名無しさん:2014/05/14(水) 18:42:46.24 ID:Nzt71bWa
C++11ではnullptrというものが追加されたそうですが
null_ptrではないのには何か理由があるのですか?
どうでもよいことですが気になってしまいます
8デフォルトの名無しさん:2014/05/14(水) 20:16:13.60 ID:2QlwcCvG
タイプする文字数が少ない
9デフォルトの名無しさん:2014/05/15(木) 18:22:05.94 ID:5sMFAW9N
素直に null にしとけっちゅうねん
10デフォルトの名無しさん:2014/05/16(金) 15:43:55.66 ID:vCeiEc1O
ポインタは全て動的っで
最終的に解放が必ず必要って解釈して良い?
動的じゃないポインタってある?
11デフォルトの名無しさん:2014/05/16(金) 16:14:28.33 ID:wig+3ePF
ある。
int a;
int *p = &a;
12デフォルトの名無しさん:2014/05/16(金) 16:16:44.29 ID:WW/l1jAv
ポインタは宇宙なので単一に矮小化してとらえることはできない
137:2014/05/16(金) 19:44:41.34 ID:ZlViVWqR
やっぱりタイプくらいしかないんですね…
文化の違いなんでしょうか?
ありがとうございました!
14デフォルトの名無しさん:2014/05/16(金) 19:53:39.11 ID:iSjldn++
質問です
/*
 整数15と37の和を表示する
*/
#include<stdio.h>

int main(void)
{
printf("%d",15+17); /*整数15と37の和を10進数で表示*/

return(0);
}



とhspスクリプトエディタにうちこんだのですが

#HSP script preprocessor ver3.32 / onion software 1997-2013(c)
#Use file [hspdef.as]
#Error:invalid include suffix in line 4 [???]
#Fatal error reported.

となってしまいます よかったらだれかおしえてください
return(0);
15デフォルトの名無しさん:2014/05/16(金) 20:16:19.66 ID:WW/l1jAv
16デフォルトの名無しさん:2014/05/16(金) 20:43:46.63 ID:wig+3ePF
>>14
C言語とHSPを混同するな
17デフォルトの名無しさん:2014/05/16(金) 22:48:00.00 ID:TJX0UH9b
分母が0かどうかを判定するのに==0で等値比較をするのは、
==0でtrueでにならない限り計算ではエラーにならないと思うので
問題ないですよね?
18デフォルトの名無しさん:2014/05/16(金) 23:01:56.31 ID:ZLut8i0j
>>17
型が double で、非常に小さな値のときに、
==0 は false だけど、演算結果が無限大になることはあるけど大丈夫?
19デフォルトの名無しさん:2014/05/17(土) 00:16:34.85 ID:V4dexxPJ
プログラムとあんまり関係ないけど、
シミュレーションプログラムでの命名について
アイデアください

時間を無次元化したら
stepって単位にするのが一般的だと思うけど
長さを無次元化したら
なんて名前にしたらいいと思う?
20デフォルトの名無しさん:2014/05/17(土) 00:21:01.02 ID:R4olBPWV
>>19
それぞれtとlでええんとちゃう?
lが嫌ならmとかで
21デフォルトの名無しさん:2014/05/17(土) 00:21:24.12 ID:YyEzaSn4
hex
22デフォルトの名無しさん:2014/05/17(土) 22:48:54.63 ID:Twx7r9t2
無次元と無名数は違うんじゃないだろうか?
23デフォルトの名無しさん:2014/05/17(土) 23:35:50.73 ID:jvmVGTrf
かなり初歩的な質問でごめんなさい。
vectorに配列型を指定した場合の挙動が分からなくて困っています。

正確には
std::vector< double[2] > vec1;
みたいなコードを書いたんですが、これはやってはいけないコードなのでしょうか?
push_backやresizeを呼ぼうとするとどうやってもエラーで進まないです。引数有りコンストラクタも呼べません。

素直に
vector<double> vec1[2];
とやるべきなのでしょうか?
また、テンプレートに配列型を指定できないのはvector特有の性質なのでしょうか?
24デフォルトの名無しさん:2014/05/17(土) 23:50:44.42 ID:R4olBPWV
>>23
<>を使うってことはtemplateを使ってるんだから、型名以外はダメだったような……
 vector<double> vec1[2];
とやると、vectorな変数が2個できるから、使える添字の範囲は
vec1[0〜1][0〜?]となる(?はvectorなので不定数)。一方、
 vector< vector<double> > vec1; //コンパイラの解釈的に空白は必須だったはず
と二段重ねにすると、resize()でサイズを弄れるから、例えば
 vec1.resize(3);
 for(int i = 0; i < 3; ++i){
  vec1[i].resize(2);
 }
とすると、使える添字の範囲はvec1[0〜2][0〜1]となる
25デフォルトの名無しさん:2014/05/18(日) 02:00:23.39 ID:3fQTMrTl
>>24
ありがとうございます
template自体が配列使っちゃいけないんですか
現在newを使ってるんですが、ソースの書き換えができない段階に来ており
添え字の問題を解決するために結局operator[]を定義したクラスを作ることにしました
26デフォルトの名無しさん:2014/05/18(日) 03:51:33.54 ID:nSMECTwp
最近C++の勉強を始めました。開発にVisualStudio2008を使っています。
普段はJavaを使用しており、開発環境もEclipseを使っているのですが
どうにもVisualStudioの使い方が判らず困っています。

VisualStudioの設定や便利な使い方を学ぶのにお勧めのWebサイトや書籍などありませんか?
27デフォルトの名無しさん:2014/05/18(日) 04:28:14.54 ID:+bye9+6c
Visual Studioのスレがあるじゃないか
なぜここで訊く
28デフォルトの名無しさん:2014/05/18(日) 08:22:30.19 ID:Uw9b9LOt
つまり、そもそもヘルプやドキュメントの検索ができない(これはスレタイトルの検索が
できなかった時点で確定している事実)のだから、机を並べて事細かにアドバイスして
くれるような人間がいない状況で新しいものに手を出すのは無謀なレベルの人間>>26
29デフォルトの名無しさん:2014/05/18(日) 10:17:46.15 ID:cA8A9s6T
>>23
良く分からんけどstd::arrayがあるからこんな風に書いたらどうかな?
わざわざoperator[]があるクラスを作るのは面倒だし、vectorを入れ子にするとコード膨らむし

typedef std::array<double, 2> Ad2;

int main()
{
std::vector<Ad2> vad;
Ad2 ad;

ad[0] = 0.0; ad[1] = 1.0;
vad.emplace_back(ad);
ad[0] = 2.0; ad[1] = 3.0;
vad.emplace_back(ad);

for (auto a : vad)
std::cout << a[0] << ' ' << a[1] << std::endl;
}
30デフォルトの名無しさん:2014/05/18(日) 14:27:07.69 ID:geSLm+s7
Cで実体にはconstありの引数を持った関数のプロトタイプ宣言の引数に
constを付けても付けなくても違反でないのですが、どちらがよいのでしょうか?
31デフォルトの名無しさん:2014/05/18(日) 15:18:49.21 ID:MO8Dtd0g
linux環境下でc言語を用いて動画を再生する方法は無いでしょうか?
x11ウィンドウ内に表示したいです
32デフォルトの名無しさん:2014/05/18(日) 16:00:30.80 ID:P2EXL/Ge
>>30
なぜconstを付けるのかということを考えると
プロトタイプ宣言に付けないと価値が半減する
33デフォルトの名無しさん:2014/05/18(日) 16:16:35.52 ID:oqaXJcpo
>>29
arrayのことは知りませんでした。その方がずっと簡単にできますね。

こちらの状況は、これまでnewで
int n = XXX;
double (*vecters)[2] = new double[n][2]
のようにしていたのですが、当初想定してなかったメモリ解放のケースが大量に出てきてしまいました
そこでvectorで解決しようと思ったのですが、vectorにvector入れ子だと添え字の順番が逆で
しかしもう書き換えができないほど利用数が多かったので、vectorに自分で定義したクラスを入れようとしてました
ですがarray使えば済む話でしたね。今までSTLにあまり触れてこなかったのですが、これを機に勉強しようと思います
ありがとうございました
34デフォルトの名無しさん:2014/05/18(日) 16:27:08.12 ID:gVgdo/dn
>>31
system("vlc moviefile.mp4");
35デフォルトの名無しさん:2014/05/18(日) 17:10:22.13 ID:DIHfwpMS
>>3
それだったらスマポに入れればいいぞ
もっと簡単になる

int main()
{
int n = 10;
std::unique_ptr<double [][2]> ud(new double[n][2]);

int i = 0;
std::for_each(ud.get(), ud.get() + n, [&i](double* p){ p[0] = i + 1.0; p[1] = i + 2.0; i++; });

for (int i = 0; i < n; i++)
std::cout << ud[i][0] << ' ' << ud[i][1] << std::endl;
}
36デフォルトの名無しさん:2014/05/18(日) 17:14:24.57 ID:DIHfwpMS
まちごた
×>>3
>>33
37デフォルトの名無しさん:2014/05/19(月) 20:38:58.41 ID:u0kYoYP8
委譲を使いクラスを生成した場合
委譲をした元クラスを解放すれば
委譲されたクラスは自動で解放される?
委譲されたクラスのデストラクタはちゃんと呼ばれる?
38デフォルトの名無しさん:2014/05/19(月) 21:02:29.78 ID:FaLSmftQ
試せば?
39デフォルトの名無しさん:2014/05/19(月) 22:38:02.91 ID:mLyDgbnZ
>>35
このスマポという奴を使う場合
ud[n][2]の2のほうも変数にする方法は有りますか?
40デフォルトの名無しさん:2014/05/19(月) 23:04:05.15 ID:Yfo7RAeE
>>39
constexpr int を使えば行ける
但し行毎に列の長さを変えるような使い方は出来ない
そういう時はvectorを使う
41デフォルトの名無しさん:2014/05/19(月) 23:45:45.38 ID:Bw7LBrUS
c言語を学びたいとおもうんですが開発環境でつまずいてしまっています
パソコンに入っている microsoft visual studio professonal 2013
でc言語を入力したいと思っているのですがなかなかうまくいきません
どうすればいいですか?
あとおすすめのc言語開発環境などがあったらおしえてほしいです
42デフォルトの名無しさん:2014/05/20(火) 00:02:52.05 ID:mxK7K6eG
>>41
>microsoft visual studio professonal 2013
初心者なのにExpressじゃなくていきなりProfessional版かよ……
まあそれはともかく、とりあえずC言語のプログラムを動かしたかったら、
・ソースコードをメモ帳等のエディタで書いて保存。拡張子は「.c」を推奨
 (Visual Studio内にもエディタはあるけど使い方を覚えるのはちょっと手間かも)
  http://i.imgur.com/CTRzqgR.png
・スタートメニューから、「Visual Studio 2013」→「Visual Studio ツール」で
 出てくる画面から、「VS2013 x64 Cross Tools コマンド プロンプト」か
 「VS2013 x86 Native Tools コマンド プロンプト」をクリック
  http://i.imgur.com/nwFfURk.png
・するとコマンドプロンプトが出現するので、ごく普通にソースコードが置いてある
 フォルダまでCDコマンドで移動
  http://i.imgur.com/lvOBxVb.png
・後はclコマンドで、「cl xxxx.c」と入力してエンターするだけ!
 (xxxx.cは、自分が保存したソースコードのファイル名を入力)
  http://i.imgur.com/3mOXHRP.png
・出来たexeを実行すれば結果が出てくるはず。お疲れ様でした
  http://i.imgur.com/U5FNBNp.png

ちなみにC言語開発環境としては素直にVisual Studioを勧めておく
(いまどきBorland C++ Compiler 5.5を使う意味はあまりないので)
43デフォルトの名無しさん:2014/05/20(火) 00:03:29.79 ID:Yfo7RAeE
constexpr size_t の方がいいかな・・・
でも64bit環境でそんな大きな配列使わないよね・・・
44デフォルトの名無しさん:2014/05/20(火) 00:11:29.08 ID:KXJMtxo4
>>41
素のCならTiny C Compilerを--runで動かすのがトライアンドエラーが早くて便利で、
コマンドプロンプトで「tcc.exe --run ソースコード.c」で実行ファイル作らずにコンパイルして動かせる。
Visual Studio使うならVisual Studio コマンドプロンプトってのがメニューに有るだろうからそれ使う。
「CL ソースコード.c」でコンパイルして作られた実行ファイルを実行すればいい。
ソースコードはメモ帳でも何でも適当なテキストエディタで拡張子を.cにしたファイルとして作ればいい。
Visual StudioのIDE使って開発してもいいけど、上手く行かなかったらしいから取り敢えず省略。

でもまずは取り敢えず適当なCの入門手引をWebサイトでも書籍でもいいから手に入れるべき。
あとはその手引に合わせた環境を用意するなり、使い方を読み替えて使う。

そもそも、なんでVSのProが入ってんだそのパソコン…
誰かが入れてくれたなら入れてくれた奴に聞くのが一番手っ取り早い気がする。
45デフォルトの名無しさん:2014/05/20(火) 00:17:47.05 ID:zlaxDiQa
>>44
それ同じこと既に言ってるんだけど

……いっそこれ使った方が楽ちんな気がする(中身はTiny C Compiler)
http://9cguide.appspot.com/p_9cide.html
46デフォルトの名無しさん:2014/05/20(火) 00:21:02.90 ID:KXJMtxo4
>>45
全部が全部同じじゃないし、投稿時間だって10分も違わないし、レスが被るくらいでみみっちいこと言うなよ
47デフォルトの名無しさん:2014/05/20(火) 01:14:46.12 ID:2A54L/7+
constexpr知らない人がいるから一応書いておくか

constexpr std::size_t m = 2;
struct mydeleter1 {
void operator()(double (*p)[m]) {
std::cout << "delete double*[" << m << "]" << std::endl;
delete[] p;
}
};

int main()
{
int n = 10;
{
std::unique_ptr<double [][m], mydeleter1> ud(new double[n][m]);

int i = 0;
std::for_each(ud.get(), ud.get() + n, [&i](double* p){ p[0] = i + 1.0; p[1] = i + 2.0; i++; });

for (int i = 0; i < n; i++)
std::cout << ud[i][0] << ' ' << ud[i][1] << std::endl;
}
std::cout << "unique_ptr was deleted." << std::endl;
}

カスタムデリータで確実に解放されている事を確認した
本当はconstexprはmain()の中に書くとすっきりするんだけど、classの前方宣言を
行ってしまうとmの値が不明になってコンパイル出来なくなるので外に出した
48デフォルトの名無しさん:2014/05/20(火) 02:32:30.63 ID:OAGGaPxS
デリータをラムダにしたらいかんのけ
49デフォルトの名無しさん:2014/05/20(火) 06:55:45.27 ID:HULE9c20
ディリータがラムザだって?
50デフォルトの名無しさん:2014/05/20(火) 10:31:47.12 ID:jnRMRVPU
>>48
無理じゃ

http://d.hatena.ne.jp/nagoya313/20100305/1267758837

std::shared_ptrならカスタムデリータにラムダ式を使えるが、std::unique_ptrはダメ
51デフォルトの名無しさん:2014/05/20(火) 12:34:49.57 ID:UR0HXhEB
>>50
autoに代入してからなら入るはずだけど
52デフォルトの名無しさん:2014/05/20(火) 14:37:47.10 ID:U8Xj8N/D
auto mydeleter2 = [](double (*p)[m]){ std::cout << "delete double*[" << m << "]" << std::endl; delete[] p; };
std::unique_ptr<double [][m], decltype(mydeleter2)> ud(new double[n][m], mydeleter2);

こんなのか
変態過ぎるwww
53デフォルトの名無しさん:2014/05/20(火) 15:32:16.32 ID:PibgqYJG
A *a, *b;
a = new A;
b=a;
delete a;
a=new A;
b!=a
という保証なんてどこにもないですよね?
54デフォルトの名無しさん:2014/05/20(火) 17:05:17.57 ID:mSiEAm6Z
一度開放した領域が再度割り当てられることはないという保証なら、ありませんね。
55デフォルトの名無しさん:2014/05/20(火) 17:06:36.99 ID:y0AQP6Vn
え?
56デフォルトの名無しさん:2014/05/20(火) 18:38:43.12 ID:KXJMtxo4
delete a;を一行後ろに回さない限り、b!=aもb==aもありうる。
57デフォルトの名無しさん:2014/05/20(火) 20:58:24.17 ID:eMXV5lE3
派生クラスのデストラクタには
とりあえず virtual つけとけば問題ない?
58デフォルトの名無しさん:2014/05/20(火) 21:10:48.34 ID:fbMM1sIr
基底クラスの方に付けろ
59デフォルトの名無しさん:2014/05/20(火) 21:17:17.03 ID:XZ8PbsoH
>>57
基底クラスの方じゃないかい?
6057:2014/05/21(水) 21:12:40.05 ID:Rtlj0b94
間違えた
基底クラスのデストラクタには
とりあえず virtual つけとけば問題ない?

あと、派生クラスのデストラクタに
virtual つけとくとなにか問題ある?
61デフォルトの名無しさん:2014/05/21(水) 23:10:48.52 ID:QpxSOORZ
基底クラスのデストラクタにvirtual付けないと基底クラスのデストラクタが呼ばれずメモリリークする
派生クラスのデストラクタは基底クラスのデストラクタにvirtualが付いている場合デフォルトでvirtualと
みなされる

http://www32.ocn.ne.jp/~ons/text/CPP0xFAQ.html.ja

ここら辺読んでよ

finalつけるとどうなるんだっけ?コンパイルエラー?警告だけ?やってみればいい話だけど
62デフォルトの名無しさん:2014/05/22(木) 00:58:34.82 ID:ZWGxuBLk
>>61
×基底クラスのデストラクタが呼ばれず
○派生クラスのデストラクタが呼ばれず
あと、それが起きるのは基底クラスにキャストした状態でdeleteした場合などで、
デストラクタが呼ばれない事が問題だから起きるのはメモリリークだけじゃない。
ハンドルがリークする場合もあれば終了処理が行われない場合もある。

だったはず。
63デフォルトの名無しさん:2014/05/22(木) 08:14:19.27 ID:B1HhBS7N
6460:2014/05/22(木) 20:57:36.89 ID:m4yPgbOU
ぶっちゃけ
クラスのデストラクタ全てにvirtualつけとけば
問題なくない?
65デフォルトの名無しさん:2014/05/22(木) 21:14:59.60 ID:2g4glAhM
>>64「パフォーマンスは投げ捨てるもの」
66デフォルトの名無しさん:2014/05/22(木) 22:10:33.87 ID:5c02VcX7
C++にてSwitch文を使った相性占いプログラムのソースを書いてほしいです

まず最初に二人の情報(5桁の数字ID、生年月日)入力をして、
そこから演算を行い、占い結果を表示するプログラムのソースを書いていただけないでしょうか

演算方法は何でもいいですし、結果は何通りでもいいです
簡単なものでも全然構いませんので、お願いしますm(_ _)m
67デフォルトの名無しさん:2014/05/22(木) 22:18:23.05 ID:33euSJkO
>>66
占い結果で分岐するのをswitch使ってって事でいいのか
68デフォルトの名無しさん:2014/05/22(木) 22:21:18.26 ID:2g4glAhM
>>66
何もかも丸投げしてんじゃねーよw
せめてIDと生年月日から占う部分だけでも作れ
(もちろんコード化できるぐらいキッチリ仕様をまとめること)
69デフォルトの名無しさん:2014/05/22(木) 22:22:03.03 ID:5c02VcX7
>>67
そうです><
70デフォルトの名無しさん:2014/05/22(木) 22:37:32.88 ID:33euSJkO
>>69
switch(占い結果){
結果1:
printf("結果1です");
break;
結果2:
printf("結果2です");
break;
}
71デフォルトの名無しさん:2014/05/22(木) 22:59:28.62 ID:2g4glAhM
とりあえず>>66の要望に沿ったものを作ってみた。
流石に入力部分ぐらいstd::cin使えば楽勝だろうから、
サンプルデータとしては適当な人物のものを使っている。
http://codepad.org/Fx7dtDlo
72デフォルトの名無しさん:2014/05/22(木) 23:11:03.08 ID:5c02VcX7
>>71
まさか答えてくださるとは……涙が出てきました、本当にありがとうございます!!!TT
まだ何もかも初心者で分からないですがあなたのような人を目指して勉強がんばっていきたいですっ!
73デフォルトの名無しさん:2014/05/22(木) 23:16:16.25 ID:2g4glAhM
>>72
入門書片手にゆっくり学んでいけばいいんじゃないかな

「C++で」と書いてあったからワザとclassとかfriend関数とか使ったけど、
本来なら小細工無しでmain関数だけでも書ける内容だしね……
流石にやりすぎた感が否めない(^_^;)
(そもそも剰余取るならswitch使わず最初からstd::stringの配列として
結果を用意した方が良いと思うけど)
74デフォルトの名無しさん:2014/05/24(土) 05:35:02.60 ID:LVEVeP19
libcurl
つかってhttp get をしてみたら
デバックプリントで
OK
と表示されるのですが、このデバック表示を消すにはどうすればいいのでしょうか
http://curl.haxx.se/libcurl/c/simple.html
75デフォルトの名無しさん:2014/05/24(土) 10:58:45.01 ID:NSCx1NVk
デバッグプリントだとわかっているならデバッグモードをやめればいいんじゃないかな?
76デフォルトの名無しさん:2014/05/24(土) 20:55:01.22 ID:jba60f72
vector<string> myVect;
にいろんな文字列を代入したとして、その中から、
string keyWord ="ABC";
で始まっている要素だけを取り出して、新たなvector<string>を
作りたいのですが、どう書けばよいでしょうか?
77デフォルトの名無しさん:2014/05/24(土) 21:02:24.98 ID:BoH7rvjb
>>76
やっつけだけどこんなのでいいのか?

vector<string> myVect;
(中略)
vector<string> myVect2;
string keyWord ="ABC";
for(size_t i = 0; i < myVect.size(); ++i){
  if(myVect[i].substr(0, keyWord.length()) == keyWord){
    myVect2.push_back(myVect[i]);
  }
}
78片山博文MZ悪魔崇拝 ◆T6xkBnTXz7B0 :2014/05/24(土) 21:05:14.48 ID:cV3HOdor
vector<string> words;
for (auto& str : myVect) {
if (str.find(keyWord)==0) words.push_back(str);
}
79デフォルトの名無しさん:2014/05/24(土) 21:46:37.05 ID:jba60f72
>>77,78
ありがとうございます!!
無事動きました。C++勉強中なので大変勉強になりました。
関連してもう一つ教えてください。
教えていただいた方法を、vectorに対して、
vector<string> result = myVect.startWith("ABC");
みたいに自分でstartWith()というメソッドを作りたいのですがC++では
そういうことが出来るのではないかと思っているのですが、
どういうキーワードでググればよいでしょうか?
80片山博文MZ悪魔崇拝 ◆T6xkBnTXz7B0 :2014/05/24(土) 22:16:43.35 ID:cV3HOdor
それは簡単にはできない。次のように派生クラスを作れば何とかできる。

class MyVector : public vector<string>
{
MyVector(){}
MyVector(const MyVector& v):vector<string>(v){}
MyVector& operator=(const MyVector& v){
this->assign(v);
return *this;
}
~MyVector(){}
vector<string> startWith(const string& str){
...
}
};
81デフォルトの名無しさん:2014/05/25(日) 04:47:21.43 ID:Nr3u6HQ6
>>80
サンプルありがとうございます。
これを参考に作ってみます。
>それは簡単にはできない。
簡単には出来ないということですが、何か難しい手法を使うと実現できるのでしょうか?
C#だと既存のクラスに拡張メソッドを追加できたので、C++でも出来るのではと思ったのですが。
82デフォルトの名無しさん:2014/05/25(日) 11:24:05.95 ID:CXANs0iQ
>>81
C#でできることがC++でできるわけでなはい、逆も然り

簡単には追加できないので、ある種のライブラリセットでは、
myVect|startWith("ABC"); みたいな書式で関数を追加する方法を採用している。

なお >>80 で作ったクラスは、vector として使うとスライシングやリークを起こすので、
MyVector というクラスそのものとして使うこと。
83デフォルトの名無しさん:2014/05/25(日) 11:29:56.00 ID:J7hNFDCP
言語レベルでできるできないというのは、標準装備の記述が使えるか否かだけだろうね。
特にC/C++システム記述用に設計された経緯があるからC++で簡単に「できない」という
のは、かなり危険な知識レベルの表れだね。
84デフォルトの名無しさん:2014/05/25(日) 11:35:03.11 ID:JrQwFRNG
#include<stdio.h>#include<string.h>#include<stdlib.h>
void f(char*,int);
int main(void){
char hoge[10];
scanf("%9s",hoge);
f( hoge,strlen(hoge) );//文字列と \0を除く文字数
return 0;
}
void f(char* hoge,int len){
char** pp = (char**)malloc(sizeof(char*) *(len+1) );
int i;
char b='\0';
if( *pp == NULL ){
printf("memoryerror");
}else{
*(pp+len)=&b;
for(i=0;i<len;i++){
*(pp+i)=&hoge[i];
}
printf("%s\n",*pp);
}
free(pp);
}

これ学校のサーバ(詳細不明)上gccで実行するとmemoryerror
VisualC++2010Expressで実行すると入力と出力が一致するのですが
こういうことってよくあることなのでしょうか
またメモリ確保できなかった理由わかりますか?
85デフォルトの名無しさん:2014/05/25(日) 11:46:43.77 ID:gWmYYtrq
そんなわけのわからないのはどうでもいい。
まともに見れるやつに書きなおしたら動くだろ。
86 ◆QZaw55cn4c :2014/05/25(日) 11:50:15.35 ID:NeNyrW9A
>>84
何をやりたいのかよくわからないので形式的な点だけを指摘するのだが

>char** pp = (char**)malloc(sizeof(char*) *(len+1) );
ここでメモリを確保できなかった場合は pp == 0 となるのだから

>if( *pp == NULL ){
ここは pp == NULL となるべき
87デフォルトの名無しさん:2014/05/25(日) 12:05:13.32 ID:JrQwFRNG
可読性は悪くて申し訳ない
他のコードをコンパクトにしたら意味のないものになってしまいました
>>86 直してみましたが visualC++で思い通り gcc でmemoryerrorです

ポインタの動的配列を作って要素にアクセスしたいのですがあってますか?
88デフォルトの名無しさん:2014/05/25(日) 12:10:49.45 ID:EMg57a+q
if( pp == NULL )
じゃないのか
*ppに何入ってるかなんてわからんだろ
89デフォルトの名無しさん:2014/05/25(日) 12:16:15.52 ID:mGonMRxn
>>84をとりあえず清書してみる
http://codepad.org/0LJCCffh
90デフォルトの名無しさん:2014/05/25(日) 12:19:00.66 ID:JrQwFRNG
申し訳ない!
>>86 >>88 修正でgcc直りました
修正前visualC++ 動いてたのはなぞだが
お騒がせしました
91デフォルトの名無しさん:2014/05/25(日) 12:21:02.58 ID:JrQwFRNG
codepadいいですね
もうお騒がせしたくないのですが
レベル上がってまともな議論できるようになったらまた来ます
92デフォルトの名無しさん:2014/05/25(日) 12:22:00.93 ID:JrQwFRNG
visualC++はミスを勝手に補っていたと認識すればいいのかな
93デフォルトの名無しさん:2014/05/25(日) 12:24:16.59 ID:EMg57a+q
たまたま確保したメモリが0クリアされてただけでしょ
94デフォルトの名無しさん:2014/05/25(日) 12:52:26.41 ID:2Bb1jnf+
>>76
regexとか
95デフォルトの名無しさん:2014/05/25(日) 12:58:54.95 ID:2XYWcL+D
>>92
修正前と修正後レスしたらわかるんじゃないかな
96デフォルトの名無しさん:2014/05/25(日) 13:14:26.31 ID:vrjD7GQR
この手のやつは Debugでは動いたけど Releaseでは動かないというよくある罠
97デフォルトの名無しさん:2014/05/25(日) 15:20:30.86 ID:VdGWzfNy
>>84
やりたいのはこういうこと?
http://ideone.com/x2YbQK
98デフォルトの名無しさん:2014/05/25(日) 18:15:23.75 ID:JrQwFRNG
>>97 secretで見れませんね
99デフォルトの名無しさん:2014/05/25(日) 18:52:04.50 ID:VdGWzfNy
>>98
http://codepad.org/cRoDAq0S
をideoneに貼ったつもりだった。

ideoneのコードがなぜか消えている。。
100デフォルトの名無しさん:2014/05/25(日) 19:18:05.82 ID:JrQwFRNG
>>99 29行目 hoge[i]は&つけないといけないと思う
101デフォルトの名無しさん:2014/05/25(日) 22:28:26.35 ID:VdGWzfNy
いや、つけてはいけません。
102デフォルトの名無しさん:2014/05/25(日) 22:38:14.80 ID:JrQwFRNG
ああ pp宣言*1個になってるし意図が伝わってなかった
ポインタ型の動的配列を作りたかったんです
ポインタの配列なら*p[定数]で済むのに...
103デフォルトの名無しさん:2014/05/26(月) 00:14:02.77 ID:1AGAnN0M
>>102
> ポインタ型の動的配列を作りたかったんです

なるほど。では>>99はあなたの「やりたいこと」とは違いましたね。失礼
104デフォルトの名無しさん:2014/05/26(月) 03:02:25.50 ID:8DsryLB1
これこのまんまじゃ期待してる動作してないんじゃないの
結果的に出力が同じになってるだけで、おそらくやらせたいだろうことはしてないぞ
105デフォルトの名無しさん:2014/05/26(月) 03:27:06.87 ID:8DsryLB1
いや、mainのhoge変数の各要素のポインタが欲しいだけならこれでいいのか
一部期待した動作をしてないであろう箇所があるってのが正しかったな

今のままだと>>89のコードでいう31行目の確認は意味のないコードになってる
正しくは

for( i=0; i < len; ++i )
{
printf( "%c", **(pp+i) ); // もしくはprintf( "%c", *pp[i] );
}
printf( "\n" );
だと思う

あと将来的に関数fを、ppのアドレスを返すように改造する場合は
bが一時オブジェクトだからこのまま返すわけにはいかないんじゃないかな
106デフォルトの名無しさん:2014/05/26(月) 03:37:33.44 ID:UJEeKjCa
まちがいさがし
http://codepad.org/hGzuz6di
107デフォルトの名無しさん:2014/05/26(月) 03:42:29.23 ID:8DsryLB1
>>106
これ見て思ったけどfor文++iじゃなくてi++にするべきだったわすまん
突然書く人変わってるって疑われるわ
108デフォルトの名無しさん:2014/05/26(月) 03:45:34.13 ID:Pt2kiZ/o
ぶっちゃけfor文の中のは大差無いらしいけど俺は前置派>インクリメント
109デフォルトの名無しさん:2014/05/26(月) 03:48:06.77 ID:8DsryLB1
>>108
今どきのコンパイラならどうせどっちで書いたって最適化してくれるんじゃねって思うしな
110デフォルトの名無しさん:2014/05/26(月) 05:14:13.42 ID:UJEeKjCa
Cが来た時にC++になるから後ろに置きたい
111デフォルトの名無しさん:2014/05/26(月) 07:04:07.96 ID:FZT5gfTQ
C++ では後置インクリメントは悪の根源並に嫌われるが
112デフォルトの名無しさん:2014/05/26(月) 07:14:41.63 ID:fNjo4Ias
前置にしろ後置にしろ
1行にそれしか書かないようにしてる
113デフォルトの名無しさん:2014/05/26(月) 10:44:45.62 ID:jXHZxPTV
>>111
ポインタとかでない限り問題なかろう
114デフォルトの名無しさん:2014/05/26(月) 12:33:31.87 ID:LnM16LwK
>>113
クラスだと、前置インクリメントオペレータしか作らないことが多い。
後置だとコピーしないといけないからね。
115デフォルトの名無しさん:2014/05/26(月) 16:08:00.12 ID:4UfKpyVP
後置インクリメントは副作用でかいよ
116デフォルトの名無しさん:2014/05/26(月) 19:31:29.48 ID:BEet9unM
助けてください
pathfileexistsを使ってサーバーの共有フォルダ内のファイルの存在をチェックしているんですが、
自分のPCだと問題なくファイルを確認できるのに、ほかのPCに持っていくと
ファイルは存在しているのにfalseが返ってきてしまいます…
パスワードもないしエクスプローラから問題なく見えるのですが何が原因分かりませんか?
117デフォルトの名無しさん:2014/05/26(月) 20:15:22.36 ID:fNjo4Ias
シェルから辿ってみれば
118デフォルトの名無しさん:2014/05/26(月) 21:15:31.18 ID:yHJImmyi
当然GetLastErrorは見たのか
119デフォルトの名無しさん:2014/05/27(火) 08:10:02.80 ID:VBK+BNJs
>>115
副作用がでかい?
用語はちゃんと理解した方がいいぞ。
120デフォルトの名無しさん:2014/05/27(火) 08:41:05.45 ID:zuChiLjA
>>119
最近聞きかじって使いたくなったんだろ。
121デフォルトの名無しさん:2014/05/28(水) 01:39:04.87 ID:1069+ikW
static変数をメンバーに持つクラスって
そのクラスを生成しなくても
そのstatic変数はプログラム実行時に生成されるの?
12264:2014/05/28(水) 01:45:41.29 ID:1069+ikW
>>65
どういうこと?
詳しく説明してほしい
123デフォルトの名無しさん:2014/05/28(水) 01:54:43.56 ID:m/PVkgzF
FileInfo fi = new FileInfo("ファイルのパス");
fi.Delete ();

StreamWriter sw = fi.AppendText();
sw.Write("テキスト");
sw.Flush();
sw.Close();


このように書いて作成されたファイルの文字コードが、
UTF-8 になってしまいます。

調べたら、そもそも StreamWriter は UTF-8 で書きこむ、とありました。
記録するときのエンコードをシフトjisにするにはどうしたらいいでしょうか。

new するときに文字コードを指定する方法はありましたが、
上記のような流れのときにエンコードを指定する方法がわかりません。
124デフォルトの名無しさん:2014/05/28(水) 02:06:07.33 ID:KYfVKk6v
125デフォルトの名無しさん:2014/05/28(水) 02:10:40.08 ID:a7wYHcWS
>>122
virtualつけると関数コール時に仮想関数テーブル参照することになって遅くなるしインスタンスのサイズも少しでかくなる
10回や100回程度ならそんなにだが1万回呼ぶとかになると結構でかい
詳しく知りたいなら仮想関数テーブルでググればいっぱい出てくるんじゃね

>>123
そもそもFileInfo通す必要あるのか
ファイルのパスが分かってるならそれをもとにStreamWriterを新しく作ればいいと思うんだが
StreamWriter^ writer = gcnew StreamWriter( ファイルパス, true, Encoding);
あとこれ本当にC++/CLIか?gcnewじゃなくてnewなあたりC#くさいんだが
126デフォルトの名無しさん:2014/05/28(水) 02:18:23.46 ID:KYfVKk6v
>>121
定義した時だね
struct A { static int a; }
なら
int A::a;
とかで定義するのでグローバル変数と同じ扱い
127デフォルトの名無しさん:2014/05/28(水) 02:24:40.32 ID:7s/YdHrO
>>121
Java ならクラスのstatic な変数は実行時に "自動的に" に生成されるが
C++ はクラス定義とは別にプログラマが自分で実体を定義してやらねばならない = >>126
128デフォルトの名無しさん:2014/05/28(水) 03:31:40.55 ID:1yf3kB3k
>>122
移転のあおりで消えたレス
> >>65
> vtbl参照するポインタ一つとdeleteする時の参照コストは増えるけど…
> ポインタ一つのメモリ量気にする場所でクラス使うなやって感じだし、
> パフォーマンス気にする処理の中でnew/delete連発もしちゃ駄目でしょ。

>>125
仮想関数テーブルを経由するのはvirtual付いてるメソッドだけだから、
デストラクタだけに付けててそれが乱発されるって設計の時点でパフォーマンスは投げ捨て済み。
あと仮想関数テーブルは同一クラスのインスタンス間で共有してたりするから、
その場合インスタンスあたりのメモリ消費の増加はポインタ1個とかのオーダになる。
これが問題になるケースというのもやはりその時点でパフォーマンスは投げ捨て終わってると思う。
129デフォルトの名無しさん:2014/05/28(水) 04:29:03.02 ID:a7wYHcWS
>>128
数千単位のデストラクタ呼び出しを毎フレーム乱発することなんてまずないけど
数千を何セットか確保した結果の数万をあるタイミングで一気に解放するってケースは稀ではあるもののなくはないと思うが
そういう時にvirtualしてなきゃ速度をずいぶん改善できることはあるだろ。まあ大抵そもそもテンプレートでの実装とか代替案がでるとは思うが
あと大きくなるってのはまさにそのポインタ1個分だからな。これも圧迫されうるのは積もり積もったときだけで数百程度だったら気にするだけ無駄だが
130デフォルトの名無しさん:2014/05/28(水) 04:43:24.82 ID:1yf3kB3k
>>129
何処でロスが出るか完全に制御してクラス使う人は「デストラクタ全てvirtual」なんて選択肢は端から無いだろうし、
数万単位の情報を速度重視で扱うなんて状況で1個1個クラスにして欲しくねぇわ…ってのは贅沢な願いなのかな?
131デフォルトの名無しさん:2014/05/28(水) 08:37:08.02 ID:m/PVkgzF
>>124
それは試しました。
ユニティ上ではエラーなくビルドできるのですが、
StreamWriter sw の部分で何故かこけてしまいます。

ファイルのパスなどは、UTF-8でちゃんと動いているので問題ないかと思ってます。

>>125
確認しました、ご明察のとおり、C++ ではなく C# のようです。
あと、ユニティとアンドロイドで開発してます。

FileInfo をなぜ使っているのか解らないのですが、
124 の方も教えてくれたサンプル通りにやっても実機で動きませんでした。


C# なら、別のスレッドに質問した方がいいですか?
132デフォルトの名無しさん:2014/05/28(水) 08:50:12.08 ID:1yf3kB3k
C++/CLIですらこのスレでいいのか迷うレベルなのにC#をここで良いかって聞かれてもな…
133デフォルトの名無しさん:2014/05/28(水) 10:25:12.68 ID:a7wYHcWS
>>130
それだから>>65だろ
134デフォルトの名無しさん:2014/05/28(水) 10:38:41.31 ID:36F+cvJj
shared_ptrに入れとけばデストラクタがついてるかついてないかなんて関係なくなる
135デフォルトの名無しさん:2014/05/28(水) 13:15:04.06 ID:mspF09G9
>>131
JavaかVBスレの方がまだマシ
136デフォルトの名無しさん:2014/05/29(木) 07:59:14.44 ID:82BFXyhl
#pragma once
ってヘッダーの先頭に一回書くだけでいいんですよね?
下に示すような書き方しているのを見たことがあります。
何か意味があるのでしょうか?

-----あるヘッダファイル-----------
#pragma once
class A{
  ...
};
#pragma once

class B{
  ...
};
#pragma once

class C{
  ...
};
#pragma once
...
137デフォルトの名無しさん:2014/05/29(木) 07:59:44.46 ID:QaxywJR9
ただのアホ
138デフォルトの名無しさん:2014/05/29(木) 10:44:05.16 ID:GJ6Azonc
バラバラのファイルを連結しただけならギリギリセーフ
139デフォルトの名無しさん:2014/05/29(木) 11:52:52.99 ID:hGrR3Csk
無意味
知らない人を惑わせたという点で有害
140デフォルトの名無しさん:2014/05/29(木) 12:28:05.73 ID:zblOCN9G
全クラスのデストラクタに
とりあえず virtual つけとけば問題なくない?
これでエラーが出ることある?
141デフォルトの名無しさん:2014/05/29(木) 12:38:42.20 ID:QaxywJR9
付けるのは多態性を使うクラスだけで十分
142デフォルトの名無しさん:2014/05/29(木) 13:14:28.94 ID:hGrR3Csk
無駄につけると遅くなるから嫌われる
個人製作に限るならあえて止める理由はない
143デフォルトの名無しさん:2014/05/29(木) 14:35:59.19 ID:GJ6Azonc
嫌われるけど、デストラクタをvirtualにして明らかに遅くなるようなケースはあんまりない気が
それで遅くなるような状態ならどうせそれ以外にも遅くなる要因が山ほどあるだろうし
144121:2014/05/29(木) 15:52:06.88 ID:zblOCN9G
static変数をメンバーに持つクラスを解放したら
static変数でも解放されて使えなくなるよね?
145デフォルトの名無しさん:2014/05/29(木) 16:01:21.88 ID:EFZu1tJU
クラスの解放って?
146デフォルトの名無しさん:2014/05/29(木) 16:12:04.91 ID:hGrR3Csk
>>126 を受けてなおそんな世迷言を
147デフォルトの名無しさん:2014/05/29(木) 16:55:56.41 ID:ZPfW7Hu7
staticメンバーのコンストラクタはプログラム開始時に呼ばれる。
staticメンバーのデストラクタはプログラム終了時にatexitみたいな仕掛けで呼ばれる。
148121:2014/05/29(木) 18:00:10.69 ID:zblOCN9G
class Ctest
{
public:
static int abc;
};


このCtestを動的に生成した場合
変数 abc は static だからグローバルになり
生成したCtestが解放された時に abc も解放されて使えなくなる?
149デフォルトの名無しさん:2014/05/29(木) 18:52:26.84 ID:zEmhoXcP
んなわけない
abcはCtestのインスタンスと無関係
150デフォルトの名無しさん:2014/05/29(木) 22:26:40.17 ID:lsho9ypK
使えなくなったらstaticにした意味ないしね・_・
151デフォルトの名無しさん:2014/05/30(金) 00:38:38.09 ID:iU8Ve7Yv
>>148
>>127

class Ctest
{
public:
static int abc;
};
だけでなく、
int Ctest::abc;
をC++ならば必ずどこかに書く
これはグローバル変数だから Ctest::abc は解放されることはない

実際の使用例
http://peace.2ch.net/test/read.cgi/tech/1313183984/449
152デフォルトの名無しさん:2014/05/30(金) 04:22:02.59 ID:p0YChy7B
超初心者の質問で申し訳ありません。
forを使って1^m+2^m+3^m+......+n^mを求めたいんですがこれのどの部分に問題がありますか?
ご教授お願いします。
http://codepad.org/ZibSLvWH
153デフォルトの名無しさん:2014/05/30(金) 04:44:42.16 ID:nHre9iMg
>どの部分に問題がありますか?
あんたの頭。
変数mの振る舞いに注意。
154デフォルトの名無しさん:2014/05/30(金) 09:01:09.24 ID:/LPGh+78
簡単にオーバーフローしそうな計算式だな
155デフォルトの名無しさん:2014/05/30(金) 14:52:39.25 ID:tQtZpcuA
156148:2014/05/30(金) 15:37:30.61 ID:9ztPnSR9
///// test.h /////

class Ctest
{
public:
static int abc;
};

///// test.cpp /////

int Ctest::abc = 100;


staticメンバーの変数はこういうことで
Ctestクラスの生成、解放関係なしに
プロプラム実行時から終了時までグローバルで使えるってことでOK?
157デフォルトの名無しさん:2014/05/30(金) 16:32:06.84 ID:lPnoVdIE
ただのグローバル変数と同じ
158デフォルトの名無しさん:2014/05/30(金) 18:23:18.60 ID:VP4sRqxG
スコープはあるだろ
159デフォルトの名無しさん:2014/05/30(金) 21:38:27.59 ID:I46UGUDy
static変数abcがあるのにそのクラスをdeleteした場合
new Ctest
delete Ctest
ここでどうやって使うん
160デフォルトの名無しさん:2014/05/30(金) 21:43:22.93 ID:BLHBUUhB
日本語でおk
161デフォルトの名無しさん:2014/05/30(金) 21:44:38.26 ID:2FpmCful
Ctest::abc
162デフォルトの名無しさん:2014/05/30(金) 22:20:18.99 ID:I46UGUDy
deleteした後にどうやって使うん
Ctestはもう死んでるやん?
163デフォルトの名無しさん:2014/05/30(金) 22:27:13.46 ID:BLHBUUhB
static変数はインスタンスと無関係だと言っただろ
164デフォルトの名無しさん:2014/05/31(土) 06:08:17.29 ID:DtdLdmhz
多分クラスとインスタンスの区別が付いてない人だろう
165デフォルトの名無しさん:2014/05/31(土) 15:40:42.88 ID:6LzyMI+6
>delete Ctest
166デフォルトの名無しさん:2014/05/31(土) 16:06:10.51 ID:A8nmKroG
特定の時間にタスクを実行したのですが
無限ループの中に何か処理を入れるようなものを作るのでしょうか
167デフォルトの名無しさん:2014/05/31(土) 17:21:00.95 ID:Udt15ViO
>>166
日本語でOK。
環境も合わせて書いとくれ。
168デフォルトの名無しさん:2014/05/31(土) 17:43:02.08 ID:zlcjKUg4
>>166
タスクって言い方からすると組込か
169デフォルトの名無しさん:2014/05/31(土) 17:53:59.88 ID:WaVhhm58
C#かもしれん
170デフォルトの名無しさん:2014/05/31(土) 17:59:10.71 ID:A8nmKroG
設定した時間で実行する処理を作りたいのですが、そういうものを作ったことがありません。

C++MFCのプログラムで無限ループしているところがあります。

ここに時間が来たかどうかの判断を入れるのが普通なのかどうなのかと思いまして
171デフォルトの名無しさん:2014/05/31(土) 18:27:46.99 ID:6LzyMI+6
つ タスクスケジューラ
172デフォルトの名無しさん:2014/05/31(土) 18:41:44.06 ID:zlcjKUg4
ある時刻なのか
ある時間経過後なのか
173デフォルトの名無しさん:2014/05/31(土) 19:00:40.55 ID:A8nmKroG
毎日23:30に実行したいです。

WINAPIのCreateWaitableTimerを使うという記事をネットで見つけましたが
これは使っていいんでしょうか
174デフォルトの名無しさん:2014/05/31(土) 20:25:19.56 ID:odnG7Cix
>>171 でいいよ
175デフォルトの名無しさん:2014/05/31(土) 20:39:16.31 ID:WaVhhm58
>>173
夏時間はどうする?
176デフォルトの名無しさん:2014/05/31(土) 20:52:34.96 ID:TLo1GTQA
なんとなくわかりました
スレッド立てて指定時間まで待機
指定時間を過ぎたら実行
終了時に次の実行時間を指定ですね
177デフォルトの名無しさん:2014/05/31(土) 22:53:07.90 ID:Km8CFKFD
>ls
a.txt b.txt
>patch <x.patch

>ls
a.txt b.txt c.txt


こんなx.patchって作成できる?
178デフォルトの名無しさん:2014/05/31(土) 23:12:31.07 ID:Udt15ViO
そりゃ作れるだろ。
例えば、こんなの。
--
#!/bin/sh
touch c.txt
--
こいつをどこか、パスの通るカレント以外の場所に置けばいい。
179デフォルトの名無しさん:2014/05/31(土) 23:25:17.31 ID:zlcjKUg4
そういう意味じゃないだろ
だったら円周率を10桁まで計算して表示するプログラムは
printf("3.1415926535\n");
でいいのか
180デフォルトの名無しさん:2014/05/31(土) 23:37:41.77 ID:Udt15ViO
>>179
その例だと、「計算して」の題意を満たしていないな。
せめて、こんなもんだろ。
--
#include <stdio.h>
#include <math.h>
int main()
{
printf("%.10f\n", atan(1) * 4);
return 0;
}
181デフォルトの名無しさん:2014/05/31(土) 23:47:30.16 ID:Km8CFKFD
diff -uN c.txt.org c.txt >x.patch
たぶんできたわ
182デフォルトの名無しさん:2014/06/01(日) 20:21:39.15 ID:EoOyig9q
Makefile で、
%.o : %.cpp
(rule)
のように汎用的に書いておき、ある特定のソースコードはコンパイルオプションを変えたい場合
Makefileはどのように書けば良いでしょうか?
上記の記述に加えて、そのソースコードのコンパイルルールを加えただけだと無視されてしまいました。
183デフォルトの名無しさん:2014/06/01(日) 23:25:25.96 ID:NTS0Pzbx
VC++6.0 で作成したDLLの中身のソースをデバッグしたいんですが、
上手くいきません。

DLLの中の関数呼び出し自体は別プロジェクトでmain作ってDLLインポートして・・
で、出来るんですが。呼び出し先のソースを見れません。何か良い方法は
ないでしょうか?
184デフォルトの名無しさん:2014/06/01(日) 23:31:47.86 ID:gjlX7ty8
DLLのプロジェクトにデバッグ用メインを登録して、DLLのプロジェクトをRunするです。
185デフォルトの名無しさん:2014/06/01(日) 23:32:16.49 ID:+IEDdSur
どううまくいかないのか
186デフォルトの名無しさん:2014/06/01(日) 23:35:11.99 ID:+IEDdSur
main側で目的のファイルを開いてブレークポイント設定(開くだけでプロジェクトへ追加は必要無い)
→mainでデバッグ開始
→mainでLoadLibrary
→DLLの関数を呼び出す
→ブレークポイントで止まる

どこまでやってどうなるのか
187デフォルトの名無しさん:2014/06/01(日) 23:37:26.91 ID:NTS0Pzbx
>> 184 とりあえずそれで試してみます。どうもありがとうございました(__)

>> 185 DLL内部のソースをSTEP実行できないんです。
188デフォルトの名無しさん:2014/06/01(日) 23:51:02.96 ID:Vdytlm3J
DLLソースの検索先パスを登録する設定があったはず
189デフォルトの名無しさん:2014/06/02(月) 22:59:40.91 ID:9EWfIjsq
EXEプロジェクトからでもデバッグできるけどソースパスの問題とかあるので、DLLプロジェクト側から親EXEを指定してデバッグするのが王道
190156:2014/06/09(月) 01:16:03.43 ID:YH45DqQS
>>156に書いたように
staticメンバーはCtestの生成、解放関係なしにグローバルで使えて
static以外のメンバーは、普段通りCtestを生成すると使える
ってことで良いんだよね?
191デフォルトの名無しさん:2014/06/09(月) 14:31:57.02 ID:CV1N0NlN
テンプレートのファンクタの動的なバージョンが
std::functionという理解であってますか?
192デフォルトの名無しさん:2014/06/09(月) 22:14:19.25 ID:2baEZhQu
>>190
「グローバルで使える」ってのが微妙だが、その通りです
記憶クラス的に

>>191
ちょっと捉え方が間違ってるような

テンプレートで指定した戻り値、シグネチャで呼び
出せるのものであれば、なんでも入れられるのがfunction
静的な関数、関数オブジェクトが該当する

ラムダもコンパイル時に関数オブジェクトを生成ので同じように使える
インスタンス関数の場合、mem_fn+bindで、関数オブジェクト化、
インスタンスへの参照固定で入れられる
193デフォルトの名無しさん:2014/06/09(月) 22:48:16.12 ID:2baEZhQu
Cで型の問題は厄介だよね
これがあるから安全で生産性も高くなるんだろうけど、
ちょっとでも違えば許してもらえない

たとえばObserverパターンとかで、コールバックを登録したいとする
ここでも型が問題になる
functionは型を消してしまえるんだな
ただし若干、オーバーヘッドがある

単純に関数に渡すファンクタが必要なのであれば、ラムダで
書いた方がよい
高速です
194デフォルトの名無しさん:2014/06/10(火) 18:33:14.20 ID:ExSiC/cX
複数のファイルが圧縮されているZIPファイルを解凍せずに、
その中身の特定のファイルを指定して読み出したり、あるいは、
その特定のファイルを上書きしてZIPファイルを書き換えたり
したいのですが、どうすれば出来ますか?
195デフォルトの名無しさん:2014/06/10(火) 18:38:38.30 ID:hzZkSFog
そういうプログラムを書けばできるんじゃないですか
196デフォルトの名無しさん:2014/06/10(火) 20:09:14.96 ID:nP1d3r8O
1/2000000と1/1999999を区別比較できるような型はありませんよね 実装案とかいただけませんか?
D/T(1<=T<=2百万,1<=D<=100)を何個か比較演算したいです
197デフォルトの名無しさん:2014/06/10(火) 20:43:52.27 ID:Q6yCJgce
有理数型を作りゃいいじゃん
198デフォルトの名無しさん:2014/06/10(火) 20:59:52.84 ID:p3jSqJSc
>>196
文字列なら簡単だ。
199デフォルトの名無しさん:2014/06/10(火) 21:03:49.73 ID:hzZkSFog
std::ratioとか
200デフォルトの名無しさん:2014/06/10(火) 21:14:10.96 ID:nP1d3r8O
>>197-199 ありがとうございます! >>199が手軽でよさそうですね
201デフォルトの名無しさん:2014/06/10(火) 23:00:55.72 ID:nP1d3r8O
先程よりもレベルの低い質問なのですがratio配列は作れるのでしょうか
202デフォルトの名無しさん:2014/06/10(火) 23:06:04.53 ID:hzZkSFog
boost::rationalなら
203デフォルトの名無しさん:2014/06/10(火) 23:11:03.68 ID:nP1d3r8O
あー残念ながらboostは使えない環境なのです 前もって書き忘れてました
204デフォルトの名無しさん:2014/06/10(火) 23:15:13.67 ID:j8iOZPUp
>>203
自分で作りなよ、ゆー
205デフォルトの名無しさん:2014/06/12(木) 19:54:09.97 ID:ZrIHv0PN
>>197 >>204 気長に作ってみますありがとうございます

http://codepad.org/ZTZs3nU4
POJなんですけど このコードがg++だと通ってc++だとコンパイルエラーでます
g++ってどんな補完あるんでしょうか
206デフォルトの名無しさん:2014/06/13(金) 23:22:35.20 ID:OcgplV8Y
>>205 解決しました ありがとうございます
sqrt()の中身int型整数を少数型にキャストしなければならないようで
207デフォルトの名無しさん:2014/06/14(土) 00:31:06.98 ID:bcTe5xiu
わからない、、オブジェクト指向とクラスがわからない、、、、
例えば、、、四角形を親とするクラスがあってその子どもが長方形と台形を持つとします。
四角形
メンバ変数
上辺、下辺、左辺、右辺、角度
機能
面積計算
周りの長さ計算
対角線を計算
台形のメンバ変数、高さ:長方形のメンバ変数なし、機能:面積計算
台形のコンストラクタで四角形
のメンバ変数を初期化?する、四角形の機能で計算、、四角形で辺だけをreturnする関数
を作り、台形の面積計算に必要な辺をうけとる
その後また長方形のコンストラクタで四角形を初期化?
こんな感じの考え方でよいのでしょうか、、、

もう自分で書いてて意味わからないのですが、エスパーの方教えてください。
もしくは四角形継承台形長方形、長方形の継承正方形のプログラムを教えてください。


main


コンストラクタで
長方形(double 辺、double 辺、、、):四角形(辺、辺){}
といった書き方でよいのでしょうか
208デフォルトの名無しさん:2014/06/14(土) 10:28:53.72 ID:h7hlzhCn
>>206
>少数型
そんなもの(二重の意味で)ない。
209デフォルトの名無しさん:2014/06/14(土) 10:46:35.46 ID:ghLFWdur
>>208 私の拙い頭では 二重のというのが理解しかねます 浮動小数点型等言葉の定義の問題でしょうか
210デフォルトの名無しさん:2014/06/14(土) 12:04:18.29 ID:vn/Wi9/b
固定小数点ってのがあるから浮動を省略しちゃいかんのと
少と小

この二点じゃないかなぁたぶん
211デフォルトの名無しさん:2014/06/14(土) 12:47:48.04 ID:9xl6N+lz
>>208
クラスはCの構造体に次の二つの性質を追加した新しいデータ型
・ メンバー変数のアクセス制御できる
・ メンバーとして変数の他に関数も持つことが出来る
基本、メンバー変数はメソッド(関数)を通じてのみアクセスして、呼び出し側が意識する必要がないように
するのがオブジェクト指向…というかカプセル化かな?

基底クラス(親クラス)をベースにして、メンバー変数・関数を追加して新しいクラス(子クラス)を定義するのが継承

四角形・台形の比喩は‥ ごめん、わからん
212デフォルトの名無しさん:2014/06/14(土) 12:52:23.31 ID:7sAVuJQO
>>207
図形なら、まずは、大きさと描画関数だけあればいいんじゃね
オブジェクトをどう利用したいのかによって、完成形は異なるんだから、
まずは「拡張できる」ように作ることを考える

ゲームを想定して、図形がキャラクタだと思って全体を構成してみたら?

なお、オブジェクト指向なんて、その方が使いやすい場面で使えば十分だ
無理に教科書的な例から学ばなくても、現実ではよく出会う
213デフォルトの名無しさん:2014/06/14(土) 13:18:44.42 ID:9xl6N+lz
継承の例

たとえば、すべての【人間】に共通で、最低限の情報は「名前」「年齢」「性別」くらい?かな
これらをメンバー変数に、変数をR/Wする関数をメンバー関数として(人間)クラスが定義できますよね

新しく【学生】を定義する必要があるとして
一から作ってもいいけど、せっかく(人間)クラスがあるんだから、これに必要な情報(変数)やメソッド(関数)を追加してやれば手抜きできると‥
(人間)クラスに、たとえば「学校名」「学部」「学科」「学年」「学位」を示す変数と、これらにR/Wするメンバー関数を追加してやれば
(学生)クラスが定義できるわけです
【学生】も【人間】だから、人間の属性を継承するということ

わかりにくかったらすまん
214デフォルトの名無しさん:2014/06/14(土) 13:28:08.28 ID:BuWNtkHZ
>>213
人間クラス専用のファイルがあったとする
人間クラスに学生情報を追加した学生クラスにしたとする

別の機会に人間クラスに人種情報を追加して人種クラスを作成する必要が出たとする
この時既に人間クラスは学生クラスに置き換わってる

こんな衝突を経験して頭がおかしくなる
215デフォルトの名無しさん:2014/06/14(土) 13:31:24.42 ID:RWrtwXRC
>>208
SQL-Server の smallint 型とか (w
216デフォルトの名無しさん:2014/06/14(土) 13:57:40.90 ID:hFdfnZbt
学生とか犬猫とかでオブジェクト指向を分かった気になってはいけない(戒め)
217デフォルトの名無しさん:2014/06/15(日) 00:26:42.99 ID:T2fwcVku
>>210 誤字気づきませんでしたthx
218デフォルトの名無しさん:2014/06/16(月) 15:25:13.12 ID:kM7IOeM2
char a[4] = "ABC";
char *b = a;

プログラムの一部に↑というのがありました。
先頭のアドレスを*bに代入?とよく分からなかったのですが、

char *b;
b=a;

としても同じ結果になって、省略できるのかな?と思いました。

他のサイトでは、
char *b="ABC";みたいな記述もあったような。

char *b;
b="ABC";
で、文字列の先頭のアドレスをbに代入してるということでしょうか?
219デフォルトの名無しさん:2014/06/16(月) 15:30:51.00 ID:H3LgDS+r
char *b = a;と

char *b;
b = a;はやってる事は一緒

char *b = "ABC";はできるが

char *b;
b = "ABC";はできない
220デフォルトの名無しさん:2014/06/16(月) 15:36:17.89 ID:kM7IOeM2
>>219
ありがとうございます。
今書いてて、エラーは出ずに実行できたのですが、
書式は間違ってる(サポートされてない)ということでしょうか。

#include <stdio.h>
int main(){
char *b;
b="ABC";
printf("%s %s\n",&b[0],b); //どちらも先頭のアドレスを渡して文字列を表示

printf("%c %c %c %c\n",*b,b[0],b[1],b[2]); //*bに%sではエラー。*bとb[0]はどちらも1文字目を表示。

printf("%p %p %p %p %p\n",b,b+1,b+2,b+3,b+4); //アドレスに配列が格納されていない部分も表示できる。
return (0);
}
221デフォルトの名無しさん:2014/06/16(月) 15:41:16.55 ID:kM7IOeM2
http://homepage1.nifty.com/toshio-k/prog/c/string.html
ちなみにここでした。
>char *s;
>s = "ABC";
一応サポートはされているんですかね。
222デフォルトの名無しさん:2014/06/16(月) 15:48:06.37 ID:wXHrgiMz
>>220-221
もうやめて、>>219のライフはゼロよ
223デフォルトの名無しさん:2014/06/16(月) 21:22:50.87 ID:9t16BPS6
>>207
もうおらんかな?
エスパーでない初学者ですが、自分の練習も兼ねて書いてみました。
メンバ変数を辺で持ったり、対角線を求めるのは出来なかったので
頂点座標を使って面積と周囲長だけ適当に書いてます。
http://codepad.org/mykX2VDE
余計かもだけど親クラスを四角形クラスにしない場合も貼っときます。
http://codepad.org/lm2cxeEM
これだと座標データは派生クラスで持つ必要があるけど、丸や三角形でも
扱えるから使い方によっては楽かも。
224デフォルトの名無しさん:2014/06/16(月) 23:07:32.01 ID:FBqd5r20
>>223
なるほど、ありがとうございます
225デフォルトの名無しさん:2014/06/16(月) 23:24:56.12 ID:FBqd5r20
>>223
なるほど、ありがとうございます

仮想関数について
http://codepad.org/IDh8dIdP
これなのですが上の派生クラスSUPERのポインタを宣言とありますが、TEST
とかいてあるのでTESTのポインタではないのですか??
また、下のほうの
test[0] = new TEST;
test[1] = new SUPER;
はオブジェクト的にはどっちのオブジェクトになっているのでしょうか?
私の考えは、両方TEST型で
test[1] = new SUPER;
は派生も入っているので基底クラスに行った後virtual関数が基底の
をオーバイライド?したのだと思っています。この考え方でよいのでしょうか
226デフォルトの名無しさん:2014/06/17(火) 00:06:29.07 ID:x7Tm4gn4
>>225
virtual関数をメンバーに持つクラスは、仮想テーブルが作られる
virtual関数と同型と見なせる関数を派生クラスで定義するのが、オーバーライド

オブジェクトは、new した方の型だから、test[1] は SUPER
ポインタや参照経由で TEST クラスへのアクセスする場合、
仮想テーブルを辿って本来の型SUPERの関数を呼び出すようになっている
227デフォルトの名無しさん:2014/06/17(火) 02:48:13.60 ID:jLYVWX8U
>>225
コメントは基底クラスTESTだと思います。
オブジェクトの型については>>226が書かれたようにnewした方の型なので
・test[0] : TEST型
・test[1] : SUPER型の内、TEST型で定義の範囲だけ
をポインタから扱えるのだと思います。
TEST型なのにSUPER型の関数が呼ばれるのは仮想関数テーブル(VMT)の為で、
virtual がつくとoutput関数はVMTを介して呼び出されるので
・TESTクラスのコンストラクタ実行時->VMTにはTEST::output()へのアドレス
・SUPERクラスのコンストラクタ実行時->VMTにはSUPER::output()へのアドレス
へ書き換えられた為だと思います。
http://codepad.org/CKXyaOCe
自分の解釈だけで書いたので、詳しい方、訂正お願いします。
228デフォルトの名無しさん:2014/06/17(火) 04:16:51.11 ID:v9u3KVJs
super と test のネーミングが真逆だよ‥
http://codepad.org/I8IPVZCh
229227:2014/06/17(火) 08:50:38.31 ID:jLYVWX8U
>>228
あ、ほんとだ。言われるまで気づきませんでした。
ありがとうごさいます。
230デフォルトの名無しさん:2014/06/17(火) 17:18:19.72 ID:zLfMxzQt
printf("%*s", 3 * (i - 1) + 5, "");

参考書に↑のようなprintf文が載ってました
%*sってどういう意味ですか?
また、3 * (i - 1) + 5で計算してる理由って何ですか?
iはint型変数です
231デフォルトの名無しさん:2014/06/17(火) 17:35:18.74 ID:LnB6vTqT
iが1とする
3 * (1 - 1) + 5 = 5
printf("%5s", "");になる

*に計算結果が入る
232デフォルトの名無しさん:2014/06/17(火) 17:45:36.12 ID:zLfMxzQt
ありがとうございます
理解できました
233デフォルトの名無しさん:2014/06/17(火) 22:10:15.29 ID:uAI2OXqB
MSXMLが使いこなせません><
IXMLDOMDocument2Ptr で CreateInstanceを呼び出してもfailしてしまいます><
助けてください… ソースは↓みたうな感じです
#include <stdio.h>
#include "stdafx.h"
#include <afxdisp.h>
#import "MSXML6.dll" rename_namespace(_T("MSXML"))
#include <msxml6.h>
#include <iostream>
#include <sstream>
#include <fstream>
// 共通プロパティ 全般 共通DLLでMFCを使う
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
AfxOleInit()
//Create the XML
MSXML::IXMLDOMDocument2Ptr pXMLDoc;
HRESULT hr = pXMLDoc.CreateInstance(__uuidof(DOMDocument60));
if(FAILED(hr))
{
AfxMessageBox(_T("Failed to create the XML class instance")); //これが呼び出される
return 0;
}
return 0;}
234デフォルトの名無しさん:2014/06/17(火) 23:37:15.63 ID:UREG7bnw
×__uuidof(DOMDocument60)
○MSXML::CLSID_DOMDocument
235デフォルトの名無しさん:2014/06/17(火) 23:47:33.92 ID:ZnAix8mp
GCC 4.4.7

#include <boost/archive/iterators/base64_from_binary.hpp>
#include <boost/archive/iterators/transform_width.hpp>

typedef base64_from_binary<transform_width<std::vector<unsigned char>::const_iterator,6,8> > base64_text;

「virtual memory exhausted: メモリを確保できません」ってでるんだけど、なんで?
236デフォルトの名無しさん:2014/06/17(火) 23:59:29.90 ID:MCvb+eCN
c++初心者です。
読んで勉強になる、ライブラリ以外のソースコードが知りたいのですが、何かオススメはあるでしょうか?
できれば比較的最近のもので、コンパクトだとありがたいです。
237デフォルトの名無しさん:2014/06/18(水) 02:50:39.05 ID:OD7nApX3
>>234
コンパイルエラーで弾かれてしまいます…

>エラー 1 error C2039: 'CLSID_DOMDocument' : 'MSXML' のメンバーではありません。 d:\cloud\bp\xmltest\xmltest\xmltest.cpp 37 1 xmltest
238デフォルトの名無しさん:2014/06/18(水) 12:33:25.00 ID:/jpL5mxU
239デフォルトの名無しさん:2014/06/18(水) 14:40:05.21 ID:2sj5eCvL
C#とC++を両方やっていると、やっぱりC#のほうが、
作業効率が良いように感じるんですが、みなさんどうですか?
240デフォルトの名無しさん:2014/06/18(水) 16:19:47.82 ID:LAmx7968
>>238
面白いけど、実務では
switch (something) {
case FOO: x = 1; break;
case BAR: x = 2; break;
default: x = 3; break;
}
と書いて欲しい
241デフォルトの名無しさん:2014/06/18(水) 16:40:59.04 ID:c0sLB5UF
>>238
その鱗ははめたままにしておきなされ
242デフォルトの名無しさん:2014/06/18(水) 18:12:14.70 ID:EaENCaWf
multi_arrayはbool型に使えますか?
243デフォルトの名無しさん:2014/06/18(水) 22:51:57.76 ID:b95ka0Af
よくC++はCの上位互換て書いてあるけど、たまにCの方が使いやすいって言うけど結局どっち?
244デフォルトの名無しさん:2014/06/18(水) 22:54:18.49 ID:pJdwjV3r
慣れ
245デフォルトの名無しさん:2014/06/18(水) 23:03:22.67 ID:cO7v6OhK
Cのやり方でやるならCの方が使い易い
C++のやり方でやるならC++の方が使い易い
246デフォルトの名無しさん:2014/06/18(水) 23:07:29.00 ID:Uko284+o
>>243
上位互換だからって使いやすいとは限らないだろ?
247デフォルトの名無しさん:2014/06/19(木) 07:57:19.73 ID:s8Zw40ia
今から勉強するやつはCやんないでC++やればいいの?
248デフォルトの名無しさん:2014/06/19(木) 08:13:27.08 ID:nGqFEu9y
>>247
C++言語の設計者は、C++をシステム言語(OS、共通ライブラリなど)向けとして作ったと言ってる。
つまりそれ以外の用途だと、Cより苦労する。
まあ大抵の個人・組織は何故かシステムレベルの車輪の再発明からやってるんで、Cを使って更に苦労する訳だが。
249デフォルトの名無しさん:2014/06/19(木) 10:06:54.74 ID:uVoak4lN
すみません
CはC++のサブセットだと思ってました
規格の改訂世代にもよるかと思いますが、C++にはなくてCに存在する仕様(機能)って例えば何がありましたっけ?
250デフォルトの名無しさん:2014/06/19(木) 12:51:00.94 ID:gmSqBbFa
可変長配列。
251デフォルトの名無しさん:2014/06/19(木) 14:15:33.09 ID:uVoak4lN
なるほど。std::vectorよりも簡単そうですよね。
252デフォルトの名無しさん:2014/06/19(木) 16:30:13.57 ID:ANGbOwOf
ゲームだとC++で組んでもC++的な機能は使われないな
253デフォルトの名無しさん:2014/06/19(木) 17:24:03.27 ID:SJ+Smgsh
多態性とか使うだろ?
254デフォルトの名無しさん:2014/06/19(木) 17:33:00.68 ID:Brdb8B0I
登場キャラをclassで実装すると固有/共有の属性の扱いがとてもラクになると思うが
255デフォルトの名無しさん:2014/06/21(土) 15:34:10.84 ID:KMvjaKi+
>>239
ちょっとしたものなら C# の方が楽と感じるけど、それなりの規模だとあまり変わらないかな
256デフォルトの名無しさん:2014/06/21(土) 16:50:10.62 ID:+tlHdBiN
>>253-254
そんな、凝ったの書かしてもらってない。そう言えば自分のではC++機能使いまくりだった
257デフォルトの名無しさん:2014/06/22(日) 03:46:49.39 ID:n/T6EZNW
それなりの規模だとコンパイルが遅いんじゃクソボケェ・・・ってなるんじゃないの
258デフォルトの名無しさん:2014/06/22(日) 12:07:54.36 ID:fKkjonsJ
ぴんぴんぷるぷるぴんぷるぷる
テンプレートは遅いね・_・
259デフォルトの名無しさん:2014/06/28(土) 12:52:17.26 ID:Z5Hu91SB
thisの値はオブジェクトが作られて無くなるまで変わりませんよね?
260デフォルトの名無しさん:2014/06/28(土) 23:53:51.23 ID:E/3TLq27
>>259
変わらない
261デフォルトの名無しさん:2014/06/29(日) 08:55:20.94 ID:KFRMJvcV
>>259
変わらないシステムが圧倒的に多いだろうね。
但し、変わった事でプログラムの動作に支障が出るようなら、それはプログラムの
作りがおかしいという事である。
262デフォルトの名無しさん:2014/06/29(日) 12:23:59.35 ID:XFCViuqu
ありがとうございます
263デフォルトの名無しさん:2014/06/29(日) 12:38:08.93 ID:K5dqtKQ7
マルチだとどっちに解答すりゃいいんだか
264デフォルトの名無しさん:2014/06/29(日) 12:51:05.82 ID:KFRMJvcV
>>263
全部に
マルチすんな!ヴォケ!
とレスするのが2chの作法、K&Rに書いてある。
265デフォルトの名無しさん:2014/06/29(日) 12:56:09.95 ID:d4tnsDO5
>>261
> 変わらないシステムが圧倒的に多いだろうね。

変わるシステムなんてあるの?
そのオブジェクト参照されてる場合、勝手に変わられると困ると思うが。
266デフォルトの名無しさん:2014/06/29(日) 13:20:20.11 ID:XFCViuqu
変わるとマジで困るんで、
変わらない証拠おしえてください。
267デフォルトの名無しさん:2014/06/29(日) 13:49:04.09 ID:kMofjRV8
>>266
文脈では仕様の話なんだが?
268デフォルトの名無しさん:2014/06/29(日) 14:10:16.72 ID:XFCViuqu
仕様として変わってもいいという風にC++の仕様書には書いてあるということか?
269デフォルトの名無しさん:2014/06/29(日) 21:44:12.38 ID:vXcDBpcb
マジレスして損した。
270デフォルトの名無しさん:2014/06/29(日) 22:32:21.70 ID:KFRMJvcV
>>265
winのAPIにもあるGlobalLockやGlobalUnlockは、そういう用途に使ってたよ。
今はheapを使うのが普通だけど別にオブジェクトをここに作る事が絶対禁止な
訳じゃない、まあオブジェクトの参照をどう保持するかの問題だな。

システムというかCPUが不自由だとメモリの仮想化が不十分でプログラムが
「実行中に何度も別のアドレスに勝手にリロケートされる」なんてことも起こり
得たんだよ。
271デフォルトの名無しさん:2014/06/29(日) 22:44:24.39 ID:Hir1ALDw
GCを使うと、thisも変わるんじゃね?
272デフォルトの名無しさん:2014/06/30(月) 07:16:38.00 ID:RRSpyW++
>>270
GlobalAlloc とかのだとアクセスはメモリーハンドル使う訳で、普通の heap と違うでしょ?
そんなもんどや顔で出されても困るわ (w
273デフォルトの名無しさん:2014/06/30(月) 16:39:38.34 ID:OoeeUvmn
顔が見えるのか
274デフォルトの名無しさん:2014/06/30(月) 19:51:06.53 ID:K5zrSJWB
>>272
君は理解の仕方が中途半端だね。
> アクセスはメモリーハンドル使う
真っ赤な嘘を広めてはいけない。
アクセスする為のポインタを得る為にメモリーハンドルを使うんだ。
君のようにメモリーハンドルでアクセスしたら例外で吹っ飛ぶよ?
275デフォルトの名無しさん:2014/06/30(月) 20:32:11.67 ID:S8arh0g0
>>274
そんな当たり前の事を知らないなかとでも言うように説明する人が居るとはな
276デフォルトの名無しさん:2014/06/30(月) 21:32:07.01 ID:K5zrSJWB
よかったな、一つ賢くなったじゃないか
277デフォルトの名無しさん:2014/07/01(火) 02:31:23.23 ID:aHhEQ2XO
>>1
VS2010で int が long int と同じになってた。
278デフォルトの名無しさん:2014/07/01(火) 07:13:49.59 ID:uMb52dFR
>>274
ハンドルとポインタの区別もつかんのか (w
279デフォルトの名無しさん:2014/07/03(木) 23:02:29.48 ID:2beLGnBn
最近、プログラマの仕事ってマーシャリングばっかりだな…
そうでないのは力仕事だし

(ネイティブに限る)コンパイラって何なんだろうって思う
280デフォルトの名無しさん:2014/07/08(火) 21:18:40.46 ID:JvR/NBCs
C言語からC++にステップアップしようかと思うんだけど
最新のC++11まで含めて浅くでいいから広範囲に扱ってるサイトとかないかな
281デフォルトの名無しさん:2014/07/08(火) 23:26:58.23 ID:KPHElX/P
>>280
cplusplus.com
282デフォルトの名無しさん:2014/07/09(水) 03:19:15.41 ID:oP2kEIS8
>>281
ありがとう。一瞬躊躇してしまったが比較的平易な英語で書かれていて
これなら翻訳サイトと併せてなんとか読めそうなのでがんばってみる
283デフォルトの名無しさん:2014/07/09(水) 08:23:29.93 ID:QPl72qxT
いちいち翻訳通すくらいなら日本語のリファレンス本買った方がいいよ
英語サイトへ行くのはその次だ
284デフォルトの名無しさん:2014/07/09(水) 14:41:27.65 ID:eczUeSs+
全角文字のアルファベットをtoupper()したいのですが、
標準関数でそういうの無いですか?
285デフォルトの名無しさん:2014/07/09(水) 15:30:20.52 ID:aj4O2jpl
>>284
先ず始めにお聞きしたいのですが、お使いの言語は何でしょうか。
Cでしたら、ありません。
286デフォルトの名無しさん:2014/07/09(水) 16:32:23.48 ID:sSBu2vKy
287デフォルトの名無しさん:2014/07/09(水) 21:05:24.47 ID:lRyDFvzO
CでS-JISなら
http://www.ncad.co.jp/~komata/c-kouza23.htm
などを参考にしてみるとか
288デフォルトの名無しさん:2014/07/09(水) 21:56:20.52 ID:75kwCoC7
http://codepad.org/JuKVmyrc
このコードを3つに分けてコンパイルすると メンバ関数未定義とコンパイルエラーでます
ggった通りにインクルードしてると思うのですがなにを間違えているのでしょうか
アドバイス頂けませんか
289デフォルトの名無しさん:2014/07/09(水) 22:08:53.21 ID:nVe34nkn
rational.cppがリンクされてないんだろう
使ってるコンパイラとエラーの内容がないから何とも言えん
290デフォルトの名無しさん:2014/07/09(水) 23:12:26.78 ID:75kwCoC7
>>289 リンクを頼りにggったら出てきましたありがとうございます
結構な時間ggってるのに見つけられない情弱さ嫌になるね
291デフォルトの名無しさん:2014/07/10(木) 14:11:27.79 ID:YR8w5b7e
string array[] = { "abc", "edfg", "AB" };
みたいに初期値を代入した配列の要素数3を
求める方法ありますか?
292デフォルトの名無しさん:2014/07/10(木) 14:47:40.07 ID:+wVx4yYh
>>291

sizeof(array) / sizeof(* array)
293デフォルトの名無しさん:2014/07/10(木) 14:53:22.59 ID:YR8w5b7e
>292
ありがとうございました。
294デフォルトの名無しさん:2014/07/10(木) 16:28:49.65 ID:TeSkcnCY
_countof()
295デフォルトの名無しさん:2014/07/12(土) 22:48:46.26 ID:MTjCae/M
ネットで、以下のようなマクロ見たんですが
#ifdef NDEBUG
#define dbgprintf 1 ? (void)0 : (void) //(1)
#else // #ifdef NDEBUG
#define dbgprintf printf
#endif // #ifdef NDEBUG
よくわかりません。(1)の行はNDEBUGの時に出力しないようにしているようですが、
#define dbgprintf
としても同じじゃないですか?(1)の意味を教えて下さい。
296デフォルトの名無しさん:2014/07/12(土) 22:58:05.24 ID:m5S9HQxE
それだと
dbgprintf("%d", func());

("%d", func());
になってしまう
297デフォルトの名無しさん:2014/07/12(土) 22:59:07.97 ID:wXyVo6GR
条件 ? 真の時 : 偽の時
298デフォルトの名無しさん:2014/07/12(土) 22:59:49.53 ID:wXyVo6GR
くあしくはサンコン演算子かなんかでggrks
299デフォルトの名無しさん:2014/07/12(土) 23:14:44.12 ID:MTjCae/M
Visual Studioならビルドも実行も問題なくできるですが。
300デフォルトの名無しさん:2014/07/12(土) 23:57:52.87 ID:NSx3oKmy
その例だとfunc()が呼ばれちゃうだろ。それも含めて、無害化したいんだろ。
301デフォルトの名無しさん:2014/07/13(日) 00:04:12.05 ID:SsDCNXiH
visual studio だと、これで行けるんですが。何でかな?
#include "stdafx.h"
#define dbgprintf 1 ? (void)0 : (void) //(1)
int func(){
  return 1;
}

int _tmain(int argc, _TCHAR* argv[]){
  dbgprintf("%d", func());
  return 0;
}
302デフォルトの名無しさん:2014/07/13(日) 00:06:25.36 ID:b0K+GMLz
ifdefの切り方のが気になる
303デフォルトの名無しさん:2014/07/13(日) 00:07:03.38 ID:SsDCNXiH
↑のは間違いでした。↓こっちでも行ける理由が分りません。
それが知りたいのですが。

#include "stdafx.h"
#define dbgprintf
int func(){
  return 1;
}

int _tmain(int argc, _TCHAR* argv[]){
  dbgprintf("%d", func());
  return 0;
}
304デフォルトの名無しさん:2014/07/13(日) 00:08:43.08 ID:G9QhDNfC
だからfunc()が呼ばれるって言ってるだろ。
305デフォルトの名無しさん:2014/07/13(日) 00:09:06.82 ID:b0K+GMLz
>>303
define展開後のソースをベタで書いて動かせばいーじゃない
306デフォルトの名無しさん:2014/07/13(日) 00:11:43.83 ID:SsDCNXiH
>>304
なるほど。そうすると、funcの戻り値はどうなるんですか?
("%d", func());

("1");
になって、この後どうなるんですか?
307デフォルトの名無しさん:2014/07/13(日) 00:15:05.28 ID:SsDCNXiH
>>305
int _tmain(int argc, _TCHAR* argv[]){
  ("1");
  return 0;
}
で動きました。 ("1"); の行は、実行に影響ないんでしょうか?
308デフォルトの名無しさん:2014/07/13(日) 00:29:57.79 ID:b0K+GMLz
>>307
ない
voidキャストされる
無駄処理なだけ
309デフォルトの名無しさん:2014/07/13(日) 00:37:10.72 ID:G9QhDNfC
そもそもそんな評価されねぇよ。あんた、「人間じゃなくて人だな」って言われない?
どこから"1"が出てくるんだよ、この間抜け。
310デフォルトの名無しさん:2014/07/13(日) 00:43:29.81 ID:G76Sa1hj
>>303
はfuncは呼ばれません。
311名無しさん@0新周年:2014/07/13(日) 01:31:07.42 ID:nrxOtUVn
int a=(123,func());
312デフォルトの名無しさん:2014/07/13(日) 01:33:03.22 ID:7UphRhX9
まず忌まわしきカンマ演算子を知るべき
話はそれからだ
313デフォルトの名無しさん:2014/07/13(日) 02:03:15.70 ID:psjBpgTU
for(i=0,j=100;i<5;i++,j-=20)
314デフォルトの名無しさん:2014/07/13(日) 07:29:50.12 ID:psjBpgTU
1, 連続した配列を2次元配列のように扱いたいのですがどうすればうまくいきますか?
 今の所は値が書き変わっていません
2, VC++2010EEではコメントのようにキャストしないとエラーになるのですがどこを直せばいいですか?

ttp://ideone.com/2cbjRj
315デフォルトの名無しさん:2014/07/13(日) 08:02:48.70 ID:fGnnU/OX
>>314
質問内容とソースとが対応していない、に1票。
316デフォルトの名無しさん:2014/07/13(日) 08:57:51.52 ID:0Iul1EJe
1. ideoneの出力を見る限り、1, 2, 3, ...が10, 20, 30, に書き換わっている
2. エラーメッセージを書く。常識
317デフォルトの名無しさん:2014/07/13(日) 10:39:54.60 ID:SsDCNXiH
カンマ演算子ググッようやくdbgprintfマクロの挙動わかりました。
有難うございました。
マクロ勉強中で、もう一つ教えてください。こんなマクロ見つけたのですが、
#define eqstr(a, b) (*(a) == *(b) && strcmp(a, b) == 0)
文字列が等しいかどうか調べるだけなら、
#define eqstr(a, b) (strcmp(a, b) == 0)
でいいと思うのですが、*(a) == *(b)は何ですか?
318デフォルトの名無しさん:2014/07/13(日) 10:48:19.01 ID:nn2UNRM4
(a)の中身が a + 1 だったりしたらどうする
319デフォルトの名無しさん:2014/07/13(日) 11:04:10.62 ID:SsDCNXiH
その時は、例えば
char a[]="1234";
char b[]="234";
とすると、
eqstr(a+1,b)は
strcmp(a+1, b)==0で
strcmp("234","234")==0で
等しいと判断されると思います。
320デフォルトの名無しさん:2014/07/13(日) 11:34:51.98 ID:iBUseW7g
2次元配列の動的確保なんですが、例えば2*3の2次元配列の場合

int **a = (int**)malloc( sizeof(int*) * 2); (@)
a[ 0 ] = (int*)malloc( sizeof(int) * 2 * 3 ); (A)

のように確保するといろいろなサイトで見かけました。

 そこで行数列数未定の2次元配列を動的確保したいのですが、
@とAの部分をreallocを使って再確保していこうとして失敗しました。
@で最初に必要な行数を与えればうまくいくのですが、行数を1つずつ増やしていく方法はありませんか?
321デフォルトの名無しさん:2014/07/13(日) 11:49:18.37 ID:psjBpgTU
>>315,316
ideone用に書き換えてる間に直ったのかもしれません
お騒がせしました

>>320
リスト構造?
322デフォルトの名無しさん:2014/07/13(日) 12:11:30.17 ID:mc+PMj3L
>>320
Aはそんなにタップリ確保しなくていいよ。
aがどんな変数か考えると簡単かも。
↓この例だと、
一行分のデータへのポインタを、最初二個持ってて、
realloc後は三つもつことになる。

#include <stdio.h>
#include <stdlib.h>
int main(){
int i, j, **a = malloc(sizeof (int *) * 2);
a[0] = malloc(sizeof (int) * 3); // 一行割り当て
a[1] = malloc(sizeof (int) * 3); // 一行割り当て
for (i = 0; i < 2; i++) for (j = 0; j < 3; j++) a[i][j] = i * 10 + j;
for (i = 0; i < 2; i++) for (j = 0; j < 3; j++) printf("%d:%d %d\n", i, j, a[i][j]);
puts("");
a = realloc(a, sizeof (int *) * 3); // 行数を増やす
a[2] = malloc(sizeof (int) * 3); // 一行割り当て
for (i = 0; i < 3; i++) for (j = 0; j < 3; j++) a[i][j] = i * 10 + j;
for (i = 0; i < 3; i++) for (j = 0; j < 3; j++) printf("%d:%d %d\n", i, j, a[i][j]);
return 0;
}
323デフォルトの名無しさん:2014/07/13(日) 12:23:37.32 ID:iBUseW7g
>>322
解答ありがとうございます
>>320に書いた確保の仕方は、メモリ領域に連続して確保するためのものでした分かりづらくすみません
なのでAの後には、
for (i = 1; i < 2; i++) a[ i ] = c[ i-1 ] + 3;
このような処理が入り、全体のサイズを確保した後に、行を割り当てることになります。

おっしゃる通りの行ごとに列のサイズを確保し、メモリ領域が連続になっていない確保の仕方では、
プログラムはエラーをはかずに動作しました。
324デフォルトの名無しさん:2014/07/13(日) 12:25:16.99 ID:iBUseW7g
>>323
×c[i-1]
○a[i-1]

でした
325デフォルトの名無しさん:2014/07/13(日) 15:40:25.69 ID:7UphRhX9
>>317
多分ほんのちょっぴりでも高速化したいんだろ
普通のコーディングならそもそもマクロじゃなく関数にすべき
326デフォルトの名無しさん:2014/07/13(日) 16:16:05.62 ID:0Iul1EJe
高速化のつもりだろうね
関数コールのオーバーヘッドがよほど気になる状況でも無い限り、
効果は薄いと思う。>>317 が興味があるなら、短絡評価を調べるといい。
マクロ自体は、strcmpのa,bの方は括弧でくくってないし、なんか中途半端
327デフォルトの名無しさん:2014/07/13(日) 18:34:21.87 ID:25pakNK6
strcmpの方はカンマ演算子をオーバーライドしてない限り大丈夫じゃね?
優先順位低いし
328名無しさん@0新周年:2014/07/13(日) 19:38:19.95 ID:XpdRKiat
(j-1)[a]
329デフォルトの名無しさん:2014/07/14(月) 03:16:13.60 ID:v6rlvCBe
>>317
高速化のつもりだろう。しかし、最近のコンパイラではstrcmpはストリング命令に
インライン展開される(ことが多い)ので、かえって低速化を招く。
330デフォルトの名無しさん:2014/07/14(月) 06:11:18.36 ID:PQHLBfsn
gccの最新バージョンではSSE4.2命令まで使ってるよ
-marchオプションで使える時はそちらをリンクするようになっている
331デフォルトの名無しさん:2014/07/14(月) 21:15:27.78 ID:QdFaiwl3
IO速くするにはどうすればいい?
バッファリング?
332デフォルトの名無しさん:2014/07/14(月) 21:53:25.57 ID:dxRw1V7C
SSDを買う
333デフォルトの名無しさん:2014/07/14(月) 22:52:44.27 ID:kVP5lF+/
>>329
最適化という機能があるよ
334デフォルトの名無しさん:2014/07/15(火) 00:07:32.82 ID:/VWMpkMO
>>331
なんでもかんでもオンメモリー
335デフォルトの名無しさん:2014/07/15(火) 12:25:59.43 ID:zrHbAgn8
繰り返し書き込むファイルの断片化対策
読込量・回数を減らす…インデックスやハッシュの活用
予算が余ってるならRAIDを組む
メモリが余ってるならRAMディスクもあり
336デフォルトの名無しさん:2014/07/15(火) 16:12:20.00 ID:eA5jv2Nf
I/Oそのものの高速化は手間なので、データ圧縮し転送時間を減らす。
とか言ってみる
337デフォルトの名無しさん:2014/07/16(水) 09:34:20.91 ID:b0IB8P33
リングバッファとセマフォ(2つ)とスレッドを使って先読みする
338デフォルトの名無しさん:2014/07/17(木) 00:36:59.90 ID:OBbzwXpO
HDDとか圧縮したまま記録すれば早いんじゃ?
339デフォルトの名無しさん:2014/07/17(木) 01:09:36.88 ID:bej3WA57
ZFSというLZ4圧縮を使えるファイルシステムがあってな
340デフォルトの名無しさん:2014/07/17(木) 15:07:58.26 ID:STDuRs09
初心者です。
ソースをすっきりさせたいので、
ウィンドウプロシージャとかWinMainとか、
include以外の全部をDLLに投げ込んじゃってもいいんでしょうか?
341デフォルトの名無しさん:2014/07/17(木) 15:17:12.77 ID:to24R3x/
なぜDLLに投げ込めばソースがすっきりするんだ?
342デフォルトの名無しさん:2014/07/17(木) 15:46:04.62 ID:en/jF64V
ソースファイルを分割するのとごっちゃになっているのではないか
343デフォルトの名無しさん:2014/07/17(木) 17:58:00.24 ID:wKNmXy3y
DLLにWinMainは無理だ
鶏が先か卵が先かになってまう
344340:2014/07/17(木) 19:43:39.87 ID:STDuRs09
ありがとうございました。
345デフォルトの名無しさん:2014/07/18(金) 10:30:44.47 ID:vLbu0UtM
C++って何を作るのに優れてるの?ゲーム以外で
346デフォルトの名無しさん
Web系以外なら何でも