はきだめC/C++下級者 ..
[2ch|▼Menu]
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
お陰様で解決出来ました、ありがとうございます。


621:デフォルトの名無しさん
08/01/28 20:04:43
C++のコンストラクタの中で例外発生させるのは駄目と聞いたのですが
ではnewもbad_alloc投げる可能性があるのでコンストラクタでnewしてはいけないのですか?

622:デフォルトの名無しさん
08/01/28 21:45:32
コンストラクタで例外はまあない方がいいのは確かだが、
ダメというほどではない。
デストラクタは絶対あかんがね。

623:デフォルトの名無しさん
08/01/29 18:08:28
クラスを作る側も使う側もきちんとリソースの管理ができていれば何の問題もない。

624:デフォルトの名無しさん
08/01/30 22:38:50
コンストラクタでの例外については、人によって意見が違うが、
俺は積極的に例外が発生するようにしてる。

じゃないと、不正なオブジェクトが生成されてしまうから

625:デフォルトの名無しさん
08/02/02 23:02:43
仮想コンストラクタとスマートポインタ使えば解決。

626:デフォルトの名無しさん
08/02/12 03:07:41
Phidgetsというハードを制御したいのですが

~略
int servo_simple()
{

CPhidgetServoHandle servo = 0;

//create the accelerometer object

CPhidgetServo_create(&servo);

//open the LED for device connections

CPhidget_open((CPhidgetHandle)servo, 20489);

//Step 1: Position 10.00
printf("Move to position 10.00. Press any key to Continue\n");
getchar();

CPhidgetServo_setMotorPosition (servo, 1, 100.00);

return 0;
}

//int _tmain(int argc, _TCHAR* argv[])
int main(void)
{
servo_simple();
return 0;
}

627:デフォルトの名無しさん
08/02/12 03:08:03
この文で、
getchar();
で入力を待たずにCPhidgetServo_setMotorPosition (servo, 1, 100.00);
を実行したいのですが、getchar();を消しただけでは駄目なのでしょうか?
ド素人な質問をしていると思うのですがどうかご教示下さいませ。

628:626-627
08/02/12 07:42:40
自己解決しました。 getchar();で入力を待たずに実行すると、ハードを認識するのが追いつかずに実行されるようでした。

629:デフォルトの名無しさん
08/02/19 23:09:36
クラスを普通に前宣言する時
class MyClass;

って書けばいいけど、例えば

class MyClass
{
public:
class Foge
{
};
};

みたいに MyClass の中にあるクラス Foge を
前宣言したい時はどうすればいいの?

630:デフォルトの名無しさん
08/02/20 01:39:33
>>629
class MyClass
{
public:
class Foge;
};

class MyClass::Foge
{
};

MyClass の定義無しでの宣言はできない。だからネストされたクラスを
インターフェースに使うと MyClass を前方宣言で済ませるのが難しくなる。

631:デフォルトの名無しさん
08/02/20 22:12:19
一つのソケットに対して送信、受信が交互ではなくて、不定期に発生するような、
プログラムを作ってるんですけども、こういうのってどうするのが良いですか?
交互に通信がある場合ならselect→recv→sendとかで簡単なんですけども
送信が繰り返される場合もあるので悩んでいます。
どなたか教えてください

632:デフォルトの名無しさん
08/02/20 22:58:08
今マインスイーパーを作ってるんですが
それについての質問ってここでしてもいいんですか?

633:デフォルトの名無しさん
08/02/20 23:35:38
>>631
sendリクエストをsignalで受ければいいような。
もし必要ならネットワークスレへどうぞ。

>>632
マインスイーパー程度ならここでもいいと思いますが、
GUIライブラリの使い方なら該当GUIライブラリスレへどうぞ。
マインスイーパースレも参考にどうぞ。

634:デフォルトの名無しさん
08/02/20 23:51:14
>>633
visualC++ 6.0を使って作ってるんですが
地雷の表示と踏んだ後のリセットがうまく出来ないんです

