[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 01/29 10:31 / Filesize : 249 KB / Number-of Response : 964
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

はきだめC/C++下級者の質問箱 2



1 名前:デフォルトの名無しさん [2006/08/22(火) 09:21:31 ]
はきだめのスレへようこそ

ここは、C/C++に挫折し、それにもかかわらず、C/C++やらなければならない者達がたむろするスレです。
なお、質問する人は回答はあまり期待しないでください。


前スレ:はきだめC/C++下級者の質問箱
pc8.2ch.net/test/read.cgi/tech/1124256027/

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

undefined reference to ****

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

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

 #ifdef __cplusplus
 extern "C" {
 #endif

最後に

 #ifdef __cplusplus
 }
 #endif

を入れる。

479 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 13:20:52 ]
1. g の地点で scanf が失敗
2. a には何も入らないため、変数に最初に入ったゴミにより default が選択される
3. others と出力される
4. 1 に戻る

この無限ループ

481 名前:477 mailto:sage [2007/06/07(木) 13:22:09 ]
なるほど、うまくいきました。ありがとうございます。

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

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

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


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

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

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



486 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 15:59:10 ]
破棄そのものは内容書き換えないからな

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

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

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

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

488 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 17:36:12 ]
そんな気持ち悪いことはしないでくださいとしかなあ。

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

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

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

490 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 09:48:11 ]
何を入れたらどう化けたんだよ

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


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

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

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

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


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



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

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

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

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

500 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 12:18:09 ]
>>498
してませんでした。
やってみます

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

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

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

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

505 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 01:35:08 ]
>>505
うん。もちろん z もね。

508 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 01:37:23 ]
>>507
ありがとうございます!!


509 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 01:38:42 ]
>>506 B

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


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


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

513 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 02:14:45 ]
いや普通ダウンキャストだろ

514 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 02:25:11 ]
static_cast でダウンキャストするわけですが何か?

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



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

プロパティ

あとはお好きにドゾー

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

518 名前:デフォルトの名無しさん [2007/07/11(水) 08:55:39 ]
さいです

519 名前:デフォルトの名無しさん mailto:sage [2007/07/12(木) 02:28:20 ]
>>517
あー説明不足ですまん。

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

520 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん [2007/07/15(日) 21:09:48 ]
for(i=0; N; i++){
・・・



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

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

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

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

525 名前:デフォルトの名無しさん mailto:sage [2007/07/15(日) 23:02:52 ]
>>520
wchar_t 使えば?



526 名前:デフォルトの名無しさん mailto:sage [2007/07/16(月) 00:43:59 ]
wchar_t じゃ解決にならんと思うのだが。

527 名前:デフォルトの名無しさん mailto:sage [2007/07/16(月) 00:58:23 ]
>>526
何か問題あるの?

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

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


530 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/07/16(月) 02:22:10 ]
L"" で初期化すれば変換なんて要らないんじゃないの?

532 名前:デフォルトの名無しさん mailto:sage [2007/07/16(月) 02:29:58 ]
wchar_t は2バイトだったり4バイトだったりするからな・・・

533 名前:520 mailto:sage [2007/07/16(月) 14:26:31 ]

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

534 名前:デフォルトの名無しさん mailto:sage [2007/07/19(木) 01:28:47 ]
int x;
std::cin >> x;

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


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



536 名前:デフォルトの名無しさん mailto:sage [2007/07/19(木) 21:54:41 ]
その方法がわかりません・・・・・

537 名前:デフォルトの名無しさん mailto:sage [2007/07/19(木) 22:57:53 ]
一旦、文字列として読み込めばいい。

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

539 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 04:07:14 ]
>>534
fail したら clear してから string へ読み捨てれば

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


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

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

544 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 06:29:53 ]
人はそれを電卓と呼ぶ。

545 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 06:57:01 ]
cin.ignore 使えば



546 名前:デフォルトの名無しさん mailto:sage [2007/07/21(土) 19:06:59 ]
ttp://www.kk19.net/new_microsoft_keyboard.jpg

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

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


548 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 19:36:32 ]
同時に全部押すことにしか使わないのさw

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

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

551 名前:デフォルトの名無しさん mailto:sage [2007/07/29(日) 21:52:37 ]
ニッポンランゲージでOK

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


553 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 14:08:55 ]
参照渡しなら問題ない。

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

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

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



556 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 12:05:33 ]
謝罪を賠償しるニダ

557 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 02:10:49 ]
>>553
ありがとう

>>554
なるほど

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

558 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 02:28:35 ]
恥ずかしい

559 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 11:49:12 ]
迷ったらconst参照でいいよ。

560 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 00:05:15 ]
なんとかならないっすね

562 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 00:14:43 ]
ええーーーやだやだ
ちょっとちょっとそんなぁ

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

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

564 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 00:39:25 ]
そうなのか

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

565 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 00:48:04 ]
通報しました



566 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 00:55:34 ]
>>560
これでいいんじゃね?

typedef struct __blockData BlockData;

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

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

568 名前:566 mailto:sage [2007/09/25(火) 01:08:52 ]
あ、最後に余計な BlockData がついてた。ごめん。

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

569 名前:デフォルトの名無しさん [2007/09/25(火) 01:13:22 ]
うへー

570 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 01:17:52 ]
void *next;

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

571 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 01:18:50 ]
uint_ptrと
void *

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

572 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 01:26:04 ]
大文字じゃなくて小文字なの?あんま見覚えが無い・・・

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

573 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 04:52:14 ]
a |= b

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


574 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 08:13:47 ]
>>573
a = a | b

575 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 09:29:14 ]
>>572
UINT_PTRはC99のuintptr_t相当。



576 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 23:18:36 ]
>>571
int と voidの使い分けは?


577 名前:デフォルトの名無しさん [2007/10/18(木) 01:34:33 ]
あげあげ






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<249KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef