スレを勃てるまでもないC/C++の質問はここで 22
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コマンドと同じ機能を持ったプログラムを作りたいんですけど
何か良い解説が載ってある本かサイトはないでしょうか?
該当するUnixコマンドのGnu実装のソース読めば?
Cで書かれてるの多いし。
system();関数でコールするとかw
C++11ではnullptrというものが追加されたそうですが
null_ptrではないのには何か理由があるのですか?
どうでもよいことですが気になってしまいます
タイプする文字数が少ない
素直に null にしとけっちゅうねん
ポインタは全て動的っで
最終的に解放が必ず必要って解釈して良い?
動的じゃないポインタってある?
11 :
デフォルトの名無しさん:2014/05/16(金) 16:14:28.33 ID:wig+3ePF
ある。
int a;
int *p = &a;
ポインタは宇宙なので単一に矮小化してとらえることはできない
13 :
7: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);
分母が0かどうかを判定するのに==0で等値比較をするのは、
==0でtrueでにならない限り計算ではエラーにならないと思うので
問題ないですよね?
>>17 型が double で、非常に小さな値のときに、
==0 は false だけど、演算結果が無限大になることはあるけど大丈夫?
プログラムとあんまり関係ないけど、
シミュレーションプログラムでの命名について
アイデアください
時間を無次元化したら
stepって単位にするのが一般的だと思うけど
長さを無次元化したら
なんて名前にしたらいいと思う?
>>19 それぞれtとlでええんとちゃう?
lが嫌ならmとかで
hex
無次元と無名数は違うんじゃないだろうか?
かなり初歩的な質問でごめんなさい。
vectorに配列型を指定した場合の挙動が分からなくて困っています。
正確には
std::vector< double[2] > vec1;
みたいなコードを書いたんですが、これはやってはいけないコードなのでしょうか?
push_backやresizeを呼ぼうとするとどうやってもエラーで進まないです。引数有りコンストラクタも呼べません。
素直に
vector<double> vec1[2];
とやるべきなのでしょうか?
また、テンプレートに配列型を指定できないのはvector特有の性質なのでしょうか?
>>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]となる
>>24 ありがとうございます
template自体が配列使っちゃいけないんですか
現在newを使ってるんですが、ソースの書き換えができない段階に来ており
添え字の問題を解決するために結局operator[]を定義したクラスを作ることにしました
最近C++の勉強を始めました。開発にVisualStudio2008を使っています。
普段はJavaを使用しており、開発環境もEclipseを使っているのですが
どうにもVisualStudioの使い方が判らず困っています。
VisualStudioの設定や便利な使い方を学ぶのにお勧めのWebサイトや書籍などありませんか?
Visual Studioのスレがあるじゃないか
なぜここで訊く
つまり、そもそもヘルプやドキュメントの検索ができない(これはスレタイトルの検索が
できなかった時点で確定している事実)のだから、机を並べて事細かにアドバイスして
くれるような人間がいない状況で新しいものに手を出すのは無謀なレベルの人間
>>26
>>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;
}
Cで実体にはconstありの引数を持った関数のプロトタイプ宣言の引数に
constを付けても付けなくても違反でないのですが、どちらがよいのでしょうか?
linux環境下でc言語を用いて動画を再生する方法は無いでしょうか?
x11ウィンドウ内に表示したいです
>>30 なぜconstを付けるのかということを考えると
プロトタイプ宣言に付けないと価値が半減する
>>29 arrayのことは知りませんでした。その方がずっと簡単にできますね。
こちらの状況は、これまでnewで
int n = XXX;
double (*vecters)[2] = new double[n][2]
のようにしていたのですが、当初想定してなかったメモリ解放のケースが大量に出てきてしまいました
そこでvectorで解決しようと思ったのですが、vectorにvector入れ子だと添え字の順番が逆で
しかしもう書き換えができないほど利用数が多かったので、vectorに自分で定義したクラスを入れようとしてました
ですがarray使えば済む話でしたね。今までSTLにあまり触れてこなかったのですが、これを機に勉強しようと思います
ありがとうございました
>>31 system("vlc moviefile.mp4");
>>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;
}
委譲を使いクラスを生成した場合
委譲をした元クラスを解放すれば
委譲されたクラスは自動で解放される?
委譲されたクラスのデストラクタはちゃんと呼ばれる?
試せば?
>>35 このスマポという奴を使う場合
ud[n][2]の2のほうも変数にする方法は有りますか?
>>39 constexpr int を使えば行ける
但し行毎に列の長さを変えるような使い方は出来ない
そういう時はvectorを使う
41 :
デフォルトの名無しさん:2014/05/19(月) 23:45:45.38 ID:Bw7LBrUS
c言語を学びたいとおもうんですが開発環境でつまずいてしまっています
パソコンに入っている microsoft visual studio professonal 2013
でc言語を入力したいと思っているのですがなかなかうまくいきません
どうすればいいですか?
あとおすすめのc言語開発環境などがあったらおしえてほしいです
constexpr size_t の方がいいかな・・・
でも64bit環境でそんな大きな配列使わないよね・・・
>>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 全部が全部同じじゃないし、投稿時間だって10分も違わないし、レスが被るくらいでみみっちいこと言うなよ
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の値が不明になってコンパイル出来なくなるので外に出した
デリータをラムダにしたらいかんのけ
ディリータがラムザだって?
>>50 autoに代入してからなら入るはずだけど
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
A *a, *b;
a = new A;
b=a;
delete a;
a=new A;
b!=a
という保証なんてどこにもないですよね?
一度開放した領域が再度割り当てられることはないという保証なら、ありませんね。
え?
delete a;を一行後ろに回さない限り、b!=aもb==aもありうる。
派生クラスのデストラクタには
とりあえず virtual つけとけば問題ない?
基底クラスの方に付けろ
60 :
57:2014/05/21(水) 21:12:40.05 ID:Rtlj0b94
間違えた
基底クラスのデストラクタには
とりあえず virtual つけとけば問題ない?
あと、派生クラスのデストラクタに
virtual つけとくとなにか問題ある?
>>61 ×基底クラスのデストラクタが呼ばれず
○派生クラスのデストラクタが呼ばれず
あと、それが起きるのは基底クラスにキャストした状態でdeleteした場合などで、
デストラクタが呼ばれない事が問題だから起きるのはメモリリークだけじゃない。
ハンドルがリークする場合もあれば終了処理が行われない場合もある。
だったはず。
64 :
60:2014/05/22(木) 20:57:36.89 ID:m4yPgbOU
ぶっちゃけ
クラスのデストラクタ全てにvirtualつけとけば
問題なくない?
C++にてSwitch文を使った相性占いプログラムのソースを書いてほしいです
まず最初に二人の情報(5桁の数字ID、生年月日)入力をして、
そこから演算を行い、占い結果を表示するプログラムのソースを書いていただけないでしょうか
演算方法は何でもいいですし、結果は何通りでもいいです
簡単なものでも全然構いませんので、お願いしますm(_ _)m
>>66 占い結果で分岐するのをswitch使ってって事でいいのか
>>66 何もかも丸投げしてんじゃねーよw
せめてIDと生年月日から占う部分だけでも作れ
(もちろんコード化できるぐらいキッチリ仕様をまとめること)
>>69 switch(占い結果){
結果1:
printf("結果1です");
break;
結果2:
printf("結果2です");
break;
}
>>71 まさか答えてくださるとは……涙が出てきました、本当にありがとうございます!!!TT
まだ何もかも初心者で分からないですがあなたのような人を目指して勉強がんばっていきたいですっ!
>>72 入門書片手にゆっくり学んでいけばいいんじゃないかな
「C++で」と書いてあったからワザとclassとかfriend関数とか使ったけど、
本来なら小細工無しでmain関数だけでも書ける内容だしね……
流石にやりすぎた感が否めない(^_^;)
(そもそも剰余取るならswitch使わず最初からstd::stringの配列として
結果を用意した方が良いと思うけど)
デバッグプリントだとわかっているならデバッグモードをやめればいいんじゃないかな?
vector<string> myVect;
にいろんな文字列を代入したとして、その中から、
string keyWord ="ABC";
で始まっている要素だけを取り出して、新たなvector<string>を
作りたいのですが、どう書けばよいでしょうか?
>>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]);
}
}
vector<string> words;
for (auto& str : myVect) {
if (str.find(keyWord)==0) words.push_back(str);
}
>>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){
...
}
};
>>80 サンプルありがとうございます。
これを参考に作ってみます。
>それは簡単にはできない。
簡単には出来ないということですが、何か難しい手法を使うと実現できるのでしょうか?
C#だと既存のクラスに拡張メソッドを追加できたので、C++でも出来るのではと思ったのですが。
>>81 C#でできることがC++でできるわけでなはい、逆も然り
簡単には追加できないので、ある種のライブラリセットでは、
myVect|startWith("ABC"); みたいな書式で関数を追加する方法を採用している。
なお
>>80 で作ったクラスは、vector として使うとスライシングやリークを起こすので、
MyVector というクラスそのものとして使うこと。
言語レベルでできるできないというのは、標準装備の記述が使えるか否かだけだろうね。
特にC/C++システム記述用に設計された経緯があるからC++で簡単に「できない」という
のは、かなり危険な知識レベルの表れだね。
#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
そんなわけのわからないのはどうでもいい。
まともに見れるやつに書きなおしたら動くだろ。
>>84 何をやりたいのかよくわからないので形式的な点だけを指摘するのだが
>char** pp = (char**)malloc(sizeof(char*) *(len+1) );
ここでメモリを確保できなかった場合は pp == 0 となるのだから
>if( *pp == NULL ){
ここは pp == NULL となるべき
可読性は悪くて申し訳ない
他のコードをコンパクトにしたら意味のないものになってしまいました
>>86 直してみましたが visualC++で思い通り gcc でmemoryerrorです
ポインタの動的配列を作って要素にアクセスしたいのですがあってますか?
if( pp == NULL )
じゃないのか
*ppに何入ってるかなんてわからんだろ
申し訳ない!
>>86 >>88 修正でgcc直りました
修正前visualC++ 動いてたのはなぞだが
お騒がせしました
codepadいいですね
もうお騒がせしたくないのですが
レベル上がってまともな議論できるようになったらまた来ます
visualC++はミスを勝手に補っていたと認識すればいいのかな
たまたま確保したメモリが0クリアされてただけでしょ
>>92 修正前と修正後レスしたらわかるんじゃないかな
この手のやつは Debugでは動いたけど Releaseでは動かないというよくある罠
>>99 29行目 hoge[i]は&つけないといけないと思う
いや、つけてはいけません。
ああ pp宣言*1個になってるし意図が伝わってなかった
ポインタ型の動的配列を作りたかったんです
ポインタの配列なら*p[定数]で済むのに...
>>102 > ポインタ型の動的配列を作りたかったんです
なるほど。では
>>99はあなたの「やりたいこと」とは違いましたね。失礼
これこのまんまじゃ期待してる動作してないんじゃないの
結果的に出力が同じになってるだけで、おそらくやらせたいだろうことはしてないぞ
いや、mainのhoge変数の各要素のポインタが欲しいだけならこれでいいのか
一部期待した動作をしてないであろう箇所があるってのが正しかったな
今のままだと
>>89のコードでいう31行目の確認は意味のないコードになってる
正しくは
for( i=0; i < len; ++i )
{
printf( "%c", **(pp+i) ); // もしくはprintf( "%c", *pp[i] );
}
printf( "\n" );
だと思う
あと将来的に関数fを、ppのアドレスを返すように改造する場合は
bが一時オブジェクトだからこのまま返すわけにはいかないんじゃないかな
>>106 これ見て思ったけどfor文++iじゃなくてi++にするべきだったわすまん
突然書く人変わってるって疑われるわ
ぶっちゃけfor文の中のは大差無いらしいけど俺は前置派>インクリメント
>>108 今どきのコンパイラならどうせどっちで書いたって最適化してくれるんじゃねって思うしな
Cが来た時にC++になるから後ろに置きたい
C++ では後置インクリメントは悪の根源並に嫌われるが
前置にしろ後置にしろ
1行にそれしか書かないようにしてる
>>113 クラスだと、前置インクリメントオペレータしか作らないことが多い。
後置だとコピーしないといけないからね。
後置インクリメントは副作用でかいよ
助けてください
pathfileexistsを使ってサーバーの共有フォルダ内のファイルの存在をチェックしているんですが、
自分のPCだと問題なくファイルを確認できるのに、ほかのPCに持っていくと
ファイルは存在しているのにfalseが返ってきてしまいます…
パスワードもないしエクスプローラから問題なく見えるのですが何が原因分かりませんか?
シェルから辿ってみれば
当然GetLastErrorは見たのか
>>115 副作用がでかい?
用語はちゃんと理解した方がいいぞ。
>>119 最近聞きかじって使いたくなったんだろ。
static変数をメンバーに持つクラスって
そのクラスを生成しなくても
そのstatic変数はプログラム実行時に生成されるの?
122 :
64:2014/05/28(水) 01:45:41.29 ID:1069+ikW
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 するときに文字コードを指定する方法はありましたが、
上記のような流れのときにエンコードを指定する方法がわかりません。
>>122 virtualつけると関数コール時に仮想関数テーブル参照することになって遅くなるしインスタンスのサイズも少しでかくなる
10回や100回程度ならそんなにだが1万回呼ぶとかになると結構でかい
詳しく知りたいなら仮想関数テーブルでググればいっぱい出てくるんじゃね
>>123 そもそもFileInfo通す必要あるのか
ファイルのパスが分かってるならそれをもとにStreamWriterを新しく作ればいいと思うんだが
StreamWriter^ writer = gcnew StreamWriter( ファイルパス, true, Encoding);
あとこれ本当にC++/CLIか?gcnewじゃなくてnewなあたりC#くさいんだが
>>121 定義した時だね
struct A { static int a; }
なら
int A::a;
とかで定義するのでグローバル変数と同じ扱い
>>121 Java ならクラスのstatic な変数は実行時に "自動的に" に生成されるが
C++ はクラス定義とは別にプログラマが自分で実体を定義してやらねばならない =
>>126
>>122 移転のあおりで消えたレス
>
>>65 > vtbl参照するポインタ一つとdeleteする時の参照コストは増えるけど…
> ポインタ一つのメモリ量気にする場所でクラス使うなやって感じだし、
> パフォーマンス気にする処理の中でnew/delete連発もしちゃ駄目でしょ。
>>125 仮想関数テーブルを経由するのはvirtual付いてるメソッドだけだから、
デストラクタだけに付けててそれが乱発されるって設計の時点でパフォーマンスは投げ捨て済み。
あと仮想関数テーブルは同一クラスのインスタンス間で共有してたりするから、
その場合インスタンスあたりのメモリ消費の増加はポインタ1個とかのオーダになる。
これが問題になるケースというのもやはりその時点でパフォーマンスは投げ捨て終わってると思う。
>>128 数千単位のデストラクタ呼び出しを毎フレーム乱発することなんてまずないけど
数千を何セットか確保した結果の数万をあるタイミングで一気に解放するってケースは稀ではあるもののなくはないと思うが
そういう時にvirtualしてなきゃ速度をずいぶん改善できることはあるだろ。まあ大抵そもそもテンプレートでの実装とか代替案がでるとは思うが
あと大きくなるってのはまさにそのポインタ1個分だからな。これも圧迫されうるのは積もり積もったときだけで数百程度だったら気にするだけ無駄だが
>>129 何処でロスが出るか完全に制御してクラス使う人は「デストラクタ全てvirtual」なんて選択肢は端から無いだろうし、
数万単位の情報を速度重視で扱うなんて状況で1個1個クラスにして欲しくねぇわ…ってのは贅沢な願いなのかな?
>>124 それは試しました。
ユニティ上ではエラーなくビルドできるのですが、
StreamWriter sw の部分で何故かこけてしまいます。
ファイルのパスなどは、UTF-8でちゃんと動いているので問題ないかと思ってます。
>>125 確認しました、ご明察のとおり、C++ ではなく C# のようです。
あと、ユニティとアンドロイドで開発してます。
FileInfo をなぜ使っているのか解らないのですが、
124 の方も教えてくれたサンプル通りにやっても実機で動きませんでした。
C# なら、別のスレッドに質問した方がいいですか?
C++/CLIですらこのスレでいいのか迷うレベルなのにC#をここで良いかって聞かれてもな…
shared_ptrに入れとけばデストラクタがついてるかついてないかなんて関係なくなる
#pragma once
ってヘッダーの先頭に一回書くだけでいいんですよね?
下に示すような書き方しているのを見たことがあります。
何か意味があるのでしょうか?
-----あるヘッダファイル-----------
#pragma once
class A{
...
};
#pragma once
class B{
...
};
#pragma once
class C{
...
};
#pragma once
...
ただのアホ
バラバラのファイルを連結しただけならギリギリセーフ
無意味
知らない人を惑わせたという点で有害
全クラスのデストラクタに
とりあえず virtual つけとけば問題なくない?
これでエラーが出ることある?
付けるのは多態性を使うクラスだけで十分
無駄につけると遅くなるから嫌われる
個人製作に限るならあえて止める理由はない
嫌われるけど、デストラクタをvirtualにして明らかに遅くなるようなケースはあんまりない気が
それで遅くなるような状態ならどうせそれ以外にも遅くなる要因が山ほどあるだろうし
144 :
121:2014/05/29(木) 15:52:06.88 ID:zblOCN9G
static変数をメンバーに持つクラスを解放したら
static変数でも解放されて使えなくなるよね?
クラスの解放って?
staticメンバーのコンストラクタはプログラム開始時に呼ばれる。
staticメンバーのデストラクタはプログラム終了時にatexitみたいな仕掛けで呼ばれる。
148 :
121:2014/05/29(木) 18:00:10.69 ID:zblOCN9G
class Ctest
{
public:
static int abc;
};
このCtestを動的に生成した場合
変数 abc は static だからグローバルになり
生成したCtestが解放された時に abc も解放されて使えなくなる?
んなわけない
abcはCtestのインスタンスと無関係
使えなくなったらstaticにした意味ないしね・_・
>どの部分に問題がありますか?
あんたの頭。
変数mの振る舞いに注意。
簡単にオーバーフローしそうな計算式だな
156 :
148: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?
ただのグローバル変数と同じ
スコープはあるだろ
static変数abcがあるのにそのクラスをdeleteした場合
new Ctest
delete Ctest
ここでどうやって使うん
日本語でおk
Ctest::abc
deleteした後にどうやって使うん
Ctestはもう死んでるやん?
static変数はインスタンスと無関係だと言っただろ
多分クラスとインスタンスの区別が付いてない人だろう
>delete Ctest
166 :
デフォルトの名無しさん:2014/05/31(土) 16:06:10.51 ID:A8nmKroG
特定の時間にタスクを実行したのですが
無限ループの中に何か処理を入れるようなものを作るのでしょうか
>>166 日本語でOK。
環境も合わせて書いとくれ。
C#かもしれん
設定した時間で実行する処理を作りたいのですが、そういうものを作ったことがありません。
C++MFCのプログラムで無限ループしているところがあります。
ここに時間が来たかどうかの判断を入れるのが普通なのかどうなのかと思いまして
つ タスクスケジューラ
ある時刻なのか
ある時間経過後なのか
毎日23:30に実行したいです。
WINAPIのCreateWaitableTimerを使うという記事をネットで見つけましたが
これは使っていいんでしょうか
なんとなくわかりました
スレッド立てて指定時間まで待機
指定時間を過ぎたら実行
終了時に次の実行時間を指定ですね
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って作成できる?
そりゃ作れるだろ。
例えば、こんなの。
--
#!/bin/sh
touch c.txt
--
こいつをどこか、パスの通るカレント以外の場所に置けばいい。
そういう意味じゃないだろ
だったら円周率を10桁まで計算して表示するプログラムは
printf("3.1415926535\n");
でいいのか
>>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はどのように書けば良いでしょうか?
上記の記述に加えて、そのソースコードのコンパイルルールを加えただけだと無視されてしまいました。
VC++6.0 で作成したDLLの中身のソースをデバッグしたいんですが、
上手くいきません。
DLLの中の関数呼び出し自体は別プロジェクトでmain作ってDLLインポートして・・
で、出来るんですが。呼び出し先のソースを見れません。何か良い方法は
ないでしょうか?
DLLのプロジェクトにデバッグ用メインを登録して、DLLのプロジェクトをRunするです。
どううまくいかないのか
main側で目的のファイルを開いてブレークポイント設定(開くだけでプロジェクトへ追加は必要無い)
→mainでデバッグ開始
→mainでLoadLibrary
→DLLの関数を呼び出す
→ブレークポイントで止まる
どこまでやってどうなるのか
>> 184 とりあえずそれで試してみます。どうもありがとうございました(__)
>> 185 DLL内部のソースをSTEP実行できないんです。
DLLソースの検索先パスを登録する設定があったはず
EXEプロジェクトからでもデバッグできるけどソースパスの問題とかあるので、DLLプロジェクト側から親EXEを指定してデバッグするのが王道
190 :
156:2014/06/09(月) 01:16:03.43 ID:YH45DqQS
>>156に書いたように
staticメンバーはCtestの生成、解放関係なしにグローバルで使えて
static以外のメンバーは、普段通りCtestを生成すると使える
ってことで良いんだよね?
テンプレートのファンクタの動的なバージョンが
std::functionという理解であってますか?
>>190 「グローバルで使える」ってのが微妙だが、その通りです
記憶クラス的に
>>191 ちょっと捉え方が間違ってるような
テンプレートで指定した戻り値、シグネチャで呼び
出せるのものであれば、なんでも入れられるのがfunction
静的な関数、関数オブジェクトが該当する
ラムダもコンパイル時に関数オブジェクトを生成ので同じように使える
インスタンス関数の場合、mem_fn+bindで、関数オブジェクト化、
インスタンスへの参照固定で入れられる
Cで型の問題は厄介だよね
これがあるから安全で生産性も高くなるんだろうけど、
ちょっとでも違えば許してもらえない
たとえばObserverパターンとかで、コールバックを登録したいとする
ここでも型が問題になる
functionは型を消してしまえるんだな
ただし若干、オーバーヘッドがある
単純に関数に渡すファンクタが必要なのであれば、ラムダで
書いた方がよい
高速です
複数のファイルが圧縮されているZIPファイルを解凍せずに、
その中身の特定のファイルを指定して読み出したり、あるいは、
その特定のファイルを上書きしてZIPファイルを書き換えたり
したいのですが、どうすれば出来ますか?
そういうプログラムを書けばできるんじゃないですか
1/2000000と1/1999999を区別比較できるような型はありませんよね 実装案とかいただけませんか?
D/T(1<=T<=2百万,1<=D<=100)を何個か比較演算したいです
有理数型を作りゃいいじゃん
std::ratioとか
先程よりもレベルの低い質問なのですがratio配列は作れるのでしょうか
boost::rationalなら
あー残念ながらboostは使えない環境なのです 前もって書き忘れてました
>>205 解決しました ありがとうございます
sqrt()の中身int型整数を少数型にキャストしなければならないようで
207 :
デフォルトの名無しさん:2014/06/14(土) 00:31:06.98 ID:bcTe5xiu
わからない、、オブジェクト指向とクラスがわからない、、、、
例えば、、、四角形を親とするクラスがあってその子どもが長方形と台形を持つとします。
四角形
メンバ変数
上辺、下辺、左辺、右辺、角度
機能
面積計算
周りの長さ計算
対角線を計算
台形のメンバ変数、高さ:長方形のメンバ変数なし、機能:面積計算
台形のコンストラクタで四角形
のメンバ変数を初期化?する、四角形の機能で計算、、四角形で辺だけをreturnする関数
を作り、台形の面積計算に必要な辺をうけとる
その後また長方形のコンストラクタで四角形を初期化?
こんな感じの考え方でよいのでしょうか、、、
もう自分で書いてて意味わからないのですが、エスパーの方教えてください。
もしくは四角形継承台形長方形、長方形の継承正方形のプログラムを教えてください。
main
で
コンストラクタで
長方形(double 辺、double 辺、、、):四角形(辺、辺){}
といった書き方でよいのでしょうか
>>206 >少数型
そんなもの(二重の意味で)ない。
>>208 私の拙い頭では 二重のというのが理解しかねます 浮動小数点型等言葉の定義の問題でしょうか
固定小数点ってのがあるから浮動を省略しちゃいかんのと
少と小
この二点じゃないかなぁたぶん
>>208 クラスはCの構造体に次の二つの性質を追加した新しいデータ型
・ メンバー変数のアクセス制御できる
・ メンバーとして変数の他に関数も持つことが出来る
基本、メンバー変数はメソッド(関数)を通じてのみアクセスして、呼び出し側が意識する必要がないように
するのがオブジェクト指向…というかカプセル化かな?
基底クラス(親クラス)をベースにして、メンバー変数・関数を追加して新しいクラス(子クラス)を定義するのが継承
四角形・台形の比喩は‥ ごめん、わからん
>>207 図形なら、まずは、大きさと描画関数だけあればいいんじゃね
オブジェクトをどう利用したいのかによって、完成形は異なるんだから、
まずは「拡張できる」ように作ることを考える
ゲームを想定して、図形がキャラクタだと思って全体を構成してみたら?
なお、オブジェクト指向なんて、その方が使いやすい場面で使えば十分だ
無理に教科書的な例から学ばなくても、現実ではよく出会う
継承の例
たとえば、すべての【人間】に共通で、最低限の情報は「名前」「年齢」「性別」くらい?かな
これらをメンバー変数に、変数をR/Wする関数をメンバー関数として(人間)クラスが定義できますよね
新しく【学生】を定義する必要があるとして
一から作ってもいいけど、せっかく(人間)クラスがあるんだから、これに必要な情報(変数)やメソッド(関数)を追加してやれば手抜きできると‥
(人間)クラスに、たとえば「学校名」「学部」「学科」「学年」「学位」を示す変数と、これらにR/Wするメンバー関数を追加してやれば
(学生)クラスが定義できるわけです
【学生】も【人間】だから、人間の属性を継承するということ
わかりにくかったらすまん
>>213 人間クラス専用のファイルがあったとする
人間クラスに学生情報を追加した学生クラスにしたとする
別の機会に人間クラスに人種情報を追加して人種クラスを作成する必要が出たとする
この時既に人間クラスは学生クラスに置き換わってる
こんな衝突を経験して頭がおかしくなる
>>208 SQL-Server の smallint 型とか (w
学生とか犬猫とかでオブジェクト指向を分かった気になってはいけない(戒め)
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に代入してるということでしょうか?
char *b = a;と
char *b;
b = a;はやってる事は一緒
char *b = "ABC";はできるが
char *b;
b = "ABC";はできない
>>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);
}
223 :
デフォルトの名無しさん:2014/06/16(月) 21:22:50.87 ID:9t16BPS6
224 :
デフォルトの名無しさん:2014/06/16(月) 23:07:32.01 ID:FBqd5r20
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関数が基底の
をオーバイライド?したのだと思っています。この考え方でよいのでしょうか
>>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 自分の解釈だけで書いたので、詳しい方、訂正お願いします。
229 :
227:2014/06/17(火) 08:50:38.31 ID:jLYVWX8U
>>228 あ、ほんとだ。言われるまで気づきませんでした。
ありがとうごさいます。
printf("%*s", 3 * (i - 1) + 5, "");
参考書に↑のようなprintf文が載ってました
%*sってどういう意味ですか?
また、3 * (i - 1) + 5で計算してる理由って何ですか?
iはint型変数です
iが1とする
3 * (1 - 1) + 5 = 5
printf("%5s", "");になる
*に計算結果が入る
ありがとうございます
理解できました
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;}
×__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: メモリを確保できません」ってでるんだけど、なんで?
c++初心者です。
読んで勉強になる、ライブラリ以外のソースコードが知りたいのですが、何かオススメはあるでしょうか?
できれば比較的最近のもので、コンパクトだとありがたいです。
>>234 コンパイルエラーで弾かれてしまいます…
>エラー 1 error C2039: 'CLSID_DOMDocument' : 'MSXML' のメンバーではありません。 d:\cloud\bp\xmltest\xmltest\xmltest.cpp 37 1 xmltest
239 :
デフォルトの名無しさん:2014/06/18(水) 14:40:05.21 ID:2sj5eCvL
C#とC++を両方やっていると、やっぱりC#のほうが、
作業効率が良いように感じるんですが、みなさんどうですか?
>>238 面白いけど、実務では
switch (something) {
case FOO: x = 1; break;
case BAR: x = 2; break;
default: x = 3; break;
}
と書いて欲しい
multi_arrayはbool型に使えますか?
よくC++はCの上位互換て書いてあるけど、たまにCの方が使いやすいって言うけど結局どっち?
244 :
デフォルトの名無しさん:2014/06/18(水) 22:54:18.49 ID:pJdwjV3r
慣れ
Cのやり方でやるならCの方が使い易い
C++のやり方でやるならC++の方が使い易い
>>243 上位互換だからって使いやすいとは限らないだろ?
今から勉強するやつはCやんないでC++やればいいの?
>>247 C++言語の設計者は、C++をシステム言語(OS、共通ライブラリなど)向けとして作ったと言ってる。
つまりそれ以外の用途だと、Cより苦労する。
まあ大抵の個人・組織は何故かシステムレベルの車輪の再発明からやってるんで、Cを使って更に苦労する訳だが。
すみません
CはC++のサブセットだと思ってました
規格の改訂世代にもよるかと思いますが、C++にはなくてCに存在する仕様(機能)って例えば何がありましたっけ?
可変長配列。
なるほど。std::vectorよりも簡単そうですよね。
ゲームだとC++で組んでもC++的な機能は使われないな
多態性とか使うだろ?
登場キャラをclassで実装すると固有/共有の属性の扱いがとてもラクになると思うが
>>239 ちょっとしたものなら C# の方が楽と感じるけど、それなりの規模だとあまり変わらないかな
>>253-254 そんな、凝ったの書かしてもらってない。そう言えば自分のではC++機能使いまくりだった
それなりの規模だとコンパイルが遅いんじゃクソボケェ・・・ってなるんじゃないの
ぴんぴんぷるぷるぴんぷるぷる
テンプレートは遅いね・_・
thisの値はオブジェクトが作られて無くなるまで変わりませんよね?
>>259 変わらないシステムが圧倒的に多いだろうね。
但し、変わった事でプログラムの動作に支障が出るようなら、それはプログラムの
作りがおかしいという事である。
ありがとうございます
マルチだとどっちに解答すりゃいいんだか
>>263 全部に
マルチすんな!ヴォケ!
とレスするのが2chの作法、K&Rに書いてある。
>>261 > 変わらないシステムが圧倒的に多いだろうね。
変わるシステムなんてあるの?
そのオブジェクト参照されてる場合、勝手に変わられると困ると思うが。
変わるとマジで困るんで、
変わらない証拠おしえてください。
仕様として変わってもいいという風にC++の仕様書には書いてあるということか?
マジレスして損した。
>>265 winのAPIにもあるGlobalLockやGlobalUnlockは、そういう用途に使ってたよ。
今はheapを使うのが普通だけど別にオブジェクトをここに作る事が絶対禁止な
訳じゃない、まあオブジェクトの参照をどう保持するかの問題だな。
システムというかCPUが不自由だとメモリの仮想化が不十分でプログラムが
「実行中に何度も別のアドレスに勝手にリロケートされる」なんてことも起こり
得たんだよ。
GCを使うと、thisも変わるんじゃね?
>>270 GlobalAlloc とかのだとアクセスはメモリーハンドル使う訳で、普通の heap と違うでしょ?
そんなもんどや顔で出されても困るわ (w
顔が見えるのか
>>272 君は理解の仕方が中途半端だね。
> アクセスはメモリーハンドル使う
真っ赤な嘘を広めてはいけない。
アクセスする為のポインタを得る為にメモリーハンドルを使うんだ。
君のようにメモリーハンドルでアクセスしたら例外で吹っ飛ぶよ?
>>274 そんな当たり前の事を知らないなかとでも言うように説明する人が居るとはな
よかったな、一つ賢くなったじゃないか
>>1 VS2010で int が long int と同じになってた。
>>274 ハンドルとポインタの区別もつかんのか (w
最近、プログラマの仕事ってマーシャリングばっかりだな…
そうでないのは力仕事だし
(ネイティブに限る)コンパイラって何なんだろうって思う
C言語からC++にステップアップしようかと思うんだけど
最新のC++11まで含めて浅くでいいから広範囲に扱ってるサイトとかないかな
>>281 ありがとう。一瞬躊躇してしまったが比較的平易な英語で書かれていて
これなら翻訳サイトと併せてなんとか読めそうなのでがんばってみる
いちいち翻訳通すくらいなら日本語のリファレンス本買った方がいいよ
英語サイトへ行くのはその次だ
全角文字のアルファベットをtoupper()したいのですが、
標準関数でそういうの無いですか?
>>284 先ず始めにお聞きしたいのですが、お使いの言語は何でしょうか。
Cでしたら、ありません。
rational.cppがリンクされてないんだろう
使ってるコンパイラとエラーの内容がないから何とも言えん
>>289 リンクを頼りにggったら出てきましたありがとうございます
結構な時間ggってるのに見つけられない情弱さ嫌になるね
string array[] = { "abc", "edfg", "AB" };
みたいに初期値を代入した配列の要素数3を
求める方法ありますか?
>>291 sizeof(array) / sizeof(* array)
>292
ありがとうございました。
_countof()
ネットで、以下のようなマクロ見たんですが
#ifdef NDEBUG
#define dbgprintf 1 ? (void)0 : (void) //(1)
#else // #ifdef NDEBUG
#define dbgprintf printf
#endif // #ifdef NDEBUG
よくわかりません。(1)の行はNDEBUGの時に出力しないようにしているようですが、
#define dbgprintf
としても同じじゃないですか?(1)の意味を教えて下さい。
それだと
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
Visual Studioならビルドも実行も問題なくできるですが。
その例だとfunc()が呼ばれちゃうだろ。それも含めて、無害化したいんだろ。
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;
}
ifdefの切り方のが気になる
↑のは間違いでした。↓こっちでも行ける理由が分りません。
それが知りたいのですが。
#include "stdafx.h"
#define dbgprintf
int func(){
return 1;
}
int _tmain(int argc, _TCHAR* argv[]){
dbgprintf("%d", func());
return 0;
}
だからfunc()が呼ばれるって言ってるだろ。
>>303 define展開後のソースをベタで書いて動かせばいーじゃない
>>304 なるほど。そうすると、funcの戻り値はどうなるんですか?
("%d", func());
が
("1");
になって、この後どうなるんですか?
>>305 int _tmain(int argc, _TCHAR* argv[]){
("1");
return 0;
}
で動きました。 ("1"); の行は、実行に影響ないんでしょうか?
>>307 ない
voidキャストされる
無駄処理なだけ
そもそもそんな評価されねぇよ。あんた、「人間じゃなくて人だな」って言われない?
どこから"1"が出てくるんだよ、この間抜け。
311 :
名無しさん@0新周年:2014/07/13(日) 01:31:07.42 ID:nrxOtUVn
int a=(123,func());
まず忌まわしきカンマ演算子を知るべき
話はそれからだ
for(i=0,j=100;i<5;i++,j-=20)
1, 連続した配列を2次元配列のように扱いたいのですがどうすればうまくいきますか?
今の所は値が書き変わっていません
2, VC++2010EEではコメントのようにキャストしないとエラーになるのですがどこを直せばいいですか?
ttp://ideone.com/2cbjRj
>>314 質問内容とソースとが対応していない、に1票。
1. ideoneの出力を見る限り、1, 2, 3, ...が10, 20, 30, に書き換わっている
2. エラーメッセージを書く。常識
カンマ演算子ググッようやくdbgprintfマクロの挙動わかりました。
有難うございました。
マクロ勉強中で、もう一つ教えてください。こんなマクロ見つけたのですが、
#define eqstr(a, b) (*(a) == *(b) && strcmp(a, b) == 0)
文字列が等しいかどうか調べるだけなら、
#define eqstr(a, b) (strcmp(a, b) == 0)
でいいと思うのですが、*(a) == *(b)は何ですか?
(a)の中身が a + 1 だったりしたらどうする
その時は、例えば
char a[]="1234";
char b[]="234";
とすると、
eqstr(a+1,b)は
strcmp(a+1, b)==0で
strcmp("234","234")==0で
等しいと判断されると思います。
2次元配列の動的確保なんですが、例えば2*3の2次元配列の場合
int **a = (int**)malloc( sizeof(int*) * 2); (@)
a[ 0 ] = (int*)malloc( sizeof(int) * 2 * 3 ); (A)
のように確保するといろいろなサイトで見かけました。
そこで行数列数未定の2次元配列を動的確保したいのですが、
@とAの部分をreallocを使って再確保していこうとして失敗しました。
@で最初に必要な行数を与えればうまくいくのですが、行数を1つずつ増やしていく方法はありませんか?
>>315,316
ideone用に書き換えてる間に直ったのかもしれません
お騒がせしました
>>320 リスト構造?
>>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;
}
>>322 解答ありがとうございます
>>320に書いた確保の仕方は、メモリ領域に連続して確保するためのものでした分かりづらくすみません
なのでAの後には、
for (i = 1; i < 2; i++) a[ i ] = c[ i-1 ] + 3;
このような処理が入り、全体のサイズを確保した後に、行を割り当てることになります。
おっしゃる通りの行ごとに列のサイズを確保し、メモリ領域が連続になっていない確保の仕方では、
プログラムはエラーをはかずに動作しました。
>>323 ×c[i-1]
○a[i-1]
でした
>>317 多分ほんのちょっぴりでも高速化したいんだろ
普通のコーディングならそもそもマクロじゃなく関数にすべき
高速化のつもりだろうね
関数コールのオーバーヘッドがよほど気になる状況でも無い限り、
効果は薄いと思う。
>>317 が興味があるなら、短絡評価を調べるといい。
マクロ自体は、strcmpのa,bの方は括弧でくくってないし、なんか中途半端
strcmpの方はカンマ演算子をオーバーライドしてない限り大丈夫じゃね?
優先順位低いし
328 :
名無しさん@0新周年:2014/07/13(日) 19:38:19.95 ID:XpdRKiat
(j-1)[a]
>>317 高速化のつもりだろう。しかし、最近のコンパイラではstrcmpはストリング命令に
インライン展開される(ことが多い)ので、かえって低速化を招く。
gccの最新バージョンではSSE4.2命令まで使ってるよ
-marchオプションで使える時はそちらをリンクするようになっている
IO速くするにはどうすればいい?
バッファリング?
SSDを買う
繰り返し書き込むファイルの断片化対策
読込量・回数を減らす…インデックスやハッシュの活用
予算が余ってるならRAIDを組む
メモリが余ってるならRAMディスクもあり
I/Oそのものの高速化は手間なので、データ圧縮し転送時間を減らす。
とか言ってみる
リングバッファとセマフォ(2つ)とスレッドを使って先読みする
HDDとか圧縮したまま記録すれば早いんじゃ?
ZFSというLZ4圧縮を使えるファイルシステムがあってな
初心者です。
ソースをすっきりさせたいので、
ウィンドウプロシージャとかWinMainとか、
include以外の全部をDLLに投げ込んじゃってもいいんでしょうか?
なぜDLLに投げ込めばソースがすっきりするんだ?
ソースファイルを分割するのとごっちゃになっているのではないか
DLLにWinMainは無理だ
鶏が先か卵が先かになってまう
344 :
340:2014/07/17(木) 19:43:39.87 ID:STDuRs09
ありがとうございました。
C++って何を作るのに優れてるの?ゲーム以外で
Web系以外なら何でも