void CMine1View::DispMine()
{
CClientDC dc(this);
CBrush *oldBrush1,redBrush,*oldBrush2;
int iy,ix;
for(iy=2;iy<=Masu+1;iy++)
{
for(ix=2;ix<=Masu+1;ix++)
{
if(Mine_Position[iy][ix]==-1)
{
oldBrush1=(CBrush*)dc.SelectStockObject(WHITE_BRUSH);
dc.Rectangle(ix*Width,iy*Width,
ix*Width+Width,iy*Width+Width);
dc.SelectObject(oldBrush1);
redBrush.CreateSolidBrush(RGB(255,0,0));
oldBrush2=dc.SelectObject(&redBrush);
dc.Ellipse(ix*Width+5,iy*Width+Width+5,
ix*Width+Width-5,iy*Width+Width-5);
dc.SelectObject(oldBrush2);
redBrush.DeleteObject();
}
}
}
AfxMessageBox("地雷 踏みました!");
}

635:デフォルトの名無しさん
08/02/21 03:02:40
>>631
selectが反応したときはrecvする
sendはいつでも何度でも好きなときに好きなだけ繰り返し呼んで良し
何か問題が?

636:デフォルトの名無しさん
08/02/21 03:13:07
トランシーバーと同じ問題じゃないの?どうぞ

637:デフォルトの名無しさん
08/02/27 01:03:33
質問です。
VC使ってて、あるクラスの実体を複数のスレッド内で使ってるのですが、
これって問題あるのでしょうか?
スレッド毎に異なるデータを用意してるので、
クラスのメンバ変数への排他の問題はありませんが、
クラス内にDLLクラスをメンバに作っていて、
スレッド毎に同じDLLにアクセスしています。
こんな使い方って問題ありますか?




638:デフォルトの名無しさん
08/02/27 01:08:24
DLLの提供する関数がリエントラントなら問題ないんじゃね

639:デフォルトの名無しさん
08/02/28 03:27:06
クラスAがあり、クラスAを実体化した際、コンストラクタでクラスBを実体化したとします。
このとき、クラスBがクラスAのpublicな関数を呼び出すためには、
クラスBに対してクラスAの実体のポインタを渡し、そこからアクセスする以外に方法がありますか?
どのような方法があるでしょうか?


640:デフォルトの名無しさん
08/02/28 03:29:48
>>639
ポインタじゃなくて参照使うとか、無理やり違う手段でっていうならグローバル変数とか、
いろいろありそうだよ。

641:デフォルトの名無しさん
08/03/03 15:37:24
>>639
あんま使ったこと無いけどクラスBにクラスAのメソッドをfriendで共有すれば?

642:デフォルトの名無しさん
08/03/03 17:35:21
friendにしてもthisポインタ相当の何かは必要だろ。

643:デフォルトの名無しさん
08/03/03 19:14:59
クラスCのstatic変数に突っ込んで、クラスCの静的メンバ関数から呼んでもらう。

644:デフォルトの名無しさん
08/03/04 12:27:18
>>639
C#でいうdelegate?
URLリンク(d.hatena.ne.jp)

645:デフォルトの名無しさん
08/03/04 21:19:25
グローバル変数なんつー力技を除けば、
どうあっても this は渡す必要がある。
デリゲートだって内部的に this を渡している訳で。

friend は public メンバ呼ぶのには全く関係ないな。

646:デフォルトの名無しさん
08/03/04 23:27:30
>>645
もちろん、何らかの方法でthisを渡す必要はあるだろう。
でも、>>639の場面で、class Bからclass Aのメソッドを直接呼び出すには、class Bがclass Aを知らないといけない。
delegateは、メンバ関数へのproxyとして働くことで、メソッドを定義しているclassを隠すことが出来る。
>>639の場面では、class Bはclass Aを知らなくても、class Aのメソッドを呼び出すことが出来るようになる。

