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


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

C/C++小心者スレッドPart1



1 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 06:18:18 ]
プログラミング言語C/C++についての、小心者向けスレです。質問・要望・雑談などどうぞ。
関連スレやURLは>>2以降。

■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
 ・ぐぐる
 ・マニュアルで探す 
 ・FAQを読む 例えば www.bohyoh.com/CandCPP/FAQ/index.html
質問には以下を書くこと。へたくそな質問は再提出を要求される。
 ・詳しい内容(「動きません」「うまくできません」では回答しようがない)
 ・エラーメッセージ(なるべくそのままで)
 ・実行環境(OS名、コンパイラ名)
 ・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。

■回答する人へ 
相手は小心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって小心者スレだもん)。
 ・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。


宗教的な話題は禁止します。


562 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 03:26:17 ]
>>560
UTF-8を単なるバイト列と見なして入力・処理・出力するだけなら、
単なるバイナリデータと同じchar型で扱って何の問題もない。
そのデータ中に'\0'が現れなければ、strlenやstrcpyはうまく動く。
普段使っているマルチバイト文字と改行の扱いが同じならテキストモードでのファイル読み書きもうまくいく。
ここまでlocaleの出番無し。

もちろん、この状態を「本当に使える」と言わないと主張するならそれに賛成するよ。

563 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 04:07:31 ]
>>562
UTF-8はASCII互換部分があるからそういうことができるのかな。
いまいちこの辺はよくわからんです*_*

564 名前:デフォルトの名無しさん mailto:sage [2009/11/22(日) 10:05:16 ]
UTF-8は外部インターフェース用と考えた方が良い
直接文字列操作するなんて考えたくない

565 名前:デフォルトの名無しさん [2009/11/23(月) 15:09:23 ]
C言語の質問です。

C言語の基本はとりあえず理解したのですが、実際に自分でプログラムを組もうとした時
はて、真っ黒コンソールで走る、組んでて楽しいプログラムって何だ?と、困っています。

そこで、こんなコンソールのプログラムなら、作ってて面白いし、勉強にもなるんじゃ?といった案をお教えください。
ちなみに、基本情報処理者の資格を一応持っているので、多少のシステム関係の知識はあります。

プログラミング環境は、
・Borland C++ Compiler 5.5.1
・Microsoft Visula Stdio 2005
の二つあります。

どうぞお願いします

566 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 15:13:31 ]
いや別にコンソール使わなくてもいいと思うけど

567 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 15:19:55 ]
オセロ

568 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 15:29:16 ]
ウィンドウ出す方法でも勉強したらいいんじゃね

569 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 16:58:24 ]
>>564
ハァ?

570 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 20:47:18 ]
>>569
俺も>>564は普通に当然だと思うが



571 名前:デフォルトの名無しさん mailto:sage [2009/11/23(月) 21:21:03 ]
>>565
テトリスなら2, 30分ぐらいで作れて遊べるから楽しいんじゃない?
昔、流行った頃は電卓に搭載されたぐらいシンプルなものだし

572 名前:565 mailto:sage [2009/11/23(月) 21:50:09 ]
>>566
おぉそうですか。Winプログラムじゃ、"Hello, world"で挫折すると聞いていたもので・・・
窓だと、どのようなプログラムがよいか、よろしければお教えくださいm(_ _)m

>>567
なるほど!いいですね
次の手を思考ルーチンを、自分で考えてみるってのも、楽しいかもしれませんね!
ありがとうございました

>>568
ぐ、やはりWindowsプログラミングですかね、
とりあえずこのソースを打ち込め!的なページを見てみます

>570
テトリスですか!いいですね、、、
mainをぐるぐる回して、関数の戻り値を確認すれば出来るのだろうか…やってみます!
ありがとうございました

573 名前:デフォルトの名無しさん [2009/11/24(火) 00:20:57 ]
CとC++の違いをお願いします。
また、
www.amazon.co.jp/gp/product/4797349816/ref=s9_simz_gw_s0_p14_i1?pf_rd_m=AN1VRQENFRJN5&pf_rd_s=center-1&pf_rd_r=0X37K4K5C7P745SGFKF4&pf_rd_t=101&pf_rd_p=463376736&pf_rd_i=489986
この本はCではなくC++を扱ってるように思うのですが、どうなのでしょうか

574 名前:デフォルトの名無しさん mailto:sage [2009/11/25(水) 00:50:20 ]
どうみてもC
VC++はCも扱える

575 名前:デフォルトの名無しさん mailto:sage [2009/11/25(水) 02:04:41 ]
どう見てもC


初心者の俺がもってるイメージとしては

c = 関数関数関数関数
cpp = c + クラス他

576 名前:デフォルトの名無しさん mailto:sage [2009/11/25(水) 02:07:32 ]
言語仕様としては間違ってなくもないけど
実際のコーディングがまったく違うよ。

577 名前:デフォルトの名無しさん mailto:sage [2009/11/25(水) 19:49:14 ]
C++を有る程度使えるようになってから
このまえCだけで全部つくる必要がでたときすごくとまどったな

なんつっても文字列操作が…

578 名前:デフォルトの名無しさん mailto:sage [2009/11/25(水) 23:00:39 ]
いつかC++のクラスやSTLが突然使えなくなる日が来るんじゃないかと思ふことがある

579 名前:デフォルトの名無しさん mailto:sage [2009/11/28(土) 00:24:14 ]
〜ヘッダ〜
class BBB;
class AAA{
  BBB *processor;
  void do();
}
〜ソース〜
AAA::do(){
  BBB &processor = *(this->processor);
  processor.execute();
}

プログラミングの出来る友達のソースを見たらこのような記述がありました。
このようにするメリットって何があるのですか?
友達にも聞いたのですが、いまいち理解できませんでした。

580 名前:デフォルトの名無しさん mailto:sage [2009/11/28(土) 03:24:18 ]
いわゆるpimplだな。
他のソースからそのヘッダだけインクルードしてAAAを使いたい場合に有効。

AAAのインスタンスを生成するには、AAAのメンバ変数のサイズが全部確定してないと
ならない。プライベートメンバでも何でも。
でも、ヘッダにAAAのプライベートメンバ変数まで全部書くようにしてると糞ソースに
なる。
だから、BBBを名前だけ宣言しといて、AAAのメンバ変数に「BBBへのポインタ」を
置く。ポインタなら中身が分からなくてもサイズは確定するから。
で、プライベートな実装は全部BBBの中に突っ込んで、AAAはBBBに丸投げする。



581 名前:デフォルトの名無しさん [2009/11/29(日) 05:28:36 ]
下のプログラムで、なぜかswitchのところでひっかかってしまいます。原因は何でしょうか。
プログラムの内容はsuujiに乱数を入れ、その乱数が〜なら○○を出力する、というものです。

int suuji;
suuji = rand() % 5 ;
printf("\n\n\n\nテストプログラム1\n");
switch (suuji)
{
case '0' :
printf("\nCASE 0");
break;
case '1' :
printf("\nCASE 1");
break;
case '2' :
printf("\nCASE 2");
break;
case '3' :
printf("\nCASE 3");
break;
case '4' :
printf("\nCASE 4");
break;
}
return 0;

582 名前:581 [2009/11/29(日) 05:30:54 ]
頭にくる
int main(void)
がぬけてました。

また、ひっかかるというのは表示されないということです

583 名前:デフォルトの名無しさん mailto:sage [2009/11/29(日) 06:40:40 ]
suuji = rand() % 5 + 0x30;

これで^^

584 名前:デフォルトの名無しさん mailto:sage [2009/11/29(日) 08:38:50 ]
やべえ俺>>583を見てもなお引っかかっちまった
文字'0'(ASCIIコード0x30)と比較してるのか

585 名前:デフォルトの名無しさん mailto:sage [2009/11/29(日) 14:14:52 ]
if(1){****}
とあった場合、
まともな(有名どころのg++とかVCとか)コンパイラなら
if(1)という無駄なオーバーヘッドは消してくれると期待できますか?
あるいはif(0)も同じく最適化してくれますかね?

586 名前:585 [2009/11/29(日) 14:22:33 ]
#include <iostream>

const int num = 1;

int main()
{
if(num){std::cout << "num" << std::endl;}
if(!num){std::cout << "!num" << std::endl;}

return 0;
}
これがg++ (最適化-O1) でasmファイルが同じになりました。
他のコンパイラでも期待して良い物なのでしょうか?


587 名前:デフォルトの名無しさん mailto:sage [2009/11/29(日) 18:11:43 ]
よほど特殊な狂った(または単純に超絶バカな)コンパイラでなければ、最適化を
切ったりしない限りは当たり前のように消える

588 名前:デフォルトの名無しさん mailto:sage [2009/11/29(日) 18:32:50 ]
>>587
ありがとうございます。


589 名前:デフォルトの名無しさん [2009/11/29(日) 19:33:54 ]
C++のクラス&構造体に関する質問です。

構造体を静的メンバとして定義するには、どうしたらいいのでしょうか。
以下のようなコードで、int型の数値をstruct型にまとめたいのです。


class Perception {
public:
   static int trackingPointX;
   static int trackingPointX;
}
int Perception::trackingPointX = 0;
int Perception::trackingPointY = 0;

int main() {
   printf("%d", Perception::trackingPointX);
   return 0;
}


いろいろと検索・試作してみましたが、実装方法が分かりませんでした。
よろしくお願いします。

590 名前:デフォルトの名無しさん mailto:sage [2009/11/29(日) 19:44:36 ]
>>589
よくわからんな。
そのコードのどこが気に入らないの?



591 名前:デフォルトの名無しさん mailto:sage [2009/11/29(日) 19:49:13 ]
struct Perception
{
  static int trackingPointX;
  static int trackingPointY;
};

592 名前:589 [2009/11/29(日) 19:51:37 ]
>>590
printf("%d", Perception::trackingPoint0.x);
printf("%d", Perception::trackingPoint1.x);
printf("%d", Perception::trackingPoint2.x);
・・・という風にしたいんです。

593 名前:デフォルトの名無しさん mailto:sage [2009/11/29(日) 19:56:42 ]
#include <stdio.h>

struct _Perception
{
  struct Point{ int x; int y; };

  Point trackingPoint0;
  Point trackingPoint1;
  Point trackingPoint2;
};

_Perception Perception;

int main()
{
  printf("%d", Perception.trackingPoint0.x);
  /* ...*/
  return 0;
}

594 名前:589 mailto:sage [2009/11/29(日) 20:22:19 ]
>>593
構造体をクラス変数として使いたいなら、メンバ変数として定義した上で
あらかじめクラスを作っておく方法しかないんですかね・・・。

595 名前:デフォルトの名無しさん mailto:sage [2009/11/29(日) 20:28:31 ]
>>594
クラスインスタンス作るのが気に入らないなら 593 のメンバ変数に static つければいいだろうが。

>>593 要らんところで予約名使うなよ。

596 名前:589 mailto:sage [2009/11/29(日) 20:38:31 ]
>>595さんの方法も試してみます。ありがとうございます。
とりあえずは以下の方法で実装できました。(言われてみれば当たり前かも・・・汗)


struct TrackingPoint { int x; int y; };

class Perception {
public:
   static TrackingPoint trackingPoint0;
   static TrackingPoint trackingPoint1;
   static TrackingPoint trackingPoint2;
};
TrackingPoint Perception::trackingPoint0 = {0, 0};
TrackingPoint Perception::trackingPoint1 = {1, 1};
TrackingPoint Perception::trackingPoint2 = {2, 2};

