はきだめC/C++下級者 ..
[2ch|▼Menu]
369:デフォルトの名無しさん
06/12/14 19:53:08
>>368 何の話だ?

370:デフォルトの名無しさん
07/01/06 18:19:48
boolは1バイト消費するのですか?


371:デフォルトの名無しさん
07/01/06 19:48:59
かもしれないし4バイトかもしれない

372:デフォルトの名無しさん
07/01/07 08:06:00
>>370
STLなら1ビット

373:デフォルトの名無しさん
07/01/07 12:43:05
>372
はぁ?

374:デフォルトの名無しさん
07/01/07 15:18:41
>>373
std::vector<bool>のことを言っているんだろう

375:デフォルトの名無しさん
07/01/07 16:46:38
vector<bool> は領域節約のため特殊化する必要があるが
それは 1 bit を保証するものではない。

376:デフォルトの名無しさん
07/01/07 17:15:33
>>374-375
それって valarray<bool> のことじゃなかったっけ?

377:デフォルトの名無しさん
07/01/08 00:18:10
>>376
23.2.5 Class vector<bool> [lib.vector.bool]
1 To optimize space allocation, a specialization of vector for bool elements is provided

378:デフォルトの名無しさん
07/01/12 17:01:28
引数を受け取るコンストラクタがある関数オブジェクトを
渡す方法を教えてください。

struct Func
{
  int data;
  func(int v) : data(v) {}
  int operator() (int i) { return v*i; }
}

template<typename F>
int Test(F f, int i)
{
  return f(i);
}

int main()
{
  Func func(1);
  return Test(func, 2);
}

Test<F>(Func) に一致するものが見つからないと怒られます。

struct Func
{
  int operator() (int i) { return i; }
}
こうすると通ります。なぜでしょうか?

