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

このエントリーをはてなブックマークに追加
940デフォルトの名無しさん:2007/04/29(日) 02:00:22
マジですか
>>937と同じく文字列リテラルはconst char*だと思ってた
941デフォルトの名無しさん:2007/04/29(日) 02:14:55
vector<string*> vec;
vec.push_back(new string("あべし"));

vec.clear();
ってした際には"あべし"が格納されてるstringオブジェクトは
ちゃんとdeleteされるんでしょうか?
942デフォルトの名無しさん:2007/04/29(日) 02:15:50
>>941
されません。boost::ptr_vectorを使えばされます。
943デフォルトの名無しさん:2007/04/29(日) 02:32:11
d
ぼーすとって凄いラインぶらり何ですね
944919:2007/04/29(日) 02:35:02
>>922さん
sprintf(kakko, "%.*s", pr - pl - 1, pl + 1);
ってどういう動きしてるんですか?
やってみたんですがpr-pl-1のところとかいじっても出力結果が変わらなかったのですが
何がどうなってるのか全然わからないす・・

いじった理由は'('から次の文字はちゃんと取れているのですが')'の前で終わって欲しいのに
')'の後ろの文字まで出てしまうからです。
945デフォルトの名無しさん:2007/04/29(日) 03:42:26
>>944
%*s は、文字列の長さが少なくても指定した幅だけは最低とる
指定した長さで切るなら、%.*s
短くても長くても固定サイズにしたいなら %*.*s

NULLをインクリメントしたって鼻から悪魔でもなんでもない
946919:2007/04/29(日) 09:21:19
>>945さん
ありがとうございます。早速試してみます
947デフォルトの名無しさん:2007/04/29(日) 15:14:23
C言語でのデバッグのコツを教えてください。
948デフォルトの名無しさん:2007/04/29(日) 16:46:43
printf
949919:2007/04/29(日) 18:19:20
だめだー・・どうあがいても無駄な文字まで拾ってきてしまう・・
大人しくfor文で回して一文字ずつ格納していくしかないのか
950919:2007/04/29(日) 18:38:21
と思ったら事故解決しました。
お騒がせしました
951デフォルトの名無しさん:2007/04/29(日) 21:59:06
今さらだけど>>938ってマジ?
PCぶっ壊れてるから確認できない。
952デフォルトの名無しさん:2007/04/29(日) 22:07:36
>>938-940
C++では、const charの配列だが、文字列リテラルからchar*への変換が定義されている。
X 3014:2003
2.13.4 文字列リテラル 1節目
4.2 配列からポインタへの変換 2節目
953デフォルトの名無しさん:2007/04/30(月) 00:41:27
constしか取れないとAPIに渡せなくて困っちゃうことが多いから、そうしたんだっけ
954デフォルトの名無しさん:2007/04/30(月) 00:49:29
>>953
そーしないと、既存の(C言語の)資産を活かせるという
C++の最大の売りのひとつが台無しになっちゃうからね。
955デフォルトの名無しさん:2007/05/01(火) 01:08:10
Javaは多少やっていて、今C++を調べています。

C++だと宣言しただけでオブジェクトができる?みたいですが、

vector<string> vec;
vector<string> *vec = new vector<string>();

上の二つの宣言でどちらも利用できますが
どちらを使ったほうがいいんでしょうか?
956デフォルトの名無しさん:2007/05/01(火) 01:14:33
C++にはご存知のとおりGCはない。
後者の場合プログラマが明示的にdeleteしないとメモリリークが発生する。
特に理由がなければ前者を使えばいいし、他のスコープなどから参照するような場合があるなら後者を使えばいい。
957デフォルトの名無しさん:2007/05/01(火) 01:15:43
boost::smart_ptrとかstd::auto_ptrに入れればスコープが外れると
自然にdeleteされるのでそれをお勧めする
958デフォルトの名無しさん:2007/05/01(火) 01:16:38
というか
>C++だと宣言しただけでオブジェクトができる?みたいですが、
こう書いてある時点でSTLやらBoostにはまだ手を出してはいけないような気がする。
959デフォルトの名無しさん:2007/05/01(火) 01:31:02
のど渇いたから水飲んでこよーっと
960デフォルトの名無しさん:2007/05/01(火) 01:33:32
>>959
ダメ! 寝る前に水飲むとオネショするよ?
961デフォルトの名無しさん:2007/05/01(火) 01:44:27
今日は早起きしたからこんな時間に居るんだよ?
962デフォルトの名無しさん:2007/05/01(火) 03:20:34
早起きにもほどがあるw
963デフォルトの名無しさん:2007/05/01(火) 03:50:02
newで配列を動的に確保する場合、
a[100][2]よりa[2][100]のような形の方がメモリが連続して速くなりますか?
964デフォルトの名無しさん:2007/05/01(火) 04:47:37
longの場合で[10000][1]と[1][10000]なら50倍近い差が出て笑った
もちろん速いのは後者ね
これはループまわして確保するって事の影響なんだろうけど
965デフォルトの名無しさん:2007/05/01(火) 05:00:41
ループまわさないでやったら大差なかった
ごめん
966963:2007/05/01(火) 05:31:57
forループで何か計算させる場合も、メモリが連続している方がキャッシュが効きやすくなるのでしょうか?
967デフォルトの名無しさん:2007/05/01(火) 06:36:27
そんなの環境によるだろ
キミに必要なのは、自分で実際に試してみて計測する気持ちだ
968デフォルトの名無しさん:2007/05/01(火) 06:39:58
どんな環境でも連続してる方がキャッシュは効きやすくないか?