int main() {
   printf("%d", Perception::trackingPoint0.x);
   printf("%d", Perception::trackingPoint1.x);
   printf("%d", Perception::trackingPoint2.x);
   return 0;
}

597 名前:デフォルトの名無しさん mailto:sage [2009/12/02(水) 00:53:41 ]
MFCを使ったサンプルプログラムを実行したいのですが、
.NET 2008だと有料版を買うしか無いのですよね・・・?

598 名前:デフォルトの名無しさん mailto:sage [2009/12/02(水) 01:28:33 ]
>>597
「.NET 2008」って、「Visual Studio .NET か Visual Studio 2008」ってこと?
まあ、そうだね。MFCを無料で入手する手段はないと思うよ。

ちょっと試すぐらいなら、現在無料で配布中の VS 2010 懼ァイ22でいけるか
もしれない。


599 名前:デフォルトの名無しさん mailto:sage [2009/12/02(水) 04:05:07 ]
>>598
説明が足りなくてすいません
Visual Stadio .NET Express EditionでMFCを使用したサンプルプログラムの動きを見たかったのです
VS2010なら、動作してくれるのかな?
ちょっとダウンロードして実行してみます

600 名前:デフォルトの名無しさん mailto:sage [2009/12/02(水) 10:03:55 ]
1回動けばいいだけなら評価版をダウンロードすればいいだけだな



601 名前:デフォルトの名無しさん [2009/12/07(月) 21:57:33 ]
a、b、cの3つのint型にそれぞれ8bit(01001110のようなもの)のデータをくっつけたいのですが、どうすればよいでしょうか。
つまり、aに5、bに3、cに8というデータがあったら、新しいint型のdに538というように
ひとつの24bitのデータにしたいのです。

なにか良い手段がありましたら、お願いします。

602 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 23:27:47 ]
>>601
a、b、cを左に8回シフトして0xffffff00(32bitの場合)とANDを取り
次に8bitデータとORを取る

603 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 23:28:31 ]
あっごめん24ビットデータか

じゃあ0xffff00とANDを取って

604 名前:デフォルトの名無しさん mailto:sage [2009/12/08(火) 01:14:20 ]
>>601
> つまり、aに5、bに3、cに8というデータがあったら、新しいint型のdに538というように

これ、 4 ビットずつ 3 つで 12 ビットのデータにしてね?

605 名前:デフォルトの名無しさん mailto:sage [2009/12/08(火) 01:27:26 ]
>>604


606 名前:デフォルトの名無しさん mailto:sage [2009/12/08(火) 04:37:51 ]
>>601
1行目と2行目以降が同じ意味に聞こえないんだけど、もしかしてこういうこと?

int d = ((a & 0xff) << 16) | ((b & 0xff) << 8) | (c & 0xff);

607 名前:デフォルトの名無しさん mailto:sage [2009/12/08(火) 07:44:40 ]
visual C++ 2008 Express Edition でシンプルなソフトを作ってみました。
そこで質問があるのですが、もし分かる人いたら教えてください。

@実行ファイルにアイコンをつけたいんですが、プロジェクトファイルを作成してしまった後でも、
アイコンをつける方法はあるのでしょうか。
(アイコンの絵柄のきれいさはあまりこだわりませんが、せっかくなんでアイコン作ってみたくて)

ARelease環境で作成されたフォルダをみると
プログラムの中で使う画像ファイルがなぜかないので手作業でフォルダに追加しないといけなかったり、
作成されたフォルダの中にexeファイル以外のファイルが8つぐらいあったりしてごちゃごちゃするので、
最終的に作成するファイルをexeファイルだけにする方法はないでしょうか?

608 名前:デフォルトの名無しさん mailto:sage [2009/12/08(火) 12:46:29 ]
昔はリソーススクリプトをごりごりしていたけど(VC++ 6.0)
いまはXMLになっている気がする(VS 2003頃からか)

とりあえず、スレ違い
Visual Studio 2008 Part 19
pc12.2ch.net/test/read.cgi/tech/1259076828/

609 名前:デフォルトの名無しさん mailto:sage [2009/12/08(火) 14:11:26 ]
>>607
>最終的に作成するファイルをexeファイルだけにする方法はないでしょうか?
ビルド後のイベントに消すコマンドを書けばよいがそんなことは普通しない。
分割コンパイルの意味がなくなる。

610 名前:デフォルトの名無しさん mailto:sage [2009/12/08(火) 20:40:37 ]
>>601が真にやりたいことが理解できてなくて
説明がうまいこといってないのか
俺の読解力がないのかが判断つかねえ



611 名前:デフォルトの名無しさん mailto:sage [2009/12/08(火) 21:29:28 ]
R=5 G=3 B=8から、RGB値の#538が欲しい、だと解釈したので>>606でいいと思ってる

612 名前:デフォルトの名無しさん mailto:sage [2009/12/08(火) 21:41:17 ]
サンプルのdが0x538だったら惑うことも無かったろう

613 名前:612 mailto:sage [2009/12/08(火) 21:42:19 ]
8bitの合成で24bitだから正しくは0x050308か

614 名前:デフォルトの名無しさん mailto:sage [2009/12/11(金) 12:49:28 ]
>>601
今の人はビットフィールドって知らないのか?

615 名前:デフォルトの名無しさん mailto:sage [2009/12/11(金) 12:51:22 ]
はぁ?

616 名前:デフォルトの名無しさん mailto:sage [2009/12/11(金) 12:58:29 ]
>>610
1行目と2行目の関連がまるで見えないので説明の問題だと思う

617 名前:デフォルトの名無しさん mailto:sage [2009/12/11(金) 13:00:10 ]
>>614
もし、8ビット毎の合成だったらunionだけでOKだな

618 名前:デフォルトの名無しさん mailto:sage [2009/12/11(金) 16:24:01 ]
C++/CLIってググっても情報少ないんだけど、
あまり使われていないのでしょうか?

619 名前:デフォルトの名無しさん mailto:sage [2009/12/11(金) 16:31:41 ]
えぇ、使われてません。
C++のルールからあまりに外れまくっている上に
C#より面倒なくせにやれることはC#未満という有様なので。

用途がすごく限られます。

620 名前:デフォルトの名無しさん mailto:sage [2009/12/11(金) 16:45:58 ]
>>618
殆どはC#とC++の情報を読み替えるだけで賄える



621 名前:デフォルトの名無しさん [2009/12/12(土) 10:38:17 ]
aとbというunsigned long型で、
aとbの差が±30以上ならint型cに1を入れる、というプログラムを作成したいのですが、
なにかいい方法はありませんか?

622 名前:デフォルトの名無しさん mailto:sage [2009/12/12(土) 10:42:36 ]
普通に引き算の結果を比較するんじゃダメなの?

623 名前:デフォルトの名無しさん mailto:sage [2009/12/12(土) 10:43:50 ]
>>621
どうやったらダメだったのかとか自分の案くらい書けば?

624 名前:デフォルトの名無しさん mailto:sage [2009/12/12(土) 10:44:31 ]
unsigned じゃ引き算の結果のマイナスは表現できないから困るだろ

625 名前:デフォルトの名無しさん mailto:sage [2009/12/12(土) 10:51:25 ]
int main(){
unsigned long a = 39.5;
unsigned long b = 6.4;
unsigned long d;
if(a>b){
d = a-b;
}else{
d = b-a;
}
int c = 0;
if(d>30){
c= 1;
}
cout << c << endl;
}

626 名前:デフォルトの名無しさん mailto:sage [2009/12/12(土) 10:51:25 ]
絶対値とりゃいい

627 名前:デフォルトの名無しさん mailto:sage [2009/12/12(土) 11:49:49 ]
if (a >= b + 30 || b >= a + 30) {
c = 1;
}

628 名前:デフォルトの名無しさん mailto:sage [2009/12/12(土) 11:53:10 ]
最大値付近だとまずくない?

629 名前:デフォルトの名無しさん mailto:sage [2009/12/12(土) 12:15:02 ]
まずかった
なんか綺麗に書けないかなと思ったけど難しかった

630 名前:デフォルトの名無しさん mailto:sage [2009/12/12(土) 12:34:01 ]
if (abs(a-b) > 30) c = 1;



631 名前:デフォルトの名無しさん mailto:sage [2009/12/12(土) 12:34:58 ]
「30以上」

632 名前:デフォルトの名無しさん mailto:sage [2009/12/12(土) 12:42:20 ]
abs()の引数はintじゃねーの?

633 名前:デフォルトの名無しさん mailto:sage [2009/12/12(土) 13:28:53 ]
unsigned longのままでやりたいなら
c = (a > b ? a - b : b - a) > 30 ? 1 : c;


634 名前:デフォルトの名無しさん [2009/12/12(土) 15:08:18 ]
横からスマソ

int型のif文で、
if (x <= -50)
みたいにできなかったっけ?

635 名前:デフォルトの名無しさん mailto:sage [2009/12/12(土) 15:16:04 ]
>>634
出来るが、一体どうしたね

636 名前:デフォルトの名無しさん [2009/12/12(土) 15:21:43 ]
いや、int型のほうは負も扱えたよなと思って

637 名前:デフォルトの名無しさん mailto:sage [2009/12/12(土) 15:22:29 ]
>>636
今更なにを。。。

どの言語を普段お使いの方ですか?


638 名前:デフォルトの名無しさん [2009/12/12(土) 18:59:13 ]
ここ数年、開発部門から離れてCとかC++も触れる機会が無かったからさ

そろそろ戻れるって聞いて、必死で覚えなおしてる

639 名前:デフォルトの名無しさん mailto:sage [2009/12/12(土) 19:01:58 ]
×戻れる
○戻される

640 名前:デフォルトの名無しさん mailto:sage [2009/12/12(土) 19:14:33 ]
>>1
なんで宗教的な話は禁止とか書いてあんの?
プログラムと宗教って何か関係性でもあったの?
普通に考えたらプログラム板なんだから宗教の話なんてスレチのイタチだってのに
わざわざ書くってことは何か理由がってのこと?



641 名前:デフォルトの名無しさん mailto:sage [2009/12/12(土) 19:51:37 ]
はい

642 名前:デフォルトの名無しさん mailto:sage [2009/12/12(土) 20:37:59 ]
>>640
vimとemacsのどちらがよりC++コーディングに適しているのか教えてください

643 名前:デフォルトの名無しさん mailto:sage [2009/12/12(土) 21:20:01 ]
以下のコードのように文字列定数の先頭アドレスを返して
関数呼び出し元で利用するのは問題ないでしょうか。
手元の環境(gcc 4.4.0)では"abc"と表示されました。

#include <stdio.h>

char *func() {
return "abc";
}

int main(void) {
puts(func());
return 0;
}


644 名前:デフォルトの名無しさん mailto:sage [2009/12/12(土) 21:41:40 ]
>>643
定数は問題ない

645 名前:デフォルトの名無しさん mailto:sage [2009/12/12(土) 21:58:57 ]
問題ないけど戻り値の型はconst chara*のほうがいいと思う

646 名前:643 mailto:sage [2009/12/12(土) 22:46:26 ]
ありがとうございます。

647 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 04:59:03 ]
>>642
それはエディタ論争だから鼬害

648 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 10:14:46 ]
>>647
バカ発見www
単に彼は「宗教的な話は禁止」の例えで出したんだろjk


649 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 10:20:43 ]
この板における「宗教」の意味を理解してないか、わざと理解してないふりをしてるアホには、
何を言っても無駄だろう。

