マジですか
>>937と同じく文字列リテラルはconst char*だと思ってた
vector<string*> vec;
vec.push_back(new string("あべし"));
vec.clear();
ってした際には"あべし"が格納されてるstringオブジェクトは
ちゃんとdeleteされるんでしょうか?
>>941 されません。boost::ptr_vectorを使えばされます。
d
ぼーすとって凄いラインぶらり何ですね
944 :
919:2007/04/29(日) 02:35:02
>>922さん
sprintf(kakko, "%.*s", pr - pl - 1, pl + 1);
ってどういう動きしてるんですか?
やってみたんですがpr-pl-1のところとかいじっても出力結果が変わらなかったのですが
何がどうなってるのか全然わからないす・・
いじった理由は'('から次の文字はちゃんと取れているのですが')'の前で終わって欲しいのに
')'の後ろの文字まで出てしまうからです。
>>944 %*s は、文字列の長さが少なくても指定した幅だけは最低とる
指定した長さで切るなら、%.*s
短くても長くても固定サイズにしたいなら %*.*s
NULLをインクリメントしたって鼻から悪魔でもなんでもない
946 :
919:2007/04/29(日) 09:21:19
>>945さん
ありがとうございます。早速試してみます
C言語でのデバッグのコツを教えてください。
printf
949 :
919:2007/04/29(日) 18:19:20
だめだー・・どうあがいても無駄な文字まで拾ってきてしまう・・
大人しくfor文で回して一文字ずつ格納していくしかないのか
950 :
919:2007/04/29(日) 18:38:21
と思ったら事故解決しました。
お騒がせしました
今さらだけど
>>938ってマジ?
PCぶっ壊れてるから確認できない。
>>938-940 C++では、const charの配列だが、文字列リテラルからchar*への変換が定義されている。
X 3014:2003
2.13.4 文字列リテラル 1節目
4.2 配列からポインタへの変換 2節目
constしか取れないとAPIに渡せなくて困っちゃうことが多いから、そうしたんだっけ
>>953 そーしないと、既存の(C言語の)資産を活かせるという
C++の最大の売りのひとつが台無しになっちゃうからね。
Javaは多少やっていて、今C++を調べています。
C++だと宣言しただけでオブジェクトができる?みたいですが、
vector<string> vec;
vector<string> *vec = new vector<string>();
上の二つの宣言でどちらも利用できますが
どちらを使ったほうがいいんでしょうか?
C++にはご存知のとおりGCはない。
後者の場合プログラマが明示的にdeleteしないとメモリリークが発生する。
特に理由がなければ前者を使えばいいし、他のスコープなどから参照するような場合があるなら後者を使えばいい。
boost::smart_ptrとかstd::auto_ptrに入れればスコープが外れると
自然にdeleteされるのでそれをお勧めする
というか
>C++だと宣言しただけでオブジェクトができる?みたいですが、
こう書いてある時点でSTLやらBoostにはまだ手を出してはいけないような気がする。
のど渇いたから水飲んでこよーっと
>>959 ダメ! 寝る前に水飲むとオネショするよ?
今日は早起きしたからこんな時間に居るんだよ?
早起きにもほどがあるw
newで配列を動的に確保する場合、
a[100][2]よりa[2][100]のような形の方がメモリが連続して速くなりますか?
longの場合で[10000][1]と[1][10000]なら50倍近い差が出て笑った
もちろん速いのは後者ね
これはループまわして確保するって事の影響なんだろうけど
ループまわさないでやったら大差なかった
ごめん
966 :
963:2007/05/01(火) 05:31:57
forループで何か計算させる場合も、メモリが連続している方がキャッシュが効きやすくなるのでしょうか?
そんなの環境によるだろ
キミに必要なのは、自分で実際に試してみて計測する気持ちだ
どんな環境でも連続してる方がキャッシュは効きやすくないか?
まあ、それはともかく、type* で連続メモリを確保して、
type** でそこへのアドレスを保存するテーブルを作ればいいんだぜ。
キャッシュが無い環境では効くも何も無い
質問自体が成り立たない状況は
質問の対象外だろ
多次元配列 hoge[X][Y]のX,Yという並びには意味があるときがほとんどだから
その意味を潰す事のコストが大きすぎて、多少の差なんてどうでもよくなってしまう
キャッシュの有無は CPU の仕様を見れば
>>971 そういう気持ちの悪い理由で、二次元データを画像に落とすときにもにょる羽目になることは多い。
C言語で、aaaというファイルを読み書き両用で作成するなら
fp = fopen("aaa.txt", "a+");
でいいと思うんですが
aaaという固定のファイル名ではなくて、
キーボードから入力した任意の文字列のファイル名でファイルを作成したい場合はどうすればいいのでしょうか?
任意の文字列を格納したchar配列を渡せばいいんじゃないか
>>975 ファイルを作成するなら"w+"だな。
"a+"じゃファイルは既存である必要がある。
#尤も、"w+"じゃ既存ファイルを消してしまうが。
a や a+ はファイル作成するよ
既存ファイルの破壊を防ぐ典型的な方法って
書き込み用として開く前に、読み込み用に開こうと試みて指定ファイルの存在を調べる
以外にありますか?
俺の少ない知識ではこれしか思いつかないんですが・・・
char* str = "aiueo";
このaiueoは定数なんですよね?
だったら、
str = "owner";
としてaiueoという定数ではなくownerという定数を指すようにすることはできても
定数自体を書き換えることはできないんですか?
*str = "o"
*(str+1) = "w"
…
みたいな感じです
次スレは?
982 :
977:2007/05/01(火) 15:46:58
>>978 あーそうだっけ。失敬。
どっちみち、既存ファイルの既存部分に手をつけられないから使うメリットは余りないけど。
>>979 環境依存しない方法では、それが無難だね。
"r+"で試みて駄目なら"w+"で開くのが一般的かな。
#追記限定なら"a"でいいでしょ。
983 :
980:2007/05/01(火) 15:50:06
>>980 できてしまうかもしれないけれど、一般的には駄目。
もしかしたらその"aiueo"が"waiueo"と共存しているかもしれないし。
984 :
983:2007/05/01(火) 15:51:26
ありゃ、名前欄ミスった。スマソ
>>983 やっぱりだめなんですね。
共存というのがよくわからないのですが、さらに調べてみます。
>>980 >*str = "o"
>*(str+1) = "w"
これは、
*str = 'o'
*(str+1) = 'w'
こうなる。
ただし元の"リテラル"を書き換える事は普通しない。
配列か、malloc等で確保した領域で行う。
>>980 文字列リテラルは書きかえちゃダメというのが C の規約にあったはず。
その癖型は char* なんだけどな。
そういう規約がなかった時代に書きかえるコードが書かれてて、
そういうコードが通らなかったら困るからという歴史的な理由だった記憶があるけど、
違うかもしれん。
char str[] = "aiueo";
なら書きかえても大丈夫。
str という配列変数を自前で作ってるから。
すごく丁寧な回答をありがとうございます。
とても理解しやすく、非常に為になりました。