まあ、それはともかく、type* で連続メモリを確保して、
type** でそこへのアドレスを保存するテーブルを作ればいいんだぜ。
969デフォルトの名無しさん:2007/05/01(火) 06:42:07
キャッシュが無い環境では効くも何も無い
970デフォルトの名無しさん:2007/05/01(火) 06:50:35
質問自体が成り立たない状況は
質問の対象外だろ
971デフォルトの名無しさん:2007/05/01(火) 07:01:03
多次元配列 hoge[X][Y]のX,Yという並びには意味があるときがほとんどだから
その意味を潰す事のコストが大きすぎて、多少の差なんてどうでもよくなってしまう
972デフォルトの名無しさん:2007/05/01(火) 07:05:49
>>970
つまり実際に試せということだ
973デフォルトの名無しさん:2007/05/01(火) 08:01:56
キャッシュの有無は CPU の仕様を見れば
974デフォルトの名無しさん:2007/05/01(火) 11:39:45
>>971
そういう気持ちの悪い理由で、二次元データを画像に落とすときにもにょる羽目になることは多い。
975デフォルトの名無しさん:2007/05/01(火) 13:20:19
C言語で、aaaというファイルを読み書き両用で作成するなら
fp = fopen("aaa.txt", "a+");
でいいと思うんですが
aaaという固定のファイル名ではなくて、
キーボードから入力した任意の文字列のファイル名でファイルを作成したい場合はどうすればいいのでしょうか?
976デフォルトの名無しさん:2007/05/01(火) 13:35:40
任意の文字列を格納したchar配列を渡せばいいんじゃないか
977デフォルトの名無しさん:2007/05/01(火) 14:05:33
>>975
ファイルを作成するなら"w+"だな。
"a+"じゃファイルは既存である必要がある。
#尤も、"w+"じゃ既存ファイルを消してしまうが。
978デフォルトの名無しさん:2007/05/01(火) 14:58:31
a や a+ はファイル作成するよ
979デフォルトの名無しさん:2007/05/01(火) 15:05:13
既存ファイルの破壊を防ぐ典型的な方法って
書き込み用として開く前に、読み込み用に開こうと試みて指定ファイルの存在を調べる
以外にありますか?
俺の少ない知識ではこれしか思いつかないんですが・・・
980デフォルトの名無しさん:2007/05/01(火) 15:35:19
char* str = "aiueo";

このaiueoは定数なんですよね?
だったら、
str = "owner";
としてaiueoという定数ではなくownerという定数を指すようにすることはできても
定数自体を書き換えることはできないんですか?
*str = "o"
*(str+1) = "w"

みたいな感じです
981デフォルトの名無しさん:2007/05/01(火) 15:38:25
次スレは?
982977:2007/05/01(火) 15:46:58
>>978
あーそうだっけ。失敬。
どっちみち、既存ファイルの既存部分に手をつけられないから使うメリットは余りないけど。

>>979
環境依存しない方法では、それが無難だね。
"r+"で試みて駄目なら"w+"で開くのが一般的かな。
#追記限定なら"a"でいいでしょ。
983980:2007/05/01(火) 15:50:06
>>980
できてしまうかもしれないけれど、一般的には駄目。
もしかしたらその"aiueo"が"waiueo"と共存しているかもしれないし。
984983:2007/05/01(火) 15:51:26
ありゃ、名前欄ミスった。スマソ
985デフォルトの名無しさん:2007/05/01(火) 16:07:14
>>983
やっぱりだめなんですね。
共存というのがよくわからないのですが、さらに調べてみます。
986デフォルトの名無しさん:2007/05/01(火) 16:08:02
>>980
>*str = "o"
>*(str+1) = "w"
これは、
*str = 'o'
*(str+1) = 'w'
こうなる。
ただし元の"リテラル"を書き換える事は普通しない。
配列か、malloc等で確保した領域で行う。
987デフォルトの名無しさん:2007/05/01(火) 16:10:46
>>980
文字列リテラルは書きかえちゃダメというのが C の規約にあったはず。
その癖型は char* なんだけどな。
そういう規約がなかった時代に書きかえるコードが書かれてて、
そういうコードが通らなかったら困るからという歴史的な理由だった記憶があるけど、
違うかもしれん。

char str[] = "aiueo";
なら書きかえても大丈夫。
str という配列変数を自前で作ってるから。
988デフォルトの名無しさん:2007/05/01(火) 16:15:09
すごく丁寧な回答をありがとうございます。
とても理解しやすく、非常に為になりました。
989デフォルトの名無しさん
次スレいらね。
↓使えば十分っしょ。

【初心者歓迎】C/C++室 Ver.36【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1175436073/

はきだめC/C++下級者の質問箱 2
http://pc11.2ch.net/test/read.cgi/tech/1156206091/