650 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 11:21:40 ]
viにしろ!!!!



651 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 13:22:13 ]
神は量子クラスを継承して光子オブジェクトを作られたわけだが
それ以前から原子クラスを継承した水素オブジェクトは存在したのだな

652 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 13:33:22 ]
>>651
いや存在してないと思うぜ。逆じゃねぇのか?

あと、テンプレートの特殊化の方が近いと思うんだぜ。
template<double spin, double Mass, double Electric charge, 俺の知らない要素>
class SubatomicParticle;


653 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 13:48:26 ]
逆というか、skyとgroundクラスをまず最初に作って
そのとき一緒にwaterクラスも実装したらしい

654 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 15:26:49 ]
宗教的な話題は禁止します。

655 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 15:33:52 ]
リアル宗教ktkr

656 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 17:01:10 ]
C#信者だけど質問してもいい?

657 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 17:31:08 ]
どうぞ

658 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 17:40:34 ]
どうぞじゃねぇよ

スレ違いだろ


659 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 18:00:32 ]
C#信者だけど(C/C++の)質問してもいい?

660 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 18:08:40 ]
>>659
ダメ
改宗してからおいでなさい。



661 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 18:15:40 ]
C/C++/C# は宗教だったのか

662 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 18:26:25 ]
そうです!!

663 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 20:14:15 ]
すみませんがどうすればいいか教えてください。
下記のコードのcuetarget=cue_parse_file(fp);までは実行に成功するのですが、cd_dump(cuetarget);以降が実行されず、実行が止まってしまいます。

#include "C:/libcue-1.3.0/bin/cd.h" #include "C:/libcue-1.3.0/bin/cdtext.h" #include "C:/libcue-1.3.0/bin/cue_parser.h" #include "C:/libcue-1.3.0/bin/libcue.h" #include "C:/libcue-1.3.0/bin/rem.h" #include "C:/libcue-1.3.0/bin/time.h"
int main(int argc, char** argv) {
FILE *fp; /*ファイルポインタの宣言 */
Cd *cuetarget;
/* ファイルのオープン */
if ((fp = fopen("S:/CDImage.cue", "r")) == NULL) {
printf("file open error!!\n");
exit(EXIT_FAILURE); /*エラーの場合は異常終了する */
}else{
cuetarget=cue_parse_file(fp);
if (cuetarget=NULL){
exit(EXIT_FAILURE); /*エラーの場合は異常終了する */
}else{
cd_dump(cuetarget);
}
}
fclose(fp); /*ファイルのクローズ */
return (EXIT_SUCCESS);

・エラーメッセージ
特になし。

・実行環境
OS:WindowsXP コンパイラ:MingW IDE:NetBeans6.0.1 使用したライブラリ:libcue-1.3.0( ttp://sourceforge.jp/projects/sfnet_libcue/ )

・最終的にやりたいこと
Cueシートの全てのトラックの、トラック名、アーティスト名などの属性を、別に用意したファイルの内容で自動的に置き換える。
(そのためにCueシートの解析用ライブラリをDLしてきた。)


664 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 20:18:23 ]
とりあえず、PATHを通しとけ
CUEファイルに原因があるかもしれないから
CUEをどこかにあげてみて

665 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 20:44:05 ]
>>664
PATHは通してあります。
CUEはこれです。
ttp://www1.axfc.net/uploader/Sc/so/63656

666 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 21:19:00 ]
>>663
この辺があやしい

if (cuetarget=NULL){ 



667 名前:663 mailto:sage [2009/12/13(日) 21:27:17 ]
解決しました。ありがとうございます。我ながら何をやっているのか…。

668 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 20:10:06 ]
定数を左辺値にしないから・・・・・

669 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 20:27:02 ]
いまどきのコンパイルなら警告出るだろ

670 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 22:50:01 ]
脳内警告が常に出ます



671 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 10:07:23 ]
>>668
左辺値の意味わかってないだろ。
まあどっちにしても定数を左に置くやつは信用できないけどな。

672 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 10:30:07 ]
>>671
右の間違いだろ

673 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 10:44:07 ]
プログラムの意味的にそうするのが自然であればそれでいいけど
単に凡ミスを防ぐために読みづらくするのは嫌だと言ってんの。

674 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 11:21:39 ]
なんだ嫌なのか。

675 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 12:01:02 ]
俺も定数を左に置くような奴を見たら、どっかおかしい人だと思うだろうな、正直。
当然、そう書こうとする動機は知っているが。

==と間違えて=を書く確率は、ちょっと慣れたまともなCプログラマなら0に限りなく
等しい。つまり、予防策としての効果も0に限りなく等しい。
よって、見た目に優れた書き方の方が良いが、左に定数を書く方がみんな見やすいと
思っているなら相当な変わり者だろう。物事は何でもかんでも対称的ではない。左と
右でどっちが感覚的に自然か、についても対称的な話ではない。現実に定数は右に
書かれる率が圧倒的に高い。

というようなことを感覚で判断できないか、または==と=を間違えることが実際に
ある人なのか、どちらにしても信用には値しないだろうな。

676 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 12:03:56 ]
ミスの確率の高さ低さより、致命傷になるかどうかじゃね?
今時のコンパイラを正しく使っていれば、間違えても致命傷にはならない
だろうとは思う。

677 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 12:11:20 ]
if ( MIN <= x && x < MAX ) {} とかは書くけど、
==と=のミスを避けるために左に定数を書くことはないなぁ。
でも、
>ちょっと慣れたまともなCプログラマなら0に限りなく
は、ソースがないから単なる妄想だね。^^

そしてハーブサッター先生の言葉を思い出そう。

678 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 12:16:48 ]
ハーブサッターの言葉なんぞ多すぎてどれだか分かんねぇよw

679 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 12:21:59 ]
ハーブサッターの言葉?

気の利いたコードは害悪だ、ってのは覚えてるな。

680 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 13:54:54 ]
個人的には
>>677
> >ちょっと慣れたまともなCプログラマなら0に限りなく
> は、ソースがないから単なる妄想
そういう統計は誰も取ってくれそうもないが、経験則としてはあるなあ。



681 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 14:08:48 ]
長くCを書いてると、比較の時は自然と==と入力してしまう

682 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 15:02:15 ]
0に限りなく近いなら定数を左辺にするテクや、=に警告するコンパイルなんて生まれなかったろうに。

683 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 15:06:07 ]
if (!ちょっと慣れたまともなCプログラマ) {
  682 名前: デフォルトの名無しさん [sage] 投稿日: 2009/12/15(火) 15:02:15
  0に限りなく近いなら定数を左辺にするテクや、=に警告するコンパイルなんて生まれなかったろうに。
}

684 名前:デフォルトの名無しさん [2009/12/15(火) 15:17:15 ]
小心者はどこへいった・・・

685 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 21:57:19 ]
俺様は比較で代入なんて間違えないぜwwwwっていう勘違いちゃんならいるけど

686 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 22:35:07 ]
俺様は比較で代入なんて間違えないぜwww
ただタイプミスするだけなんだぜwwww
ダメじゃんorz

687 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 23:37:27 ]
\(^o^)/オワタ

688 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 10:47:01 ]
結構膨大なコード書いてきたけど、ごく初期は別にして普通に一度も間違えないけどな

689 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 11:08:54 ]
間違えることよりも、早期発見できるほうが重要だけどな。
他人の作ったコードもメンテすることあるし。

690 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 14:09:20 ]
タイプミスばっかでげんなり



691 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 15:27:40 ]
>>688
PL/SQL と並行してやってると、代入/比較どころか
文字列のクォーテーションまで間違うぜ!

692 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 16:10:07 ]
他人に「定数は左に書こうぜ」とか言ってたらさらにキチガイじみてるな

693 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 16:11:16 ]
他人の作ったコードのメンテで「定数は左に」って役に立つの?
右に書いてあるコードを全部左に置き換えてからコード読むとか?

694 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 16:17:45 ]
「仕事じゃバカのコードもメンテしなきゃならないんだよ」理論の失敗例だな

695 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 18:25:03 ]
vbの即時で文法ミス見つける機能が他の環境にもあれば そのうち実現するか

696 名前:デフォルトの名無しさん [2009/12/17(木) 04:02:14 ]
パソコンの時刻を2038年1月19日3時14分7秒の30秒前に設定して30秒後どうなるのかを誰か試してみてくれないか?
うちのパソコンでは何かうまくゆかないんだ

697 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 05:03:28 ]
女の腐ったような回りくどさだな
どうせ30年弱の間には解決するだろ

698 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 08:04:46 ]
何でC/C++スレで2038年問題を?

699 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 11:32:43 ]
「C/C++スレ」ではなく「小心者スレ」だから

700 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 11:33:45 ]
>>695
文法ミスじゃないから原因を特定しにくいバグになるんじゃないの?
だから、コンパイル時にエラーとなるように定数を左辺に置くという小技が出てきたわけで。

今は警告でるんだからそんな小技はデメリットしかないと思うよ



701 名前:541 mailto:sage [2009/12/17(木) 17:41:27 ]
>>541で質問した者です。

検索の結果、やりたいことは「重複順列の列挙」と言うのだと分かりました。
また、列挙までのサンプルソースも手に入りました。
が、

あまりにも数字が多いので、必要のない物を出力前に除外しようと思い立ちました。

そこで質問です。除外条件で
・m桁目に2がある数値は除外
・0が5個以上連続している数値は除外
・左右反転して同一数値になるものは最初に出力した物以外出力しない

等々、どうやって条件付けしたらいいのか分かりません。

702 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 18:03:47 ]
>>701
どういうものが必要ないかを俺が決めていいのかよ??
じゃぁ(ry

703 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 19:37:56 ]
条件付けで処理が増える分、余計に遅くなるだけな気もするが。

704 名前:デフォルトの名無しさん mailto:sage [2009/12/18(金) 06:40:17 ]
選択整列法の平均比較回数が約N^2/4になるのはなぜですか?

705 名前:デフォルトの名無しさん mailto:sage [2009/12/18(金) 10:50:35 ]
平均っていうか、単純選択ソートの比較回数は固定のはずでは

706 名前:デフォルトの名無しさん mailto:sage [2009/12/18(金) 10:59:38 ]
選択ソートの比較回数は(N-1)*N/2じゃないの?

707 名前:デフォルトの名無しさん mailto:sage [2009/12/18(金) 11:38:27 ]
失礼、挿入整列法でした。

708 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 00:49:35 ]
スレ違いかもしれないけど。
wiiyourselfとかwiiremoteなどのwii関係のC,C++用のライブラリーでとっつき安いライブラリのおすすめがある人いませんか?
自分の作ったVRウォークスルーもどきにヘッドトラッキングを導入したいんだけど。

709 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 01:22:28 ]
>>707
俺最低。異物挿入法とか読んだ。どこに異物があるのか。

710 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 01:49:11 ]
>707
大雑把に説明してみる。
Insertion sort ではどの位置に要素を挿入するべきかを判定するために比較が用いられている。
最初逆順に並んでいる場合(=最悪の場合)は比較回数は 0+1+2+...+(n-1)=n(n-1)/2 になる。
各ステップにおいてどの位置に挿入することになるかは等確率となるため平均を考えると半分の位置になる。
従って 0/2+1/2+2/2+...+(n-1)/2=1/2(0+1+2+...+(n-1))=n(n-1)/4 となる。