647:デフォルトの名無しさん
08/03/04 23:59:25
そもそも、コンストラクタ内で他のクラスにメンバ関数を呼ばせる事自体
結構危険な事だと思うけどね。

648:デフォルトの名無しさん
08/03/08 17:27:25
コンストラクタで実体化しただけで、
コンストラクタで関数を呼ぶとは書いてないだろ

649:デフォルトの名無しさん
08/03/13 19:06:50
Wikipedia項目リンク
何でstrcpy(s, NULL);は誤りなのですか?

650:デフォルトの名無しさん
08/03/13 19:26:01
>>649
NULLがchar*型じゃないから

651:デフォルトの名無しさん
08/03/13 19:44:01
memsetは問題なく動くからまだいいけど、
普通は、s[0] = '\0';で十分だろ。せいぜいstrcpy(s, "");

652:デフォルトの名無しさん
08/03/13 23:19:50
NULL を脱参照して死亡

653:デフォルトの名無しさん
08/03/24 10:47:50
ファイルを分割したときに変数を大域変数として定義して、
呼び出すためにはどうしたらいいでしょうか?

今ファイルがmain.cpp,hoge.h,hoge.cpp,hage.h,hage.cppとある時に,
全体でのメモリアクセスを調べるためにmain.cppでint型の大域変数を定義して,
hoge.cppとhage.cpp内で値をインクリメントできるようにしたいのですが・・・

654:デフォルトの名無しさん
08/03/24 10:51:04
どんな入門書にも書いてあるよ

655:デフォルトの名無しさん
08/03/24 11:25:16
main.cppで変数定義して、
hage.h,hoge.hでexturn宣言したらエラーが出るのですが、
やり方間違ってますか?

656:デフォルトの名無しさん
08/03/24 11:26:37
>>653
クラスにすることお勧め。

657:デフォルトの名無しさん
08/03/24 13:36:42
どうしてエラーをコピペしないのか。俺らをエスパーだと思ってるのか。

>>655
ソースも見ないで間違ってるかどうか判断できるわけがない。
ソース(その変数に関係するところ)とエラー(いっぱい出てたら始めの3個くらい)を張って。
改めて打つんじゃなくてコピペで。

>hage.h,hoge.hでexturn宣言したらエラーが出るのですが、
externの綴りが間違ってる。ここに書く時に間違えただけならいいんだけど。

658:デフォルトの名無しさん
08/03/24 20:57:56
エスパーしてもらいたいんじゃなくて
原因である可能性の高いものを列挙してもらいたいんじゃない?

んで、それを一通り試して、自己解決しました!って言うの(笑)

659:デフォルトの名無しさん
08/03/25 02:29:45
>>655
やりかたがまちがっている。
.h ファイルはコンパイルする必要はないよ。

660:デフォルトの名無しさん
08/03/25 03:10:31
>>653
[main.cpp]
#include <stdio.h>
void hoge_inc(void);
void hage_inc(void);
int count;
int main(int argc, char *argv[]) {
    count = 0;
    hoge_inc();
    printf("count = %d\n", count);
    hage_inc();
    printf("count = %d\n", count);
    return 0;
}
[hoge.cpp]
extern int count;
void hoge_inc(void) {
    count++;
}
[hage.cpp]
extern int count;
void hage_inc(void) {
    count++;
}

661:デフォルトの名無しさん
08/03/25 11:28:05
スレの内容見ながら直したら解決できました。
出てたエラーは
error LNK2001: 外部シンボル ""int mov_i" (?mov_i@@3HA)" は未解決です。
でファイルの依存関係が間違っていたのが原因でした。

>>656-660
有難うございました。

>>657
申し訳ないです・・・以後気をつけます