379:デフォルトの名無しさん
07/01/12 17:02:51
func(int v) : data(v) {}のところはFunc(〜のtypoです

380:デフォルトの名無しさん
07/01/12 17:28:07
struct Func
{
  int data;
  Func(int v) : data(v) {}
  int operator() (int i) { return data*i; }
}

まだ間違ってました。


381:デフォルトの名無しさん
07/01/12 17:33:04
>>378-380
通るじゃないか。コンパイラ何使ってんの?

382:デフォルトの名無しさん
07/01/12 17:36:23
うあれ?TurboC++です。もう一度やってみます

383:デフォルトの名無しさん
07/01/12 17:42:23
gcc3.4.2なら通るぞ。

384:デフォルトの名無しさん
07/01/12 17:42:26
すみません、再構築したら通りました・・・・

385:デフォルトの名無しさん
07/01/12 17:50:21
makefileをちゃんと書いてないんじゃないの?
ヘッダとの依存性とかを

386:デフォルトの名無しさん
07/01/15 22:00:14
C++で
vector<counter> v(dic.begin(), dic.end());
sort(v.begin(), v.end(), cmp);
for (vector<counter>::iterator i = v.begin(); i != v.end(); ++i)
cout << i->first << ":" << i->second << endl;
return 0;
の部分の機能がわからないのでどなたか解説してください

387:デフォルトの名無しさん
07/01/15 22:50:34
URLリンク(www005.upp.so-net.ne.jp)

388:デフォルトの名無しさん
07/01/15 22:52:01
dicというコンテナからcounter型のvectorを生成し、
それをcmpを比較関数としてソート
ソート結果を表示


389:デフォルトの名無しさん
07/03/02 11:50:48
1.0-1.0が0にならない理由を教えてくだすれ

390:デフォルトの名無しさん
07/03/02 12:02:14
0になるだろ

391:デフォルトの名無しさん
07/03/03 00:45:07
ポインタで
char *p;
p = "ABC";
とした時の
pは"ABC"を表すのですか?
*pは何を表すのですか?

392:デフォルトの名無しさん
07/03/03 02:01:01
pは"ABC"の先頭アドレスをさす
*pは'A'を表す

393:デフォルトの名無しさん
07/03/03 03:11:04
>>392
ありがとうございます!

394:デフォルトの名無しさん
07/03/04 18:58:20
C言語系のサイトでよく見るんですが
kitty on your lap とは何なのでしょうか?
hello worldみたいなもの?

395:デフォルトの名無しさん
07/03/04 19:08:10
ぐぐっても…一番上には出てこないのか。
何番目かに引っかかる「ひざの上の同居人」ってゲームに
そういうサブタイトルがついてたんだよ。
今では陳腐に見えるけど、当時はまだまだ新鮮なコンセプトで、
一部の猫耳好きから圧倒的な支持を受けた。

396:デフォルトの名無しさん
07/03/04 19:09:23
よく見るって…そんなの使ってるの一箇所だけだろ

397:デフォルトの名無しさん
07/03/04 19:12:02
さくら、ケロちゃんと同じくらいは使われてるんじゃね?

398:デフォルトの名無しさん
07/03/04 19:15:57
あのヲタクチックなサンプルコードさえなければ
あそこは最高のサイトだと思うんだがな…

399:デフォルトの名無しさん
07/03/04 19:20:44
一昔前はプログラマ言ったらそんな奴らばかりだっただろ

400:デフォルトの名無しさん
07/03/04 19:37:35
今もだけどな

401:デフォルトの名無しさん
07/03/05 23:04:36
スレリンク(prog板:842番)
に誤爆してしまったのでこちらに再投下します。

std::string変数を空にするのに、
var=std::string("");
とか馬鹿馬鹿しいことやってるんですが、普通はどうするんでしょうか。

402:デフォルトの名無しさん
07/03/05 23:13:33
>>401
var.clear();

403:デフォルトの名無しさん
07/03/05 23:22:07
あっあありがとうございます。

404:デフォルトの名無しさん
07/04/13 09:12:41
nullと0の違いを教えてください

405:デフォルトの名無しさん
07/04/13 09:21:57
0はただのゼロだが、nullは「意味を持たない」という文脈で使われ、
その実体は必ずしもゼロではない
例えば大抵の処理系では int *p=null; と int *q=0; は等価だが、
場合によっては q はメモリの「ゼロ番地」を指しており、
実際に読み取ることができる、ということもありうる

406:デフォルトの名無しさん
07/04/13 09:33:16
とすると、大抵の処理系では、0番地とヌルポはどのようにして見分けているのですか?

407:デフォルトの名無しさん
07/04/13 09:48:57
>>404
CにもC++にもnullなんてものはない。
NULLのことなら、NULLが0なんじゃない。0がNULLなんだ。

408:デフォルトの名無しさん
07/04/13 10:13:41
>>405
いくら「はきだめ」でも、嘘はいくない。

409:デフォルトの名無しさん
07/04/13 10:58:09
>>404
C言語の定義によればどんなポインターの型にも特別な値、
すなわち 「ヌルポインター」が存在する。このヌルポインターは
他のどんなポ インターの値とも区別可能で、「いかなるオブジェクトや
関数へのポ インターと比較しても等しくなることがないことを
保証されている」。 すなわちアドレス演算子&を適用した結果が
ヌルポインターとなることもない。

C言語の定義によれば、ポインターを書くべきところに現れた定数0は、
コンパイル時にヌルポインターに変換される。すなわち初期化・代入・
比較をするときに左辺/右辺のどちらかにポインター型の変数か式が
現れたときは、コンパイラはもう一方の側の定数0がヌルポインター
を要求していることを理解し、適切なデータ型のヌルポインターの値
を産み出す。

410:デフォルトの名無しさん
07/04/14 19:12:14
C++Q&Aの2.24に
class Vehicle{
public:
virtual void startEngine()=0;
vietual ~Vehicle();
};
Vehicle::~Vehicle(){}

「そこから導出される派生クラスではstartEngine()メンバ関数を提供してはいけない。」

とあるんですが、これは使うなって事ですか?
「提供してはいけない」っていう言葉の趣旨がわからんのですが。


411:デフォルトの名無しさん
07/04/14 19:15:40
多分
s/しては/しなくては/
ではないかと。

412:デフォルトの名無しさん
07/04/14 20:41:27
ですよね。
定義しないとエラーになるんで、これは一体・・・と思ってた所です。

訳者が監修扱いになってるんで、誤訳かなぁと思ってた所です。


413:デフォルトの名無しさん
07/04/14 20:45:54
デストラクタをvirtualにしないと駄目な理由がいまいちわかりません。


414:デフォルトの名無しさん
07/04/14 20:49:42
>>413
struct Base
{
// virtual ~Base() {}
};
struct Derived : Base
{
Derived() : p(malloc(100)) {}
~Derived() { free(p); }
private:
void* p;
};

{
Base* x = new Derived;
delete x;
}

415:デフォルトの名無しさん
07/04/14 21:06:15
そこでshared_ptrですよ、と惑わしてみる

416:デフォルトの名無しさん
07/04/15 08:19:41
動的束縛(アップキャスト)を使った状態でのdeleteが駄目って事ですか?



417:デフォルトの名無しさん
07/04/15 09:42:37
float x=0.1;
exp(0.1*x)だとfloatなのにpow(0.1*x,2)だとdoubleになってしまうのは何故なのでしょうか?
pow(float(0.1*x),2)とすれば、floatになってくれるのですが、expとpowで何が違うのでしょうか?


418:デフォルトの名無しさん
07/04/15 09:49:12
んなこたーない。

つーか、何を根拠にfloatだのdoubleだの言ってるんだ?

419:デフォルトの名無しさん
07/04/15 16:40:47
まずCかC++かはっきりさせろ

420:デフォルトの名無しさん
07/04/15 16:48:26
C++です。

421:デフォルトの名無しさん
07/04/15 17:25:36
で、根拠は?

422:デフォルトの名無しさん
07/04/15 17:33:13
cmathを使っている

423:デフォルトの名無しさん
07/04/15 18:57:11
ダメだこりゃ。

424:デフォルトの名無しさん
07/04/15 19:14:06
math.hを使え

425:デフォルトの名無しさん
07/04/15 20:25:31
なんでやねん。

426:デフォルトの名無しさん
07/04/15 21:33:50
>>417
0.1 * xは、0.1がdouble型だからxもdouble型へ昇格され、全体としてもdouble型になる。
expもpowもdouble型の引数を取るものが呼ばれるはず。
そうでないならコンパイラがおかしいはず。
そもそも418も指摘しているとおりで、417自身がどうやって調べたのかも怪しいが。

ついでにいくつか言うが、float型リテラルを作るには0.1fのようにfを後置しろ。
そんな関数スタイルのキャストでも(勿論Cスタイルのも)使うな。
ここではstatic_castを使え(Boostのimplicit_castもありだ)。

427:デフォルトの名無しさん
07/04/17 13:06:00
#include <windows.h>
#include <stdio.h>


void main()
{
 double a;

 a = 2/6;
 printf("%f\n", a);
}

VC6にて上のように単純に2÷6を計算したら0が出力されます。
0.33333・・・を出したいのですがどうすればいいのでしょうか?

428:デフォルトの名無しさん
07/04/17 13:48:59
>>427
a = 2.0 / 6.0;

429:デフォルトの名無しさん
07/04/17 13:54:24
>>428
ありがとー


430:デフォルトの名無しさん
07/04/17 20:52:34
共用体が有効なときってあるの?
活用方法が見出せない。

431:デフォルトの名無しさん
07/04/17 22:11:20
>>430
確かに。職業PGだが、BigEndianとLittleEndianが混在した状況で
共用体が必要な場面は少ないと思う。実際使わないし。

組み込み系ならBEかLEかははっきりしているので
union X {
long a;
char b[sizeof(long)];
};

とかやることがあるかも。

432:デフォルトの名無しさん
07/04/17 23:37:36
領域をケチりたい場合にはよく使ったが、
最近はメモリに気を使う必要性が減ったから、
わざわざそういうことはしなくなったな。

433:デフォルトの名無しさん
07/04/18 01:02:36
union REGS は昔良く使われてたな。
今は struct sockaddr 関係で使われてたような。
sin_addrが内部の何かのdefineだった気がする。実装依存だろうけど。

434:デフォルトの名無しさん
07/04/18 11:00:22
>>430
であれば、使わなければよい。

実例としては、例えば「ICMPヘッダ union」でググるよろし。

435:デフォルトの名無しさん
07/04/21 18:03:25
freeにNULLを渡した場合の挙動は仕様として決まっていますか?
また、一般的な処理系ではどうなっているでしょうか。

436:デフォルトの名無しさん
07/04/21 18:24:28
>435
標準CではfreeにNULLを渡したときは何もしない(だから渡してもよい)
ことが保証されている。

437:デフォルトの名無しさん
07/04/30 09:05:06
32bit Windowsと64bit Windows両方で共通のコードを書きたいのですが、
int、doubleなど同じ変数型でも変数の桁数、精度がそれぞれで違うと思いますが、
これらの違いの一覧はどこかで公開されているのでしょうか?
これらはOS依存なのでしょうか?それともコンパイラ依存なのでしょうか?



438:デフォルトの名無しさん
07/04/30 10:41:58
VC++なら、
たぶん求めてるのはこの中から見つけ出せると思う。
URLリンク(msdn2.microsoft.com)(VS.80).aspx

439:デフォルトの名無しさん
07/04/30 10:49:34
intってコンピュータが64bitなら64bitになるというものじゃないのですか?

440:デフォルトの名無しさん
07/04/30 11:00:43
IP64,LP64,LLP64とかでググレ

441:デフォルトの名無しさん
07/04/30 16:20:50
if文の条件としてキーボードでaが入力されたら〜ということを表したいのですが、
char c;
if((c=getchar())==a)
と言ったものを考えたのですが、
char c;
if((c=getchar())=='a') に直すべきでしょうか。
非常に稚拙な質問ですが、よくわからないので助けてください。


442:デフォルトの名無しさん
07/04/30 16:26:29
>>441
正しくコンパイルできて動くほうを選べ。

443:デフォルトの名無しさん
07/04/30 17:07:24
>>442
ごめんなさい、今出先なのでコンパイルできる環境がないもので・・・。
どうか教えていただけませんか。

444:デフォルトの名無しさん
07/04/30 17:12:29
>>443
教えるも何も >>441 からでは判別不能。エスパーの召喚が必要だ。
コンパイルできない環境で知る必要も無いだろう。帰ってからゆっくり試せ。

445:デフォルトの名無しさん
07/04/30 19:00:38
>441
前者は、入力した文字を 変数 a の内容と比較している。
後者は、入力した文字が a という文字かどうかを判定している。
さあ、選べ。

446:デフォルトの名無しさん
07/05/01 01:23:21
>>445
トークンa
'a'という整数

447:デフォルトの名無しさん
07/05/01 07:40:59
>441
ついでにgetchar()の戻り値、文字リテラルの型はintだからchar c;ではなくint c;
とすべき

448:447
07/05/01 07:42:04
>文字リテラルの型はint
Cの場合ね。

449:デフォルトの名無しさん
07/05/06 19:11:31
下記のファイルの3列目を読み込んで配列に格納したいです。
-----
1,2,3,4
5,6,7,8
9,8,7,6
5,4,3,2
-----

数値はカンマで区切られています。
どうやったら a[0]=3, a[1]=7, a[2]=7, a[3]=3
というふうに格納できるでしょうか?
a[0][2]=3, a[1][2]=7, a[2][2]=7, a[3][2]=3
でも構いません。よろしくお願いします。

450:デフォルトの名無しさん
07/05/06 19:12:13
宿題は宿題スレへ

451:デフォルトの名無しさん
07/05/06 19:19:57
>>449
適当でいいのなら fgets で 3 列目まで読み込んでから
sscanf(buf, "%d,%d,%d,%d", &a[0], &a[1], &a[2], &a[3]);
みたいに。

真面目にやるなら strtok とか、コンマを strchr で探して切り捨てたりしてから、
atoi とか。

452:デフォルトの名無しさん
07/05/06 19:31:52
一行読み込むごとに
sscanf(buf, "%d,%d,%d,%d", &dummy, &dummy, &a[i], &dummy);
でいいじゃん

453:デフォルトの名無しさん
07/05/06 20:42:28
普通に %*d つかえよw

454:デフォルトの名無しさん
07/05/06 20:45:02
あ、三列目ってそっちか。

455:449
07/05/06 20:47:58
>>451-454
とくに宿題ではないのでここに書かせてもらってます。
型は決まっているのでsscanfでできました。
ありがとうございました。

456:デフォルトの名無しさん
07/05/07 00:21:59
>>453
すっかり忘れてたわー

457:デフォルトの名無しさん
07/05/07 11:33:22
>>452
で、3カラム目だけ得る目的なのに4カラム目を空読みする理由は?
#"%*d,%*d,%d"で充分。

458:デフォルトの名無しさん
07/05/07 17:30:42
>>457
上につられたってことにしといてください

459:デフォルトの名無しさん
07/05/07 23:31:13
#include <stdio.h>
#define JIJYO(x) ((x)*(x))

main()
{
int i = 1;
while(i <= 5) {
printf("結果:%d\n", JIJYO(i++));
}
}
において、実行結果は1^2,3^2,5^2の順に表示されるのですが、
何故、1^2,2^2,3^2……とならずに、i++が2回ずつ呼びだされるのでしょうか?

460:デフォルトの名無しさん
07/05/07 23:42:30
見え見えの落とし穴にはまるあなたは
きっと仲間内では天然キャラとして愛される存在なのでしょう

461:デフォルトの名無しさん
07/05/07 23:53:10
>>459
漏れも初心者なんで、あってるかどうかわからないけど。

#define JIJYO(x) ((x)*(x))

((i++)*(i++)) に展開されるんじゃないかな。

462:デフォルトの名無しさん
07/05/07 23:56:59
マクロを教える時に必ず注意される所だと思うが。

463:459
07/05/08 02:02:18
>>461
なるほど……。
ありがとうございました。

464:デフォルトの名無しさん
07/05/08 13:38:07
C++について。
問題文: f(x)=x^3(xの3乗)のdf(x)/dxのプログラムをC++で作れ。
(1≦x≦2、xは0.01ずつ増加<x(i+1)=x(i)+0.01>、そのときのf(x)の値も用いる。)

5月14日までに考えて来い!との事なので・・・
どうかご教授願いたく存じますm(_ _;)m

465:デフォルトの名無しさん
07/05/08 13:56:57
>>464
for (int x=100;x<=200;x++)
{
    cout<<(x/100.0)<<" "<<3*(x/100.0)*(x/100.0)<<"\n";
}

466:デフォルトの名無しさん
07/05/08 13:59:49
>>464
宿題スレとのマルチはお勧めしない。

467:デフォルトの名無しさん
07/05/08 15:44:46
さすが掃き溜め。

468:デフォルトの名無しさん
07/05/08 16:20:58
C++厨死ね

469:デフォルトの名無しさん
07/05/10 01:28:34
>>464
丸投げしといて、回答があれば丸写ししようなどと考えてる (らしい) 奴が
>ご教授願いたく
などとふざけた台詞を吐くお陰で、この単語に脊髄反射してしまう奴が
後を絶たないんじゃないかと思うようになって来た。

470:デフォルトの名無しさん
07/05/15 23:33:14
すいません・・・二重ポインタ**の意味がどうしてもわかりません・・・
多次元配列がどうのこうのって書いてあったけど・・・

471:デフォルトの名無しさん
07/05/16 00:30:42
>>470
ポインタのポインタで検索汁

472:デフォルトの名無しさん
07/05/16 00:45:13
ありがとうございました.二重ポインタで検索してました.

473:デフォルトの名無しさん
07/05/17 19:23:25
ぬるぽいんた

474:デフォルトの名無しさん
07/05/17 23:52:42
がっいんた

475:デフォルトの名無しさん
07/06/07 11:04:30
ropeってどんな時に使うのですか?
いまいち利点が分からないのですが。

476:デフォルトの名無しさん
07/06/07 11:19:39
>>475
URLリンク(www.oopweb.com)

個人的には、「非標準である」というデメリットしか思いつきません。

477:デフォルトの名無しさん
07/06/07 12:04:02
gccで作成した静的ライブラリとg++で作成したオブジェクトファイルを
リンクさせようとすると

undefined reference to ****

のようになります。
ライブラリの方はgccでしかコンパイルがうまく通らないのですが、
今後作成するプログラムはC++で書くため、gccでコンパイルしたものと
g++でコンパイルしたものをうまくリンクしたいのですが
何かよい解決策はないでしょうか?

478:デフォルトの名無しさん
07/06/07 12:17:22
>>477
「名前マングル」でググるよろし。
ライブラリのヘッダに手を入れていいなら
プロトタイプ宣言の先頭に

 #ifdef __cplusplus
 extern "C" {
 #endif

最後に

 #ifdef __cplusplus
 }
 #endif

を入れる。

479:デフォルトの名無しさん
07/06/07 13:12:38
while(1)
{
scanf("%d", &a);

switch (a) {
case 1:
printf("a = 1\n");
break;
case 3:
printf("a = 3\n");
break;
case 5:
printf("a = 5\n");
break;
default:
printf("others\n");
break;
}
}


これでgとか非数値を入力するとscanfが飛ばされて
defaultの所が延々流れるのですが何故でしょうか?

480:デフォルトの名無しさん
07/06/07 13:20:52
1. g の地点で scanf が失敗
2. a には何も入らないため、変数に最初に入ったゴミにより default が選択される
3. others と出力される
4. 1 に戻る

この無限ループ

481:477
07/06/07 13:22:09
なるほど、うまくいきました。ありがとうございます。

482:デフォルトの名無しさん
07/06/07 13:51:28
const int* p = new int[10];
delete[] p;

これ、エラーも警告も何も出ないんですけど、
仕様上合法なんですか?

483:デフォルトの名無しさん
07/06/07 13:59:51
>>480
なるほど、文字入力を%dの10進数指定して読み込んだら
ASCIIコードの値が格納されるかと勘違いしてました。
ていうか失敗の後再読み込みされずにgのゴミで処理されるって
scanfの仕様どうなってるんだろうかと今さらながらググってみたら
一番最初に出てくる関数だから侮っていたら書いてあることが意外と難しくてビックリでしたorz


484:デフォルトの名無しさん
07/06/07 14:15:41
>>482
const int の配列を割り当てるのも、それを解放するのも
何の問題ありません。

でも p[0] = 0; なんてするとエラーになる罠。

485:デフォルトの名無しさん
07/06/07 14:26:43
メモリの破棄には const の力は及ばない・・・ということですか。
分かりました。

486:デフォルトの名無しさん
07/06/07 15:59:10
破棄そのものは内容書き換えないからな

487:デフォルトの名無しさん
07/06/07 16:04:32
理屈は分かるけど、それでいいんかいと思わなくはないなw

void foo(const int* p) {
 delete[] p;
}

を foo(p); って呼んで、
ああ、p は foo で何の影響も受けてないよねー、と思ったら、
delete[] されてた、なんつって。

まあ、const_cast という悪魔も確かにいるけどね。

488:デフォルトの名無しさん
07/06/07 17:36:12
そんな気持ち悪いことはしないでくださいとしかなあ。

489:デフォルトの名無しさん
07/07/06 09:47:01
C言語で、文字列 str1 の先頭から1文字づつ取り出して
別の文字列 str2 に追記していく場合、
strncatを使用して

strncat(str2,&str1[i],1);

とするとstr2の内容が文字化けしてしまいます。
FedoraCore6なんですが、どうすればいいでしょうか?

490:デフォルトの名無しさん
07/07/06 09:48:11
何を入れたらどう化けたんだよ

491:デフォルトの名無しさん
07/07/06 10:01:41
>>490
(だとか)だとかを入力後、他の文字を追記するとstr2に文字化けが生じてしまいます


492:デフォルトの名無しさん
07/07/06 10:03:31
つまり、マルチバイト文字を入れたときに化けるんだな
化ける前と化けた文字を見れば一発でわかるが・・・
iはちゃんと1ずつ進めてんの?

493:デフォルトの名無しさん
07/07/06 10:05:06
マルチバイトはstrncpyの3番目が1の場合2回(UTF-8なら3回)実行しないとだめなのはわかってる?

494:デフォルトの名無しさん
07/07/06 10:07:47
半角(などを使用していたつもりだったので、
文字列内にマルチバイト文字は入っていないと思っていたのですが・・・・

sizeof("(")でもsizeof("1")でも同じ値がかえってきたのですが、"("もマルチバイトなんでしょうか?
あらかじめstrlenで文字数を数えてからiを回しています。


495:デフォルトの名無しさん
07/07/06 10:08:40
(だとか)だとかを
「だとか」じゃなくて、"("、")"のほうかよw

496:デフォルトの名無しさん
07/07/06 10:10:48
>>495
すみません、ちゃんと""つけておいたほうが良かったですね。

497:デフォルトの名無しさん
07/07/06 10:13:54
文字化けを見てみないとわからんけど、\0終端して無いからゴミがくっついてるんじゃね

498:デフォルトの名無しさん
07/07/06 10:17:24
そういや、最初にstr2は0で初期化してる?
strcat は\0のとこに追加するんだぜ。

499:デフォルトの名無しさん
07/07/06 12:01:06
str(n)cat なんていう下衆なもんは使わないことをおすすめする。

500:デフォルトの名無しさん
07/07/06 12:18:09
>>498
してませんでした。
やってみます

501:デフォルトの名無しさん
07/07/10 21:31:00
クラスにはセットとゲット以外に、
なるべくメンバ関数を作らないようにすべきですか?
それとも、どんどん関数を含めても良いのでしょうか?
思想的な質問ですが…

502:デフォルトの名無しさん
07/07/10 21:33:03
アクセサ自体ベタベタ付ける物ではない
メンバ関数・変数ともにそのクラスを表現するのに必要なものだけで良い

503:デフォルトの名無しさん
07/07/10 21:38:34
つまりメンバ関数にする意味があるもののみ含めるのが良いと、
そういうことで良いでしょうか。

504:デフォルトの名無しさん
07/07/10 21:59:27
それでおkかな。
OOには単一責任の原則と言う物があるから
基本的にクラスが持つ責任は一つだけ。
メンバ関数をその責任に応じたもののみを付けるのが良い。
無駄に責任を負うと初心者にありがちなblobアンチパターンになる。

505:デフォルトの名無しさん
07/07/11 01:28:49
class A
{
public:
  int x;
};
class B: public A
{
public:
  int y;
}:
class C: public B
{
  int z;
};

継承を習っているんですが、上のようなコードがあったとき、

int main()
{
  C object;
}

このようにクラスCのオブジェクトを生成したとすると、
int x, yの分のメモリを保持しているクラスCのオブジェクトができるんでしょうか?



506:デフォルトの名無しさん
07/07/11 01:35:06
もう一つ質問なんですが

class A
{
  int x;
};
class B: public A
{
public
  int y;
};
int main()
{
  A* p;
  p = new B;
}

このようにクラスA型のポインタでクラスBの領域を動的確保した場合、
Bのオブジェクトができるのですか?
それともAのオブジェクトができるのでしょうか?


507:デフォルトの名無しさん
07/07/11 01:35:08
>>505
うん。もちろん z もね。

508:デフォルトの名無しさん
07/07/11 01:37:23
>>507
ありがとうございます!!


509:デフォルトの名無しさん
07/07/11 01:38:42
>>506 B

510:デフォルトの名無しさん
07/07/11 01:40:07
>>509
ありがとうございます!
これで今ある疑念が解消されました!


511:デフォルトの名無しさん
07/07/11 01:54:21
解消されたと言った手前、いきなりですが
>>506の場合において、生成されたクラスBのオブジェクトが持つint yにアクセスする手段ってありますか?
ポインタはクラスA型なので、アロー演算子を使っては呼び出せないですし…
もしかして不可能ですか?


512:デフォルトの名無しさん
07/07/11 02:09:52
>>511
A* が指してるオブジェクトが本当に B だと確信できるなら static_cast で
B* に変換してアクセスできる。ただし、行儀のいいコードではない。

513:デフォルトの名無しさん
07/07/11 02:14:45
いや普通ダウンキャストだろ

514:デフォルトの名無しさん
07/07/11 02:25:11
static_cast でダウンキャストするわけですが何か?

515:デフォルトの名無しさん
07/07/11 05:10:25
コマンドプロンプトの履歴?をもっと多く表示させたいんです。
最初のほうの計算がきれてしまいます。

516:デフォルトの名無しさん
07/07/11 05:15:38
>>515
ウィンドウ名が書いてあるところ右クリック

プロパティ

あとはお好きにドゾー

517:デフォルトの名無しさん
07/07/11 05:22:20
>>516
そこからがわからないんですけど
バッファサイズとバッファ数を大きくすればいいのでしようか?

518:デフォルトの名無しさん
07/07/11 08:55:39
さいです

519:デフォルトの名無しさん
07/07/12 02:28:20
>>517
あー説明不足ですまん。

> バッファサイズとバッファ数を大きくすればいいのでしようか?
おk。

520:デフォルトの名無しさん
07/07/15 18:42:34

 漢字かな雑じりの string を小文字にしたいんですが,以下の方法では「認.」 が化けてしまいます.

std::string str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ AB確認.";//期待する変換: abcdefghijklmnopqrstuvwxyz AB確認.
std::ctype<char> c;
c.tolower( str.begin(), str.end() );//「認.」 が化ける


 以下の方法で上手くいっているように思いますが問題ありますでしょうか?
また,もっと簡単な方法があれば御教示下さい.

for( int i=0; i < str.size(); i++)
{
  if ( _ismbblead(str[i]) )
  {
    i++;
    continue;
  }
  str[i] = tolower(str[i]);
}



521:デフォルトの名無しさん
07/07/15 21:09:48
for(i=0; N; i++){
・・・



このときの繰り返し条件Nってどういう意味になりますか?

522:デフォルトの名無しさん
07/07/15 21:11:49
Nのところが0以外なら繰り返してください、っていう意味!!!!

523:デフォルトの名無しさん
07/07/15 21:17:25
共有メモリに(キューデータ構造)を構築したいのですが
どうしたらいいのでしょうか?

524:デフォルトの名無しさん
07/07/15 21:30:25
>>523
まずは、パソコンの電源を入れる

525:デフォルトの名無しさん
07/07/15 23:02:52
>>520
wchar_t 使えば?

526:デフォルトの名無しさん
07/07/16 00:43:59
wchar_t じゃ解決にならんと思うのだが。

527:デフォルトの名無しさん
07/07/16 00:58:23
>>526
何か問題あるの?

528:デフォルトの名無しさん
07/07/16 01:47:49
>>520 で済む事なのに
わざわざ文字コード変換とかするとか、
いくらなんでも無駄すぎる。

529:デフォルトの名無しさん
07/07/16 01:53:54
>>521
Nがtrue(真)なら繰り返す
Nがfalse(偽)なら打ち切る
そして true とは 0 以外の値を持つ事であり、false とは 0 であることである。


530:デフォルトの名無しさん
07/07/16 02:18:50
>>528
お前の言うことは分かるが、もし527に対して言っているのなら、
答えになっていないぞ。
無駄かどうかはともかく、wchar_tでも解決できるのだから。

個人的にはwchar_tを使うのはありだと思う。
確かにこの例では_ismbbleadの1つで済むが、そうでない(wchar_tにしたほうが手っ取り早い)場合は結構ある。
それ以外にも利点や必要があってwchar_tを使っていると、
522程度でもwchar_tを使えばいいと思うようになってくる。
今時変換のコストなんて微々たるもの。
なんなら元データをwchar_tと同じ文字コードにすればいい。(完全に脱線したが)

ただ、std::stringとstd::wstringとの間に簡単な変換方法が無いのは痛い。

ところで、wchar_t使う方法では、やり方次第で
全角英字まで小文字になりそうな気もする。

531:デフォルトの名無しさん
07/07/16 02:22:10
L"" で初期化すれば変換なんて要らないんじゃないの?

532:デフォルトの名無しさん
07/07/16 02:29:58
wchar_t は2バイトだったり4バイトだったりするからな・・・

533:520
07/07/16 14:26:31

皆さん御解答有難う御座います.
wchar_t も検討しましたが,問題なさそうなので >>520 で行きたいと思います.
有難う御座いました.

534:デフォルトの名無しさん
07/07/19 01:28:47
int x;
std::cin >> x;

ってすると、xがint型であってもキーボードからWWWって文字列を入れたりすることができちゃうじゃないですか
これって防げませんか?


535:デフォルトの名無しさん
07/07/19 01:56:16
>>534
入力されたらどうするかを自分で決めて好きに実装すればいい。
最悪は1文字ずつ処理。

536:デフォルトの名無しさん
07/07/19 21:54:41
その方法がわかりません・・・・・

537:デフォルトの名無しさん
07/07/19 22:57:53
一旦、文字列として読み込めばいい。

538:デフォルトの名無しさん
07/07/20 00:55:38
配列と、forとかの反復処理を勉強してください。

539:デフォルトの名無しさん
07/07/20 03:37:06
わざわざ再発明させなくてもいんじゃね?っていつも思う。
てか悪い。C++は良く分からなかった。

#include <stdio.h>
main() {
   int a;
   do {
      printf("値>");
      scanf("%d",&a);
      while (getchar() != '\n') { }
   } while((a < 1) || (a > 9999));
   return 0;
}

540:デフォルトの名無しさん
07/07/20 04:07:14
>>534
fail したら clear してから string へ読み捨てれば

541:デフォルトの名無しさん
07/07/20 22:37:43
じゃあC++における標準入力って何でも文字列で読み込まないとエラー処理できないわけですか…


542:デフォルトの名無しさん
07/07/20 22:52:48
>>541
Cでも同じじゃね?
ってか、入力されるのは実際文字列であってたまたま数字だったら変換してくれてるってことでしょ。
Variantみたいな型が無い時点で>540のようにするしかないかと。

543:デフォルトの名無しさん
07/07/21 01:04:15
>>541
どうしてもっていうならテンキー以外のキーボードをつなげるな

544:デフォルトの名無しさん
07/07/21 06:29:53
人はそれを電卓と呼ぶ。

545:デフォルトの名無しさん
07/07/21 06:57:01
cin.ignore 使えば

546:デフォルトの名無しさん
07/07/21 19:06:59
URLリンク(www.kk19.net)

地球上のキーボードが全てこれだったら、
ちっとはマシな世の中になってたかもな

547:デフォルトの名無しさん
07/07/22 07:58:57
>>546
せめてリターンキーは必要だろう
CtrlとALTときたら普通はSHIFT
指五本あるのになんで三キーしかないのか


548:デフォルトの名無しさん
07/07/22 19:36:32
同時に全部押すことにしか使わないのさw

549:デフォルトの名無しさん
07/07/23 01:49:49
最近は使わないんだろうな。
NTのログインにも使わなくなったからな・・・

550:名無しさん@そうだ選挙に行こう
07/07/29 15:26:31
参照っていうのは『参照!』ってやった時にしかアクティブにならないのがファイナルアンサーですか?

551:デフォルトの名無しさん
07/07/29 21:52:37
ニッポンランゲージでOK

552:デフォルトの名無しさん
07/07/30 14:01:40
構造体を関数で参照した時に
その関数では使わない構造体の中の変数があった時
関数に構造体を渡した時に、
構造体の中の変数が多いとそれだけ何か、処理が増えてしまうのか
それとも「参照!」ってやったときだけ処理されるのかが知りたいです(´・ω・`)


553:デフォルトの名無しさん
07/07/30 14:08:55
参照渡しなら問題ない。

554:デフォルトの名無しさん
07/07/31 00:41:42
>>552
もう少し質問を簡潔にまとめてくれると助かる。
構造体を値渡しすれば関数内で利用されてない変数の有無に関わらずコピーの処理が発生する。
よって、構造体が大きくなればなるほど処理も大きくなる。
これを避けたいのであれば>>553のようにするか、ポインタ渡しすればいい。

555:デフォルトの名無しさん
07/07/31 10:51:52
>>554
日本語の拙い>552に合わせて変な用語を使わなくていいよ。
構造体のメンバを変数と言われるとどうにも理解しにくいから。
#メンバ変数と言おうと要素と言おうとその辺は構わんが。

ついでに注釈。問題の関数がインライン展開されるような代物なら、
参照渡しでなくともコピーが発生しない可能性はある。
従って、迷ったときは値渡しで充分だ。

556:デフォルトの名無しさん
07/07/31 12:05:33
謝罪を賠償しるニダ

557:デフォルトの名無しさん
07/08/01 02:10:49
>>553
ありがとう

>>554
なるほど

>>555
インラインっていうのを始めて知りました
それだとコピーされなかったりするんですね
でもとりあえず参照使っときます

558:デフォルトの名無しさん
07/08/01 02:28:35
恥ずかしい

559:デフォルトの名無しさん
07/08/01 11:49:12
迷ったらconst参照でいいよ。

560:デフォルトの名無しさん
07/09/25 00:02:25
typedef struct __blockData{
uint32_t index;
uint32_t block_size;
struct __blockData *next;
}BlockData;


struct __blockData *next;この部分なんとか
BlockData *next;って書きたいんですけど

なんとかならないっすか?

561:デフォルトの名無しさん
07/09/25 00:05:15
なんとかならないっすね

562:デフォルトの名無しさん
07/09/25 00:14:43
ええーーーやだやだ
ちょっとちょっとそんなぁ

まってくださいよ>>561さん
俺がどんな思いで12分過ごしたと思うのですか?

563:デフォルトの名無しさん
07/09/25 00:35:10
typedefはあくまで再定義
最後の行のBlockData;までいったところで初めて再定義完了になるから
自分を指す場合ちゃんとstruct __blockDataと明示しないと不可。

564:デフォルトの名無しさん
07/09/25 00:39:25
そうなのか

やけ酒するしかないな...
高校生だけどまぁいいかw

565:デフォルトの名無しさん
07/09/25 00:48:04
通報しました

566:デフォルトの名無しさん
07/09/25 00:55:34
>>560
これでいいんじゃね?

typedef struct __blockData BlockData;

struct __blockData{
uint32_t index;
uint32_t block_size;
BlockData *next;
}BlockData;

567:デフォルトの名無しさん
07/09/25 01:04:43
>>566
それはCでもC++でも無理だろ。書き忘れたがC++コンパイラなら
struct BlockData;と前方宣言する事でコンパイルをパス出来た。

568:566
07/09/25 01:08:52
あ、最後に余計な BlockData がついてた。ごめん。

>>567
最後の余計なやつだけ修正すればコンパイルできるよ。
C++ なら前方宣言も要らなくて struct BlockData { BlockData* ... ってできるよ。

569:デフォルトの名無しさん
07/09/25 01:13:22
うへー

570:デフォルトの名無しさん
07/09/25 01:17:52
void *next;

では・・・・だめですかそうですか。

571:デフォルトの名無しさん
07/09/25 01:18:50
uint_ptrと
void *

の使いわけってどうすればいいの?

572:デフォルトの名無しさん
07/09/25 01:26:04
大文字じゃなくて小文字なの?あんま見覚えが無い・・・

UINT_PTRはunsigned intだった気もするけどよく覚えていない

573:デフォルトの名無しさん
07/09/25 04:52:14
a |= b

ってどんな意味なんでしょうか?


574:デフォルトの名無しさん
07/09/25 08:13:47
>>573
a = a | b

575:デフォルトの名無しさん
07/09/25 09:29:14
>>572
UINT_PTRはC99のuintptr_t相当。

576:デフォルトの名無しさん
07/09/25 23:18:36
>>571
int と voidの使い分けは?


577:デフォルトの名無しさん
07/10/18 01:34:33
あげあげ

578:デフォルトの名無しさん
07/10/18 02:00:25
>>571

void* はどんな型のポインタが渡されるか分らない場合に使う。
(キャストしないと参照先を見れない)
int* はポインタが指し示した先がint型であるとされる。

char a = 'a'
int* p1 = (int*)&a;
void* p2 = &a;

となっているとき*p1はエラーにならんが*p2はエラーになる。
なので関数内で使用時のキャストし忘れが防げる…のではなかったかな?

579:デフォルトの名無しさん
07/10/18 08:17:44


580:デフォルトの名無しさん
07/10/18 08:32:36
すみません。書きかけを送信してしまいました。
ハード、ソフト共に同じはずなのに、別のPCではマルチプロセスのミューテックスによる排他制御が上手く働いていないみたいなのですが、
原因として何を疑えばいいのでしょうか。もう全然判んないです。

581:デフォルトの名無しさん
07/10/18 09:30:23
>>580
最小限のコードを晒す

582:デフォルトの名無しさん
07/10/19 08:27:30
『上手く働いていないみたい』といいたい気持ちはわかるが
それでは他人にはわかってもらえませんよ。

583:デフォルトの名無しさん
07/10/19 08:30:39
>>580
今まで偶然動いていただけで同期処理に漏れがあったかだな

584:デフォルトの名無しさん
07/10/19 09:13:13
>>580
うちでは上手く働いている
実力不足じゃね?

585:デフォルトの名無しさん
07/10/20 11:06:18
今まで低速シングルCPUで動いていたが
高速なPCに変えたらおかしくなったとか
クアッドコアに変えたらおかしくなったとか
そういうマルチスレッドプログラムなんかもあるんだろうな。

586:デフォルトの名無しさん
07/10/20 13:03:24
機種依存ソフトなんだろう。

587:デフォルトの名無しさん
07/10/20 16:34:20
方角が悪い。

588: ◆NpJ1Hez.TM
07/10/24 04:48:27

YES!!

589:デフォルトの名無しさん
07/10/25 17:57:28
関数ポインタテーブルとswitch-case文
ってどっちが高速なの?

どっちも個数は100

590:デフォルトの名無しさん
07/10/25 21:02:40
ポインタ

591:要は、実測あるのみ
07/10/29 12:07:48
>>589
一概には言えないが、テーブルの方が遅いことは多分ないと思う。
恐らくは、大差ないと思うが。

592:デフォルトの名無しさん
07/10/30 01:12:14
テーブルが遅くなるケースも充分考えられるよ。もちろん、メモリアクセスの速度を除いて。

単純な例だと、2つの値(分岐先)が交互に来る場合。
こういった規則的なものなら、分岐予測はほぼ必ず成功する(ものが多い)。
最近のプロセッサなら、もっと複雑なパターンでも予測出来るものもある。
一方、テーブルジャンプだと、(普通は)前回と同じ分岐をすると仮定されるので
必ず分岐ミスとなる(ものもある)。

当然、分岐予測ミスのペナルティの大きさも含めて、プロセッサによる差が大きいけどね。

593:デフォルトの名無しさん
07/11/16 19:20:28
>>589
なぜ「switch-case文より関数ポインタテーブルのが高速」だと考えるのか?

条件分岐が排除できるから

では、なぜ条件分岐が排除できると高速になるのか?

実際に実行するコードがかなり前から分かっていれば、
CPUでコードプリフェッチやアウトオブオーダー実行などの最適化を行えるから

関数ポインタテーブルを使えば実行するコードがかなり前に分かるのか?

条件にもよるが、おそらくはノー
多くの場合、直前にならないと関数ポインタの値が分からない

つまり、関数ポインタテーブルを使っても、少なくともx86の場合は速くなりません。
条件分岐なら二者択一でとりあえずどちらかの分岐コードを実行するという手もありますが、
関数ポインタだとそういうこともできないので、多くの場合ストールします。
実際に実行するコードアドレスがかなり前から分かっていて、
そのアドレスを特定のレジスタ(か不変なことが保証されているメモリ)
に保存しておくことができればストールは回避できます。

594:デフォルトの名無しさん
07/11/17 15:25:53
じゃあif-elseでもいいのか


595:デフォルトの名無しさん
07/11/17 19:17:04
選択肢が100個もあれば、速度は分布によっていろいろだろうな。

596:デフォルトの名無しさん
07/11/17 23:16:36
Cカス
Cカス

うるさい人を黙らせる方法教えてください

なるべく合法的な方法がいいです

597:デフォルトの名無しさん
07/11/17 23:30:14
RubyもPythonもphpもUnixも
全部Cで書かれてるんだぞ。
Cはすごいんだぞ。

598:デフォルトの名無しさん
07/11/17 23:35:23
>>596
相手がしゃべった瞬間に大声を出すとか

599:デフォルトの名無しさん
07/11/19 07:11:07
>>596
お前の耳を取ってしまえ

600:デフォルトの名無しさん
07/11/22 00:23:13
C言語でC++の
テンプレート見たいに記述したいんだけど

どうしたらいいものじゃろうか?のぅ?

601:デフォルトの名無しさん
07/11/22 01:03:26
プリプロセッサを駆使する。

602:デフォルトの名無しさん
07/11/22 20:52:15
でどうやってかくの?

603:デフォルトの名無しさん
07/11/23 09:48:29
## を駆使する

604:デフォルトの名無しさん
07/11/24 06:34:15
C++にtemplateが実装されるまでの過程を知ってりゃ話は早いんだがな。
generic.h

605:デフォルトの名無しさん
07/11/27 22:49:30
そうだ、cfrontを使おう(w

606:デフォルトの名無しさん
07/12/01 09:23:34
template<typename T>T*hoge(T*t){return t;}
でNULLを受け取れるようにするにはどうすればいいんでしょう...

607:デフォルトの名無しさん
07/12/01 11:57:46
(void*)NULLみたいに、型付きのNULLを渡す。
でないと、どの型のNULLがほしいか誰にも判らないじゃん。

608:デフォルトの名無しさん
07/12/01 13:28:57
NULLに型など付けれません
ばかじゃねーのw

609:デフォルトの名無しさん
07/12/01 23:02:23
>>606
hoge<int>(0)

610:デフォルトの名無しさん
08/01/18 00:18:25
hashのkeyを

char key[32]で定義しmemcpyを
必要に応じて複数回コールする方法と


struct key_data{
_u32 data;
....
};

みたいな感じで構造体を定義して
_u8 *にキャストして使うのは
どっちが速い?それとも同じ?


611:デフォルトの名無しさん
08/01/18 03:44:57
なんともいえない。
実測。

612:デフォルトの名無しさん
08/01/19 00:12:37
>>608
いくらここが掃き溜めだと言っても限度が・・・

613:デフォルトの名無しさん
08/01/20 21:00:38
コンパイルしたときのエラーに

storage size of 's' isn't known

とでてきてしまいます。
これはどこを直せばいいんでしょうか?
storageって何ですか?

614:デフォルトの名無しさん
08/01/21 10:32:07
>>613
辞書くらい引け。

恐らく、int s[]みたいな変数宣言でもしているんだろ。

615:デフォルトの名無しさん
08/01/21 12:37:58

offsetof(s,m)マクロみたいなので
他クラスのprotectedメンバのオフセットを
取得したいんですがどうすればよいですか?



616:デフォルトの名無しさん
08/01/21 12:41:48
>>615
それができたらprotectedの意味がないとは思わないかね?

617:デフォルトの名無しさん
08/01/22 23:31:19
コンパイルをした時に
converting to ‘int’ from ‘float’

って表示されたらどこが悪いんでしょうか?

618:デフォルトの名無しさん
08/01/22 23:39:07
>>617
floatからintに暗黙の変換を行っている。
明示的にキャストを書けば警告は出ない。

619:デフォルトの名無しさん
08/01/22 23:44:05
>>617
>って表示されたらどこが悪いんでしょうか?
頭……というのはさておき、floatからintではオーバフローが起きる恐れがあるので
気の利いたコンパイラは警告を出すってこと。
# 勿論、出さないようにもできる。

620:デフォルトの名無しさん
08/01/23 00:29:52
>>618-619
お陰様で解決出来ました、ありがとうございます。



次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4772日前に更新/249 KB
担当:undef