711 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 01:58:03 ]
補足。
>各ステップにおいてどの位置に挿入することになるかは等確率
例えば最悪値で n-1 回比較するケースにおいて平均を考えると (1+2+...+(n-1))/(n-1) = n(n-1)/2/(n-1) = n/2
で大体半分。↑の式でも正確じゃないけどまぁオーダーとしては合ってるはず。

712 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 02:59:32 ]
質問なのですが、投げられた例外の型ってどうやって判定してるんですか?
catchで分岐する時です。
静的に分かるものですか?
それとも実行時型情報みたいなの使うんでしょうか?


713 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 08:32:55 ]
>>712
msdn.microsoft.com/ja-jp/library/cc440190%28VS.71%29.aspx

714 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 08:36:11 ]
>712
静的には分からないので
>実行時型情報みたいなの
を使ってる。
g++ の場合だと正に std::type_info を使ってるらしい。
詳しく知りたい場合は BinaryHacks おすすめ。

715 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 14:51:07 ]
try{
// コード
}catch(Exception1 e){
//例外1
}catch(Exception2 e){
//例外2
}catch(Exception3 e){
//例外3
}

716 名前:デフォルトの名無しさん [2009/12/20(日) 16:14:52 ]
#include <iostream>
using namespace std;
int main()
{
int n=100;
double k = 1.0/n;
for(double i=0.5;i >= -0.5; i-=k){
double x =0.0;
x = i;
cout << x << endl;
}
return 0;
}


これをコンパイルして実行したら0のところがe-16とかの小さい数になってしまいます。
原因を教えてください

717 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 16:18:46 ]
>>716 www.kouno.jp/home/c_faq/c14.html

718 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 17:25:17 ]
>>717
ありがとうございます
0のところだけ別に入れます

719 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 19:23:07 ]
>>716
0以外の場合は浮動小数点誤差が情報落ちして消えてしまうけど、
0の場合は誤差がそのまま有効な数値になるから。


 cout << x << end;
を使わず
 printf("%.2f\n", x );
を使えばいい

720 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 20:04:57 ]
定数は左に、インド人は右に。



721 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 20:44:05 ]
なつかしいなおいw

722 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 21:42:41 ]
インド人は右ってどういう意味?


723 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 21:51:22 ]
ハンドルは右

724 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 21:54:28 ]
そういう意味か!!!

725 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 22:49:34 ]
>>724 「インド人を右に」でぐぐれ

726 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 23:01:19 ]
>>716みたいなのだと、100倍した値で計算して、表示の時に100分の1するのもいいかもな

727 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 01:03:47 ]
別の言い方をすれば、ostreamで浮動小数点数を出力しようとするとprintfの%g相当ということだな。
<iomanip>をインクルードして、例えば
cout << fixed << setprecision(2) << x << endl;
と書けば、%.2f相当の出力になる。

728 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 22:37:27 ]
VS2010β2のC++を使ってみました。

UInt32 aa;
aa = 0x12;

FileStream^ fs = gcnew FileStream("tmp.bin", FileMode::Create);
BinaryWriter^ binWriter = gcnew BinaryWriter( fs );
binWriter->Write( aa );
binWriter->Close();
fs->Close();

作成したtmp.binが使用中のままになっているため、2回繰り返すとエラーになってしまいます。
Closeしただけではダメなのでしょうか?
すいませんがよろしくお願いします。

729 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 23:35:48 ]
>>728
CLIの質問は大胆すぎるので別スレでどうぞ


730 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 23:38:00 ]
>>728
エラーとはどういうこと?
次のように、単純に2回実行することを試したが、なんの例外も投げられることなく実行されるけど。
using namespace System;
using namespace System::IO;

int main()
{
UInt32 aa;
aa = 0x12;
{
FileStream^ fs = gcnew FileStream("tmp.bin", FileMode::Create);
BinaryWriter^ binWriter = gcnew BinaryWriter( fs );
binWriter->Write( aa );
binWriter->Close();
}
{
FileStream^ fs = gcnew FileStream("tmp.bin", FileMode::Create);
BinaryWriter^ binWriter = gcnew BinaryWriter( fs );
binWriter->Write( aa );
binWriter->Close();
}
}



731 名前:728 mailto:sage [2009/12/22(火) 01:08:58 ]
>>730
すいません、他のサブルーチンがひっかけてました。
ありがとうございました。

732 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 01:35:39 ]
>>731
そうそう、BinaryWriterのCloseは、大元のストリームもCloseすることになっているから、
fs->Close()は無くても平気だよ。もちろん、あっても害はないから気にしなくても全然問題ない。

733 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 02:58:29 ]
すみません、
普通、構造体のインスタンスに、STLで見かける.size()メンバなんて有りませんよね?

ttp://marupeke296.com/DXG_No37_AnimationController.html
ここの「アニメーション上位レベル構造体」が「SetLoopTimeメソッド」で.size()されていて
そのままインスタンスを作ってコンパイルしようとすると、当然のように
>error C2228: '.size' の左側はクラス、構造体、共用体でなければなりません
と出ます。
この構造体は何か、普通と違った使い方をしているのでしょうか?
それとも私が、何か知らなければいけない事を知らないだけなのでしょうか。

734 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 04:52:19 ]
>733
C++は詳しく知らないし、僕が昔使っていたときにはinterfaceなんてなかった気もするがおそらく

class CHighLevelAnimController : IHighLevelAnimController {
  private:
    vector<struct HLANIMATION_DESC> m_Amin;
   CHighLevelAnimController operator=(CHighLevelAnimController& c) { return c; }
  public:
    CHighLevelAnimController() { }
    ~CHighLevelAnimController() { }

    bool SetLoopTime(UINT, FLOAT);
...
};
CHighLevelAnimControllerクラスは、IHighLevelAnimControllerインターフェイスを継承(実装)して
m_Aminオブジェクトは、vector<>のようなテンプレートクラスのインスタンスとしてCHighLevelAnimControllerクラスまたはその基底クラスで定義されている

interfaceキーワードに詳しい人詳細キボン

735 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 05:39:46 ]
>>734
Windowsでは、どこかのヘッダで#define interface structってされているだけ。

>>733
自分も、m_Animは実際にはなんらかのSTLコンテナか何かなのだと思う。

736 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 11:08:03 ]
>>734 >>735
何か特別な使い方かと思いましたが、STLに包んでいるとかなのですね。
ありがとうございました。

737 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 16:13:02 ]
すみません。
起動や大型のファイル群を読み込むなどで10秒前後待たせる時
画面にLoading表示やその進行状況を表示したいのですが、
あれはどう実装するものなのでしょうか?

普通に組むと1つの工程(ファイルなど)単位で処理が停止してしまいますし、
「Loading」「読み込み画面」などの検索ワードでは違うものばかりHitし、
実現方法を見つけられずにいます。 何かご助言を頂けると幸いです orz

738 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 16:24:50 ]
マルチスレッド

739 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 16:57:06 ]
1ファイルの読み込み途中の経過を出したいなら、読み込みの関数を呼ぶ度に進行状況のウィンドウを書き換える

740 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 17:13:38 ]
>>738
ググってみました。マルチプロセス処理というものが有るのですね。
これで実現への道筋が見えました。ありがとうございました。

>>739
そうですね。その程度なら勉強〜開発時間を殆どかけずにやれそうですね。
ありがとうございました。



741 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 17:15:01 ]
凝ったLoading画面を作るならマルチスレッドが楽
止まってないことだけ示したいなら、一部読み込んでは表示、を繰り返せばいい

742 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 17:15:41 ]
マルチプロセスとマルチスレッドは一般的には別物だぜ

743 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 09:19:30 ]
端折れば
マルチプロセス>メモリ空間が別
マルチスレッド>同じメモリ空間

744 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 14:01:26 ]
HAL研のプログラミングコンテストの難易度をおしえてください。
ひととおり文法勉強したんですが、難しく思えます

745 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 18:35:29 ]
2009年のを見たけど、C++を適切に勉強していれば(文法的には)難しくはないと思うけどな
最短経路問題とかその類のロジックを問う問題でしょ
文法が分からないのであればそれ以前のレベルってことだね

746 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 19:20:51 ]
どうやらプログラミングではなく、アルゴリズムを競うコンテストっぽいね。



747 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 21:20:54 ]
>>744
俺も去年の春からプログラミングを勉強し始めたばかりで参加してるけど
アルゴリズムを考えるだけだから文法がわかってれば何も難しくもなくね?

難易度はどうですかって質問の答えにはなってないとは思うけど

748 名前:デフォルトの名無しさん mailto:sage [2010/01/05(火) 01:18:43 ]
>>745
>>746
>>747

なるほど。じゃ用意されている関数を使えるレベルすらないので
もう少し勉強してからトライします。もう終わりそうですけど。
レスありがとうございました。

749 名前:デフォルトの名無しさん [2010/01/07(木) 06:18:50 ]
openmpはマルチプロセスにする方法はありますか?

750 名前:デフォルトの名無しさん [2010/01/07(木) 14:17:20 ]
const Hoge*
const Hoge&
Hoge const*
Hoge const&

の違いを実例を挙げて詳しく教えてください。



751 名前:デフォルトの名無しさん mailto:sage [2010/01/07(木) 16:17:41 ]
実例だったら自分で組んでみれば分かるだろ。

752 名前:デフォルトの名無しさん mailto:sage [2010/01/07(木) 17:02:22 ]
俺も
const&
の2つがよくわからん。

753 名前:デフォルトの名無しさん mailto:sage [2010/01/07(木) 17:18:14 ]
const Hoge& と Hoge const& は一緒だから気にするな
& を超えて Hoge& const になると変わる

754 名前:753 mailto:sage [2010/01/07(木) 17:19:46 ]
ごめん
何かわけのわからんことを言った
参照はもともと変更不可だから Hoge& const のようなものは無かった
Hoge* const はある

755 名前:デフォルトの名無しさん mailto:sage [2010/01/07(木) 17:30:50 ]
>>754もちつけ。参照も変更可能。
#include <iostream>
int main() {
int a = 10, b = 20;
int &r = a;
std::cout << r << std::endl;
r = b;
std::cout << r << std::endl;
/*
int &const cr = a; // `const' qualifiers cannot be applied to `int&'
std::cout << cr << std::endl;
cr = b;
std::cout << cr << std::endl;
*/
int *const cp = &a;
std::cout << *cp << std::endl;
//cp = &b; // error: assignment of read-only variable `cp'
std::cout << *cp << std::endl;
return 0;
}

756 名前:デフォルトの名無しさん mailto:sage [2010/01/07(木) 21:52:05 ]
delete this;
って適切に現在?のオブジェクトを破棄してくれるのですか?

757 名前:デフォルトの名無しさん mailto:sage [2010/01/07(木) 22:21:38 ]
適切に使えば

758 名前:デフォルトの名無しさん mailto:sage [2010/01/07(木) 23:39:12 ]
>>755
>>753が言ってるのは「別のオブジェクトを指すように変更することはできない」ってことだよ。
Hoge&は最初からHoge*const相当で、参照にHoge*に対応するものはないんだから。

759 名前:デフォルトの名無しさん mailto:sage [2010/01/08(金) 09:32:09 ]
>>758
別のオブジェクトを指すように変更することはできない?
いつからそうなってんの?w

int a = 10, b = 20;
int &r = a;
std::cout << r << std::endl;
r = b;
std::cout << r << std::endl;

これを実行して確認しる。

760 名前:デフォルトの名無しさん mailto:sage [2010/01/08(金) 09:33:45 ]
>>758
あーごめんw 俺が狂ってた。
r = b;
これはひょっとして、代入されてるのか。
( つд∩)うえーん
( つд・∩)チラ



761 名前:デフォルトの名無しさん mailto:sage [2010/01/08(金) 09:42:09 ]
int a = 10, b = 20;
int &r = a;
std::cout << &a << ' ' << &b << std::endl;
std::cout << r << ' ' << &r << std::endl;
r = b;
std::cout << r << ' ' << &r << std::endl;

実行結果:

0x22cce4 0x22cce0
10 0x22cce4
20 0x22cce4

___
←樹海| オワタ
 ̄|| ̄ ┗(^o^ )┓三  >>753 >>758 両氏ごめん
 ||    ┏┗  三
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

762 名前:デフォルトの名無しさん mailto:sage [2010/01/08(金) 09:50:12 ]
学校の課題で配列に10個の実数を入力して最大値と最小値を求める問題なんですが、最大値は正常に出力されますが、最小値がうまく出力されません。
#include<stdio.h>
int main (void)
{
float x[11];
float max,min;
int i;
printf("実数を10個入力してください\n");
for ( i = 1; i <= 10; i++){
scanf("%f",& x[i]);
}
max = x[0];
for ( i = 1; i <= 10; i++){
if (x[i] > max){
max = x[i];
}
}
min = x[0];
for ( i = 1; i <= 10; i++){
if (x[i] < min){
min = x[i];
}
}

printf("最大値は%fです\n",max);
printf("最小値は%fです\n",min);
return 0;

}
どこが原因なんでしょうか?

763 名前:デフォルトの名無しさん mailto:sage [2010/01/08(金) 09:56:55 ]
x[0]が未初期化

764 名前:デフォルトの名無しさん mailto:sage [2010/01/08(金) 12:59:46 ]
すみません。複数のクラスを辿りループ処理をするプログラムで
クラス毎に1度だけ変数の初期化をさせたい場合、
1.コンストラクタを使う  (再初期化が必要になった場合、結局の後者いずれかが必要に・・?)
2.各クラスのグローバルスコープに初期化用のstatic boolを置いて処理
3.初期化用メソッドを別に作って纏めて管理

この3つが思い付くのですが、
どういう初期化が定番、もしくは設計的に無難だと思われますでしょうか?

765 名前:デフォルトの名無しさん mailto:sage [2010/01/08(金) 13:29:43 ]
staticイニシャライザじゃダメなの?

766 名前:765 mailto:sage [2010/01/08(金) 13:30:28 ]
ごめんJavaと勘違いしてました

767 名前:デフォルトの名無しさん mailto:sage [2010/01/09(土) 09:17:09 ]
>764
辿るのはクラスなのオブジェクトなの?
初期化するのはクラス毎なのオブジェクト毎なの?
どんな処理しようとしてるのかが良く分からない。
擬似コードでいいから書いてみてくれた方が答えやすい。

「クラス毎に1度だけ」の条件を抜いた上で感覚で答えれば、
それが本当に「初期化」ならコンストラクタにすると思う。
状態の再設定が必要なら reset() みたいなメソッドも作るだろうね。

>各クラスのグローバルスコープ
言いたいのはクラススコープじゃね?

768 名前:デフォルトの名無しさん mailto:sage [2010/01/10(日) 12:33:35 ]
>>767
初期化じゃなくて再設定って言わないとですね;

>各クラスのグローバルスコープ
すみませんでした、そんなの無いですよね;
つい完成するまでは1行で済むクラスの置いてるソースファイルのグローバルスコープにstatic boolを置く癖から。。  表現に注意します;

そして、変数の再設定メソッドが良さそうですね・・ありがとうございました。

769 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 17:08:21 ]
すみません。
「配列にはしたくない変数名の末尾」に数字を付けるのは、滅多に見ない気がするのですが、何か危険なのでしょうか?
以前はhennsuuA ..B ..C としていたのですが、最近はhennsuu1 ..2 ..3 とやっているのですが・・

770 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 17:10:45 ]
そういう命名がふさわしい場合が滅多に無いから



771 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 17:16:39 ]
a, b, c, 1, 2, 3 なんて機械的な命名ではなく、それぞれの変数の役目に合った意味のある名前を付けるべき
いい名前が思い浮かばないのなら変数名スレに相談してみては

772 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 17:22:51 ]
単純に通し番号を振るのがふさわしいような場合は、普通は似たような処理をそれぞれ
の変数に適用するだろうから、素直に配列にすることが多いだろ。
配列はふさわしくないが通し番号がふさわしい、という場面が滅多に無いから、そういう
命名も滅多に見ないだけ。
で、その言い方だと頻繁に通し番号を振ってるようだから、やはり命名がおかしいか、
よほど特殊なジャンルで活動しているか。まぁ、後者ならこんな質問は出ないだろうと
思うので、多分前者だろう。

773 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 17:24:18 ]
たまに通し番号が多発しやすいジャンルもあるから、何を作っててそういうコードに
なるのか知りたい気もする

774 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 18:12:39 ]
>>770-773
ありがとうございます。危険性そのものは多分、無いのですね。
私のプログラミング能力の低さから来てる問題なのが大半だとは思います。

あとは、
変数1の値に応じて処理をわけ、変数2の値に応じて処理を分け と
どっちも1桁の数値だから配列にして置いてても良いのですが、
一応種類が全く違う2つなので、名前を別にしたいのですが
違い過ぎると使い間違えそうになるので・・とりあえずa, b, c, 1, 2, 3 と
やっちゃってました。

変数名スレッドなるものが有るんですね。 探して見てこようかと思います。
ありがとうございました。

775 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 19:05:36 ]
まーゲームなんかだと変数名にシリアル振りたくなることはある
でも今時そこまでガチに汚く組まないと困ることはコンシューマでも珍しい

776 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 22:33:15 ]
意味は異なるが関連のある変数?
なら構造体にするとか

777 名前:デフォルトの名無しさん mailto:sage [2010/01/16(土) 17:07:00 ]
ポインタを配列形式でアクセスするとき、添字に負の数を指定するのは文法上許されるのでしょうか。
int a[10];
int *p = a+5;

p[-4] = 0;

778 名前:デフォルトの名無しさん mailto:sage [2010/01/16(土) 17:10:40 ]
>>777
値の正負は文法上の問題ではないので、非負の値が許されるなら当然、文法上は、有効。

779 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 00:43:20 ]
けどすごい紛らわしい書き方だな…

780 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 12:01:30 ]
まぁ素直に*(p-4)=0と書いた方がいいわな。1[p]とかと似たような空気を感じる。

どうでもいいけど、-4[p]=0は試してないけど有効じゃなさそうだな、優先順位的に。



781 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 18:13:26 ]
一連の流れでmalloc/freeを連想した

782 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 20:05:01 ]
>>780
(-4)[p] なら大丈夫

783 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 20:17:49 ]
そんな書き方、文法が許しても俺が許さん

784 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 20:38:04 ]
コーディング規約とかで人のプログラミングスタイルを制限するのは
ナンセンスだと思っている俺ですら>>782はぶち殺したくなる


785 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 09:30:44 ]
べつにいいやんw 一箇所だけとか、少ないときは。
きっと清涼剤のようにさわやかになれるぞ。

786 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 09:40:05 ]
なれねーよw

787 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 21:22:34 ]
マジックナンバーならまだ一目でわかるが

int a[10];
int *p = a+5;
int n = -4;
/* 数十行のコード */
n[p] = 0;

とかなってたら明確な悪意を感じる

788 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 20:40:13 ]
すみません。
共通の変数50個を扱うデータクラスA(インスタンスは500個)に関連して
10種x1〜20の配列(ムラの激しい追加情報)が必要なのですが、
全部データクラスAに入れてしまうと、約190個x400インスタンス=76000個分ほどの変数は無駄になる計算で・・。
STLを使うなりクラスをバラにするなり考えているのですが
こういう場合、どうデータを管理するのが定番、妥当なのでしょうか?

789 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 21:05:01 ]
たかが76000個くらい気にしない、というのも一つの解決方法

790 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 21:24:38 ]
76000個のインスタンス一つは組み込み型程度なの?
とりあえず気にしないで作ってだめそうだったら工夫するとか?
76000個をヒープに取ったらまずい?




791 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 21:44:52 ]
使うときに使う分だけ配列を確保すればいいんじゃね?

792 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 23:57:49 ]
それは本当に配列でなければいけないの?

793 名前:デフォルトの名無しさん mailto:sage [2010/01/20(水) 01:55:58 ]
>788
>共通の変数50個
この段階でクラスの切り分け方ミスってるような気もするが。

追加情報については STL のコンテナ使うなり(コンテナの選択は追加、削除、検索の発生の仕方次第)、
適当なクラスにラップするなり、ケース次第だと思う。
追加情報に対して単なるコンテナ以上の操作が必要ならばクラスにラップするかもね。

794 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 19:56:01 ]
>>789-793
ありがとうございます。巻き添えらしいアクセス制限で返事が遅れてすみません。
今は、言われてみれば数十KB位のようですし、そのままデータクラスAに入れて使う事にします。
問題になってきたらご助言を参考に改良したく思います。
ありがとうございました。

795 名前:デフォルトの名無しさん mailto:sage [2010/01/27(水) 13:10:49 ]
すいません。
DIRECT法(DIviding RECTngle)のプログラムを組むことになったのですが、
どうにもとっかかりが無くて困っています。
おおよその理論は分かっているのですが、形にすることが全くできません。
ググって見たりはしたものの、それらしきプログラムソースは落ちていませんでした。
助けていただくことはできますでしょうか?


796 名前:デフォルトの名無しさん mailto:sage [2010/01/27(水) 13:36:39 ]
>>795
ググると普通にあるけど…?
ソースが欲しいって訳?

797 名前:デフォルトの名無しさん mailto:sage [2010/01/27(水) 18:44:46 ]
>>796
ソースがあれば、いただけると幸いです。

798 名前:デフォルトの名無しさん [2010/01/29(金) 17:20:14 ]
795
どなたかお願いします。
書き忘れましたが、C++です。

本当に困ってます

799 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 17:43:15 ]
留年したまえ

800 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 17:53:41 ]
>落ちていませんでした

こういうこと書かれると手伝う気うせる



801 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 20:13:46 ]
>>800
なんでだよw

802 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 20:25:14 ]
>>801
なんでだよじゃねえだろ。失礼甚だしい

803 名前:801 mailto:sage [2010/01/29(金) 22:04:27 ]
>>802
まあ・・・確かに落ちているという表現はあまり良くなかったかもしれんな。

ま、その辺は本人がきっと弁明するということで。


804 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 22:32:16 ]
>>803
お前がその本人だろ・・・
何しれっと他人の振りしてんだよ

805 名前:デフォルトの名無しさん mailto:sage [2010/01/30(土) 00:01:15 ]
>>804
いや別人だから失敬な。


まあ何だっていいけど。
証明方法がないもんなぁ。


806 名前:デフォルトの名無しさん mailto:sage [2010/01/30(土) 16:20:48 ]
795です。
ご指摘の通り「落ちている」という表現は悪かったと反省してます。
ただ本当に困っています。どなたか助けてくれる方いましたら
本当にお願いします。

807 名前:805 mailto:sage [2010/01/30(土) 16:26:09 ]
>>806
このスレには低能力者しかいないから
別のスレ(ttp://pc12.2ch.net/test/read.cgi/tech/1263556932/とか)
に行ってみたらどうでしょうか?

> 証明方法
fusianasanがあったか。
でもまあ晒したくないからやめとこう。

808 名前:805 mailto:sage [2010/01/30(土) 18:03:11 ]
>>806
言い忘れたが、常識で考えてくれ。
このままだとマルチポストになるぞ。

どっちかでは別スレに行ってきますと断りをいれましょう。


809 名前:デフォルトの名無しさん mailto:sage [2010/01/30(土) 18:25:36 ]
すいませんでした。別スレ行きます

810 名前:デフォルトの名無しさん mailto:sage [2010/01/30(土) 19:22:32 ]
.                   ____
    _              | (・∀・) |
   `))             | ̄ ̄ ̄ ̄
    ´             ∧
                <⌒>
                 /⌒\
       _________]皿皿[-∧-∧、
    /三三三三三三∧_/\_|,,|「|,,,|「|ミ^!、
  __| ̄田 ̄田 / ̄ ̄Π . ∩  |'|「|'''|「|||:ll;|
 /__,|==/\=ハ, ̄ ̄|「| ̄ ̄ ̄ ̄|「| ̄ ̄|
/_| ロ ロ 「 ̄ ̄ ̄ | | 田 |「|  田 田 |「|[[[[|
|ll.|ロ ロ,/| l⌒l.l⌒l.| |    |「|        |「|ミミミミミミ



811 名前:保守 [2010/02/06(土) 11:57:12 ]
ttp://exlight.net/devel/cpp/string_initialize.html
C++の初期化指定は複雑
C++の初期化は恐ろしく複雑になってて,

struct S {
int a;
static int b;
int c;
} s = { 1, 3 };

と書いたらs.a = 1,s.c = 3と初期化されるなんてルールも決まっている.あんまり深入りしないでおこう….


812 名前:デフォルトの名無しさん mailto:sage [2010/02/06(土) 13:12:32 ]
複雑というより落とし穴だらけ、という感じだな

813 名前:デフォルトの名無しさん mailto:sage [2010/02/06(土) 14:04:51 ]
>>811
まあねえ
静的メンバは外で定義しないといけないしね
そうしないとコンパイラから叱られる

814 名前:デフォルトの名無しさん mailto:sage [2010/02/06(土) 17:21:56 ]
だが、スタティックメンバ変数程度で*恐ろしく*複雑ってのは、さすがにどうよ?
そりゃCよりは複雑だけど、C++に限らず、いまどきの言語でクラス変数使ったら
同じような状況になるし、少なくともスタティックメンバ変数の初期化ルールは
*恐ろしく*なんて形容されるほどじゃないと思うんだが。

ついでに聞きたいんだけど、C++に限らず、みんなが「こいつは複雑だ」と思った
言語仕様ってある?
例えば多重継承とかテンプレートとかは複雑?簡単?

815 名前:デフォルトの名無しさん mailto:sage [2010/02/06(土) 17:49:22 ]
テンプレートの部分特殊化のルールは複雑だと思う

816 名前:デフォルトの名無しさん mailto:sage [2010/02/06(土) 17:50:05 ]
あとADLは時々わけがわからなくなる
STLが吐く長いエラーメッセージはさすがに慣れたけど

817 名前:デフォルトの名無しさん mailto:sage [2010/02/06(土) 17:55:31 ]
ヘッダに const 定義しても ODR にならない場合のルールは複雑だ。

818 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 11:35:00 ]
そりゃわかにくく書こうと思えばわかりにくく書けるさ
とにかく他人にも,そして自分にもわかりやすく書くだけ
忘れた頃に見ても

819 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 02:26:30 ]
座標入れようと思ってdouble[3]のvectorを作ったはいいが、push_backしたときにエラー出る。
仕方ないから

struct XYZ{
double array[3];
XYZ(){}
XYZ(const XYZ&xyz){memcpy(array, xyz.array, sizeof(double)*3);}
~XYZ(){}
XYZ &operator[](unsigned int n){ return array[n]; }
};

って作ったけど、もっと楽にできなかったのかなぁ?

820 名前:819 mailto:sage [2010/02/10(水) 02:32:51 ]
あ、そんなの言うと、普通にvector<vector<double> >使えって言われそうだけど、
大量の要素を入れたかったんで、double配列いっこいっこに、mallocの管理領域使うのがもったいなかったんだ。
あと、vector<double>にしといて、[i][j]を[i*3+j]ってしたり、ループするときにイテレータ3個飛ばしにしてもよかったんだけど、
なんかそこらへんでコードが地味に複雑化するのが嫌だったんだ。



821 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 05:43:20 ]
>>819 boost::array<double, 3>

822 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 07:02:33 ]
要素が3つくらいならboost::tupleとか。
配列っぽく扱える必要があるなら使えないが。

823 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 07:26:33 ]
boost::arrayがせいかいじゃね?

824 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 10:25:35 ]
>>819
POD型の配列にはコピーコンストラクタがないからエラーになるんだろ

825 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 11:09:45 ]
>>821
そんなのがあったのですね。トンクス

826 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 07:34:09 ]
すみません。Visual C++ 2008 Express Editionで
ブレークポイント(行の左に赤丸)を付けてデバッグ開始をした時に
・ちゃんと矢印が出て止まる状況
・透明な円になり、黄色い△に!が付いて止まらない状況
の2パターンが起きるのは何故なのでしょうか?

以前はちゃんとブレークポイントを入れれば矢印で止まってくれたのですが、
今は止まってくれず、無理に手前のブレークポイントからステップインすると
ソースを表示できない とか 逆アセンブル画面へ とかと出てしまいます。
どうすればコードを辿れるようになるでしょうか・・。

827 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 10:17:30 ]
変更したのにビルドされてない、とか別の場所のソースだったりとか

828 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 15:12:40 ]
デバッグビルドにするとか

829 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 15:25:45 ]
あーリリースビルドで最適化で消されてると中抜きの丸になるな

830 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 20:31:00 ]
>>827-829
情報ありがとうございます。デバッグモードのままでこうなるのですが・・
頂いた情報から調べてみようと思います。 ありがとうございました。



831 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 20:44:20 ]
すみません。今まで殆どの定数を、
「ヘッダーファイルに#define」で作っていたのですが、
配列の要素数宣言などに使うわけでもなく、ただ1ソース内の複数メソッドで使う数値などは
そのソースのグローバルスコープにstaticで作った方が良い気がしてきたのですが、
これはプログラミングの常識として、やらないべきなのでしょうか? やるべきなのでしょうか?

832 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 22:09:58 ]
>>831
> そのソースのグローバルスコープにstaticで作った方が良い気がしてきたのですが、
C言語ならそのソースの頭で#defineすれば良い。
C++ならconst定数を使うべき。
いずれにせよやらないべき。

↓↓C++にて↓↓
今までは
#define max_num 100
としていたところをヘッダに
const int max_num = 100;
と書けばよい。
ttp://www7b.biglobe.ne.jp/~robe/cpphtml/html01/cpp01042.html


833 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 22:18:11 ]
>>831
1ファイルだけでしか使わないなら、そのファイルの先頭で定義するのは普通。
C++ならconst使え、とは832も言っているとおりだが。

834 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 00:11:02 ]
>>832-833
ありがとうございます。用途に応じてconstを使うよう心がけようと思います。

835 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 00:36:35 ]
2つ質問させていただきます

(1)
char* x = "ABC";
*x = 'x';

を実行するとエラーになるのですが、なぜ2行目の代入はうまくいかないのでしょう

(2)
void test(const int n)
{
int a[n];
}

int main()
{
test(5);
}

を実行すると、

定数式が必要です。
サイズが 0 の配列を割り当てまたは宣言しようとしました。
'a' : サイズが不明です。

というエラーが出てコンパイルできません。
testの仮引数を定数にしたので配列が作れると思ったのですがなぜだめなのでしょう。


836 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 02:03:41 ]
>>835
(1) www.kouno.jp/home/c_faq/c1.html#32
(2) www.kouno.jp/home/c_faq/c11.html#8

837 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 02:58:24 ]
>>836
ありがとうございます。(1)はわかりましたが、(2)に関しては

const int n = 5;
int a[n];

はコンパイルでき、違いがよくわかりません。
関数として用いる場合(>>835の書き方)は事実上定数になっていない、ということでしょうか

838 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 03:21:53 ]
>>837
それがコンパイルできるなら、たぶん C++ 使ってるんじゃないかと。

839 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 04:04:15 ]
>>838
どこでCとC++の区別をつけるのかいまいちよくわかっていませんが、
C++のつもりで書いていました。

840 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 04:12:29 ]
>>839
コンパイラが違う



841 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 04:24:55 ]
>>839
CからC++が派生する過程で、constがついている変数は定数とみなすようにルールが変更された。
逆に言うと、constがなければ定数とはみなさない、というルールなので従うしかない。
VC系コンパイラなら、拡張子をcにすればconstがついていてもエラーになると思う。

これがgccだと>>835の(2)すら通っちゃうんだが、言語仕様上はエラーになるのが正しい、はず。

842 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 04:28:04 ]
>>841
gcc で通っちゃうのはおそらく C99 の仕業。たぶん const なくても通る。

843 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 04:41:14 ]
C99制定前からのGCC独自拡張です

844 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 14:16:59 ]
質問です。
ttp://bal4u.dip.jp/mt/program/c-4/
ここの「数字変換 10進数を2進数に変換 dec2bin」を、
10進数から3進数へ変換するようにしたいのですが、うまくいきません。
どのようにしたらよいでしょうか。

845 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 14:43:18 ]
>>844
どうしたらうまくいかなかったを書かないとなんともいえない。


846 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 15:32:41 ]
親クラス -(継承)-> 子クラス -(継承)-> 孫クラス

というクラスで、孫クラスを親クラスに見立てて扱いたい(多態)と思い、

(親クラス型)孫クラス

というふうにアップキャストしようとしたら、コンパイラに怒られました。

こういうの、って設計がマズいということでしょうか・・・

847 名前:844 mailto:sage [2010/02/27(土) 15:33:03 ]
do
{
r = 0;
non_zero = 0;
for(i = dec_len - 1; i >= 0; i--)
{
d = tmp[ i ];
tmp[ i ] = d / 3;
if(r > 0){tmp[ i ] += 3;}
if(tmp[ i ] > 0){non_zero = 1;}
switch(d)
{
case '0': r=0;break;
case '1': r=1;break;
case '2': r=2;break;
case '3': r=0;break;
case '4': r=1;break;
case '5': r=2;break;
case '6': r=0;break;
case '7': r=1;break;
case '8': r=2;break;
case '9': r=0;break;
}
//r = d & 1;
}
bin[ bin_len++ ] = r;

}while(non_zero);

主要部分を改造した物を上げて見ます。
ごらんの通り、答えが合いません。
全体的に訳が分かりません。(元のソースは理解できましたが……)

848 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 18:24:32 ]
>>846
その変換は暗黙の変換で通るはず。
これ以上はエラーメッセージやソースを晒してもらわないとわかんない。

849 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 18:32:43 ]
>>844,847
元のソースから変数名が適当で読みにくいソースだね。わけがわからないのはそのせいじゃない?

素直に一旦ふつうの整数値として取り出して3進の文字列に書き出すようにしたほうが
簡単だと思うよ。整数値に変換する部分は strtol() 使えば一発だし。

850 名前:844 mailto:sage [2010/02/27(土) 19:44:37 ]
>>849
多倍長演算ってことになっているので、いったん数値に戻すっていうのも難しそう。
一応 50桁の10進数を3進数に変換したいと考えています。
他に簡単に10進 3進の相互変換が出来そうな仕組みはありませんかね。

とりあえず一桁の時の答えだけは合うようになった(笑)




851 名前:846 mailto:sage [2010/02/28(日) 15:24:38 ]
>>848
すみません、何か勘違いしていたようです。
問題なく動きました。
失礼しました。

852 名前:デフォルトの名無しさん mailto:sage [2010/02/28(日) 23:07:29 ]
>>850
849 同様に俺も数値にした方がミスしにくいし応用も効くしいいと思うけどな
桁数多くてもgmp みたいなものもあるし,必要なら自分で class 作っても良いし

まぁ目的に依るけどね
>>844 のコードを変更することだけが目的ならしょうがないけどね


853 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 20:07:36 ]
初歩的な質問すみません、BYTE配列からDWORD型変数に数値をコピーした時、
1バイト分しかコピーできないのですが、(256以上が0…1…2… となってしまいます。)
どうすれば8バイト分コピーできるのでしょうか。

854 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 20:49:47 ]
> BYTE配列からDWORD型変数
C/C++にそんな型は存在しません。

MFCの用語はスレチな気がする。
ttp://pc12.2ch.net/test/read.cgi/tech/1250919279/
こことかか?

855 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 20:59:30 ]
>854
MFC っていうか Win32 だと思われ。
書いてる事そのものは memcpy とか CopyMemory だけどそれが本当に自分のやりたい事かどうか
確認した方がいいかもしれない。

856 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 21:01:36 ]
>>854
> C/C++にそんな型は存在しません。

小心者スレッドなんだからまあ良いではないか。

>>853
どんなコードでコピーしたの?
そもそもBYTE型に256以上の値は入らないし、DWORDだったら4バイトだよね。


857 名前:854 mailto:sage [2010/03/07(日) 21:21:41 ]
>>856
> 小心者スレッドなんだからまあ良いではないか。
一応 小心者 向けに多少はしたつもりだったんだが、
俺の言い方はやっぱまだ厳しかったか。
スマン


858 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 21:40:13 ]
コード見たほうが早いなたぶん

859 名前:853 mailto:sage [2010/03/08(月) 00:08:15 ]
>>854-858
ありがとうございます、memcpy使えば良かったですね、
他の事に気がいっててそんな事にも気付かなかった、 orz
あとDWORDは4バイトだったんですね、ご指摘ありがとうございました。

860 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 10:55:08 ]
配列ならポインタを強引にキャストするだけでもよくね
メモリ上の配置の把握が必要だけど、memcpyするにしてもそれは必要だし



861 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 12:43:22 ]
>>860
エイリアシングルールというものがあってだな。
www.radiumsoftware.com/0304.html#030408

862 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 03:46:00 ]
8bit変数配列→32bit変数、ってだけならunion作れ
8bit変数配列→32bit変数配列、とかならどうしたもんだか

863 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 22:33:09 ]
unionつかったらエンディアンの問題はどうするの?

864 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 23:04:11 ]
2倍あるいは1/2倍していたところをビットシフトに書き換えたら、若干遅くなりました。
同じかそれ以上の速さになることはあると思っていましたが、遅くなるとはどういうことなんでしょうか??
CPUには乗算や除算のほうが高速に行える回路が付いてるんでしょうか??

865 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 23:45:00 ]
>>864
推測ではどういう風にでも考えられるので
コンパイラにアセンブリを吐き出させてみればどうでしょう

866 名前:864 mailto:sage [2010/03/13(土) 01:38:25 ]
>>865
ありがとうございます。
アセンブラは読めませんが、がんばって解読してみます。

867 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 10:20:26 ]
>>863
気になるなら#ifdefするなり効率落として変換関数書くなりすればいいんじゃね
綺麗で効率いい方法は知らん

868 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 10:40:47 ]
絶対にWindowsでしか使わないのにクロスプラットフォームで書きたくなる病とかあるよな

869 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 12:11:15 ]
>>868
できる限り標準に準拠するのは正しい態度だと俺は思うよ

* ずっとWindowsだけの仕事をするとは限らん
* 元々Windowsだけのつもりでもコードの一部流用とかすることがありうる


870 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 13:45:37 ]
8bit配列→32bitなんていう処理についての話からの流れだからなぁ
汚くする理由の無い部分は綺麗に書くのが当然だが、エンディアン絡みの処理を
すっきり綺麗に効率良く、って訳には行かんだろ現状



871 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 14:15:49 ]
>>869
* 言語標準に準拠しつつクロスプラットフォームではないコードは極めて一般的
* OS標準に準拠しつつクロスプラットフォームでないコードは言うまでもなく一般的
* そもそも「絶対に」という前提の話

まず、クロスプラットフォームと規格準拠は全くの別物。前者の需要は極めて稀。
Windowsアプリを書く時にクロスプラットフォームにしようとするのは、かなり病的
にならないと困難だと思うぞ。犠牲も大きいし。

872 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 15:25:22 ]
Qtとかの外部ライブラリを使えば
クロスプラットフォームでも楽に書けるぞ。


873 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:57:02 ]
>>871
プラットフォーム依存性が必要無いところは敢えて依存性持たせない方が
良いと俺は思うけどな
必要もなくプラットフォーム依存してるコードもよくあるが
元々絶対に流用しないつもりでも一部切り貼りって結構あると思うぞ

874 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 22:02:26 ]
forループのインデクスすらDWORD使うサンプルとかあるからな

875 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 07:46:33 ]
程度問題だな。病気レベルの無駄なことはやらない方がいい。無理せずに依存無く
書けるなら当然その方がいい。
Qtは微妙だろ。必要も無しにあれを選ぶ理由は無いと思う。

876 名前:872 mailto:sage [2010/03/14(日) 10:36:59 ]
別にQtじゃなくても、とにかくクロスプラットフォームな外部ライブラリなら
俺の言いたいことは伝わると思うんで、適当に読み替えてください。

877 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 15:01:47 ]
クロスプラットフォームなフレームワークに乗っかれば
クロスプラットフォームでも楽に書けるぞ。

・・・当たり前だろjk

878 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 00:23:17 ]
本気で細かいことをしようとするととても楽に書けるなんてもんじゃないから、
普通は細かいことをバッサリ諦めるしか無いのがクロスプラットフォーム

879 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 00:27:38 ]
まぁGUIに関しては特にそうだよね

880 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 08:24:51 ]
独自機能は全部諦めることになるしなぁ



881 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 21:37:14 ]
>>878
細かいこと気にしない方が逆にいいものできたりして…
稀かもしれんが

882 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 22:23:42 ]
>>881
「逆にいい」は稀かと
あっても無くても関係ない、ならまだそれなりにある話だが

CUIなら割と素直にクロスプラットフォームになりやすいけどな
それでも、元の流れの内容をエンディアン違いにまで対応させようとしたら
あまり綺麗には済まないが

883 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 21:46:48 ]
CUIでも、実用品でクロスプラットフォームなコードになると大抵はマクロで個別に
ソース分岐させてるけどな。C/C++標準だけで書ける実用品なんて小物だけ。
LinuxとBSD系ですら、パフォーマンスを実用レベルにする為には移植作業が必要に
なったりする訳で。Windowsならなおのこと。

884 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 21:56:00 ]
標準の範囲ではWindowsでUnicodeファイル名を扱えないし
ディレクトリすら作れないし
バイナリファイルを標準入出力で読み書きできないし
大きなファイルのシークもできない

885 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 21:57:51 ]
だからクロスプラットフォームなフレームワークに乗っかろうぜ
と言ってるじゃないか。
だれもC/C++標準だけで満足はしないさ。


886 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 22:03:09 ]
オープンソースだと、単にWindowsのUnicodeファイル名などは
切り捨てているものも多いな

887 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 22:18:27 ]
そしてパスに空白を含むと落ちるクソアプリができあがると

888 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 22:24:03 ]
>>887
> そしてパスに空白を含むと落ちるクソアプリができあがると
たまにそういうクソアプリが見つかるけど、
それが原因だったんかい!

889 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 01:19:44 ]
クロスプラットフォーム向けのフレームワーク使ったところで、問題の本質の
ほとんどは解決しないよな

890 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 18:28:38 ]
プラットフォーム依存性があるにしろオープンソースでクロスプラットフォー
ムというと firefox, thunderbird, gimp, cygwin とか思いつくけど
これらってクソアプリやへぼアプリの分類なの?



891 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 18:58:00 ]
cygwinは最近出た1.7まではUnicodeファイル名に対応していなかった
実のところ、Windows専用でも、Unicodeファイル名に対応していないプログラムは
ものすごく多い、特にコンソールアプリケーションではそれが普通

892 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 19:20:32 ]
>>890
必死に移植作業してマクロで分岐させるんならいくらでもクロスプラットフォームに
なるのは当然だろw

893 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 22:53:58 ]
>>890
firefox, thunderbird, gimp, cygwin が
クソアプリやへぼアプリだったら
そうじゃないアプリって世の中にほとんどないんじゃないか?


894 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 23:49:10 ]
クロスプラットフォームなコードでもクソじゃないのはあると言いたいんだろ
だが、あの辺のは「現実に十二分な需要がある」から、仕方なく「多大な手間を掛けて
複雑なコードを書いて」実現してるから、牧歌的な話からは程遠い

895 名前:デフォルトの名無しさん mailto:sage [2010/03/18(木) 00:16:50 ]
>>894
> クロスプラットフォームなコードでもクソじゃないのはあると言いたいんだろ

クロスプラットフォームのアプリのほとんどが
クソアプリだってことが言いたいのかい?

896 名前:デフォルトの名無しさん mailto:sage [2010/03/18(木) 00:19:05 ]
クソアプリの定義にもよるんじゃないの
例えばlameは最優秀のMP3エンコーダーだが、Unicodeファイル名には対応していない

897 名前:デフォルトの名無しさん mailto:sage [2010/03/18(木) 00:31:07 ]
英語限定ならば問題は大分少なくなりそうだな…

898 名前:デフォルトの名無しさん mailto:sage [2010/03/18(木) 00:32:40 ]
そうだな
GUIの場合、IMEという難関もあるし

899 名前:デフォルトの名無しさん mailto:sage [2010/03/18(木) 11:56:10 ]
>>895
どう見ても真逆の意味にしか読めないが

900 名前:デフォルトの名無しさん mailto:sage [2010/03/18(木) 12:05:23 ]
コードは肥大するけどお勉強の為に非依存で書いてみました、でも誰も使いません
けどね、ってのが無駄
自然に非依存なコードになるならそれでいいんだよ(エンディアンなんかは面倒な
ことをしなきゃ非依存にはならんけど)
実需があるなら無理もしなきゃならないし、変態コードが肥大しても許される



901 名前:デフォルトの名無しさん mailto:sage [2010/03/18(木) 12:08:51 ]
実装の手間自体もでかいが、テストの手間のほうがより悲惨だな

クロスプラットフォームを本気で考えるのは、プロジェクトが大きくなってからで
いいと思う

902 名前:デフォルトの名無しさん mailto:sage [2010/03/18(木) 14:36:18 ]
クロスプラットフォームにするほど
他人が使ってくれるかどうかっていうところがなw

903 名前:デフォルトの名無しさん mailto:sage [2010/03/18(木) 18:14:36 ]
>>900
> 自然に非依存なコードになるならそれでいいんだよ(エンディアンなんかは面倒な
> ことをしなきゃ非依存にはならんけど)

素朴な質問だが通常のコーディングでなぜエンディアンを
生で扱わなければいけないの?

904 名前:デフォルトの名無しさん mailto:sage [2010/03/18(木) 18:20:57 ]
>>903
誰かがエンディアンを持ち出したからだろ

905 名前:デフォルトの名無しさん mailto:sage [2010/03/18(木) 18:21:42 ]
>900ではないが
少なくとも画像や音声など、バイナリデータを弄る場合には必ずエンディアンの問題は
出てくるでしょ

ネットワークプログラミングにおけるntohl()のように、ホストエンディアンを
意識せずに「ホストエンディアンと対象エンディアン(bigないしlittle)を
変換する関数」を複数用意することで、問題を解決できることが多いと思うけど

906 名前:デフォルトの名無しさん mailto:sage [2010/03/18(木) 18:35:28 ]
>>905
画像,音声,ネットワークだと生で扱わなくてもライブラリがあるんでは
自分で用意する必要は必ずしも無いはず

907 名前:デフォルトの名無しさん mailto:sage [2010/03/18(木) 18:47:09 ]
そもそも>>900を読んで「通常のコーディングでもエンディアンを生で扱わなければ
いけない」とは読み取れないんだが

908 名前:デフォルトの名無しさん mailto:sage [2010/03/18(木) 20:41:29 ]
>>906
ま、ライブラリにおんぶにだっこでいい場合はそうだね

ただ、例えばntohl()のようなものはホストエンディアンによってコードを
分ける必要はなくしてくれるが、「ここはネットワークエンディアンに変換する
必要があるのでntohl()を呼ぶ」ような仕事は残るわけだから、
エンディアンを意識しなくてよい、というわけではないよね


909 名前:デフォルトの名無しさん mailto:sage [2010/03/18(木) 22:06:47 ]
>>908
それはどういうライブラリ使うかじゃないか?

たとえば画像の時は「必ずエンディアンの問題は出てくる」というが,
magick++ みたいなもの使えば「エンディアンを意識しなくてよい」
という状況だと思うけど違う?

910 名前:デフォルトの名無しさん mailto:sage [2010/03/18(木) 22:30:11 ]
>>909
正直議論の意味というか、何にこだわってるのか、何を知りたいのか
全く理解できんのだけど……
magick++を使ったことは無いのでわからんが、まあ、そう言ってしまえば
何だってそうだといえるだろうさ

画像処理で言うと、ファイルフォーマット内のバイトオーダーは
ライブラリによって隠蔽されるケースは多いと思う
が、ライブラリにロードしてもらった32bitラスタ画像のピクセルフォーマットが
ARGBかBGRAか、といったことは、ピクセルを弄る場合には結局必要になるわけだ



911 名前:デフォルトの名無しさん mailto:sage [2010/03/18(木) 22:54:34 ]
picture[y][x].a = 〜
みたいに使えるんでないの?
ロードの処理が重くなりそうだが。

912 名前:デフォルトの名無しさん mailto:sage [2010/03/18(木) 23:01:06 ]
>>911
一瞬意味が分からなかった、その.aはARGBのAか
まあ、そういう実装は可能だろうね
Cだと
PutPixel(point, a, r, g, b)
のような関数ないしマクロを使うんだろう


913 名前:デフォルトの名無しさん mailto:sage [2010/03/18(木) 23:13:43 ]
>>910
画像処理と言ってもライブラリを使える場合もあるから
「必ずエンディアンの問題は出てくる」ということも無いということだよ

magick++ とかを使ってできることをわざわざ車輪を再発明する事もない場合も多いし
具体的にピクセルをどう弄りたいわけ?


914 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 01:45:40 ]
>>913
ああ、要するに「必ず」は言いすぎだろ、という突っ込みか
確かに言い過ぎたね

915 名前:デフォルトの名無しさん [2010/03/19(金) 12:22:01 ]
Windowsでカレントディレクトリを取得する方法を教えてください

916 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 12:36:42 ]
GetCurrentDirectory()

917 名前:デフォルトの名無しさん mailto:sage [2010/03/27(土) 23:45:49 ]
失礼します。
C++を勉強中の初心者です。

ポインタを関数の戻り値する場合は関数内の宣言にstaticをつけなければならないという記述をよく目にするのですが、
以下のようにstaticをつけずにHoge hを宣言しても問題なくプログラムが動き、5が出力されます。どういうことなのでしょうか。

typedef struct{
int k;
} Hoge;

Hoge* func(int a)
{
Hoge h;
h.k = a;
return &h;
}

int main()
{
Hoge* h = func(5);
cout << h->k;
}

918 名前:デフォルトの名無しさん mailto:sage [2010/03/27(土) 23:59:25 ]
>>917
Hoge h がスタック上に作られている場合、関数から帰ってきた
直後は問題ない可能性が高いが、もう1回func()を呼んだり
別の関数を呼んだりすると、おかしくなる可能性がある。

919 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 00:02:59 ]
>>917
動くのはたまたまです
試しに、func(5) のあとに別の関数を呼んでみてください
別の結果になると思います

920 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 00:16:44 ]
なるほど
たしかにおっしゃるとおりの事態が起きました。
ありがとうございます。

あと実はこのことに直接関わるかはわからないのですが、
別のプログラムにおいて、同じように構造体のポインタを戻り値とする関数をつくって内部の宣言をstatic有りと無しどちらも試したところ、
staticをつけた方はmainを抜けるところで停止してしまいます。
関係があるのかどうかよくわかりませんが、もし心当たりがありましたらお教えいただけると幸いです。



921 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 00:23:11 ]
>>920
ソースをcodepadに貼れ
言ってる事がよくわからない

922 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 00:25:57 ]
>>920
そんなことで悩むぐらいならポインタでなく実体を返せばいいと思う

Hoge func(int a)
{
Hoge h;
h.k = a;
return h;
}


923 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 01:30:09 ]
>>922
構造体の配列を返したかったので・・・

すみませんどうやら別のところで引っかかっていたようで、今解決しました。
どうもお騒がせしましてすみません。

924 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 03:13:39 ]
つーか根本的に関数側で確保した構造体のポインタを返すのがキモイ
呼び出し側で(空でいいから)構造体を用意して、そのポインタを関数に渡して、
関数側はその渡されたポインタで構造体の中身を加工する、っつーのが普通だし、
そういう設計ならポインタを返す必要も無いしstaticも要らないし、static無しで
ポインタ返しても別に問題無い
何でそうなるかが分からんようだと辛い

925 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 09:22:50 ]
>>924
関数側で確保した構造体のポインタじゃなくて構造体を返すのもダメ?

926 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 10:41:34 ]
>>924-925
(コピーのオーバーヘッドはおいといて)1個の構造体や、固定長の構造体配列ならそれでもいいんじゃないの?
任意個数の配列をポインタではなく値で返す方法ってのを俺は知らないのだけど、どんなのがある?

>>920
staticつけないのは論外として、つけてもポインタの指し示す先が共有されていることは理解してる?
int *func(int n){
static int a;
a=n;
return &a;
}
int main(void){
int a,b;
a=func(1);
b=func(2);
printf("a = %d, b = %d\n", a, b); /* a = 2, b = 2 */
return 0;
}

927 名前:926 mailto:sage [2010/03/28(日) 10:42:50 ]
ごめ、すっとぼけてた。
int main(void){
int *a,*b;
a=func(1);
b=func(2);
printf("*a = %d, *b = %d\n", *a, *b); /* *a = 2, *b = 2 */
return 0;
}

928 名前:925 mailto:sage [2010/03/28(日) 13:39:27 ]
デザインの問題だけどたとえば何かデータをファイルから読むとか
与えたデータから新しいデータを作るというときに

const vector<double> parseData(double x,vector<double> v,...){
vector<double> v1;
…vector 領域確保して,データを料理してv1に入れる…
return v1;
}
int main(){
...
vector<double> vData(paseData(x,v,...));
}

みたいなのはなぜいかんのかなと思って

void parseData(vector<double>&v1,double x,vector<double> v,...){
…vector 領域確保して,データを料理してv1に入れる…
}
int main(){

vector<double> vData;
paseData(vData,x,v,...);
}

みたいに必ず書かなきゃいかんのかな?(確かに昔Fortranとかはいつもこういう
スタイルだったなぁ)

個人的には前者の方が直感的だけど
簡単のため vector の例にしたけどもちろん自分で定義したデータ class でも同じこと




929 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 13:40:41 ]
コピーが発生したら嫌じゃん

930 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 15:38:13 ]
コピーのコストが問題にならない状況でなら、その手も使った。



931 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 16:47:51 ]
関数内でnewしてshared_ptrで返せばいいよ

932 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 17:06:34 ]
#include <vector>
#include <memory>
#include <iostream>

using namespace std;
using namespace std::tr1;

shared_ptr<vector<double> > parseData(double x){
    shared_ptr<vector<double> > v1(new vector<double>);
    v1->push_back(x);
    return v1;
}
int main(){
    shared_ptr<vector<double> > vData(parseData(1.5));
    cout << vData->at(0) << endl;
}

933 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 20:14:03 ]
何でstatic付けると助かるのかを理解しない限り、いくらでも似たような問題で
引っ掛かると思われ

934 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 20:24:01 ]
#include <iostream>
#include <vector>
using namespace std;

int sum(vector<int> vec){
int ammount = 0;
for(vector<int>::iterator it = vec.begin();it != vec.end(); ++it){ ammount += *it; }
return ammount; } // 2ch行数制限回避
int main()
{
vector<int> v;
v.push_back(1);v.push_back(2);v.push_back(3);
cout << sum << endl; // 表示結果: 6
}
はいいんだけど、sumを
template <class T, T zero> T sum(vector<T> vec)
{
T ammount = zero;
for(vector<T>::iterator it = vec.begin();it != vec.end(); ++it){
ammount += *it;
}
return ammount;
}
にして、main中のcoutの行をcout << sum<int, 0>(v) << endl;にすると
a.cpp:8: error: dependent-name ‘std::vector::iterator’ is parsed as a non-type, but instantiation yields a type
a.cpp:8: note: say ‘typename std::vector::iterator’ if a type is meant
のようになっちゃう。vector<T>::iterator itをT vector::iterator itに変えても
a.cpp:9: error: ‘template<class _Tp, class _Alloc> class std::vector’ used without template parameters
a.cpp:9: error: expected initializer before ‘it’
になっちゃう。
どう対処すればいいんでしょう?

935 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 20:29:52 ]
>>934 ja.lmgtfy.com/?q=error%3A+dependent-name

936 名前:デフォルトの名無しさん mailto:sage [2010/03/28(日) 20:57:05 ]
typename vector<T>::iteratorか。

937 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 20:14:09 ]
test

938 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 20:59:59 ]
個人的にはそろそろ>>928前者のような直接値を返すのも
VC10とかg++ 4.3とかめちゃくちゃ新しいコンパイラならはありだと思うようになってきた。
C++0xのおかげでコピー発生しなくなったから。

939 名前:デフォルトの名無しさん mailto:sage [2010/03/29(月) 22:17:32 ]
それはちゃんと右辺値参照をアレするクラスを書いた時限定じゃないのか
全てライブラリのコンテナに限定するなら構わんだろうけど

940 名前:デフォルトの名無しさん [2010/04/07(水) 05:36:10 ]
error: pointer to incomplete class type is not allowedってどういうことですか?



941 名前:デフォルトの名無しさん mailto:sage [2010/04/07(水) 05:40:42 ]
>>940 そのまんまだろう。

942 名前:デフォルトの名無しさん mailto:sage [2010/04/07(水) 13:16:50 ]
>>940
不透明ポインタあたりでぐぐれ






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

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

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