662:デフォルトの名無しさん
08/03/26 04:03:10
Windows 限定の話題で申し訳ないんですが、FARPROC 型というのが何なのかよくわからないので質問させてください。
MSDN の CallWindowProc の項目を見ると、FARPROC 型は

 typedef int (FAR WINAPI *FARPROC)();

と宣言されているらしいんですが、WINAPI は __stdcall だから良いとして、FAR というのは何なんでしょうか?
MinGW だと FAR は省略されてるので、付けても付けなくても同じな気がするんですが、
とすると FARPROC=ただの関数ポインタと考えちゃって構わないんですか?

663:デフォルトの名無しさん
08/03/26 04:04:56
16bitアドレッシング時代の残骸だろ。無視して医院で内科医。

664:デフォルトの名無しさん
08/03/26 04:09:15
>>663
ありがとうございます。なんかMS-DOS時代はFARとかNEARとか使ってたらしいのでそういうことなんですかね。
Windows だとこういうマクロとか typedef がやたらと多くて変な所でやたら苦労させられます(;´Д`)

665:デフォルトの名無しさん
08/03/26 11:29:57
どこかに#define FARと定義されているから、
プリプロセスが終われば消えてなくなる。

666:デフォルトの名無しさん
08/03/26 19:20:32
いい時代になったもんだ。

667:デフォルトの名無しさん
08/04/01 23:30:29
コンストラクタを定義しようと思っているのですが
ClassA();
ClassA(int nSize);
と定義して、実体を書く時に

ClassA::ClassA(){
this->ClassA(1);
}

と言う具合に書きたいんですが
error C2273: '関数形式のキャスト' : '->' 演算子の右側で使用できません。
となって出来ません。
何とか、良い方法はありませんでしょうか?
ClassA(int nSize=1);
もあるとは思うのですが、指定した場合、もう少し細かくコードを書きたいのです。


668:デフォルトの名無しさん
08/04/01 23:35:07
ほかのコンストラクタを呼ぶことは今のところ不可能だから、
privateな初期化関数を作ってそれを呼ぶのが常套手段。

669:デフォルトの名無しさん
08/04/08 18:49:12
nanosleepの使用例はどこかにありませんか?

670:デフォルトの名無しさん
08/04/08 22:20:53
>>669
ありますが、何か。

671:デフォルトの名無しさん
08/04/08 22:24:11
nanosleepの使用例なんて腐るほどあるわよ。ネットは広大ね。

って少佐が言ってた

672:デフォルトの名無しさん
08/04/08 22:28:06
あんなの、man引けば使い方なんて一発だろうに。

673:デフォルトの名無しさん
08/04/09 04:07:45
うちのman nanosleepには使用例は載っていないな〜〜

674:デフォルトの名無しさん
08/04/09 06:39:06
手取り足取り教えて貰わないと書けないんですか?

675:デフォルトの名無しさん
08/04/09 07:04:28
URLリンク(www.google.co.jp)

676:デフォルトの名無しさん
08/04/09 08:05:20
Visual C++でnanosleepに当たるものを教えてください

677:デフォルトの名無しさん
08/04/09 08:59:32
Sleep()
指定する時間単位と精度の違いに注意。

678:デフォルトの名無しさん
08/04/09 13:21:59
質問。
URLリンク(www.be-interactive.org)
にあるアクションスクリプトをC++で書き直してみたいんだけど、
辞書データのクラス化と初期化をどうやったらいいのか
分からなくて困ってます。
typedef struct { int x,y; } POINT;
class Stroke { vector<POINT> points; };
class DictItem { vector<Stroke> strokes; };
class Dictionary { vector<DictItem> items; };
と定義してはみたものの、どうデータを流し込んで
やればいいんでしょうか?
もしくはもっと効率的なクラス定義の方法があれば
教えてください。

679:デフォルトの名無しさん
08/04/09 21:09:12
std::map使えばいいんじゃね

680:デフォルトの名無しさん
08/04/10 17:44:25
ダイナミックライブラリとスタティックライブラリの使い分けについて教えてください

681:デフォルトの名無しさん
08/04/10 21:40:05
>>680
C/C++の質問ではありませんのでスレ違いです。

682:デフォルトの名無しさん
08/04/16 02:44:04
ポインタで複数の配列の連続的に扱うことはできますか?

int *p
int A[3] , B[3], C[3];
(p+0) = A;
(p+3) = B;
(p+6) = C;



683:デフォルトの名無しさん
08/04/16 02:47:57
できません

684:デフォルトの名無しさん
08/04/16 13:52:33
そういうコンテナ/イテレータを書くのも勉強になりそうではあるな

685:デフォルトの名無しさん
08/04/17 02:20:38
>>682
unionで配列の位置を一纏めに固定すれば可能

686:回答者も下級なのか、このスレは
08/04/17 08:15:36
>>685
ほほぉ、unionでですか。具体例をどうぞ。

687:デフォルトの名無しさん
08/04/18 00:02:31
VisualC++2008でfopen_sやfopenしてもファイルを読み込んでくれません。
パスはあってるし、DOS窓で実行ファイルと読み込みたいファイルのあるディレクトリに移動してから実行してもダメでした。

fopen_s(&fp, "a.txt","r")
fp=fopen("a.txt","r")
という書き方で間違ってないと思うのですが…

原因としてはどんなことが考えられるんでしょうか?


688:デフォルトの名無しさん
08/04/18 00:31:47
もしかして:
a.txt.txt

689:デフォルトの名無しさん
08/04/18 22:58:27
もしかして:
VisualC++2008 【Express Edition】

690:デフォルトの名無しさん
08/04/19 00:02:10
>>682

int p[9];
int* A=p+0, *B=p+3, *C=p+6;
A[0]=(以下略

じゃだめなん?

691:デフォルトの名無しさん
08/04/19 00:25:14
>>689
そうです

692:デフォルトの名無しさん
08/04/20 02:54:00
>>686
union {
struct {
int A[3],B[3],C[3];
};
int D[9];
} Array;

int *p = &( Array.A[0] );

こんな風に

693:デフォルトの名無しさん
08/04/22 11:59:19
intじゃなかったら使えないな

694:デフォルトの名無しさん
08/04/22 17:51:28
10進数を2進数に変換する方法教えてください

695:デフォルトの名無しさん
08/04/22 17:57:29
2で割って少数以下切捨て、その時の余りをならべる。を繰り返す。

696:デフォルトの名無しさん
08/04/22 18:16:54
以下を実行して
a:0x8049e80 0x8049e80 0x8049e80
A:0x8049e80 0x8049e80 0x8049e80
11 12 13
4 5 6
0 0 0
のようになることを期待していますが11 12 13が1 2 3のままです。どのようにしたらよいか教えていただけると幸いです。
struct data{
double x[3],p[3],q,rm;
};
class Func{
public:
void func1(struct data []);
};
class SubFunc{
public:
void subfunc1(struct data []);
};
続く

697:デフォルトの名無しさん
08/04/22 18:17:29
続きです
int main(void)
{
static data P[3];
Func FC;
FC.func1(P);
for(int i=0;i<3;i++){
cout << P[i].x[0] <<" "<< P[i].x[1] <<" "<< P[i].x[2] << endl;
}
return 0;
}
void Func::func1(struct data A[]){
SubFunc SFC;
SFC.subfunc1(A);
A[0].x[0]=1.0;
A[0].x[1]=2.0;
A[0].x[2]=3.0;
cout <<"A:"<< &A[0].x[0] <<" "<< &A[0].x[0] <<" "<< &A[0].x[0] << endl;
}
void SubFunc::subfunc1(struct data a[]){
a[0].x[0]=11.0;
a[0].x[1]=12.0;
a[0].x[2]=13.0;
cout <<"a:"<< &a[0].x[0] <<" "<< &a[0].x[0] <<" "<< &a[0].x[0] << endl;
a[1].x[0]=4.0;
a[1].x[1]=5.0;
a[1].x[2]=6.0;
}


698:デフォルトの名無しさん
08/04/22 18:27:36
char a[] = "100";

って書くと これどういう意味になるの?

699:デフォルトの名無しさん
08/04/22 18:29:01
>>698
a[0]='1' a[1]='0' a[2]='0' a[3]='\0'

700:デフォルトの名無しさん
08/04/22 18:34:43
>>699
さんきゅ!

701:デフォルトの名無しさん
08/04/22 18:36:19
>>696
SFC.subfunc1(A); 
A[0].x[0]=1.0; 
A[0].x[1]=2.0; 
A[0].x[2]=3.0; 

SFC.subfunc1()呼んで11 12 13入れても、その後上書きしてるじゃん



702:デフォルトの名無しさん
08/04/22 18:55:07
>>701
おっしゃるとおりです。ありがとうございました。

703:デフォルトの名無しさん
08/04/23 01:03:54
コンパイラとリンカのバージョンってどうやって調べるか分かりますか?
ちなみに、使っている環境(って言うのかな?)はCPad for Borland C++Compilerってやつです
あんまり難しい専門用語は分からないんで、初級者でもわかるように教えてくれるとうれしいです

704:デフォルトの名無しさん
08/04/23 01:07:11
無料版の BCC のバージョンは 5.5 しか存在しない。

705:デフォルトの名無しさん
08/04/23 01:34:27
>>704
それはリンカのこと?それともコンパイラのことですか?
超下級者だから全然わからん

706:デフォルトの名無しさん
08/04/23 01:35:44
ちっとも保守される様子がないbccなんかそろそろやめて
mingwやvcのexpress editionにすればいいのに。

707:デフォルトの名無しさん
08/04/23 01:39:43
-v

708:デフォルトの名無しさん
08/04/23 02:19:31
>>704
修正版の5.5.1がある。

709:デフォルトの名無しさん
08/04/24 10:33:03
>>694-695
整数は割っても少数にならないし、小数は扱いにくいから
↓のを繰り返す。

x % 2 //2進数の一桁目がこれででる。
x /= 2 //一桁目を取り出したらずらす。



710:デフォルトの名無しさん
08/04/24 10:47:35
x & 1
x =>> 1

711:デフォルトの名無しさん
08/04/24 15:42:59
1, 2, 4, 8, 16, 32, ... とビット数の数だけ論理和とればいいだけじゃん

712:デフォルトの名無しさん
08/04/24 15:57:14

ごめん。
>>709はマイナスのとき使えな・・くもないか。


713:デフォルトの名無しさん
08/04/24 21:56:29
まず10進数の定義からだな。


714:デフォルトの名無しさん
08/04/24 23:44:04
定義厨もここまできたか

715:デフォルトの名無しさん
08/04/25 09:16:09
パックドBCDかもしれんし、ASCZかもしれん。

716:デフォルトの名無しさん
08/05/06 17:33:03
#include <stdio.h>
struct histgram{
int x;
int y[100];
};
void one(struct histgram *hist);
void two(struct histgram *hist);
int main (void){
struct histgram hist[1] ;
int z;
hist->x = 0;
for(z=0;z<100;z++){
hist->y[z]=0;
}
printf("before***%d***%d***%d***",hist->x,hist->y[0],hist->y[50]);
one(hist);
printf("before***%s***%s***%s***",hist->x,hist->y[0],hist->y[50]);
for(z=0;z<9999999999;z++);
return 0;
}
void one(struct histgram *hist)
{
two(hist);
}
void two(struct histgram *hist)
{
int z;
hist->x = 1;
for(z=0;z<100;z++){
hist->y[z]=1;}}
これで実行するとメモリのエラーが出るんですが、どうすれば解決するでしょうか


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

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