【初心者歓迎】C/C++室 Ver.59【環境依存OK】

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.50【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1204124447/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm

2デフォルトの名無しさん:2008/03/30(日) 01:53:36
           ____   ,. -‐''"7__,,..-─ァ 
           |::::::`/  /-‐─-='、> ,、
           `ヽ/   `>/  )   ヽ.>|_ヽ/|  _,,..-‐'"´ヽ.
            |/   <     ´)   Y--‐`''"´:::::::::::::::::/i__,,.. - 、
           /|     `>   、_)   | ̄V::::::::: , 、::::::::::::\| ヽ、,.ノ
          /::::|    < l  )     ./___∧::::::くH\:::::::/|-‐'" 
          l__,∧    \      ,イ:;:-‐‐-、__,,.ヽ-、, >:::\|´"'' ー、'"`ヽ
           /:::::ヽ、  __,>ー-‐<__フ   r'´    i:::::::/|    |  ノ 
            ̄ ̄ヽ、    ー‐-‐< !、   ゝ__,,..-<::::::\/___,,..-‐''" 
                `ヽr-、..,,_____,,.>フ` ̄|´ヽ.    ヽ:/      
                       く/   /|  |
                        \/ \/

     _____                   ___     ____          ___   ___
   / ____/ /´ ̄|    / ̄l  /´ ̄/  /___/     /____/ l ̄l  / ̄/ /___/ /__  \
  / /       .  ̄ ̄     ̄    ̄ ̄   ___              ̄    ̄  ___     /  /
  \ \_l ̄/  /´ ̄ ̄ |  /´ ̄ ∨ ̄ ̄/ / __/    / ̄/  / ̄/  | ̄∨ ̄/  / __/ / ̄ ̄ /
   \_  /  / / ̄|  | /  /l   /|  / / /___    /  /_/  /   |     /  / /___  /  /\ \
      / /  /__/   |_|/,_,/ |,_,/ |,_/ /___/   /____/    | __/  /___/ /_/   \ \
   .  / / / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\ \ \
      ̄   ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄    ̄
3デフォルトの名無しさん:2008/03/30(日) 01:59:08
し、死んでる・・・
4デフォルトの名無しさん:2008/03/30(日) 02:01:37
(・ω・`)乙 ←ポニーテール
5デフォルトの名無しさん:2008/03/30(日) 03:00:43
正直、番号なんてどうでもいいよな。
6デフォルトの名無しさん:2008/03/30(日) 03:20:29
Ver+=9になっとるがな。
7デフォルトの名無しさん:2008/03/30(日) 03:27:06
>>1


GUIアプリ作りたいけど……中々そこまで勉強が進まない。
delphiとかrubyの方がいいんでしょうかな。
8デフォルトの名無しさん:2008/03/30(日) 03:35:17
>>1
乙だけど次は54くらいに戻そうぜ もしくは60-6あたりで。

>>7
楽にやるならGUIでrubyは無い気がするが…
delphiは少し古くなってきているのでC#あたりがおすすめ
9デフォルトの名無しさん:2008/03/30(日) 09:15:28
08/02/05-08/02/20
【初心者歓迎】C/C++室 Ver.48【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1202141921/

08/02/20-08/02/27
【初心者歓迎】C/C++室 Ver.49【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1203478421/

08/02/28-08/03/14
【初心者歓迎】C/C++室 Ver.50【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1204124499/

08/03/14(3レスのみで終了)
【初心者歓迎】C/C++室 Ver.51【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1205496128/

08/02/28,08/03/14-08/03/30
【初心者歓迎】C/C++室 Ver.50【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1204124447/

スレッド移行としてはこんな流れみたいなので、前スレが Ver.51相当、今スレは Ver.52 相当と見なせば良さそうだけどね。
101:2008/03/30(日) 09:29:03
ごめん、こんなに大変なことになるとは…
軽い気持ちで59にしてしまったばかりに、、、、
俺がこのスレの最後にまた出てきて責任をもって次はVer 53を立てろと言うよ。
11デフォルトの名無しさん:2008/03/30(日) 10:38:16
大丈夫。バージョンなんてただの飾りです。
12デフォルトの名無しさん:2008/03/30(日) 10:53:17
大変なことにはなってないから、気にすんなw
13デフォルトの名無しさん:2008/03/30(日) 12:09:59
もしくは59にたどり着くまで保守してくれればおkwww
14デフォルトの名無しさん:2008/03/30(日) 14:18:20
>>8
thx。そうか、delphiは古いか。
やっぱスタジオゲットしたほうがいいな。
15デフォルトの名無しさん:2008/03/30(日) 16:27:35
C++で、演算子の多重定義というところの問題で詰まってます
「operatorを使って、++x、x++をクラス型のオブジェクトに適用できるようにしました
では、前置演算子関数から後置演算子関数を呼び出すか、またはその逆にして、スマートにしたものを作れ」
という問題です

メインのプログラムで呼び出すときに
++x は x..operator++()
x++ は x..operator++(0)
と解釈されるとあります
しかし、前置関数、後置関数の区別の方法がどうにも理解できません
前置に後置を入れると、そもそも引数を受け取らない関数から、どうやって受け取る関数を実行させるのか
またはその逆がどうやったらできるのか
実際に思いついたのはこんなものです
Counter& operator++() {
Counter x = *this;
if(cnt < UINT_MAX) cnt++;

if(t != 0) {
Counter y; y = x; *this = y; }
return *this; }
関数を呼び出してないし、実際にコンパイルしてみると、左辺値が必要というエラーで失敗します
解法をおしえていただけないでしょうか
16デフォルトの名無しさん:2008/03/30(日) 16:36:17
tってなんだよ
17デフォルトの名無しさん:2008/03/30(日) 16:39:55
いきなり答えを出していいのか。

前置インクリメントは普通に定義した上で、
こういう風に前置インクリメントを使う後置インクリメント演算子関数をクラスのメンバとして作る。
無理にメンバにする必要もないけど。
Counter operator ++(int)
{
  Counter x = *this;
  ++*this;
  return x;
}
18デフォルトの名無しさん:2008/03/30(日) 16:58:27
>>16
いや引数をどうにかしようとおもって、後置で0が入れられるなら、前置は何も入らない!とおもってやった名残です
つまり消し忘れなのです

>>17
*thisの++がoperator++()ということですかなるほど
実行できました
ありがとうございました
19デフォルトの名無しさん:2008/03/30(日) 17:08:48
C++ で2次元配列へのポインタ返したいときにどういう風に記述すればいいのでしょうか。
例えば、以下の関数で???の部分はどのような記述になりますか。

??? getArray(){

const int ary[ ][5] = {
{1, 1, 1, 1, 1 },
{1, 1, 1, 1, 1 },
{1, 1, 1, 1, 1 },
{1, 1, 1, 1, 1 },
{1, 1, 1, 1, 1 }
};

return ary;
}

また受けて側では
どのように取得すればいいのでしょうか。

20デフォルトの名無しさん:2008/03/30(日) 17:16:24
>>19
・配列を返すことはできない。
・ローカル変数のアドレスを返すことはできない。
従って、こんなもんかな。
const int (* getArray())[5]
{
static const int ary[ ][5] = {
{1, 1, 1, 1, 1 },
{1, 1, 1, 1, 1 },
{1, 1, 1, 1, 1 },
{1, 1, 1, 1, 1 },
{1, 1, 1, 1, 1 }
};

return ary;
}

int main()
{
const int (* a)[5] = getArray();
return 0;
}
尤も、これが正解かどうかは別の問題。
2119:2008/03/30(日) 17:26:25
>>20
ありがとうございます。
実は実際のソースでは、2次元配列はクラスのprivate static const なメンバ変数なのですが
クラスの外からアクセサを使ってアクセスしたいのです。
その場合の記述も上記のようなものになるのでしょうか。
22デフォルトの名無しさん:2008/03/30(日) 17:28:01
だったら参照でいいんでない?
2319:2008/03/30(日) 17:48:38
>>22
すいません。2次元配列への参照を戻す関数の宣言は
どのように書けばいいでしょうか?
24デフォルトの名無しさん:2008/03/30(日) 17:49:30
こんばんは。今月、C++を始めたばかりの初心者です。
お勧めの入門書・参考書があれば教えてください。
25デフォルトの名無しさん:2008/03/30(日) 18:20:55
>>23
const int (& getArray())[5][5] const {...; return ary;}

const int (& a)[5][5] = ....getArray();
26デフォルトの名無しさん:2008/03/30(日) 18:21:16
>>24
初心者スレか書籍スレへ。
2719:2008/03/30(日) 18:32:02
>>25
ありがとうございます。
ややこしいですね・・・
28デフォルトの名無しさん:2008/03/30(日) 18:34:43
>>24
ないのでお帰りください。
29デフォルトの名無しさん:2008/03/30(日) 18:41:35
>>24
Cが理解出来ればC++は根性で分かる
クラス、派生、オーバーライド、演算子のオーバーライドとかね。
あんなもん構造体のラッパー
STL、テンプレートは知らんでも何とかなる

C++勉強中に.NetのC++をmanagedでやると
永遠に理解出来なくなると思われ。
30デフォルトの名無しさん:2008/03/30(日) 18:52:45
>>29 こいつ初心者だな・・・
31デフォルトの名無しさん:2008/03/30(日) 19:01:37
>>30
・・・まじ???
自称「C++得意です」なんですけど…
32デフォルトの名無しさん:2008/03/30(日) 19:15:44
テンプレート自分で書くかはともかく、STL使わないC++ってもはや全く想像できないなぁ。
まあ、俺もCから移った直後は>>29みたいなノリだったんだけどね。
「STL? なにそれおいしいの?」「テンプレート? つかわねーよhahaha!!」って。
33デフォルトの名無しさん:2008/03/30(日) 19:17:07
STLとtemplateがないC++なんぞ使いたくない
3419:2008/03/30(日) 19:19:15
わけわかめなエラーが出て困ってます。助けてください。
たとえば"error C2143: 構文エラー : ';' が '<cv-qualifer>' の前にありません"などです。
開発はVS2008で行っています。

class Map{

public:
virtual const int (& getMap())[1000][1000] const = 0;

};

class FirstBasement : public Map{

private:
static const int floor[30][30];

public:
// 地図の状態を返す
virtual const int (& getMap())[30][30] const;

};

const int (& FirstBasement::getMap())[30][30] const{

return FirstBasement::floor;
}
35デフォルトの名無しさん:2008/03/30(日) 19:23:11
>>34
constの位置が違う。
virtual const int (& getMap() const)[1000][1000] = 0;
36デフォルトの名無しさん:2008/03/30(日) 19:28:29
typedef使ったりboost::multiarray使ったほうが可読性が高まると思うが
3719:2008/03/30(日) 19:29:05
>> 35
うまくいきました。ありがとうございます。
ただ配列の大きさも同じでないとオーバーライドできないのですね。
3819:2008/03/30(日) 19:31:08
>>36
boostはまだ知らないのですが、typedefはそうですね。
こういう時にこそ、使うべきですよね。勉強になります。
39デフォルトの名無しさん:2008/03/30(日) 19:31:43
自分は趣味でやってるだけだけどCで書こうとするとSTLないから倍の時間がかかるよ。
C使いこなせる人尊敬するわ
40デフォルトの名無しさん:2008/03/30(日) 19:34:11
CとC++の中で最も優先して勉強するのはSTLと思う 
41デフォルトの名無しさん:2008/03/30(日) 19:37:08
>>37
配列型は要素数が違えば別の型。

型が違えばオーバーライドにならない。
戻り型と違う型はreturnできない。
なんだか難儀しそうだね。
42デフォルトの名無しさん:2008/03/30(日) 19:39:30
34なんて全然分からんw強引にキャストする所だったw
配列はついついポインタにキャストするからなぁ

>>39
Cだとクラス間の上下関係無いから、いつでもどこでも呼び出せて楽じゃない?
メンバにstaticつけた瞬間に敗北した気がする。
classやらの基本構文書いて15分、とかイライラする。
Cならいきなり呼び出せるのに、て思うとね〜

というか、Cから入ってC++使う機会が少なかったから
脳内でクラス構造が上手に作れないらしいw

STLよりANSIライブラリの方が手軽で使い易いし覚え易いし・・・
43デフォルトの名無しさん:2008/03/30(日) 20:08:44
>>42
ウン百万行ってソースを担当すりゃわかるようになる。
>いつでもどこでも呼び出せて楽
楽だからスパゲッティーが生まれやすくなる。
44デフォルトの名無しさん:2008/03/30(日) 20:17:50
そうだな。設計とは制限することだと言うし。
45デフォルトの名無しさん:2008/03/30(日) 20:26:15
厳密にアクセスの流れを制限することが売りというか
オブジェクト指向のキモというか

従来どおりにやろうとするなら単なるオーバーヘッドの増加でしかないようなw
46デフォルトの名無しさん:2008/03/30(日) 20:27:16
まぁ趣味でやる程度の規模ならCでも全然問題ない気がする
47デフォルトの名無しさん:2008/03/30(日) 20:30:07
29=42は超初心者 
48デフォルトの名無しさん:2008/03/30(日) 20:39:37
string("hagehage");

って、Cスタイルキャストですか?コンストラクタ呼んだことになってますか?
49デフォルトの名無しさん:2008/03/30(日) 20:41:57
>>42
いつでもどこでも呼び出せるようにして、良いんじゃない?
俺は良いと思うよ。STLは使うことを進めるけど。

オブジェクト指向もC++で扱えるパラダイムの一つに過ぎないからね。

ラムダ万歳。
50デフォルトの名無しさん:2008/03/30(日) 20:42:48
>>48
コンストラクタ。
51デフォルトの名無しさん:2008/03/30(日) 20:47:59
>>50
ありがとうございます。
いままで
static_cast<string>("hagehage");
って書いてたんですが、今度から>>48ですませることにします。
52デフォルトの名無しさん:2008/03/30(日) 20:59:35
>>51
状況によるだろうけど、それ書く機会少なくない?
明示しなくても変換(コンストラクタが選択)されるよ。
   void f(const std::string& s);
   f("aaa"); //OK
   std::string s = "aaa"; //OK
5325:2008/03/30(日) 21:03:40
>>19
ゴメン、constの付け所を間違えた。
やはりあれだな、>20が真実を語っていたな。
54デフォルトの名無しさん:2008/03/30(日) 21:07:04
下の"移動アルゴリズム", "移動可能かチェック"で以下のようなエラーが出るんですが
何が悪いのでしょうか。

エラー 1 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません d:\root\gamecreation\rpg\movestrategy.h 17 RPG
エラー 2 error C2143: 構文エラー : ',' が '&' の前にありません。 d:\root\gamecreation\rpg\movestrategy.h 17 RPG
エラー 3 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません d:\root\gamecreation\rpg\movestrategy.h 21 RPG
エラー 4 error C2143: 構文エラー : ',' が '&' の前にありません。 d:\root\gamecreation\rpg\movestrategy.h 21 RPG

#include "Map.h"
#include "EDirection.h"
#include "DxLib.h"

namespace hogehoge{

class MoveStrategy{

public:
// 仮想デストラクタ
virtual ~MoveStrategy();

// 移動アルゴリズム
virtual EDirection Move(const Map& map) const = 0;

protected:
// 移動可能かチェック
virtual bool IsMovable(const Map& map, const int& direction) const;

};

}
55デフォルトの名無しさん:2008/03/30(日) 21:09:35
>>52
えっと、メンバのreplace使う時とかで、リテラルの長さがほしくてstringに入れる場合、つまり
str.replace(str.find("あ"),(string("あ")).length(),string("い"));
こういう場面とか、文字列を+でつないでいく、たとえば
str = "my name is " + name + "\n"; // エラー
str = string("my name is") + name + string("\n");
こういう場面みたいな時です。
56デフォルトの名無しさん:2008/03/30(日) 21:19:20
>>54
Mapが定義されて無いんじゃね?

>>55
それならおk。
57デフォルトの名無しさん:2008/03/30(日) 21:26:00
>>55
見逃してた。stringへの+も明示する必要ないから
string("\n") は "\n" だけで良いよ。

str = string() + "my name is" + name + "\n";
でもおk。
58デフォルトの名無しさん:2008/03/30(日) 21:27:50
>>56
ありがとうございます。解決しました。
確かにMapがおかしかったです。
原因はMapで純粋仮想関数ではなく、ただの仮想関数を宣言していただけなのに
その定義を持っていなかったことでした。
59デフォルトの名無しさん:2008/03/30(日) 21:36:52
>>57
>str = string() + "my name is" + name + "\n";
わーお(`・ω・´)いろいろありがとうございます。
60超初心者29=42:2008/03/30(日) 21:39:35
>>43
ン百万行・・・
いいとこ10万行ぐらいだな、触ってたのは

ン百万のソースを触るなんてオープン系の人?(´・ω・`)??

PCアプリでン百万行たって、
モジュール化進んでるからン百万だろうが怖くないしな

名前空間なんかイラネの世界で生きて来たからな〜w

Cだとヘッダ単位でモジュール化したりするモンだが。。
規模が違うんだろうな〜〜。。。。
61デフォルトの名無しさん:2008/03/30(日) 21:45:24
モジュール化?なにそれ?なスパゲッティコードを君にプレゼントしよう
62デフォルトの名無しさん:2008/03/30(日) 21:49:29
規模が大きくなってくると、人員の質にバラ付きがでてくるのさ
6354:2008/03/30(日) 21:50:15
ちょっと教えてください。
以下のようなクラス宣言があります。
#include "Player.h"
#include "Enemy.h"
#include "Map.h"
#include <vector>
namespace hogehoge{
/**********************************
* 概要: 地図の振る舞いを管理する *
**********************************/
class Map{
public:
static const int CHIP_SIZE = 15;
protected:
Player* player;
//std::vector<Enemy> *enemy;
public:
// コンストラクタ
Map();
//仮想デストラクタ
virtual ~Map();
// 地図を表示する
virtual void Display() const = 0;
// 地下1階への状態を返す
virtual const int (& getMap() const)[30][30] = 0;
};
}
6454:2008/03/30(日) 21:51:09
この場合以下のエラーが大量に出てしまいます。
エラー 1 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません d:\root\gamecreation\rpg\movestrategy.h 17 RPG
エラー 2 error C2143: 構文エラー : ',' が '&' の前にありません。 d:\root\gamecreation\rpg\movestrategy.h 17 RPG

ここから#include "Enemy.h"を取ると、エラーなくコンパイルできます。
Enemy.hは以下のようになっています。
#include "Map.h"
#include "EDirection.h"
#include "DxLib.h"
namespace hogehoge{
class MoveStrategy{
public:
// 仮想デストラクタ
virtual ~MoveStrategy();
// 移動アルゴリズム
virtual EDirection Move(const Map& map) const = 0;
protected:
// 移動可能かチェック
virtual bool IsMovable(const Map& map, const int& direction) const;
};
}
上のエラーはどういう意味なのでしょうか。
65デフォルトの名無しさん:2008/03/30(日) 21:52:20
>>60
同じ同じ。
言語のサポートが優位な点だけど、
大枠でのプログラム層なアーキテクチャはC,C++で左右されないと思うよ。
66デフォルトの名無しさん:2008/03/30(日) 22:01:25
>>54

>型指定子がありません - int と仮定しました
コンパイラ:「const Map」がよく分からないので、「const int Map」だと考えますね

>',' が '&' の前にありません
コンパイラ:「const int Map&」、なんか変数名のあとに「&」が出て来たんですけど
6766:2008/03/30(日) 22:04:46
一応補足。
2つ目のエラーは、1つ目の仮定のせいで発生してるってことね。
6829=42超初心者:2008/03/30(日) 22:07:33
>>66
Map ってクラスが入れ子になってるからじゃないの?
ヘッダの相互参照になってる

enemy.h の頭に
class Map;

ての入れてコンパイル通らない?
もしくは cpp 内のみにヘッダ参照宣言入れて、ヘッダ内からの include
やめるとか
MS VC ならエラー行間違えない筈なんだけどな

すげー適当に答えてるけどw


>>61
>>62
共同作業でのプログラミング経験ほとんど無いんで〜
他人の綺麗なコードをスパゲティにした事なら何度もあります。未だバレてませんヨ、HAHAHA
6954:2008/03/30(日) 22:18:50
>> 66, 68
ありがとうございます。

class Map;
class MoveStrategy{
};

class Map;
class Enemy{

};

とすると、エラーはごっそり減ったのですが、まだ以下のようなエラーが残ります。
エラー 1 error C2061: 構文エラー : 識別子 'MoveStrategy' d:\root\gamecreation\rpg\enemy.h 16 RPG

ヘッダの相互参照というのは
#ifndef をしていたら、必ず防げるものではないのですか?
70デフォルトの名無しさん:2008/03/30(日) 22:28:30
class A{
  B b;
};
class B{
  A a;
};

要はこれと同じ状態。前方宣言でも回避できない。これも
class A{
  A a;
};
という問題に帰着できるから分かるだろ
7129=42超初心者:2008/03/30(日) 22:32:18
>>69
無理かと

#include "map.h"
#include "Enemy.h"
の2行は次の形に展開される

class Map {
... void ( Enemy *pEnemy );     <= ★注意★class Map 宣言より上に class Enemy 宣言が無い
}                                 この時点でコンパイラは class Enemy の情報を持たないのでエラー
class Enemy {
... void ( Map *pMap );
}
となり、エラー

だから #include が展開された時に

Enemy.cpp :
 class Map;
 class Enemy {
  ... void ( Map *pMap );
 }

Map.cpp :
 class Enemy;
 class Map {
  ... void ( Enemy pEnemy );
 }

にするのが手っ取り早い
VC 使ってるなら #pragma once 使った方がコードスッキリするよ
72デフォルトの名無しさん:2008/03/30(日) 22:32:45
ゲームのように扱うデータが多かったりすると
必然的にコード量は増えるし、オブジェクト指向も取り入れるんだろう。

制御屋だとシステムの大きさに比例してでかくなるけど
担当も細分化されて、一人で担当するところはそれほどでもないね。
安全に関わるから。
7329=42超初心者:2008/03/30(日) 22:40:43
>>72
エミュレータ使ってもバグ取れないなんてザラだからねぇ・・・
ブレークポイント張りずらいし

組込み系だとC++コンパイラが無いこと多い
ミドルウェアでC以外のもの見た事ないし。
linuxのほとんどのコアソースがCでなのも傍証してる(ソースが古いのも一因)

gccだけはブレークかけても、どこがバグなのかさっぱり分からん(´・ω・`;;;)
モジュール化の概念はドコ行っても同じかも
74デフォルトの名無しさん:2008/03/30(日) 22:42:58
最近は組み込みもC++にシフトしてるよ
例外とかメモリ確保とか制限は多いけど
7554:2008/03/30(日) 22:43:31
>>70, 71
一応上のエラーは,これも class MoveStrategy; を追加することで消えました。
有益な情報ありがとうございます。
この問題に関して不案内なところがあるので、もう少し勉強してみます。
76デフォルトの名無しさん:2008/03/30(日) 22:51:40
>C++コンパイラが無いこと
そこでcfrontですよ
77デフォルトの名無しさん:2008/03/30(日) 23:06:52
日立のやつはC++使えるよね
PCみたいにはいかないけど。
78デフォルトの名無しさん:2008/03/30(日) 23:17:00
組込みでmallocに頼るのがどうも・・・
1週間後にフリーズ>再起動したら直りました、で
原因がmallocじゃどうにもならないしな〜。
RAMの必要量が予想出来ないしなぁ。。。

C++の展開命令見ると何書いてあるか分からないしなぁ
Cならまだしも。
79デフォルトの名無しさん:2008/03/30(日) 23:49:40
Templateの諸機能が動的に実装してある
80デフォルトの名無しさん:2008/03/31(月) 06:05:05
すみません。質問させて下さい。XP+VC++ 9.0です

【やりたいこと】 データファイルを読み込んで、ダイクストラ法を使って最短ルートを求める

【条件】
ノードは可変数個、コストは全て正の値、スタートノード及びゴールノードは
dijkstra.exe -start_node -goal_node のようにプログラム開始時に与える。

【何が分からないのか】
可変数個のノードや、エッジがどのノードに向かって延びているか、
かかるコストはいくらか等のデータをどのようにデータファイルに格納するか、データファイルの構造決定。
データファイルの構造が決定したとして、どのように可変数個のデータを読み込むか、
どうやってデータの終わりを探すか。ファイルからデータを読み込んだとして、データの整合性を
どのように検証するか。

分からないことばかりですが、誰かヒントだけでも教えて下さい。宜しくお願いします。
81デフォルトの名無しさん:2008/03/31(月) 06:25:26
>>19
亀レスだけど、typedefするのも1つの手。

typedef int IA_5[5];
IA_5 array[3] = {{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15}}; // == array[3][5]
IA_5* func(){ return array; }

int main()
{
IA_5* p = func();
for(int i = 0; i < 3; ++i){
for(int j = 0; j < 5; ++j) cout << p[i][j] << " ";
cout << endl;
}
return 0;
}
82デフォルトの名無しさん:2008/03/31(月) 06:37:54
>>80
可変個のデータ読み込みは、非常に基礎的で、ダイクストラ法と関係ないですよ
それをまず出来るようになって下さい
83デフォルトの名無しさん:2008/03/31(月) 06:38:58
>>80
C++でも良いんですか? もし良ければSTLを使ってノードを管理すると簡単と思います
84デフォルトの名無しさん:2008/03/31(月) 06:57:59
>>82-83

レスありがとうございます。私の修行が足りないようで、お恥ずかしい限りです。
勉強して理解を深めてからもう一度出直してきます。スレ汚してすみませんでした。
85デフォルトの名無しさん:2008/03/31(月) 07:23:05
すこし作ったよ

#include <vector>
#include <iostream>
#include <set>
using namespace std;

class node {
public: unsigned int dis,ver;
node(){ ver=dis=-1;}
node(unsigned int i, unsigned int d){ dis=d; ver=i; }
bool operator < (const node &x) const { return (dis<x.dis); }
};

typedef set<node> vertex;

main(){
vector< vertex > g; //グラフの定義
g.push_back(vertex()); //頂点追加
g[0].insert(node(1,3)); //辺と距離の追加
g[0].insert(node(2,5));
g[0].insert(node(3,2));
vertex::iterator p=g[0].begin(); 
cout<<(p->ver); // 最も短い距離の頂点を出力
}
86デフォルトの名無しさん:2008/03/31(月) 11:15:09
VC++2008EEで勉強中なのですが、
いろんなサイトの見よう見まねで下記ソースを試してみたところ
ビルドして一瞬ウィンドウが出て終わってしまいます。
これはreturn 0のせいかと思って、return 0を消しても
やはり一瞬で終わってしまいます。
どうすれば終了しないでコマンドプロンプトのような画面で
文字が確認できるようになるのでしょうか。

#include <iostream>
int main(void){
using std::cout;
using std::endl;
int a;
int &alias = a;
alias = 100;
cout << "a = " << a <<endl;
cout << "alias = " << alias <<endl;
return 0;
}

87デフォルトの名無しさん:2008/03/31(月) 11:32:42
getchar();
return 0;
88デフォルトの名無しさん:2008/03/31(月) 11:41:03
>>87
ありがとうございます!ようやく確認できるようになりました。
キーボード入力待機状態にして止めるんですね。
勉強になりました。
89デフォルトの名無しさん:2008/03/31(月) 11:41:05
Ctrl + F5
90デフォルトの名無しさん:2008/03/31(月) 11:45:24
>>89
デバッグなしでビルドというのでも止まるんですね。
ありがとうございます。
C言語はいろいろ解らないことばかりで非常に助かります。
91デフォルトの名無しさん:2008/03/31(月) 11:48:00
>>86
コマンドプロンプトで実行するか、>>87
92デフォルトの名無しさん:2008/03/31(月) 12:04:44
>>90
それらはCの知識ではない。Windowsの使い方の知識とVisualStudioの使い方の知識だ。
93デフォルトの名無しさん:2008/03/31(月) 12:36:21
>>84
Boostのグラフライブラリを使う
94デフォルトの名無しさん:2008/03/31(月) 14:10:05
http://builder.japan.zdnet.com/sp/c-programming-language/story/0,3800083430,20370255,00.htm
ポインタの勉強をしているのですがサンプルのコードを動かしてみたところうまくいきません
95デフォルトの名無しさん:2008/03/31(月) 14:13:24
もうアパートを探すのはつかれたよ。
はやくプログラミングしたいよ。

96デフォルトの名無しさん:2008/03/31(月) 14:20:17
>>94
コメント欄がすごいことにw
97デフォルトの名無しさん:2008/03/31(月) 14:23:25
>>94
もうこの人終わりだなw
98デフォルトの名無しさん:2008/03/31(月) 14:28:30
int *n;
*n = 5; /* ポインタ変数nに値5を代入 */

初期化もポイントする先も決めてないポインタをそのまま使うのって非常に不味いよねぇ
自分ははじめにポインタの初期化を必ずするよう教わったがなぁ
99デフォルトの名無しさん:2008/03/31(月) 14:40:39
>>96>>97
あー、前スレで話題になった奴か。
エピステーメーにまで指摘されていたのに未だに記事の修正が入らないのね。
編集がコメントなにやらゴミを書いているけどそんなものは記事の修正とは認められないし。
この程度のコメントじゃZDNETとしても著者としても痛くも痒くもないのでしょ。
100デフォルトの名無しさん:2008/03/31(月) 14:46:23
>>99
もしや本人さま(えぴさん)で?
101デフォルトの名無しさん:2008/03/31(月) 14:48:48
どうなるか、サンプルソースをコンパイルして実行してみたら思った通り以上終了w

フォールト ->00401007 c70005000000 mov dword ptr [eax],0x5 ds:0023:00000001=????????
だってさ。

*n = 5: の部分かな。エラーがソース乗せちゃまずいでしょw
102デフォルトの名無しさん:2008/03/31(月) 14:49:42
× エラーがソース乗せちゃまずいでしょw
○ エラーがでるソース乗せちゃまずいでしょw
103デフォルトの名無しさん:2008/03/31(月) 14:54:00
>>101
コンパイラにもよるんじゃね?
いや、試してないけど
104デフォルトの名無しさん:2008/03/31(月) 14:55:06
見てないけどエラーを修正しなさいって問題なんだろ
105デフォルトの名無しさん:2008/03/31(月) 14:56:59
あんまり往生際悪いんで吹いたww
106デフォルトの名無しさん:2008/03/31(月) 14:57:20
「動くけど危険」とかいう話じゃなくて「動かない」コードだろ、これは
107デフォルトの名無しさん:2008/03/31(月) 14:59:25
>>101
必ずしも 異常 終了するとは限らない
ポインタの指す先による

>>106
場合によっては動くコード
108デフォルトの名無しさん:2008/03/31(月) 15:03:01
最適化をオフにして次のコードを実行すると…
勘弁してほしいタイプのバグ

#include<stdio.h>

void hoge(void){
static int a=5;
int *n=&a;
printf("a=%d\n", a);
}

void huga(void){
int *n;
*n=100;
}

int main(void){
hoge();
huga();
hoge();
return 0;
}
10999:2008/03/31(月) 15:13:55
>>101
落ち着け。「以上終了」になっているぞw

>>100
勘弁してくれ。一緒にされたらそれはそれで迷惑だ。
もし私がエピたんなら、自分のブログでネタにしているよ。
いや、それだと本人が書いていたら拙いな。
……と思って検索したら、やっぱり書いていたかw
で、ついでにうろついたらまぁ、他にも釣れた罠。
110デフォルトの名無しさん:2008/03/31(月) 15:21:40
επιστημηってプログラム系の掲示板でよく見かけるけどなんの人なの?
111デフォルトの名無しさん:2008/03/31(月) 15:30:11
掲示板でよく見かけるヤツは偽者
自称C++のちょっと偉い人
112デフォルトの名無しさん:2008/03/31(月) 15:31:34
C++の黎明期からC++に関わってきた人。
かといって、C++の隅から隅まで知っているわけではなくて、
Boostのコミッタというわけでもなくて、
意外に中途半端な立ち位置な気がするお人。

でも、俺より知識も経験もあるのは確実。
113デフォルトの名無しさん:2008/03/31(月) 15:32:34
魚拓とっておこうと思ったら既に3つも取られてたw
114デフォルトの名無しさん:2008/03/31(月) 15:33:23
エイプリルフールは明日だ
115デフォルトの名無しさん:2008/03/31(月) 15:36:26
なんか冒頭に追記が

> 現在、本稿には技術的観点から異議が多数寄せられているため、詳細をレビュー中です。
> 初めてご覧になる方は、コメント欄もあわせてお読み下さい。
> また、読者の皆様には引き続き、コメントなどでご意見を頂けましたら幸いです。

そんな大層なレベルの話なのか…?
116デフォルトの名無しさん:2008/03/31(月) 15:39:40
>現在、本稿には技術的な誤りが存在するため、詳細をレビュー中です。
>初めてご覧になる方は、コメント欄もあわせてお読み下さい。
>また、読者の皆様には引き続き、コメントなどでご意見を頂けましたら幸いです。

厳しくなったw
117デフォルトの名無しさん:2008/03/31(月) 15:44:52
初心者にとってポインタの概念ってそんなに躓きやすい物なのか?
ポインタの基本的な部分で苦労したことがないのでそこら辺が不思議だ
118デフォルトの名無しさん:2008/03/31(月) 15:45:30
>>94
おい。間違えて「記事推薦者になる」ってとこクリックしちまったぞ。
どうやって取り消すんだ。おい。教えろ。
119デフォルトの名無しさん:2008/03/31(月) 15:50:36
>>117
昔教える立場にあったことがあるが、何でかしらんが分かる奴と分からん奴がいて、
分からん奴はいくら教えてもなかなか理解してくれん。
メモリってのがリニアな空間で位置や距離の概念があることを理解できないらしい。
120デフォルトの名無しさん:2008/03/31(月) 15:55:35
番地とか分かりやすいものに例えればいいんじゃね?
121デフォルトの名無しさん:2008/03/31(月) 15:56:25
>>118
ワロヌ
122デフォルトの名無しさん:2008/03/31(月) 16:00:32
>>117
俺もそうだけど、アセンブラから入ると、「ポインタが分からない」と言う人がどう分からないのか分からない
新人に教えるときなんかにとても苦労する
123デフォルトの名無しさん:2008/03/31(月) 16:07:17
変数:戸棚
値:ケーキ
ポインタ:「戸棚にケーキがあります」という母ちゃんの置き手紙
124デフォルトの名無しさん:2008/03/31(月) 16:09:03
>>123
訳わからんw
125デフォルトの名無しさん:2008/03/31(月) 16:17:56
>>123
戸棚の場所が書いてあるメモ、なんじゃね?
126デフォルトの名無しさん:2008/03/31(月) 16:25:27
変数: 箱や器のようなもの
値: 箱にいれる何か
ポインタ: 箱が置いてある場所を書いてあるメモ

みたいな解釈でいいんだろうか?
ポインタを正しく理解できてるか自分でもよくわからん。
127デフォルトの名無しさん:2008/03/31(月) 16:25:38
ケーキを食った後置き手紙を始末しないと後の人が迷惑するという話か
12899:2008/03/31(月) 16:31:08
いや、置き手紙はそのままで戸棚に「中身は俺の腹の中」って書いておくんだろ。
129デフォルトの名無しさん:2008/03/31(月) 16:38:46
JAVAの本を書いている人みたいだけど、
これほどポインタの概念がわかってなくても
使えるのか、JAVAって。
ある意味うらやましいかも。
130デフォルトの名無しさん:2008/03/31(月) 16:45:21
>>128
そして後から置き手紙を読んだワカメが大激怒
131デフォルトの名無しさん:2008/03/31(月) 16:45:51
>>129
でも、ポインタも理解できないような人が書いたJavaのコードって、やっぱりどこか危なげなんじゃないかね
132デフォルトの名無しさん:2008/03/31(月) 16:47:44
>>130
Access Violationのメッセージボックスのアイコンに、ワカメの顔が表示されるとこ想像した。
133デフォルトの名無しさん:2008/03/31(月) 16:52:23
>>129
それらの本も、もしかすると同じようにでたらめな知識に基づいて書いてるんじゃないかと疑わざるを得ない気がする。
134デフォルトの名無しさん:2008/03/31(月) 17:06:45
>>131
参照がBoostのスマートポインタと同じようなもので
理解できない人は怪しいコードいっぱい書くことに
135デフォルトの名無しさん:2008/03/31(月) 17:11:39
(Javaの)参照がBoostのスマートポインタと同じようなものってこと?
なんで*Boostの*って制限を設けるか理解しかねるけど、
Javaの参照はポインタそのものと同じようなもので、
それに加えて参照されなくなってからは回収される可能性があるだけ。
C++でのスマートポインタはローカルに限れば基本的にスコープを抜けた時点で回収されるから、
JavaのGCとは少し違う。
136デフォルトの名無しさん:2008/03/31(月) 17:17:49
自分の知らないところでチョコチョコされる行動まで把握しないといけないのは面倒だが

かといって自分で何もかも把握して処理するのも面倒

なかなかバランスが難しいのねぇ
137デフォルトの名無しさん:2008/03/31(月) 17:20:59
個人的にはRAIIは気に入ってるというか、いい方法だと思うんだけどなぁ。
もっとC++成分を取り入れたJavaライクな言語とかあればうれしいんだけど。
138デフォルトの名無しさん:2008/03/31(月) 18:07:30
それならDを試してみてはどうだろう。
139デフォルトの名無しさん:2008/03/31(月) 19:35:48
Dは頭の悪そうな言語名だから使いたくない。
140デフォルトの名無しさん:2008/03/31(月) 19:38:06
頭の悪い人程そういうことを気にするもんだな。
141デフォルトの名無しさん:2008/03/31(月) 19:39:18
予想通りのレスだな。
142デフォルトの名無しさん:2008/03/31(月) 19:44:39
>>139
豆腐屋っぽいよね
143デフォルトの名無しさん:2008/03/31(月) 19:47:25
D は使って欲しかったらまず言語仕様を安定させて欲しい。
144デフォルトの名無しさん:2008/03/31(月) 19:51:40
python + cpp + java = D (という予定)
145デフォルトの名無しさん:2008/03/31(月) 20:04:37
C++にもっさり毛が生えたのがD
146デフォルトの名無しさん:2008/03/31(月) 20:11:27
D1.0は仕様確定したよ。
147デフォルトの名無しさん:2008/03/31(月) 20:13:03
2.0 へ移行することになったときに
仕様が違いすぎて大変なので面倒くさい。
148デフォルトの名無しさん:2008/03/31(月) 21:44:25
>>126
違うよ。
値は数値とか文字列とかの事で、変数は値につける名札で、ポインタは値がアドレスの変数の事だよ。
149デフォルトの名無しさん:2008/03/31(月) 22:37:22
>>148
エロ本が変数で、収録されてる写真が値
ポインタはエロ本という変数で(便宜上*がついてる、というかポインタであることの証)、そのポインタの値はページ数
ってな理解でいいの?
150デフォルトの名無しさん:2008/03/31(月) 22:52:48
エロ本は型で、デラベッピンが変数じゃね
151デフォルトの名無しさん:2008/03/31(月) 23:07:50
デラベッピンはエロ本の派生クラスだ。
152デフォルトの名無しさん:2008/03/31(月) 23:08:45
エロ本が概念でデラベッピンが型だろう
153デフォルトの名無しさん:2008/03/31(月) 23:12:31
確かに
154デフォルトの名無しさん:2008/04/01(火) 00:20:55
お前らw
155デフォルトの名無しさん:2008/04/01(火) 00:25:05
よりによってでらべっぴんを用いるところに何らかの意図を感じる
156デフォルトの名無しさん:2008/04/01(火) 01:34:06
エロ本としてではなく美術書として扱う場合、これは派生なの?
157デフォルトの名無しさん:2008/04/01(火) 01:56:47
それは扱う側が決めることだろ
どう使われようがしったこっちゃない
158デフォルトの名無しさん:2008/04/01(火) 08:09:08
>>156
インターフェースとして定義したクラスを継承
159デフォルトの名無しさん:2008/04/01(火) 08:51:50
>>149
>エロ本が変数で、収録されてる写真が値
この解釈だとエロ本はunionの配列で、ページ数は配列のindex。
160デフォルトの名無しさん:2008/04/01(火) 08:52:39
C/C++のポインタの機能--参照渡しのような処理 - builder by ZDNet Japan
http://builder.japan.zdnet.com/sp/c-programming-language/story/0,3800083430,20370255,00.htm
このサイトのドコがおかしいのでしょうか?
161デフォルトの名無しさん:2008/04/01(火) 09:02:23
本人?
コメント欄の通り
162デフォルトの名無しさん:2008/04/01(火) 09:50:07
それは4/1のために用意された記事だからあまり真に受けないほうがいい。
163デフォルトの名無しさん:2008/04/01(火) 10:54:05
>>160
>このサイトのドコがおかしいのでしょうか?
殆ど全て。
164デフォルトの名無しさん:2008/04/01(火) 11:53:26
サイトってw
普通に「記事」とか言えよ
安っぽい釣り針だな
165デフォルトの名無しさん:2008/04/01(火) 11:56:11
碌に査読もせずにほいほい載せちゃうようなサイトだからな。何かおかしいだろ。
166デフォルトの名無しさん:2008/04/01(火) 12:36:03
嘘を嘘と
167デフォルトの名無しさん:2008/04/01(火) 12:56:31
編集がコメントで悪足掻きしたり、著者の有り得ないコメントを代理掲載しているくらいだからね。
168デフォルトの名無しさん:2008/04/01(火) 15:17:06
記事のサブタイトルが「変数の場所(アドレス)」に変わったw
169デフォルトの名無しさん:2008/04/01(火) 15:20:55
推薦増えすぎw
170いっそ誰か転載してくれw:2008/04/01(火) 15:26:22
一ページ目は修正掛かったようだけど、日本語が破綻している。
>ポインタ変数を定義するには、通常の型の場合とは異なり、型名の後ろに * がつけられる。
よくあるダメドキュメントのパターンである、主語と述語の関係が狂ってしまっている。
この文章は誰の手によるものだろうか。筆者? 編集? レビュアー?
いっそ企画から遣り直しては如何だろうか。
171デフォルトの名無しさん:2008/04/01(火) 16:03:48
俺が筆者ならしばらくは人には会いたくないだろうなw
はずかしすぐるwww
172デフォルトの名無しさん:2008/04/01(火) 16:21:59
「builder編集部 冨田」って人も大変だな。
しかし、事前の校正をしなかった報いだ。
この冨田って人が担当だったかどうかは知らんが。

builderの信頼性も、これで地に落ちたな(あったかどうかは不明だが)。
173デフォルトの名無しさん:2008/04/01(火) 16:24:12
しかし、たったこれだけのコードの校正も出来ないってどれだけ不注意なんだ
174デフォルトの名無しさん:2008/04/01(火) 16:35:58
プロのテクニカルライターだから信用してたんでしょ
175デフォルトの名無しさん:2008/04/01(火) 16:37:49
かわうそうだからもうそっとしといてあげようよ
176デフォルトの名無しさん:2008/04/01(火) 16:38:03
この連載、続くのか、打ち切りになるのか・・・
177デフォルトの名無しさん:2008/04/01(火) 16:39:01
>>175
バンブーブレードのアニメを思い出したw
178デフォルトの名無しさん:2008/04/01(火) 16:40:54
前橋さんに書いて欲しい
179デフォルトの名無しさん:2008/04/01(火) 16:41:47
え、連載なの?
180デフォルトの名無しさん:2008/04/01(火) 17:10:38
>>164
スミマセン『記事』でしたね。でもCあまり判らないので。。。
181デフォルトの名無しさん:2008/04/01(火) 17:11:33
http://builder.japan.zdnet.com/sp/c-programming-language/
特集だな。

>>180
それはC言語の問題じゃないだろ。
日本語やり直せ。
182いっそ誰か転載してくれw:2008/04/01(火) 17:26:55
問題は件のページだけではない。
こちらのページから引用してみよう。
http://builder.japan.zdnet.com/sp/c-programming-language/story/0,3800083430,20368158-2,00.htm
--
データを区切る文字を空白などではないものにする方法だ。たとえば”%s,%s”とすれば、”abc def,ghi”を”abc def”と”ghi”という2つの値として入力することができる。
--
これも、実験してみれば直ぐに判るが出鱈目である。
一体全体、この特集はどんな技術者を作ろうと言うのだろうかw
183デフォルトの名無しさん:2008/04/01(火) 17:44:37
何の話かと思ったら、scanf()か
184デフォルトの名無しさん:2008/04/01(火) 17:46:36
>>182
scanfで入力制限が出来ることを知らなかったorz
185デフォルトの名無しさん:2008/04/01(火) 18:02:09
>>184
普通は、scanf()では使いにくいから、入力制限はsscanf()で使うんだけどね。
所謂入門書でその辺りにきちんと触れているものは、知る限りないね。
186デフォルトの名無しさん:2008/04/01(火) 18:07:30
>>182 確かに酷いな
187デフォルトの名無しさん:2008/04/01(火) 18:11:27
ttp://builder.japan.zdnet.com/rank/
推薦の数が飛び抜けているな
188デフォルトの名無しさん:2008/04/01(火) 20:53:23
件の人の(ttp://builder.japan.zdnet.com/sp/c-programming-language/story/0,3800083430,20366709-2,00.htm)
>また、doubleからはlong double(12バイト分)を派生させることができるが、
>floatではそれができないという違いがある。
ってどういう意味なんでしょうか?
189デフォルトの名無しさん:2008/04/01(火) 20:58:36
long float
という型が無い事を言いたかったんじゃね?

日本語でおkな記事だな

こんなん初心者に読ませても害にしかならないな
190デフォルトの名無しさん:2008/04/01(火) 21:01:05
おれ、今までlong doubleって10バイトって思ってたよ。
191デフォルトの名無しさん:2008/04/01(火) 21:15:41
>>189 なるほど。
192デフォルトの名無しさん:2008/04/01(火) 21:19:08
long double が 12 バイトの環境は見た事無いなあ。
10 か 16 ならあるが。
193デフォルトの名無しさん:2008/04/01(火) 21:22:48
sizeof(long double)
12bytes gcc (MinGW)
10bytes Borland C++ Compiler
194デフォルトの名無しさん:2008/04/01(火) 21:23:28
普通の gcc だと 16 だな。
195デフォルトの名無しさん:2008/04/01(火) 21:34:38
仕方ない、取り敢えず特集の全ての記事にダメ出ししてくるか。
これだけ頓珍漢な記事だらけならパーフェクトも狙えるだろw
196デフォルトの名無しさん:2008/04/01(火) 21:36:46
>>182
これ何か不味いのか?
197デフォルトの名無しさん:2008/04/01(火) 21:47:56
>>196
#include <stdio.h>
int main() {
char a[10], b[10];
switch(sscanf("abc def,ghi", "%s,%s", a, b)) {
case 2:
puts("a, bともに読み込めた。");
puts(a);puts(b);
break;
case 1:
puts("aだけ読み込めた。");
puts(a);
break;
case 0:
puts("aもbも読み込めなかった。");
break;
case EOF:
puts("エラー");
}
return 0;
}

どうなるとおもう?
198デフォルトの名無しさん:2008/04/01(火) 21:54:06
上と下ではどっちが速いですか?

bool rb = m_map.insert(std::make_pair(key, value)).second;
if(rb)
{
  ほげほげ;
}

if(m_map.insert(std::make_pair(key, value)).second)
{
  ほげほげ;
}
199デフォルトの名無しさん:2008/04/01(火) 21:55:14
いっしょだろ。
200デフォルトの名無しさん:2008/04/01(火) 21:56:23
変数にコピーする分上が遅い。
201デフォルトの名無しさん:2008/04/01(火) 21:58:21
>>197
aだけ成功

スペースの後が終端文字列になってた
202デフォルトの名無しさん:2008/04/01(火) 21:58:43
>>200
その程度なら最適化で消えることが期待できる。

>>198
実測重要。
203デフォルトの名無しさん:2008/04/01(火) 22:00:30
下はスタックポインタの変動が一回多くなるので、極々僅かに遅くなる気も?
204デフォルトの名無しさん:2008/04/01(火) 22:00:55
.     人
     (  )
  , '´ ̄  `ヽ
  / ( ( 人人) ) 最適化すれば消えるのではないかと
  |人| V_V|ノ   ふじおかが言っている。
 ノノ| |o○_⌒_○
     ( エ )
.     o( )o
       uu

205デフォルトの名無しさん:2008/04/01(火) 22:05:51
>>193 でもMinGWだとこれが?→ unsigned int 0以上の整数 (0から65535)
206デフォルトの名無しさん:2008/04/01(火) 22:15:46
if(!banana)と、書くのが気持ち悪いのですが、
if(true != banana)と、書くとスピードが落ちますか?
207デフォルトの名無しさん:2008/04/01(火) 22:21:01
if(banana == flase)じゃないのが気持ち悪いな
208デフォルトの名無しさん:2008/04/01(火) 22:21:46
うお 間違えたw
209デフォルトの名無しさん:2008/04/01(火) 22:24:30
>>205
どういう意味でしょう?
MinGW でも unsigned int は 0〜4294967295 の範囲です
210デフォルトの名無しさん:2008/04/01(火) 22:32:28
>>206
とりあえず>>207に直したとして、まず変わらん。
むしろ変わる環境があったらちょっと興味がわく。

で、速度は実測が基本。一応ね。
211デフォルトの名無しさん:2008/04/01(火) 22:46:02
trueと比較するのは(速度は兎も角)確実に1ステップ無駄な処理が入る。
212デフォルトの名無しさん:2008/04/01(火) 22:47:05
うそーん
213デフォルトの名無しさん:2008/04/01(火) 22:56:11
>if(!banana)
と、
>if(true != banana)

コードの意味合いが異なる
214デフォルトの名無しさん:2008/04/01(火) 22:58:32
>>209 >>188の記事からの引用です
215デフォルトの名無しさん:2008/04/01(火) 23:05:34
class hoge
{
hoge(){←エラー
rcdefault.top = 0;
rcdefault.left = 0;
rcdefault.buttom = 480;
rcdefault.right = 640;
}
static const RECT rcdefault;
}

性的で固定な構造体の中身はどうやって指定するの?
216デフォルトの名無しさん:2008/04/01(火) 23:10:47
ピコエロス
217デフォルトの名無しさん:2008/04/01(火) 23:19:11
class HOge{
static const A a;
};

const RECT HOge::a = {1,2,3,4};
218デフォルトの名無しさん:2008/04/01(火) 23:27:05
ttp://builder.japan.zdnet.com/sp/c-programming-language/story/0,3800083430,20363049,00.htm
--
本来の名称は1文字のCなのだが、それだけだと分かりにくいからか、一般的にはC言語という。
--
# C言語と表記することが多いと認めるのは吝かではないが、果たして開発現場でC言語と呼ぶ輩はどれほどいるのだろうか。
--
子孫にあたるプログラム言語には、同じくオブジェクト指向が取り入れられているJavaなどがある。
--
# いつからJavaはCの子孫になったんだ?

ttp://builder.japan.zdnet.com/sp/c-programming-language/story/0,3800083430,20363414-2,00.htm
--
しかし、前述の通り携帯電話などの機器の動作はC/C++で開発されたプログラムによって行われている。
--
# そうなんですか? 本当に?

ttp://builder.japan.zdnet.com/sp/c-programming-language/story/0,3800083430,20366709-2,00.htm
--
floatよりもdoubleのほうが扱える数値の範囲が広くなる。そのため、floatよりもdoubleのほうが精密な値を表すことが可能になる。
--
# 「そのため」ではありません。無茶を言わんでください。

ttp://builder.japan.zdnet.com/sp/c-programming-language/story/0,3800083430,20366845-2,00.htm
--
printf( "|%5.3f %-9.4f|", 12.34, 56.789 ); /* |12.340 56.7890 | */
--
# わざわざ初心者を混乱させなくてもいいでしょう。素直に%6.3fとしては如何?
219デフォルトの名無しさん:2008/04/01(火) 23:36:51
さすがに重隅ウザイ
220デフォルトの名無しさん:2008/04/01(火) 23:37:35
できました。
221デフォルトの名無しさん:2008/04/01(火) 23:40:22
>>218
ここに書くと筆者が見てくれるの?
222デフォルトの名無しさん:2008/04/01(火) 23:43:52
>>220
who?
223デフォルトの名無しさん:2008/04/01(火) 23:46:47
規格内に C 言語って記述がいくらでもあるのに・・・。
224デフォルトの名無しさん:2008/04/01(火) 23:51:37
The Programming Language C
225デフォルトの名無しさん:2008/04/01(火) 23:54:05
今マルチスレッドで裏で画像読み込みとかやってるんですが、
あるスレッドが専用の関数に必要な引数を渡して、要求だけ
vectorにキューイングしてで出て行く、そして読み込み用のスレッドがこのvectorから
メッセージを取り出して画像読み込み操作を行うという形なんですが

なんかどこかで衝突?みたいなことが起こってるみたいで成功したり失敗したりです。。。
メッセージは追加時push_backで取り出し時begin()使ってます。
Javaのsynchronizedみたいに排他にするにはどうすればいいんでしょうか?
226デフォルトの名無しさん:2008/04/01(火) 23:56:50
>>225
STLはひどい事にマルチスレッドに対応してない実装をコンパイラ製作側が提供しても良い仕様になってるので、
別途マルチスレッドに対応したフラグを外側から用意するなど措置をとる必要がある。
227デフォルトの名無しさん:2008/04/01(火) 23:56:59
>>225
winならCriticalSectionやMutexとか。
それ以外でもならboost::threadとか。
228デフォルトの名無しさん:2008/04/02(水) 00:03:51
STLportを使う
229デフォルトの名無しさん:2008/04/02(水) 10:01:26
文字列を配列で宣言するのとポインタで宣言するのって何か違いがあるんでしょうか?
やってること同じだと思うんですけど。
230デフォルトの名無しさん:2008/04/02(水) 10:10:28
char a[]="test";とchar *b="test";のことを言ってるなら違いはある。とりあえず配列を使っておけば問題ない。
231デフォルトの名無しさん:2008/04/02(水) 10:10:50
>>229
> 文字列を配列で宣言するのとポインタで宣言するのって何か違いがあるんでしょうか?
> やってること同じだと思うんですけど。
その通りやってることは同じなので、好きな方でどうぞ。
232デフォルトの名無しさん:2008/04/02(水) 10:27:44
はじめまして。
VBを今週から始めた初心者です。
上司に教わりながらやっていますが、全くわかりません。

とりあえず、言われた仕事が
モジュール2で
Public Sub 関数名()
'表を追加します
End Sub
を作成して、モジュール1でcollで呼び出すらしいんですが
表を追加の関数がわかりません。
誰か教えて下さい。
233デフォルトの名無しさん:2008/04/02(水) 10:28:52
その上司に聞けよ。
というかスレ違いだ。
234デフォルトの名無しさん:2008/04/02(水) 10:29:30
落ち着け

ここはC/C++スレだ
235デフォルトの名無しさん:2008/04/02(水) 10:31:09
>>230
その違いについて知りたいんですが、、、メモリの問題とかですかね
236デフォルトの名無しさん:2008/04/02(水) 10:33:55
232です。
申し訳ないです。
どこに書けばいいのかわからなくて。。。
237デフォルトの名無しさん:2008/04/02(水) 10:37:38
それすら調べられないならマに向いてないから辞めた方が良い
238デフォルトの名無しさん:2008/04/02(水) 10:48:57
>>226,227ありがとうございます。
面白そうなので自分で作ってみることにします。
239デフォルトの名無しさん:2008/04/02(水) 10:49:38
そうですね。
辞めてしまいたいです。
240デフォルトの名無しさん:2008/04/02(水) 10:55:29
>>239
仕事じゃなくて課題なのでは? 未経験でも出来る課題を出されたんじゃないですか?
プログラム経験はあるんですか?
241デフォルトの名無しさん:2008/04/02(水) 11:10:26
本当に初心者なし質問かと思うのですが
ttp://tondol.ty.land.to/event/koushien/2006honsen/08.html
のプログラムなんですが、数字を二つ入力するのですが
1 2
という入力ではなく
3
というように数字一つで改行されたらプログラムを終了するようにしたいのですが
どのようにすればいいのでしょうか?
242デフォルトの名無しさん:2008/04/02(水) 11:12:30
文字列で受け取って自分で調べる
243デフォルトの名無しさん:2008/04/02(水) 11:52:31
すいません文字列で受け取るとはどういうことでしょうか?
244238:2008/04/02(水) 12:03:36
Mutexで神速でできてしまったんだけど、ミューテックスだとどんな制限があるんでしょうか?
245デフォルトの名無しさん:2008/04/02(水) 12:18:56
多重起動防止
246デフォルトの名無しさん:2008/04/02(水) 12:19:23
>>244
排他処理を追加した分遅くなる。MutexよりもCriticalSectionセクションのほうが速いので用途に応じて使い分けるとよい。
247デフォルトの名無しさん:2008/04/02(水) 12:20:21
ミューテックスを使うと投機実行の処理が多くなったり、より速いアクセス速度のあるキャッシュへのデータ格納最適化ができなかったりする。
248デフォルトの名無しさん:2008/04/02(水) 13:01:07
>>236
EXCELにVBAのリファレンスついてないのか?
まあ該当スレは検索すればすぐ見つかるだろうけど,質問しても
やってトライ.シリーズでいいからEXCEL/VBAの参考書一冊買え
みたいな話になるだけですぞ
249デフォルトの名無しさん:2008/04/02(水) 13:21:53
250デフォルトの名無しさん:2008/04/02(水) 13:22:45
上の、236じゃなくて>>236へだった
251デフォルトの名無しさん:2008/04/02(水) 13:23:13
>>238
何度間違ってるんだorz
252238:2008/04/02(水) 15:33:58
>>245-247,249-251
ありがとうございます。ほくほくです
253デフォルトの名無しさん:2008/04/02(水) 20:29:09
c++ VisualStadio.net
TestProgプロジェクトにあるCTestClassクラスをライブラリにしてMainProjプロジェクトで使おうとしています。
CTestClassクラスが宣言されているTestClass.h、TestClass.cpp、そしてほとんどカラのstdafx.hとstdafx.cppをビルドしてTestProg.libを作成しました。
そしてMainProjプロジェクト内のファイルにて
#pragma comment(lib, "TestProg.lib")
このようにライブラリの使用を宣言するまでは問題なかった(ビルド成功)のですが、CTestClassを使おうとすると宣言がされていないとエラーが出ます。
ライブラリ内のクラスを使うにはこれらに加えて何かしないといけないのでしょうか?
ちなみにMainProjにTestClass.hとTestClass.cppを追加し、上記の#pragmaの代わりに
#include "TestClass.h" を入れるとエラーは出ませんでした。
254デフォルトの名無しさん:2008/04/02(水) 20:43:05
TestClass.hへのパスは通ってますか?
255デフォルトの名無しさん:2008/04/02(水) 20:55:23
   /     /     /      /  /  / /
/     /     /     /     /   /   
                 ,.、 ,.、    /   /      
    /    /      ∠二二、ヽ    / /  
  /    /   /   ((´・ω・`)) ちょっと船の様子を見に行ってくる… 
               / ~~:~~~〈   /  / 
       /    /  ノ   : _,,..ゝ   / 
    /    /     (,,..,)二i_,∠  /    /
256デフォルトの名無しさん:2008/04/02(水) 21:30:23
>>253
// MainProjプロジェクトにTestProg.libとTestClass.hコピーして
#pragma comment(lib, "TestProg.lib")
#include "TestClass.h"
257238:2008/04/02(水) 21:32:33
 ∧_∧
..(    *)
..(    )〇
なんだか胸騒ぎがする・・・。
258デフォルトの名無しさん:2008/04/02(水) 21:57:43
Xcodeで開発しているのですが、
"クラス::関数()", referenced from:
とエラーが出ます。
調べてもどういう意味のエラーかも分からずです。
どういう意味のエラーなんでしょうか?
259デフォルトの名無しさん:2008/04/02(水) 22:12:53
>>258
エラーメッセージはそれだけじゃないでしょ。前か後にも何か書いてあるはず。
260デフォルトの名無しさん:2008/04/02(水) 22:14:58
>>256
ありがとうございます。使えるようになしました。
>>254
それは何度も疑っていたので大丈夫でした。
パスが通っていないとエラーが出ますしlib自体が正常に更新されているかどうかも確認していました。


複数のサブプロジェクトでクラスを作り、メインプロジェクトでこれらをライブラリとして読み込むために試行錯誤していました。
.hと.cppをコピーしてメインプロジェクトに追加するとメインプロジェクトだけで変更が可能なのと
ファイル数が膨大になり管理がしにくくなるので改善したいと言うのが主な理由です。
今回の場合ですとMainProjプロジェクトでCTestClassクラスのメンバ変数や関数を自由に追加することが出来てしまったり
TestProgプロジェクトでCTestClassクラスを更新するとMainProjプロジェクトのTestProg.libだけでなくTestClass.hの更新も必要になってしまいます。
MainProjプロジェクトのCTestClassクラス自体に変更が加えられないような仕組みや
更新がlibだけで済むような方法は無いものなのでしょうか。
261デフォルトの名無しさん:2008/04/02(水) 22:31:40
ヘッダをいじらなくて済むようにするイディオムとしてpimplが有名。
少なくともprivateメンバの変更では共有するヘッダに影響を与えないで済む。
262デフォルトの名無しさん:2008/04/02(水) 23:05:52
ある型がクラス/構造体かどうか調べる方法はありますか?
あと、クラスのメンバ関数を列挙する方法はありますか

template<typename T> void enum_functions() {
  if (T::is_class()) {
    for (int i = 0; i < T::func_count(); ++i) {
      std::cout << T::func_name(i) << '\n';
    }
  }
}
みたいな感じで。
263デフォルトの名無しさん:2008/04/02(水) 23:22:54
>>231
嘘はいかんよ。

>>235
>char a[]="test";とchar *b="test";
 *a='T';    /* OK */
 a[0]='w';   /* OK */
// *b='T';   /* NG */
 b=a;     /* OK */
 *b='T';    /* OK */
 b[0]='w';   /* OK */
// a=NULL; /* どうだったっけ?*/
264238:2008/04/02(水) 23:28:59
>>262
どんな実装だよ。
せめてclass Tにしようぜ
265デフォルトの名無しさん:2008/04/02(水) 23:30:32
// *b='T';   /* NG */
 *b='T';    /* OK */
どっちだよ
266253,260:2008/04/02(水) 23:32:01
>>261
初めて知った単語なので非常に有難いです。
結局クラスをライブラリにするのはcppファイルの中身が見えなくなるだけで(ビルドが早くなったりもしますが)
いかにヘッダ部分をcppに移せるかで使用先(メインプロジェクト)での可変性が変わると言うことでしょうか。
267デフォルトの名無しさん:2008/04/02(水) 23:34:28
>>262
思い描いている形とは違うかもしれないけど、
BoostまたはTR1にType Traitsに、is_classというものがある。
かなりコンパイラを選ぶだろうけど。

さすがにメンバの列挙はない。
268デフォルトの名無しさん:2008/04/02(水) 23:35:43
>>259
すいません。
"クラスA::関数()",referenced from:
クラスB::関数() in クラスB.o
symbol(s) not found
collect2:ld returned 1 exit status
とあります。
269デフォルトの名無しさん:2008/04/02(水) 23:40:16
>>265

// *b='T';     /* NG */
 b=a; *b='T';   /* OK */

分かりにくくてスマソ
270デフォルトの名無しさん:2008/04/03(木) 00:43:38
>>268
クラスB.o の中に入っている クラスB::関数() から参照されている "ク
ラスA::関数()" というシンボルが見付かりません、
とリンカー様(ld)が怒ってらっしゃる。

つまり、クラスA::関数() をコンパイルした .o ファイルやそれが入っ
ているライブラリをコマンドラインに指定する必要がある。
271デフォルトの名無しさん:2008/04/03(木) 04:53:36
文字コードの問題です。
wchar_t buff[3];
とあって
SHIFT-JISで書かれたテキストから、fgetwsで読み込む事で
例えば、
「もじ」
ならば
buff[0]<=も
buff[1]<=じ
と、入る事を望みます。

このような処理をする場合、どのようにすればいいのでしょうか?
ちなみに、fgetwsで読むと、buff[0]とbuffr[1]で"も"が入ってしまいます。
fgetwsはsjisで書かれたテキストを自動で変換して読み込んでくれると聞いたのですが・・・。
272デフォルトの名無しさん:2008/04/03(木) 05:00:49
あ、一応自己解決しました。
テキストを、UTF16のBOMなしにして
setlocale(LC_CTYPE, "");を設定し、バイナリモードで読めばよかったんですね。

出来れば、SJISから変換されるとありがたいんですが・・・。
273デフォルトの名無しさん:2008/04/03(木) 08:16:33
std::vector<int> vec;
という変数があるとして、
for (int i = 0; i < vec.size(); i++) {.....}
とか書くとintとunsigned intを比較してるという警告がでて嫌なのでstatic_cast<int>(vec.size())
とかやってるのですが、これもいやです。どうすればいいですか?
274デフォルトの名無しさん:2008/04/03(木) 08:28:55
1.iをstd::vector<int>::size_typeにする。
2.iteratorを使う。
3.STLのアルゴリズムを使う。
275デフォルトの名無しさん:2008/04/03(木) 08:43:33
>>273
4.iをunsignedにする。
276デフォルトの名無しさん:2008/04/03(木) 08:51:22
ありがとうございます。
STLのアルゴリズムを使うというのは、for文の中でやりたかったことがSTLのアルゴリズムで
表現できる必要がありますよね?常にできるということではないですよね?

277デフォルトの名無しさん:2008/04/03(木) 08:55:56
>>271-272
まずは環境を書こう。
278デフォルトの名無しさん:2008/04/03(木) 08:59:30
>>276
{...}の内容によってはちょっと面倒かも知れんので、その場合は2.かな。
279デフォルトの名無しさん:2008/04/03(木) 12:04:46
class complex {
public:
double re;
double im;
};
こういうクラスがあるときに、operator>>(istream &, complex &a) を定義するとすると、
どういう風にやるのがよいでしょうか?
280デフォルトの名無しさん:2008/04/03(木) 12:07:17
そんなクラスは作らずに、標準ライブラリのcomplexを使う。
281デフォルトの名無しさん:2008/04/03(木) 14:05:47
windows2k MinGW を入れたいのです
MinGWインストーラがネット無いので使えません
ソースフォージからどれを落とせば良いでしょうか
またそれは全て同じフォルダに上書きで良いでしょうか
binフォルダなどかぶっているものがおおいんです
使いたいのはC、C++、SDL、OpenGLです
パスは適当に通そうと思っています
282デフォルトの名無しさん:2008/04/03(木) 15:08:36
>>281
大陸へカエレ
283デフォルトの名無しさん:2008/04/03(木) 15:10:11
専用スレで聞いた方がいいんじゃない。自分はDev C++の日本語版で入れたけど
284281:2008/04/03(木) 15:20:11
>>283
ではMinGWスレに移動したいと思います
レスdでした
285デフォルトの名無しさん:2008/04/03(木) 15:47:08
C/C++ってつおいですか
286デフォルトの名無しさん:2008/04/03(木) 15:48:47
>>285
未定義です
287デフォルトの名無しさん:2008/04/03(木) 15:52:35
BCBの__propertyはVCでも使えますか。VCで書いてみたら、色が変わったので。
288デフォルトの名無しさん:2008/04/03(木) 15:54:42
MFCを使ってCMainFrameから継承されたウィンドウとCDialogから継承されたダイアログを
MTI(Multiple Top Level Window)風に同時に取扱たいです。

何か参考となるキーワードやソースやwebpageを教えて頂けないでしょうか。
289デフォルトの名無しさん:2008/04/03(木) 16:00:47
>>287
VC入ってるのならF1押してヘルプを見るのだ
290デフォルトの名無しさん:2008/04/03(木) 16:43:19
>>288
キーワード:
モードレスダイアログ
タイマー
291デフォルトの名無しさん:2008/04/03(木) 17:14:42
VCのどっとねっとでないやつでVBやC#みたいなプロパティを作るものはありますか?
292288:2008/04/03(木) 17:16:36
>>290
モードレスダイアログだとダイアログが子になってしまって、ちょっと欲しいものじゃないんです。
親子関係はなし、もしくはCMainFrameを子にしたいんです。
293デフォルトの名無しさん:2008/04/03(木) 17:16:39
ATL
294デフォルトの名無しさん:2008/04/03(木) 17:44:43
>>279
comlex& operator>>(istream & a)
295デフォルトの名無しさん:2008/04/03(木) 17:52:31
>>292
ウィンドウ無か非表示の親からメインフレームとダイアログ作れば兄弟になる
296デフォルトの名無しさん:2008/04/03(木) 17:59:36
_declspec(dllexport)

こういうのって、Cの仕様なんでしょうか? それともコンパイラの方の仕様なんでしょうか?
まとまった文章や文献をご存知の方がいらしゃいましたらよろしくお願いいたしますm(_ _)m
297デフォルトの名無しさん:2008/04/03(木) 18:05:31
DLLはWindows用語
298デフォルトの名無しさん:2008/04/03(木) 18:09:02
文献はMSDNにある
299デフォルトの名無しさん:2008/04/03(木) 18:12:00
300デフォルトの名無しさん:2008/04/03(木) 18:20:47
先頭にアンダースコアが2つ付いたのは
一部の組み込みマクロを除いて、他は全て処理系の拡張仕様。
301デフォルトの名無しさん:2008/04/03(木) 18:21:29
>>297
>>299
ありがとうございます。勉強してみます。
302300:2008/04/03(木) 19:09:12
俺は無視か・・・。まあいいけどさ。
303デフォルトの名無しさん:2008/04/03(木) 19:19:55
>>302
ばかじゃねぇのw
304デフォルトの名無しさん:2008/04/03(木) 19:31:24
>>302 質問者がレス読んでから投稿ボタン押すまでに書き込むとスルーされる
アフリカではよくあること
305デフォルトの名無しさん:2008/04/03(木) 19:45:47
>>302
すみません、気づきませんでした^^; ありがとうございます。
同じWindows環境でも、処理系に依存する部分は結構ありそうなので、頑張って調べてみます><
306デフォルトの名無しさん:2008/04/03(木) 21:15:07
template<class T>
class A{
public:
void put( T t )
{
std::cout << t << std::endl;
}

};

このようなテンプレートを用意したとして、

A<int> a;

のようにintとして定義した場合に、put()にint以外の引数を
入れるとコンパイルエラーになるようにしたいんですが

a.put( 1.0f ); // 例えばこの場合コンパイルエラーが出るようにしたい
307デフォルトの名無しさん:2008/04/03(木) 21:21:19
A<float>().put(1.0f);
308デフォルトの名無しさん:2008/04/03(木) 21:34:58
template<class T>
class A{
public:
template<class T2>
void put( T2 t )
{
BOOST_STATIC_ASSERT(boost::is_same<T, T2>::value);
std::cout << t << std::endl;
}

};
309デフォルトの名無しさん:2008/04/03(木) 22:00:35
C言語から自作したAPIを呼び出すにはどうすれば良いのでしょうか?
Windows APIは、#include <windows.h>で呼び出すことができるようなのですが、
ソフトウェア屋が作ったAPIをCのソースから呼び出す方法がさっぱり。

ググっては見たのですが具体的な書き方が見つかりませんでした。
参考になるサイト、もしくはソースがあれば教えてください。
310デフォルトの名無しさん:2008/04/03(木) 22:02:40
extern "C"
311デフォルトの名無しさん:2008/04/03(木) 22:04:05
>>309
DLLを動的に呼び出すか、ソースなら#include ""だろ
312デフォルトの名無しさん:2008/04/03(木) 22:06:51
operator<<()の定義の中で、宣言なしにwsという変数を使ってwhite spaceを読み込んでいるものをみたのですが、
これが一体なになのかわかりません。コンパイルは出来ているのでつかえるみたいなのですが、、
ググってもいいのがひっかかりません。どうか教えてください。

313デフォルトの名無しさん:2008/04/03(木) 22:20:15
>>310-311
ソフトウェア屋が用意したAPI(恐らくDLL)を手元のCソースから利用したいんですが…
いまいちわからないです。C言語をやるのは初めてで。
314デフォルトの名無しさん:2008/04/03(木) 22:22:13
恐らくとか言われても・・・。
.lib をリンクして提供されてるヘッダファイルインクルードすればいいだけじゃね?
315デフォルトの名無しさん:2008/04/03(木) 22:23:48
LoadLibrary
316デフォルトの名無しさん:2008/04/03(木) 22:35:46
>>312
空白を読み飛ばすマニピュレータのstd::ws
317デフォルトの名無しさん:2008/04/03(木) 22:36:49
>>297
OS/2やTOWNS-OSでもDLLだったけど生き残ったのはWindowsだけか
318デフォルトの名無しさん:2008/04/03(木) 22:40:25
OS/2はNTの元ネタみたいなもんだし
319デフォルトの名無しさん:2008/04/03(木) 22:40:38
>>314
なるほど…APIを触ったことがないのでどういうものかわかりませんでした。
ライブラリと同じような扱いでインクルードできるんですね。
ありがとうございました。
320デフォルトの名無しさん:2008/04/03(木) 22:43:17
OS/2 って何?そんな子はいませんでしたよ!
321デフォルトの名無しさん:2008/04/03(木) 22:45:56
322デフォルトの名無しさん:2008/04/03(木) 23:42:51
std::mapのinsert()で戻ってくるiteratorとboolのpairな型はどこかに定義されていないの?
323デフォルトの名無しさん:2008/04/03(木) 23:43:33
c++のcomplexのoperator>>の実装を見たのですが、4+5i という複素数があったとすると、
(4,5) という文字列で入力するようになっていました。実装は()とかの括弧やコンマをみて
ちゃんと処理やってたのですが、普通に考えたら、4+5iとかの文字列の入力の方が自然なような
気がするのですが、(4,5)の方がよいという理由がありますか?
よろしくお願いします。

324デフォルトの名無しさん:2008/04/03(木) 23:47:48
C言語が(,)の入力に対応している点
a+biはC言語が対応していない
325デフォルトの名無しさん:2008/04/04(金) 00:44:30
他人の書いた CやC++ソースが大量にあったとして、
コード解析するときってどうやってる?

Linux 環境で grep や vim + ctags で解析 → gdb で動作確認なんて
やり方してる俺は激しく時代遅れな希ガス
326デフォルトの名無しさん:2008/04/04(金) 00:51:17
>>325
動作させられるなら、動作させてみて、どの関数が一番頻繁に呼び出されてるかをみてみる。
全体の20%のコードが80%の時間を使ってるというしな。
327デフォルトの名無しさん:2008/04/04(金) 01:06:04
>>324
c言語が対応してないというのは、どういう意味ですか?
scanf()で一文字づつ読み込んで解析すればできませんか?

328デフォルトの名無しさん:2008/04/04(金) 01:14:47
>>327
文字列を解析すればできるよ
しかし、直接プログラム内で kansuu(x,y)とかけるのとは違う
329デフォルトの名無しさん:2008/04/04(金) 01:15:14
>>327
何がいいたいのかよくわからんが・・・
>complex x = 3 + 2i;
って使い方がしたいんじゃないのか?そいつぁ無理だ。(少なくともおれの知識じゃ)
なぜそこでscanfが出てくるのがさっぱりわからんが
>complex x = "3 + 2i";
なら、実装は可能だ。
ただ、種々の書式に対応するとめんどくさそうなことこの上ない実装になりそう。
330デフォルトの名無しさん:2008/04/04(金) 01:15:48
プログラム内では、(x,y)の形にするか複素数型に変換するしか無い
331デフォルトの名無しさん:2008/04/04(金) 01:22:17
scanf("%d+%di", &x, &y);
みたいな?w
332デフォルトの名無しさん:2008/04/04(金) 01:35:28
いや、入力は文字列で扱ってるんだが、
"1+2i"じゃなくて、"(1,2)"みたいに、実装してあるのは何で?
って質問だと思われw
333デフォルトの名無しさん:2008/04/04(金) 01:54:54
C++標準のcomplexって使ったことないんだけどそういう仕様なの?
仕様なら仕方ないが信じがたいんだがw
334デフォルトの名無しさん:2008/04/04(金) 01:58:38
C++はこうだろ?

std::complex<double>(1, 3)
335デフォルトの名無しさん:2008/04/04(金) 02:10:39
complexをiostreamで出力するときに、
"1+2i"じゃなくて"(1,2)"となっているのは何で?
ってことだろ。
336335:2008/04/04(金) 02:12:00
× complexをiostreamで出力するときに、
○ complexをiostreamで入出力するときに、
337デフォルトの名無しさん:2008/04/04(金) 02:23:09
コピペして使えるようにじゃね?
338デフォルトの名無しさん:2008/04/04(金) 02:41:24
335の人が言っているのが、こっちの意図です。でも最初の人がC言語ではサポートしていない、
というのがどういう意味だったのかはわかりました。
文字列で扱うんなら、4+5iとかでも問題ないと思ったのですが、(,)で実装してしまったし、、、
4+5iとかはちょっと面倒くさそう。

339デフォルトの名無しさん:2008/04/04(金) 07:40:38
iだったりjだったりするからじゃねw
340デフォルトの名無しさん:2008/04/04(金) 12:05:27
テンプレートクラス作って、
そのポインタをlistにつっこんで
イテレータで走査しようとしたら怒られる

//Error
list<Hoge<T>*>::iterator it;

expected `;' before "it"

テンプレートクラスを
テンプレートのままぶち込むのがいけないのか、
それとも別のところがいけないのかでいいんで教えてください
341デフォルトの名無しさん:2008/04/04(金) 12:30:31
- list<Hoge<T>*>::iterator it;
+ typename list<Hoge<T>*>::iterator it;
342デフォルトの名無しさん:2008/04/04(金) 12:34:55
ああ、そういうことだったのね(´・ω・`)

ありがとー
343デフォルトの名無しさん:2008/04/04(金) 12:35:00
>>340
そりゃ型決まってないと無理でないか?
list<Hoge<int>*>::iterator it;
とかならいけると思うけど。
344デフォルトの名無しさん:2008/04/04(金) 12:41:23
gccだとちゃんとエラーはいてくれるがVCだと通るから困る
345デフォルトの名無しさん:2008/04/04(金) 15:28:40
を、2ページ目にも修正入ったみたいだな。
346デフォルトの名無しさん:2008/04/04(金) 16:45:18
教えて!!
言語を勉強したいのだが何がお勧め??
C++??Java??
347デフォルトの名無しさん:2008/04/04(金) 16:46:17
目的は?
趣味なら何でもいいと思うよ。
348デフォルトの名無しさん:2008/04/04(金) 16:47:57
>>346
BASIC
349デフォルトの名無しさん:2008/04/04(金) 16:51:06
>>347
>>348
仕事でUNIXのオペレータをしています。
言語を覚えてスキルアップしたい。と思っています。
でも色んな言語がありすぎて何を始めればいいのか
分かりません。今の時代にあっていてこれからも使っていけそうな
言語を教えて下さい。お願いします。
350デフォルトの名無しさん:2008/04/04(金) 16:53:20
>>346
スレタイが読める程度の日本語。
351デフォルトの名無しさん:2008/04/04(金) 16:53:45
UNIXならまずはシェルスクリプトからはじめてみては?
で、awk&sed、perl、python or rubyと進むとか。
352デフォルトの名無しさん:2008/04/04(金) 16:57:41
C/C++のスレで訊かれたなら、やっぱりC/C++と答えるべきか
353デフォルトの名無しさん:2008/04/04(金) 16:58:14
C#といってみる
354デフォルトの名無しさん:2008/04/04(金) 16:59:02
C++では簡単に出来てJavaでやりにくい事
その逆などを教えて下さい。
355デフォルトの名無しさん:2008/04/04(金) 17:03:38
その手の質問はぐぐったほうが丁寧な解説出てくるよ
ここで聞いてもすれ違いのうえ端的だったり極端すぎる答えしか返ってこないよ
356デフォルトの名無しさん:2008/04/04(金) 17:15:06
初心者のためのプログラミング言語ガイド Part7
http://pc11.2ch.net/test/read.cgi/tech/1200807067/
357デフォルトの名無しさん:2008/04/04(金) 20:28:22
初心者はまずこれを読んで
ポインタを理解すること

http://builder.japan.zdnet.com/sp/c-programming-language/story/0%2C3800083430%2C20370255%2C00.htm


これができない奴はC/C++いじるの辞めろ
適正が0かマイナスだ
358デフォルトの名無しさん:2008/04/04(金) 20:58:48
359デフォルトの名無しさん:2008/04/04(金) 21:22:45
それ1週間前のネタ
360デフォルトの名無しさん:2008/04/04(金) 21:50:48
C++にポインタ排卵だろ
361デフォルトの名無しさん:2008/04/04(金) 21:57:43
まあ大部分は排除できるな。
362デフォルトの名無しさん:2008/04/04(金) 22:21:10
constメソッドからでもポインタ型メンバの参照先なら操作し放題とか駄目活用している
363238:2008/04/04(金) 22:32:21
protectedでstaticな独自クラスの配列の参照の初期化で他のクラスのメンバ変数を与えたいんですが
無理ですよね・・・?
もし他のクラスのstatic変数なら大丈夫でしょうか?
364デフォルトの名無しさん:2008/04/04(金) 22:36:38
RTTIは実際にどういう場面で使われるんですか?

template<typename T> void hoge(const T &a) {
  if (typeid(a) == typeid(int)) { ... }
}

とかやるんですかね
365デフォルトの名無しさん:2008/04/04(金) 22:37:35
クラスのインスタンス自身への参照ならいくらでも可能だと思うが、
その中のメンバ変数と言われると難しいというか、
そもそもそんな怪しい事しようとしている事にまず疑問を持たざるを得ない。
366デフォルトの名無しさん:2008/04/04(金) 22:38:45
>>364
dynamic_cast も RTTI を利用してる。
typeid はあまり使う事は無いな。
367デフォルトの名無しさん:2008/04/04(金) 22:54:27
dynamic_castなら、よくこういう状況で使いたくなる。
1. ライブラリの用意した基底クラスBから派生した自作クラスDを作る。
2. Dのインスタンスをライブラリに渡す。
3. ライブラリからのコールバックで2で渡したものがB型への参照・ポインタで与えられる。
この例だと結局boost::polymorphic_downcastにするんだけどね。

>>364
その例だったら特殊化で十分。
368デフォルトの名無しさん:2008/04/04(金) 23:00:11
配列の参照のスタティックなクラス変数のクラス定義外での宣言って
Hoge Piyo::(&foo)[][100];
じゃないの・・・?
369デフォルトの名無しさん:2008/04/04(金) 23:05:51
とりあえずコンパイルの通るコードを頼む
370デフォルトの名無しさん:2008/04/04(金) 23:09:04
>>360

多態とか
371デフォルトの名無しさん:2008/04/04(金) 23:09:50
スマートポインタでいい。
372デフォルトの名無しさん:2008/04/04(金) 23:58:47
でいいというか、ポインタ使えないなら、ポインタもどきを使うしかない。
クラスがメンバに参照を持つとコンテナに突っ込めなくなってしまうので、
嫌でもポインタ使わなきゃならないと思うんだけど。

373デフォルトの名無しさん:2008/04/05(土) 00:07:58
大体ポインタを理解できないならスマートポインタも理解できないかと
360は何を言いたかったのだろう
374デフォルトの名無しさん:2008/04/05(土) 00:08:53
スマートポインタはアドレス演算とかやらないから
scoped_ptr くらいなら何とかなるんじゃね?
375デフォルトの名無しさん:2008/04/05(土) 00:15:57
ダメな奴は、やり方が言語仕様に引っ張られる。
376デフォルトの名無しさん:2008/04/05(土) 00:17:42
いやイテレータ使うならアドレス演算と大して変わらないんじゃないか
ポインタわからないようではC++できないというのは真実だと思うけど
377デフォルトの名無しさん:2008/04/05(土) 01:24:51
排卵日
378デフォルトの名無しさん:2008/04/05(土) 03:16:18
メンバ変数の文字列の一部を新しい文字列として返したいんですが
どういう方法がありますか?

こういうのです

class Test {
private:
 char data[256];
public:
 char * getStr()
 {
  char *ret = new char[3];
  ret[0] = data[0];
  ret[1] = data[1];
  ret[2] = data[2];
  
  return ret;
 }
};

これを

std::string str = getStr();

このように使った場合retのデリートができないので
メモリリークしますよね?何かいい方法ありませんか?
379デフォルトの名無しさん:2008/04/05(土) 04:35:02
const std::string getData() const { return std::string( data ); }
380デフォルトの名無しさん:2008/04/05(土) 06:48:36
終端に '\0' を追加するのも忘れずに
381デフォルトの名無しさん:2008/04/05(土) 08:04:56
クラスがメンバに参照を持つとコンテナに突っ込めなくなってしまうので、
382デフォルトの名無しさん:2008/04/05(土) 08:49:39
void getStr(std::string& str) const {
 str.assign(data, 3);
}
std::string getStr() const {
 return std::string(data, 3);
}

後者は代入する時にコピーが発生するので場合によっては効率悪いが
(初期化の場合は大抵のコンパイラなら戻り値最適化してくれるので大抵コピーは発生しない)、
かといって前者は必ず変数用意しないといけない。

どっちにするか、あるいは両方用意するかはお好きなように。


まあ、string にどんなメンバがあるかくらい見とけ。
http://www.wakhok.ac.jp/~sumi/stl/header/string.html
383デフォルトの名無しさん:2008/04/05(土) 10:43:49
>>381
参照のようなconstなメンバー変数を持つとコピーコンストラクタが書けない
一方ほとんどのコンテナはメモリ確保を自動でするからコピーが発生する
常識だと思ってたんだけどどこかおかしいのか
384デフォルトの名無しさん:2008/04/05(土) 10:53:24
デフォルトコンストラクタが書けないと言った方が正しいか
385デフォルトの名無しさん:2008/04/05(土) 11:06:11
コピコンは書けるだろ?
書けないのは代入演算子。
386デフォルトの名無しさん:2008/04/05(土) 12:09:51
終了文字の\0って入れなきゃいけないんでしょうか。
サンプルで\0を使っているコードを\0消しても正常に動作するんですが。
387デフォルトの名無しさん:2008/04/05(土) 12:14:40
BCCで「異なる 〜型へのポインタが混在している」って出るんですが、
これってどうすれば解決できるんでしょう?
箇所は
vsprintf(unsigned char*,const char*,va_list);
って使ってるところなんですが、unsignedのポインタからsignedのポインタにはキャストできないって言われたし・・・
388デフォルトの名無しさん:2008/04/05(土) 12:14:41
>>386
コードによる。サンプル晒せ。
実はどこかで\0が付いているだけかもしれない。
389386:2008/04/05(土) 12:28:09
>>388
これです。
int CreateSave() {
HANDLE hFile;
SYSTEMTIME st;
TCHAR szTime[128];
TCHAR *lpszBuf;
DWORD dwAccBytes;
DWORD dwSize = 0L;
       HGLOBAL hMem;
DWORD dwLen;

GetLocalTime(&st);
wsprintf(szTime,_T("\r\nファイル作成時: %d年%02d月%02d日%02d時%02d分%02d秒"),
st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);

dwLen = (DWORD)lstrlen(szTime);
390386:2008/04/05(土) 12:28:48
続き

hFile = CreateFile(_T("ファイルログ.txt"),GENERIC_READ, 0, NULL, OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL, NULL);
dwSize = GetFileSize(hFile, NULL) + dwLen;

hMem = GlobalAlloc(GHND, sizeof(TCHAR) * dwSize + 1);
lpszBuf = (TCHAR*)GlobalLock(hMem);
ReadFile(hFile, lpszBuf, dwSize, &dwAccBytes, NULL);
CloseHandle(hFile);
lstrcat(lpszBuf, szTime);
lpszBuf[dwSize] = '\0';
hFile = CreateFile(_T("ファイルログ.txt"), GENERIC_WRITE, 0,
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
WriteFile(hFile, lpszBuf, (DWORD)lstrlen(lpszBuf), &dwAccBytes, NULL);
CloseHandle(hFile);
GlobalUnlock(hMem);
GlobalFree(hMem);

return -1;
}
391デフォルトの名無しさん:2008/04/05(土) 12:30:09
>>387
(const signed char *)にキャスト
392デフォルトの名無しさん:2008/04/05(土) 12:50:12
>>390
よく読んでないけどstrcat(lpszBuf, szTime);この時点で¥0がついてると思われ
393デフォルトの名無しさん:2008/04/05(土) 12:58:53
>>391
constってことは第2引数にですよね?やったら同じエラーが2個に増えたんですけど・・・
394デフォルトの名無しさん:2008/04/05(土) 12:59:59
constを破るキャストがあるんですが、あれがあったらconstの意味なくないですか?
395デフォルトの名無しさん:2008/04/05(土) 13:04:11
constは破るためにある
だから const const charがあるだろ
396デフォルトの名無しさん:2008/04/05(土) 14:33:43
>>390
lpszBuf = (TCHAR*)GlobalLock(hMem);
ReadFile(hFile, lpszBuf, dwSize, &dwAccBytes, NULL);
CloseHandle(hFile);
lstrcat(lpszBuf, szTime);
lpszBuf[dwSize] = '\0';

このあたりか。
何か無茶苦茶危険なコードに見えるんだけど。

hMem = GlobalAlloc(GHND, sizeof(TCHAR) * dwSize + 1);  ← dwSize 文字分のメモリを確保してるつもりのようだが、+1 の位置がおかしい(TCHAR が2バイトの時に領域が足りない)
lpszBuf = (TCHAR*)GlobalLock(hMem);
ReadFile(hFile, lpszBuf, dwSize, &dwAccBytes, NULL);  ← dwSize 読み込む
CloseHandle(hFile);
lstrcat(lpszBuf, szTime); ← '\0' を付けないまま lstrcat は危険というか、szTime の文字数分領域がさらに必要なんだけどその領域を確保すらしていない
lpszBuf[dwSize] = '\0'; ← lstrcat の前に行う
397デフォルトの名無しさん:2008/04/05(土) 14:35:01
しかも、lpszBuf[dwSize] = '\0'; じゃなくて lpszBuf[dwAccBytes] = '\0'; だな。
398デフォルトの名無しさん:2008/04/05(土) 14:41:08
Unicodeビルドかどうかで、ファイルの文字コードまで
影響を受けるというのは良くない場合のほうが多いと思うけど、
それはいいのか?
399デフォルトの名無しさん:2008/04/05(土) 15:57:43
何もひねらずに考えるとこうですが

if( n % 2 )
  printf( "奇数です\n" );
else
  printf( "偶数です\n" );

奇数か偶数か調べるもっともスマートなコードってどんなんですかね?
400デフォルトの名無しさん:2008/04/05(土) 15:59:38
int isOdd(int n){ return n % 2; }

if( isOdd(n) )
  printf( "奇数です\n" );
else
  printf( "偶数です\n" );
401デフォルトの名無しさん:2008/04/05(土) 16:00:21
スマートってのが読みやすいって意味ならそれでいいんじゃね?
スマートが短いって意味なら、いろいろあるだろうけど。
402デフォルトの名無しさん:2008/04/05(土) 16:00:43
inline bool isOdd(int n) { return n % 2 != 0; }
403デフォルトの名無しさん:2008/04/05(土) 16:07:03
下位1bitでも調べればいいんじゃね
スマートといえるかわからんけど
404デフォルトの名無しさん:2008/04/05(土) 16:08:36
最下位ビット調べて0なら偶数
405デフォルトの名無しさん:2008/04/05(土) 16:09:05
かぶった><
406デフォルトの名無しさん:2008/04/05(土) 16:10:52
この程度なら最適化されないのかな?
407デフォルトの名無しさん:2008/04/05(土) 16:23:00
まともなコンパイラならするよ。
408デフォルトの名無しさん:2008/04/05(土) 17:00:52
std::string のfind()とfind_first_of()の違いって何ですか?
どちらも最初の位置を返すと思うんですが
409デフォルトの名無しさん:2008/04/05(土) 17:04:02
findはコンテナから特定の要素を見つける。
find_first_ofはコンテナから特定のコンテナの要素を見つける。
410デフォルトの名無しさん:2008/04/05(土) 17:21:25
std::string str("hogefugapiyo");
std::string::size_type find = str.find_first_of("abc");

"abc"のうち一番最初に見つかった要素の位置を返す
コンパイルが通るかは試してないのでわからん
411デフォルトの名無しさん:2008/04/05(土) 18:17:44
質問です。
以下のような二つのコードの時間を計ってみたら、
コードBの方が早く、コードAはすさまじく重くなりました。
なぜでしょうか?
あと、コードAの方で、変数aをデバッグで値を見ると、
1.731e-040#DEN のように表示されます。
#DENとは何なんでしょうか?
よろしくお願いします。

環境はVisual c++ 2005です。

//コードA
for(int i =0; i< 5000; i++){
float a = 1.731e-040f;
float b = 1.731e-040f;
float the_test = a*b;
}

//コードB
for(int i =0; i< 5000; i++){
float a = 0.1f;
float b = 0.1f;
float the_test = a*b;
}
412デフォルトの名無しさん:2008/04/05(土) 18:31:22
>>411
DENormal number (非正規化数)

FPUによっては非正規化数の演算をサポートしてなくて、
これをソフトウェア側でエミュレートしてる場合がある。
すると、パフォーマンスが落ちる原因になる。
413じじ:2008/04/05(土) 18:57:43
MFCをつかったマルチスレッドプログラミングを仕事で要求されているの
ですが、APPクラスの子レッドとしておくのがいいのでしょうか?
414デフォルトの名無しさん:2008/04/05(土) 19:17:30
enum は ビットマスクしてもいいですか?
415デフォルトの名無しさん:2008/04/05(土) 20:03:42
どうやったらうまくコーディングできるんだろう?
すぱげってぃーなコードになってしまう。やっぱり慣れるしかない?

以下サンプル

void binary_search(double x,double y,double *z)
{
int i;
double c,j;
j = 0.0000001;

for(i=0;y*y - 2 > j;i++)
{

if(x*x - 2 < 0 && y*y - 2 > 0)
{
c = (x+y)/2;
if(c*c - 2 > 0) y = c; else x = c;
}
binary_search(x,y,z);
}

*z = x;

}

再帰しまくりでサーセン。でもどうやったら再帰せずに実現できるだろう?
考えるのが面倒&考えても良く分からないので再帰に走る今日この頃。
416デフォルトの名無しさん:2008/04/05(土) 20:04:37
無理に再帰を使わない方がスパゲティ化する。
417デフォルトの名無しさん:2008/04/05(土) 20:11:04
再帰はスタックで実現している。
418デフォルトの名無しさん:2008/04/05(土) 20:12:39
>>415
何がしたいんだよ?

binary_search(x,y,z);

//binary_search(x,y,z);
419デフォルトの名無しさん:2008/04/05(土) 20:21:12
バイナリサーチをバイナリデータのサーチと勘違いしてたりして
変数一文字でコメントもなくて通じると思ってるんだろうか
420デフォルトの名無しさん:2008/04/05(土) 20:29:23
binary search じゃなくて bisection method の間違いだったわ
恥ずかしい。。。。鬱だしのう orz
421デフォルトの名無しさん:2008/04/05(土) 22:55:05
これが日本のITレベルだ


http://pc11.2ch.net/test/read.cgi/prog/1191638525/43-44

くずばっかw
422デフォルトの名無しさん:2008/04/05(土) 23:05:51
>>421
すまん、記事のコメントと同じ事をいいたいのか
それとも、2ページ目の解説についていいたいのか
さっぱり分からないから、ちゃんと説明してくれないか?
423デフォルトの名無しさん:2008/04/05(土) 23:06:44
x 日本
o IBM
424デフォルトの名無しさん:2008/04/05(土) 23:37:02
内部に二次元配列をもつクラスから、instance[0][0]みたいな書き方で値を取得したいと思ってます。
double operator[][](int x, int y)
のような書き方は出来ないみたいなので、(コンパイル失敗しました)、
この場合どうすればいいでしょうか?

425デフォルトの名無しさん:2008/04/05(土) 23:47:13
要素数が100万くらいあるvectorを半分にして50万要素のvector2つにしたいのですが、
50万番目のiteratorを取得するのにiterator++ を50万回呼ぶ以外の方法はないのでしょうか。
vector<int>::iterator it=vec.begin()+vec.size()/2
とかいう感じだと演算子+は定義されていない、とかでダメなもんで。
この辺がポインタとの違いかなとは思うのですが。
426デフォルトの名無しさん:2008/04/05(土) 23:50:06
επιστημη ってこんなところにも出没するんだな
427デフォルトの名無しさん:2008/04/05(土) 23:54:19
>>425
std::advance

というか、+ は定義されているはずなのだが、
どんなコンパイラ使ってるの?
428デフォルトの名無しさん:2008/04/05(土) 23:54:52
>>425
コンパイラ何使ってるの?
vector のイテレータはランダムアクセスイテレータのはずだから、
コンパイラの実装がおかしいだろ、それは。
429デフォルトの名無しさん:2008/04/05(土) 23:55:08
>>425
vector<int>::iterator it= &vec[vec.size()/2];
みたいな感じでできないか?
430デフォルトの名無しさん:2008/04/06(日) 00:01:24
>>429 それはダメ。ポインタとごっちゃになってる。
431デフォルトの名無しさん:2008/04/06(日) 00:08:31
PCSX2というソフトをコンパイルしたいんですがやり方がわかりません。
プログラムについての知識0です。
勉強したいとかではなくこのソフトがほしいだけです。

Microsoft Visual C++ 2008をとりあえずインストールしましたがやり方がまったくわかりません。
サルにも判るように教えてくれる方がいれば幸いです。

ttp://www.pcsx2.net/files/10490

ttp://pcsx2.svn.sourceforge.net/viewvc/pcsx2/pcsx2/GS.cpp?view=markup&pathrev=346
432425:2008/04/06(日) 00:10:23
すみません。できました。どこかで間違った思い込みしてたみたいです。
433デフォルトの名無しさん:2008/04/06(日) 00:23:40
>>430
ランダムアクセスイテレータはポインタ互換だと勘違いしてた
そういう実装が多いだけか
434デフォルトの名無しさん:2008/04/06(日) 00:25:07
>>433
使用可能な演算子はポインタと同じだが、
ポインタとの間で相互変換することはできない。
435デフォルトの名無しさん:2008/04/06(日) 00:26:14
ただし、ポインタもランダムアクセスイテレータの一種だけどね。
436デフォルトの名無しさん:2008/04/06(日) 01:01:40
>>424
プロキシクラスを返す。
class A
{
public:
class Proxy
{
public:
double operator[](int y);
};
Proxy operator[](int x);
};
437デフォルトの名無しさん:2008/04/06(日) 01:06:20
ポインタ返せるならそれでいいと思う。
範囲チェックしたければ何かクラス返すことになると思うけど。
438デフォルトの名無しさん:2008/04/06(日) 10:48:56
>>431
スレ違いだということ、サルでも分かるかな?
439411:2008/04/06(日) 12:00:53
>412
回答ありがとうございます。
遅くなる原因がわかり、勉強になりました。

ありがとうございました。
440デフォルトの名無しさん:2008/04/06(日) 12:57:53
>>436-437
ありがとうございます。
以下のような実装でいいですか? (あまりスッキリしてないような、、)
class test {
public:
test(int arg_size);
struct Proxy {
Proxy(int arg_size) : size(arg_size) {
vec.assign(size, 0.0);
}
double &operator[](int y) {
return vec[y];
}
std::vector<double> vec;
int size;
};
Proxy &operator[](int x) {
return proc_vec[x];
}
std::vector<Proxy> proc_vec;
int size;
};

441デフォルトの名無しさん:2008/04/06(日) 13:36:20
ていうかよっぽどの理由が無いなら()演算子のでいいじゃん
442デフォルトの名無しさん:2008/04/06(日) 14:08:59
クラスの中身の先頭にusing namespace 〜;は書けないの?
443デフォルトの名無しさん:2008/04/06(日) 14:11:20
>>441
なるほど、たしかに全然すっきり書けますね。
メンテもしやすそうだし、こっちにします。
ありがとうございます。

class Matrix {
public:
Matrix(int arg_size) : size(arg_size) {
vec.assign(size, std::vector<double>(size));
}
std::vector< std::vector<double> > vec;
int size;
double &operator()(int x, int y) {
return vec[x][y];
}
};

444デフォルトの名無しさん:2008/04/06(日) 14:18:34
>>443
440でもそうだったけど、size変数って不要じゃね?
445デフォルトの名無しさん:2008/04/06(日) 15:13:16
>>443
更にで何だけど、要素数のパターンが少なくて、定数でしか使わないなら要素数テンプレートにしちゃうと
ベクターも使わずに済むが・・・
用途分からんからしらね
446デフォルトの名無しさん:2008/04/06(日) 15:15:45
エラー 1 error LNK2001: 外部シンボル ""private: static int Forms::Application::nCmdShow" (?nCmdShow@Application@Forms@@0HA)" は未解決です。 main.obj
ってどういう意味のエラーですか?
447デフォルトの名無しさん:2008/04/06(日) 15:21:22
>>446
宣言だけされてて関数が定義されていない。
448デフォルトの名無しさん:2008/04/06(日) 15:34:25
>>445
どうやるんですか?
要素は、二次元ベクトルなんですが、1000×1000要素くらいです。

449デフォルトの名無しさん:2008/04/06(日) 15:36:35
>>446
プロジェクトのリンクするライブラリの設定で
必要な関数入ったLIBファイルを設定しわすれてるんじゃない
450デフォルトの名無しさん:2008/04/06(日) 15:37:08
>>444
その通りですね。
size変数は消します。
451デフォルトの名無しさん:2008/04/06(日) 15:46:43
>>448
vectorの要素数って変わるの?
452デフォルトの名無しさん:2008/04/06(日) 16:25:26
>>448
横レスだが、こういうことだと思う。
template<int size_x, int size_y> class Matrix {
public:
double& operator()(int x, int y) { return v_[x][y]; }
private:
double v_[size_x][size_y];
};

1000×1000は大きいので、スタックには置けないけど。
453デフォルトの名無しさん:2008/04/06(日) 16:43:03
よくみるLPクラス名って、そのクラスのポインタ型って事?
454デフォルトの名無しさん:2008/04/06(日) 17:00:20
>>453 そういう名前付けの規則が昔はやってたんだよ。
455デフォルトの名無しさん:2008/04/06(日) 17:02:13
ある天気予報サイトの三重県の天気情報の文字列だけを抽出して自分のホームページに乗せるプログラムを書きたいのですが、どういったことを勉強すれば良いのかご教示願えないでしょうか。宜しくお願いします。
456デフォルトの名無しさん:2008/04/06(日) 17:13:54
>>455
・サイトにアクセスしてページを入手する
・ページを加工する
・自サイトに貼り付ける
WebProg板へどうぞ。
457デフォルトの名無しさん:2008/04/06(日) 17:32:48
エラー 1 error C2143: 構文エラー : ';' が 'Forms::Application::frm' の前にありません。 application.cpp 7
エラー 2 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません application.cpp 7
エラー 3 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません application.cpp 7
エラー 4 error C2371: 'frm' : 再定義されています。異なる基本型です。 application.cpp 7
>>449
>>447
解決しました。
が、今度はこんなエラーが。
定義はしたんですが、今度は定義した場所でエラー吐くようになりました。
458デフォルトの名無しさん:2008/04/06(日) 17:52:08
>>457

>>54-
459デフォルトの名無しさん:2008/04/06(日) 19:44:31
ありがとうございました。
名前空間をちゃんと指定してなかったのが原因でした。
460デフォルトの名無しさん:2008/04/07(月) 02:21:47
ヘッダに定義とか書けちゃうんだけど、
分けた方がええの?

分ける理由ってなんですか?
461デフォルトの名無しさん:2008/04/07(月) 02:41:53
>>460
定義のほうをあらかじめコンパイルしてオブジェクトにしとける
小さいなら定義も一緒でいいだろ
boostとかにもそういうのあるよ
462デフォルトの名無しさん:2008/04/07(月) 02:46:51
>>460
プログラムサイズが増えたり重複オブジェクトができたりコンパイルが通らなかったりする
463デフォルトの名無しさん:2008/04/07(月) 02:49:17
ヘッダに関数書くならstaticつけるかファンクタにするかテンプレートにしとけよ。
464デフォルトの名無しさん:2008/04/07(月) 02:54:18
こういう質問をする人のレベルだと、一番掴みやすいのはコンパイル時間の問題かなぁ。

>>460
たとえば、計10万行くらいあるソースファイル群のすべてが
直接or間接的にhoge.hppというヘッダファイルをincludeしているとして、
hoge.hppが実装まで全部書いてあるモノだったとすると、
その実装部分をほんの1行変更しただけで、10万行のソースファイル群が
すべて再コンパイルされることになる。
定義を別ファイルにしておけば、変更したときに再コンパイルするのはそのファイルだけで済む。
465デフォルトの名無しさん:2008/04/07(月) 04:53:14
LinuxにおいてHDDの容量を取得したいのですがどの様にすればよいのでしょうか?
466デフォルトの名無しさん:2008/04/07(月) 04:59:01
ただのグローバル変数とstaticをつけたグローバル変数って同違うんですか?
467デフォルトの名無しさん:2008/04/07(月) 06:43:59
>>465
Linux板へどうぞ。ulimitでできるでしょ。

>>466
前者は文字通りGlobal。後者はファイルスコープなので違う翻訳単位からは見えない。
どちらにしても、可能な限り使わないに越したことはない。
468デフォルトの名無しさん:2008/04/07(月) 07:14:53
>>464
>>463
>>462
>>461
ありがとう。
なんとなくわかった。
469デフォルトの名無しさん:2008/04/07(月) 07:45:15
>>463
ヘッダに関数書くときに、static付けたり、ファンクタにしたり、テンプレートにしたりすると、
どういう点でいいですか?全然考えてませんでした。

470デフォルトの名無しさん:2008/04/07(月) 07:59:53
関数が複数実体化されることを抑制できる。
471デフォルトの名無しさん:2008/04/07(月) 12:23:30
★ 今世紀最大の大祭り!聖火を巡る障害物リレー 日本イベント来たる! ★

【目的】
 街中をオニが駆け巡ります。
 オニは聖火を持って移動します。これを消すのが目的です。

 ただし、今回は参加者が多いため難易度がはね上がりました。
 今回のみ、オニは壁役に守られながら走ります。
 壁役を突破して聖火を消せばゲームクリアとなります。

【ルール】
〜勝ち〜
 オニが持っている聖火を消すとその時点でゲームクリアとなります。
〜負け〜
 オニが若里公園まで逃げ切るとその時点でゲームオーバーとなります。

【日時    】 2008年4月26日(土)8:30スタート
【場所    】 長野県長野市
【ルート地図】 ttp://www.city.nagano.nagano.jp/upload/1/taiiku_lane.pdf
【詳細情報 】 ttp://www.joc.or.jp/beijing/torchrelay/index.html
-------------------------------------------------------------
イギリスで行われたイベントの様子
ttp://jp.youtube.com/watch?v=1-KMVWRFLes
フランスで行われたイベントの様子(1分30秒から)
ttp://jp.youtube.com/watch?v=9mYEtkW2bsw

『2ch大規模OFF会場』
ttp://sports11.2ch.net/test/read.cgi/offmatrix/1207495088/
ttp://sports11.2ch.net/test/read.cgi/offmatrix/1207418064/

『各国の競技結果』
ttp://ja.uncyclopedia.info/wiki/%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%88%E3%83%AA%E3%83%BC%E3%83%A0%E3%83%BB%E8%81%96%E7%81%AB%E3%83%AA%E3%83%AC%E3%83%BC
472デフォルトの名無しさん:2008/04/07(月) 18:43:10
四則演算ってさ、
char でも int でも double でもしてくれるが、
それってコンパイル時に適切にマシン語に変換してくれてるんですか?

CPUが持ってる算術演算の機能を使えるように
置き換えてるのであってCPUが int なのか char なのか判断して
処理してるわけではないですよね?
473デフォルトの名無しさん:2008/04/07(月) 18:51:06
>>472
そうだよ
ないです
474デフォルトの名無しさん:2008/04/07(月) 19:12:35
ただし格上げされて計算されるので種別はそんなに多くないです。
475デフォルトの名無しさん:2008/04/07(月) 20:03:56
格上げ、というか汎整数拡張あたりじゃないのかな
476デフォルトの名無しさん:2008/04/07(月) 22:26:22
とりあえず宿題スレの方で提出が終わったので、
自分なりに作ろうと思っているのですが、いきなり行き詰ってしまいました;
整数の場合8桁、負数の場合9桁、エラー仕様など、問題が山積みですが、
どうかご教授お願いします。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6203.txt
477476:2008/04/07(月) 22:28:20
#define buffersize 10ですね;
478デフォルトの名無しさん:2008/04/07(月) 22:41:06
>>476
何がしたいんだ?宿題をといて自分なりに課題を拡張して勉強しようとしたのか?
そのテキストファイルを見せられても、課題を丸投げされているようにしか見えないが。

とりあえずバッファオーバーフローしてたり、いろいろまずいぞ。
479デフォルトの名無しさん:2008/04/08(火) 10:55:17
ttp://www.nicovideo.jp/watch/sm2820444

この動画でやっている、画像ファイルをテキスト(AA)に変換は
どのようにやっているのですか?
480デフォルトの名無しさん:2008/04/08(火) 11:03:12
動画にコード出てるじゃないか……
481デフォルトの名無しさん:2008/04/08(火) 11:08:11
画像の輪郭抽出→予めこのパターンにはこの文字を使うというデータを登録しておく→
画像の上から順にパターン解析と文字割り当てを行う。

って感じしか思い浮かばん
482デフォルトの名無しさん:2008/04/08(火) 11:08:35
>>480
初心者なもので・・・
画像を読み込んで、テキストに変換してさらにそれの色を判別してつけるのは
どの辺のコードを見たら良いのでしょうか?
483デフォルトの名無しさん:2008/04/08(火) 11:19:20
今動画見てきたぜ。想像してたのと違ったぜ。とりあえずBMPを配列にするとこからはじめたら?
BMPのフォーマット↓凄く簡単だからすぐできるはず。
ttp://www.kk.iij4u.or.jp/~kondo/bmp/
後は色に合わせて<font color="色">■</font>をひたすら出力すればできるだろ。
中級入門くらいじゃね?動かしたいならJavaScriptの解説かじればおk
484デフォルトの名無しさん:2008/04/08(火) 12:38:37
>>476
とりあえず、どのあたりで困ってるのかな。?

mainに全部書くのではなく関数を作ってみよう。
引数をまとめれば、何をするべきかわかるんじゃないかな。
485デフォルトの名無しさん:2008/04/08(火) 12:43:09
昔、先輩が「コンストラクタではnew使うな」と言っていたのを思い出したのだけど、
これってどういう意図なのでしょう。
一般的なルールなのか、特定の状況で有効な話だったのか……。
486デフォルトの名無しさん:2008/04/08(火) 12:47:03
>>485
コンストラクタ内で例外が発生すると、デストラクタは呼ばれない (仕様)
→ new でコケたらリーク!

じゃね?
コンストラクタ内の例外は漏れなくコンストラクタ内で処置すれば無問題。
487デフォルトの名無しさん:2008/04/08(火) 13:04:20
>>479
お絵かきとかでもあるネタだけど、むしろどうやって動画にしてる
のかの方が気になる。コーディング中ずっと録画してあとで編集
してるんだろうが…根性あるなw
488デフォルトの名無しさん:2008/04/08(火) 13:17:33
コーディング中のキータイプを記録、編集

動画を取りながら記録したキータイプをマクロで動かす

(`゚'Д`゚')
489デフォルトの名無しさん:2008/04/08(火) 13:24:03
>>479
画像を読み込んで表示するところから始めたらいい
結構親切っぽいから彼のサイトの掲示板で聞いてみれば
講座の方はかなり酷いスパゲティコードだからお勧めしないw
490デフォルトの名無しさん:2008/04/08(火) 16:01:19
491デフォルトの名無しさん:2008/04/08(火) 18:21:58
cinからdoubleを1つまたは複数入力させます。入力されたのが1個なのか、複数なのか判定したいのですが、
以下のコードでよいですか?Macだとうごくのですが、windowsでもこれでいいのかわかりません。
double a;
std::cin >> a;
if (std::cin.peek() == '\n') {
// 数字は一個だった
}
else {
// 一個じゃなかった。
}
492デフォルトの名無しさん:2008/04/08(火) 18:48:09
>>491
やってみりゃいいじゃない。
493デフォルトの名無しさん:2008/04/08(火) 19:06:50
>>492
ありがとうございます。今手元にwindowsがないのです。
また、自分のところのwindowsでやってみて動いても、ほかの人のwindowsでは
どうなるかわからないし…
その、規格的に入力の文字列末判定はこれでいいのかどうか、知り痛いです。
494デフォルトの名無しさん:2008/04/08(火) 19:10:04
>>485
VC8で大量にメモリの確保しているとコンストラクタの中のnewで「メモリが不足しています。」とエラーがでる。
理由が分からずallocにしたら問題なかった。
というか今も原因が掴みきれない件。
495デフォルトの名無しさん:2008/04/08(火) 19:20:20
使う型がある程度限定できるテンプレートだったら
MyTemplate<型名>をtypedefしてしまえば良いような気がするけど
これってありなんですかね?
496デフォルトの名無しさん:2008/04/08(火) 19:38:16
まさにstringとwstring
497デフォルトの名無しさん:2008/04/08(火) 20:08:28
>>493
つボラギノール
498デフォルトの名無しさん:2008/04/08(火) 21:56:33
>>495
あり。
499デフォルトの名無しさん:2008/04/08(火) 21:59:56
ありあり。
500デフォルトの名無しさん:2008/04/08(火) 22:04:32
ありありありあり。
501デフォルトの名無しさん:2008/04/08(火) 22:05:12
ありが十匹で
502デフォルトの名無しさん:2008/04/08(火) 22:14:19
さよならだ
503デフォルトの名無しさん:2008/04/08(火) 22:23:50
アリーヴェデルチ
504476:2008/04/08(火) 22:28:39
>>478
ですよね、失礼しました;

>>484
エラー仕様を作ろうとしたのですが、
【整数の場合最大8桁までを有効とし、9桁以降を無視する。
 負数の場合は、最大9桁までを有効とし、10桁目以降は無視する。】とあり、
【『−』のみ、または改行のみ入力されたらエラーメッセージを表示し、終了】
というのもあるので、
エラーとしては if(a[0]=='\n')  if(a[1]=='-' && a[0]=='\n')
みたいなのを使えばいいのかなぁ、程度で考えてるのですが、
どこに入れればいいのかなどイマイチ判らないのです;
505デフォルトの名無しさん:2008/04/08(火) 22:34:19
ひょっとしてその数え方だと、「-1」は2桁なのか?
506476:2008/04/08(火) 22:53:28
>>505
私的にはそういう風に考えてます;
507デフォルトの名無しさん:2008/04/08(火) 22:54:05
>>486
なるほどー例外ですか。それは思い浮かばなかった。
newしたときの初期化の処理が無駄だったりするのかとか当時考えたのを思い出した。
508デフォルトの名無しさん:2008/04/08(火) 23:02:41
>>504
whileを抜けて
>if(a[0]=='\n')  if(a[1]=='-' && a[0]=='\n')
の場合にreturnで終わればOK
returnの前にprintfで適当にエラー出せば目的のものになるだろ。
>どこに入れればいいのかなどイマイチ判らないのです;
どこに入れてダメだったんだ?
509デフォルトの名無しさん:2008/04/08(火) 23:09:47
classのなかにnamespaceは作れますか?
510デフォルトの名無しさん:2008/04/08(火) 23:19:28
muri
511デフォルトの名無しさん:2008/04/09(水) 03:14:20
質問なのですが、(VC++ 2008 EE を使用しています。)

以下のコード。

COORD coord;
HANDLE hConsoleStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hConsoleStdOut, coord);

は、<windows.h>をインクルードして使える、というのは判断できますが、
これはwindowsプログラミングなのでしょうか?
WinMain()関数も無いし、DOSで表示されるのですが、
こういったコードの総称は何と呼ばれているのですか?

説明下手で申し訳ないです。
512デフォルトの名無しさん:2008/04/09(水) 03:17:27
WindowsのAPIに依存してるならどう考えてもWindowsプログラミングだと思うが…。
513デフォルトの名無しさん:2008/04/09(水) 03:39:45
WindowSystem(≒GUI)プログラミングではないが、
(MS-)Windowsプログラミングだな。
ついでに言えば、コンソールウィンドウはDOSではない。
514デフォルトの名無しさん:2008/04/09(水) 04:02:03
>>512
>>513

ありがとうございます。
この「COORD coord;」や「HANDLE」の意味が解らず、
じゃあ総称が判ればネットで検索できる、と思い至ったのですが、
ネットを見ても、C言語による(MS-)Windowsプログラミングが掲載されていないんですよね。
はぁ。。。
515デフォルトの名無しさん:2008/04/09(水) 05:19:59
>>514
日本語訳は無いけどMSDNに載ってるよ。
516Alexander The Great WAS ALBANIAN, the PROOF by Flamuri:2008/04/09(水) 06:53:32
517デフォルトの名無しさん:2008/04/09(水) 07:30:25
>>507
ちゃんと delete すれば問題ない。
例外を一旦コンストラクタ内でキャッチして delete するのもいいが、
スマートポインタに入れておけばあとはデストラクタが勝手に何とかしてくれる。

コンストラクタ内で例外が発生した場合に呼ばれないデストラクタは
構築中のオブジェクトのデストラクタだけだからね。
既に構築されたオブジェクトのデストラクタは全て呼ばれる。
例えば基底クラスのデストラクタとか
構築されたメンバ変数のデストラクタとかは全て呼ばれる。

new に関して気をつける必要があるのは事実だけど、
使っていけないってことはあり得ない。
まあ、初心者は使わない方が無難ってこと程度の話じゃないのかな。
518デフォルトの名無しさん:2008/04/09(水) 09:01:29
いいえ、newを生で使っている人はちゃんとスキンをつけるようにしてください。
519デフォルトの名無しさん:2008/04/09(水) 09:26:43
newに限らず例外を投げる可能性のある関数をコンストラクタ内で
呼び出すときはstack unwindを考えて対応する。
520デフォルトの名無しさん:2008/04/09(水) 09:32:36
コンストラクタ内でnewが例外吐いたのをキャッチしたとして、
そのあと何をすれば良いのですか?
521デフォルトの名無しさん:2008/04/09(水) 09:38:26
>>520
ケースバイケース
スワップが頻発してるなどメモリ不足でシステムがヤバイ状態なら
終了してシステム全体のシステムの再考。
そのエラーを無視してでも少しでも長く生き続ける必要が条件なら
ログにでも吐いて続行。
522デフォルトの名無しさん:2008/04/09(水) 11:47:43
VC++2008EE
ListBoxの1行削除ができたので、今度は削除前に
メッセージボックスを出して見ようとしたのですが、
エラーがものすごい数出てしまいました。

System::Windows::Forms::DialogResult result;
result = MessageBox::Show("削除しますか?","DELETE CHECK",MessageBoxButtons::YesNo);
Debug::WriteLine(result);
if(result != System::Windows::Forms::DialogResult::Yes)){
return;
}
if文全体を削除すると問題なく動作し、
また、出力ではYes,No確認できるので、
if文のSystem::Windows::Forms::DialogResult::Yesが、
問題なのかと思い、"Yes"とかにしてみたのですがやはりエラーが出てしまいます。
これはなぜエラーが出てしまうのでしょうか
523デフォルトの名無しさん:2008/04/09(水) 11:56:41
>>519
それコンストラクタ関係ないだろ。
524デフォルトの名無しさん:2008/04/09(水) 12:00:08
>>522
それ.netじゃん
AfxMessageBoxかAPIのMessageBox使うべし
525デフォルトの名無しさん:2008/04/09(水) 12:03:48
>>520
コンストラクタ内で catch なんて書かないでいいように RAII を徹底したほうがいい。
526デフォルトの名無しさん:2008/04/09(水) 12:14:47
>>524
ひと目でわかる Microsoft Visual C++ 2008 アプリケーション開発入門
という本を読みながらやっていて、
本書はC++/CLIで書いてある。とあるので、たぶん.netというやつだとおもいます。

この本の通りにやるとエラーが出てしまい、
エラーの内容見てもよく分からなくて、
いろいろ試してたのですが、結局原因が分からず聞いてみました。

この本で使っているMessageBoxにはなにか問題があったりするんでしょうか
527デフォルトの名無しさん:2008/04/09(水) 12:21:41
>>526
C++/CLIてのはC++でなんとか.net使いましょうよ・・・っていう仕様
.netだけならC#の方がいいし、速度的にC++ならC++/CLIしないでMFCかAPI使った方がいい
528522:2008/04/09(水) 12:30:18
申し訳ありません。もの凄く下らないミスでした。
if(result != System::Windows::Forms::DialogResult::Yes)){
かっこが一つ多かったです・・・スレ汚しすみませんでした。

>>527
うう、本まで買って気合い入れてしまったため再スタートは辛いです。
とりあえずこの道進んで、あとから徐々に方向転換してみます。
ありがとうございました。
529デフォルトの名無しさん:2008/04/09(水) 12:33:15
>>528
C++/CLIなら↓の方で聞いた方がいいよ

C++/CLI part3
http://pc11.2ch.net/test/read.cgi/tech/1206447234/
530デフォルトの名無しさん:2008/04/09(水) 15:29:32
>>528
甘いな。俺は最初どの本買ったらいいかわかんなくて結局3冊目まで買ったぞ
531デフォルトの名無しさん:2008/04/09(水) 15:36:05
MFCってまだ使われてるのか?
532デフォルトの名無しさん:2008/04/09(水) 15:44:23
>>531
きみのPCのMFC関連のDLL等を全て削除して使用してみればきみの環境での依存度が分かる
533デフォルトの名無しさん:2008/04/09(水) 15:46:40
>>532
滑ってるよ
534デフォルトの名無しさん:2008/04/09(水) 15:52:50
マジレス
535デフォルトの名無しさん:2008/04/09(水) 17:07:16
MFC関連のDLL、スタティックリンクするから無くても動いちゃうよ
(俺のアプリは)
536デフォルトの名無しさん:2008/04/09(水) 17:14:37
CString m_combo = "notepad.exe";
WinExec((LPCSTR)(LPCTSTR)m_combo,SW_SHOW);
これアプリが起動しないんですけどなんでですか
537デフォルトの名無しさん:2008/04/09(水) 17:23:00
LPCTSTRをLPCSTRに変換しているのが限り無く怪しい。
LPCTSTRを引数に取るShellExecuteか何かを使え。
538デフォルトの名無しさん:2008/04/09(水) 17:30:01
WinExecが好きなんですけど変換は不可能ですか?
539デフォルトの名無しさん:2008/04/09(水) 17:33:34
なら(LPCSTR)(CStringA)m_comboでどうだ。
あと、引数の少なさなら<tchar.h>の_tsystemがいいぞ。
540デフォルトの名無しさん:2008/04/09(水) 17:35:33
っていうかWinExecはdeprecatedな扱いのAPIのような気がする。
541デフォルトの名無しさん:2008/04/09(水) 17:37:24
struct hoge_a{
int a;
int b;
};

struct hoge_b : public a{
int c;
int d;
};

としたとき、hoge_aのメンバのメモリ上の並び順はabとなるのは保証(規定)されていると
どこかで見た記憶があるのですが、hoge_bの場合、abcdとなることは保証されるのでしょうか?
542デフォルトの名無しさん:2008/04/09(水) 17:54:09
>>539
動いたwお前すごいわ
どこにも乗ってなかったぞこんなの
543デフォルトの名無しさん:2008/04/09(水) 18:27:43
srandのseedが同じ場合、マシンやOSが変わっても同じ乱数を発生させることができるのでしょうか?
544デフォルトの名無しさん:2008/04/09(水) 18:32:25
>>543
No
545デフォルトの名無しさん:2008/04/09(水) 18:42:27
そうすると何に依存するのでしょうか?
コンパイラですか?それともOSですか?
AMDとintelのようにCPUが変わっただけでもダメですか?
546デフォルトの名無しさん:2008/04/09(水) 18:44:58
libcの実装次第?
時間と空間を使えばかなりランダムになりそうだけどなぁ。
547デフォルトの名無しさん:2008/04/09(水) 19:10:37
>>543
移植性を考えるなら同じ種で同じ乱数列の出力を保証するにはライブラリに頼らず乱数発生器も実装してしまう
548デフォルトの名無しさん:2008/04/09(水) 19:46:10
C++について質問なのですが、
オブジェクトを作らずにメンバ関数を呼び出すことは可能でしょうか。
549デフォルトの名無しさん:2008/04/09(水) 19:49:19
静的メンバ関数なら。
550デフォルトの名無しさん:2008/04/09(水) 19:54:24
>>548
できる。

struct a{ void f(){} };
reinterpret_cast<a*>(NULL)->f();
551デフォルトの名無しさん:2008/04/09(水) 20:06:20
なるほど。勉強になりました。
レスありがとうございました。
#include <stdio.h>

class A
{
public:
static A* make_obj(void);
void my_puts(void){ puts("Hello\n"); }
};

A* A::make_obj(void){
A* a = new A;
return a;
}

int main()
{
A* a = A::make_obj();
a->my_puts();
return 0;
}
552デフォルトの名無しさん:2008/04/09(水) 20:12:24
>>550
やめなさい
553デフォルトの名無しさん:2008/04/09(水) 20:36:54
>>551
わかってると思うけど生ポではなくスマポに入れて返しとけよ
554デフォルトの名無しさん:2008/04/09(水) 21:09:35
using namespace 〜;
は取り消せますか?
555デフォルトの名無しさん:2008/04/09(水) 21:16:28
永遠に取り消す事が出来ない呪いです。
using は計画的に。
556デフォルトの名無しさん:2008/04/09(水) 21:24:07
namespaceをusingすると、そのnamespace内のusingまで見えてしまうのには泣く。意味ねーじゃん
557デフォルトの名無しさん:2008/04/09(水) 21:27:35
だからヘッダにusing書いちゃ駄目ってママ言ったでしょ
558デフォルトの名無しさん:2008/04/09(水) 21:30:57
>>550
staticメンバ関数が無い時代の苦肉の策ですなあ。
ただ非静的メンバーは参照できない。
559デフォルトの名無しさん:2008/04/09(水) 21:31:50
turboPascalのusing見たいな使い方したかったのに。
560デフォルトの名無しさん:2008/04/10(木) 00:22:01
VC++ 2008 EE でWindowsアプリケーションを作成したいのですが、
そのまま<windows.h>をインクルードしてもエラー表示なので、
どのような設定が必要なんですか?
561デフォルトの名無しさん:2008/04/10(木) 00:24:06
>>548
なんのためのメンバ関数なんだか。
562デフォルトの名無しさん:2008/04/10(木) 00:33:29
>>561
いや、他人の書いたコードを解読してるんだ。。
563デフォルトの名無しさん:2008/04/10(木) 00:39:03
>>560
[ファイル]-[追加]-[新しいプロジェクト]
[Visual C++]-[Win32]-[Win32プロジェクト]-[プロジェクト名]-[OK]
[次へ]-[Windowsアプリケーション]-[■空のプロジェクト]-[完了]
[ソースファイル]-[追加]-[新しい項目]
[Visual C++]-[コード]-[C++ファイル]-[ファイル名]-[追加]
564デフォルトの名無しさん:2008/04/10(木) 01:46:59
>>563
ありがとうございます。3行目まではうまく設定できたのですが、
4行目の「ソースファイル」?が何を指しているのかわからず、
そのまま5行目の作成を行いました。
結果はやはりビルドエラーです。
コードは以下です。

LRESULT CALLBACK WindowProc(HWND,UINT,WPARAM,LPARAM);

/* アプリケーションエントリーポイント */
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR CmdLine,
int CmdShow)
{
   //処理

return ;

}

/* ウインドウプロシージャ */
LRESULT CALLBACK WindowProc(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam)
{
//処理
}
return DefWindowProc(hwnd,message,wparam,lparam);
}
565デフォルトの名無しさん:2008/04/10(木) 01:50:01
エラーの内容は?
566デフォルトの名無しさん:2008/04/10(木) 01:54:31
ファーストへの悪送球。
567デフォルトの名無しさん:2008/04/10(木) 01:54:45
1>------ ビルド開始: プロジェクト: C800, 構成: Debug Win32 ------
1>コンパイルしています...
1>MJ_1.cpp
1>.\MJ_1.cpp(26) : error C2440: '=' : 'const char [6]' から 'LPCWSTR' に変換できません。
1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
1>.\MJ_1.cpp(41) : error C2664: 'CreateWindowExW' : 2 番目の引数を 'const char [6]' から 'LPCWSTR' に変換できません。(新しい機能 ; ヘルプを参照)
1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
1>C800.cpp
1>.\C800.cpp(28) : error C2440: '=' : 'const char [6]' から 'LPCWSTR' に変換できません。
1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
1>.\C800.cpp(43) : error C2664: 'CreateWindowExW' : 2 番目の引数を 'const char [6]' から 'LPCWSTR' に変換できません。(新しい機能 ; ヘルプを参照)
1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
1>コードを生成中...
1>ビルドログは "file://d:\My Documents\Visual Studio 2008\Projects\C800\C800\Debug\BuildLog.htm" に保存されました。
1>C800 - エラー 4、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

です。
568デフォルトの名無しさん:2008/04/10(木) 02:02:15
>>567
なぜコンパイルエラーの部分を省略する。
ググればいろいろ見つかる。
http://www.google.co.jp/hws/search?hl=ja&q=LPCWSTR+char+c2440&client=fenrir&adsafe=off&safe=off&lr=lang_ja
569デフォルトの名無しさん:2008/04/10(木) 02:21:14
>>568
ありがとうございます。
文字変換だったのですね。
しかしググっても出てこないので最後に嘆きます。

1>------ ビルド開始: プロジェクト: GAME, 構成: Debug Win32 ------
1>マニフェストを埋め込んでいます...
1>.\Debug\GAME.exe.intermediate.manifest : general error c1010070: Failed to load and parse the manifest. U_U!$kLdK
1>~[
1>ビルドログは "file://d:\My Documents\Visual Studio 2008\Projects\C800\GAME\Debug\BuildLog.htm" に保存されました。
1>GAME - エラー 1、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

なるエラーが出るのですが、まったく意味不明です。
570569:2008/04/10(木) 18:46:06
申し訳ないです。
自己解決しました。
ありがとうございます。
571デフォルトの名無しさん:2008/04/10(木) 21:45:49
VC++2005で、ADOでSQLSERVER2005に接続して、binary型のフィールドに
1000byte程のバイナリデータを保存したいのですが、
long型の配列にデータをmemcpyし、それをrs->Updateしようとすると、
コンパイルで「bool値に変換します」というような警告がでて、データを転送できません。
バイナリデータを転送するにはどのようにすればいいのでしょうか?
(配列には正常にデータがコピーされていることはファイル出力で確認できております)
572デフォルトの名無しさん:2008/04/11(金) 00:26:01
573デフォルトの名無しさん:2008/04/11(金) 06:15:26
vector〈基底クラス*〉に数種類の派生クラスをプッシュバックしてオーバーライドした関数を実行するようなことはできますか?
574デフォルトの名無しさん:2008/04/11(金) 06:18:09
>>573
virtualなメンバ関数を実行ということなら、可能です。
575デフォルトの名無しさん:2008/04/11(金) 06:33:22
もちろん仮想関数にしてあります
&の付け忘れでした

解決できましたありがとうございます
576デフォルトの名無しさん:2008/04/11(金) 06:38:48
577デフォルトの名無しさん:2008/04/11(金) 06:50:20
573=574=575=576
578デフォルトの名無しさん:2008/04/11(金) 07:17:15
>>575
メモリリークに気をつけような。
boost::ptr_vector の使用も検討してみるといい。
579デフォルトの名無しさん:2008/04/11(金) 12:34:50
動的に二次元配列を確保するにはどうすればよいですか?
int x=10; int y=10;
double a[x][y];
という風に書くのは、xyが小さい間は出来たのですが、newで確保しようとすると
yを変数にできません。vectorを使わずに上記のようなことができるでしょうか?
よろしくお願いします。
580デフォルトの名無しさん:2008/04/11(金) 12:37:06
double **a;

*a = new double[x]

for( int i = 0; i < x; ++i )
 a[x] = new double[y]

こんなん
581デフォルトの名無しさん:2008/04/11(金) 12:47:33
boost::multi_arrayオススメ。
582デフォルトの名無しさん:2008/04/11(金) 12:52:43
>>580
ありがとうございます。
確保した二次元配列をほかの関数に渡すにはどうすればよいですか?

あと、boost::multi_arrayは速いですか?
今書いているのは、std::vectorもあまり知らない人に見せるためなので、
boostなんてとてもだめです。
583デフォルトの名無しさん:2008/04/11(金) 12:57:05
アセンブリ言語のコンパイラのCソースプログラムを持っているのですが、
アセンブリ言語をコンパイルするには、このソースをコンパイルしてから
どうすればいいのでしょうか?
584デフォルトの名無しさん:2008/04/11(金) 12:58:11
void func( int **a );
これでわたせるんじゃね、多分
585デフォルトの名無しさん:2008/04/11(金) 13:06:03
>>582
そういう初心者には、素直に一次元配列を仮想化して使う方がいい。
こんな関数でも用意すればアクセスするのも割と簡単だ。
static unsigned offset(unsigned x, unsigned y, unsigned w)
{
return x + y * w;
}
勿論、メモリ確保はこうなる。
double * a = new double[w * h];
あー、ついでに言えば>580はバグだらけだから要注意で。
つーか、>584もかすだわ。
586デフォルトの名無しさん:2008/04/11(金) 13:06:38
>>583
Cソースをコンパイルしてできた実行ファイルを実行してアセンブルすれ
ばいいのでは。

587デフォルトの名無しさん:2008/04/11(金) 13:19:33
>アセンブリ言語のコンパイラ
有り得ない間違いだな。
588デフォルトの名無しさん:2008/04/11(金) 13:29:33
>>580
これは酷い。
589デフォルトの名無しさん:2008/04/11(金) 13:34:19
mbscmp
wcscmp
などの違いがわからない・・・・
あと、lstrcmp とか strcmp みたいなのもあったような気がするけど気のせい?
誰か、これらの関数の違いについて分かり易く教えてください。
590デフォルトの名無しさん:2008/04/11(金) 13:40:56
文字として wchar_t を使うとき -> wcscmp
文字として char で mbcs を使うとき mbscmp
文字として char で sbcs を使うとき strcmp
文字として TCHAR を使うとき lstrcmp

ドキュメント読まずにまず2chで聞くという態度では、わからなくて当たり前。
591デフォルトの名無しさん:2008/04/11(金) 13:49:11
>>590
すみません。それがいまいちよくわからないんです。
charを使うときとか、tcharを使うときと言われても抽象的すぎて???
具体的に、どういう処理をするときにmbscmp や strcmp などを使い分けるのでしょうか?
同じ文字列比較でも、mbscmp を使っていたり、 strcmp を使っていたりと、訳が分りません。
592デフォルトの名無しさん:2008/04/11(金) 13:52:17
>>587
確かに…ご指摘ありがとうございます
アセンブリ言語を実行するものの意味で使いました
593デフォルトの名無しさん:2008/04/11(金) 13:52:50
>>591
それは抽象的だからわからないんじゃなくて、勉強しないからわからないのです。
mbcs と sbcs の違いなんか、Google で 「mbcs と sbcs の違い」を(カッコははずして)
検索すればいくつもそれらしい説明のページが出てくるのです。

もし手抜きじゃなくてホントのホントに何もしないで知識が身に付くと思ってるのなら、
そもそもバカなので勉強しても無駄なので止めるべきです。
594デフォルトの名無しさん:2008/04/11(金) 14:04:17
>>592
それは普通、アセンブラと呼ばれる。
いや、厳密に言えば「アセンブリ言語を翻訳するもの」だが。
595デフォルトの名無しさん:2008/04/11(金) 14:05:02
>>593
なんか嫌なことでもあったのか?
596デフォルトの名無しさん:2008/04/11(金) 14:05:03
なんとなく分ったような分らないような・・・・

同じ英数字からなる文字列比較でもプログラムによって使っている関数が違うのは
書き手(プログラマー)の意識の違いによる?
さらにワイド文字とマルチバイト文字の違いがよく分らん。。。。

出直してきます。スレ汚してすみません。
597デフォルトの名無しさん:2008/04/11(金) 14:06:53
すまん
*a = new double[x]
じゃなくて
a = new double*[x]
598デフォルトの名無しさん:2008/04/11(金) 14:20:42
>>597
それだけじゃねーだろ。
599デフォルトの名無しさん:2008/04/11(金) 15:19:15
>>595
593じゃないけど、あえて言うなら「投げっぱなしの馬鹿を見てしまったこと」が
「嫌なこと」なんだろう。
600デフォルトの名無しさん:2008/04/11(金) 20:21:49
deleteで落ちちゃうんだけど、原因わかりません><
このコードで落ちます・・・。

int i;
char *lpary[4];

for (i = 0; i < 4; i++){
lpary[i] = new char[256];
}

for (i = 0; i < 4; i++){
delete [] lpary[i];
}

誰か教えてください。
601デフォルトの名無しさん:2008/04/11(金) 20:23:53
落ちる要素は特に見当たらないが・・・。
多分、他で色々やってる部分でマズいことやってんじゃないかと。
602デフォルトの名無しさん:2008/04/11(金) 20:24:46

for (i = 0; i < 4; i++){
delete lpary[i]
}

delete[] lpary;
603デフォルトの名無しさん:2008/04/11(金) 20:25:53
>>602
おいおい^^;
604デフォルトの名無しさん:2008/04/11(金) 20:26:53
よく見てなかった
すまん忘れてくれ
605600:2008/04/11(金) 20:29:44
すいません。原因わかりました。
newとdeleteの間でやってる処理で確保したポインタに別のポインタ
渡してしまってた・・・。

まじごめん;;
606デフォルトの名無しさん:2008/04/11(金) 20:30:25
悪い事いわないから、vector 使え。
607デフォルトの名無しさん:2008/04/11(金) 23:28:52
>>596
>さらにワイド文字とマルチバイト文字の違いがよく分らん
それを調べるのが先だということに気づかないの?
608デフォルトの名無しさん:2008/04/11(金) 23:30:06
出直してくるって言ってるんだからほっとけよ
609デフォルトの名無しさん:2008/04/12(土) 00:33:20
変数をStringだとかChar型で指定することってできますか?
610デフォルトの名無しさん:2008/04/12(土) 00:34:10
????????
611デフォルトの名無しさん:2008/04/12(土) 00:56:30
静的なメモリを確保をしたクラス内に動的に確保したクラスがあるとします
この場合exit(0)が実行された時に正しく破棄が行われますでしょうか?
612デフォルトの名無しさん:2008/04/12(土) 00:59:02
>>611
だいたいOSがうまく解放してくれる・・・かもね。
そんな保障はどこにもない。ちゃんと解放するかJava等に移行しましょう。
613デフォルトの名無しさん:2008/04/12(土) 01:14:07
ぬるぽ
614デフォルトの名無しさん:2008/04/12(土) 01:15:38
>>611
ライブラリの仕様によるけど、
・静的なオブジェクトのデストラクタ⇒呼ばれる
・main()から辿ってその時点までのスタック上にあるオブジェクトのデストラクタ⇒呼ばれない
つまりスタックの巻き戻しは行われないが通常のクリーンアップルーチンは呼ばれる、
が一般的なのでは。何か重要な後処理が必要なら atexit でも書いとくべきだな。
615デフォルトの名無しさん:2008/04/12(土) 01:34:05
atexitを使うことにします
ありがとうございます
616デフォルトの名無しさん:2008/04/12(土) 02:10:32
constポインタpDataのメンバstd::deque<Log> LogDataを参照するpastLog

const std::deque<Log>& pastLog = pData->LogData

を上のように作ってそのiteratorを使用したいのですが
const std::deque<M3Log>::iterator itr = pastLog.begin();
とすると

左オペランドを扱う演算子が見つかりません (または変換できません) (新しい動作; ヘルプを参照)。

と怒られます

何処をどうしていいのかわかりません、アドバイスをいただけないでしょうか
617616:2008/04/12(土) 02:12:31
訂正
const std::deque<M3Log>::iterator itr = pastLog.begin();

const std::deque<Log>::iterator itr = pastLog.begin();
618デフォルトの名無しさん:2008/04/12(土) 02:12:40
c++ は良く知らないけど、
std::deque<Log>::const_iterator itr = pastLog.begin();
じゃないの?
619デフォルトの名無しさん:2008/04/12(土) 02:19:58
>>618
ありがとうございます
無事コードがコンパイルを通るようになりました

const_iteratorなんてあったのか・・・
620デフォルトの名無しさん:2008/04/12(土) 03:41:33
>>619
>const_iteratorなんてあったのか・・・
超ワロタじゃないかよ
621デフォルトの名無しさん:2008/04/12(土) 04:19:52
静的確保と動的確保でプライベートメンバ関数の実行に違いが出るようなことは有るでしょうか?
622デフォルトの名無しさん:2008/04/12(土) 09:55:51
外から借りない限り終了すれば仮想プロセス空間ごと消滅するかと。
623デフォルトの名無しさん:2008/04/12(土) 11:01:31
さあて。delete thisするんでない限りは、まー無いんでないかね。
624デフォルトの名無しさん:2008/04/12(土) 12:57:40
#define sucide delete this
625デフォルトの名無しさん:2008/04/12(土) 14:40:30
suicide
626デフォルトの名無しさん:2008/04/12(土) 14:49:06
oh misu superu
627デフォルトの名無しさん:2008/04/12(土) 14:50:30
ifの条件部で変数を宣言したい時に、boolとして評価できない型だとコンパイルエラーになりますよね

std::set::const_iterator it = hoge.find(....);
if (it != hoge.end()) {
// ここで it を使う
}
のようなことをするときにifのブロック内にitのスコープを限定して
if ((std::set::const_iterator it = hoge.find(...)) != hoge.end()) {
のようなことをしたいんですけど無理ですか?
628デフォルトの名無しさん:2008/04/12(土) 15:23:43
無理
629デフォルトの名無しさん:2008/04/12(土) 15:39:39
for ( std...it = hoge.find(...); it != hoge.end(); ) {
 break;
}

おすすめはしない
630デフォルトの名無しさん:2008/04/12(土) 15:40:03
{ std::set::const_iterator it; if(...){...} }
631デフォルトの名無しさん:2008/04/12(土) 15:40:50
あるいは空スコープを使うとか。

{
 std...it = ...:
 if(){
 }
}
632デフォルトの名無しさん:2008/04/12(土) 15:54:26
無理やり
template<typename T, template<class> class Comp> class eval_lapper
{
public:
    eval_lapper( std::pair<T, T> rhs ) : obj_(rhs.first), target_(rhs.second) {}
    operator bool() const { return Comp<T>()(obj_, target_); }
    T& obj() { return obj_; }
    const T& obj() const { return obj_; }

private:
    T obj_;
    T target_;
};

int main()
{
    std::set<int> s;
    //s.insert(123);
    if( eval_lapper<std::set<int>::const_iterator, std::not_equal_to > it = std::make_pair( s.find(123), s.end() ) )
        std::cout << *(it.obj()) << std::endl;
    return 0;
}
633デフォルトの名無しさん:2008/04/12(土) 15:57:33
ifの評価部分ってboolのオーバーロードがあったらちゃんとboolとして評価してくれるの?
634デフォルトの名無しさん:2008/04/12(土) 15:58:44
してくれるが、if 文以外の所でも本当に bool 値として解釈されて欲しい場合でなければ bool のオーバーロードはすべきじゃない。
635デフォルトの名無しさん:2008/04/12(土) 16:00:12
if 文だけでそう解釈されて欲しい場合は、
普通には使われないようなポインタへのキャスト演算子を
オーバーロードするのが一般的。
メンバポインタとか。
636デフォルトの名無しさん:2008/04/12(土) 16:41:51
>>632
面白いなやり方だな
でも、lapper => wrapper じゃね
637デフォルトの名無しさん:2008/04/12(土) 16:53:02
//test.h
struct test{
 int a;
 test(int a_) : a(a_){}
};

//instance.cpp
#include "test.h"
test obj(1024);

//program.cpp
#include <iostream>
#include "test.h"
extern test obj;

int main(){
 std::cout << obj.a << std::endl;
 return 0;
}

別々の翻訳単位に型testが定義されてるけど、同一の型として認識されるの?
VC8ではコンパイル通った。
638デフォルトの名無しさん:2008/04/12(土) 17:01:05
そりゃ通るだろ

同じヘッダインクルードしてるんだし
639デフォルトの名無しさん:2008/04/12(土) 17:01:59
メンバ変数が一部が#ifdefあたりで囲んであると
場合によっては非常に愉快な話になるけどね
640デフォルトの名無しさん:2008/04/12(土) 17:09:35
愉快なというかバグな話だろ
641デフォルトの名無しさん:2008/04/12(土) 22:59:36
中々原因が掴めず笑うしかないとかそういうアレだろう
鼻から悪魔が出たらもっと愉快だな
642デフォルトの名無しさん:2008/04/13(日) 22:40:49
String name;

String^ name;
の違いはなんですか?ハンドルの意味がわかりません
643デフォルトの名無しさん:2008/04/13(日) 22:48:53
>>642
C++/CLI はスレ違いなのです。

C++/CLI part3
http://pc11.2ch.net/test/read.cgi/tech/1206447234/
644デフォルトの名無しさん:2008/04/13(日) 22:50:41
>>642
とりあえず「C++/CLI ハンドル 自動変数」でググったら説明が見つかると思う。
それで分からなかったら、もう一度おいで。

# CLIってちょい過疎気味の本スレしか無いのな
645デフォルトの名無しさん:2008/04/14(月) 01:32:44
コピーコンスタクタ辺りで質問です。

template <bool M> struct P {
int* _p;

P(int* v=NULL) : _p(v) {}
P(P& v) : _p(v.release()) {} // (1)
~P() { if(M && _p) delete _p; }

void reset(int* v=NULL)
{ if(M && _p && _p != v) delete _p; _p = v; }

int* release()
{ int* temp = _p; _p = NULL; return temp; }
};

P<true> pf(int n) { return P<true>(new int(n)); }

int main() { P<true> a = pf(3); }

上記だと
error: no matching function for call to ‘P<true>::P(P<true>)’
とコンパイルエラーがでます。 しかし (1) を

template <bool _M> P(P<_M>& v) : _p(v.release()) {}

にするとエラーにならずにコンパイルできるようになります。なぜコンパイルエラーがでなくなるのでしょうか? コンパイラは gcc version 4.0.1 (Apple Inc. build 5465) です。
646デフォルトの名無しさん:2008/04/14(月) 01:43:50
>>645
コピーコンストラクタをテンプレート関数にして異なるテンプレート引数の型でも受け取れられるれりれるようにしたから。
647デフォルトの名無しさん:2008/04/14(月) 01:46:07
>>645
よく分からんけど、VC8だとどちらもコンパイル通ったぞ
648デフォルトの名無しさん:2008/04/14(月) 01:49:12
>>647
エスパーすると645は(1)をP(P& v) : _p(v.release()) {}とした上でソースコードのどこかで
P<false> oldObj;
P<true> newObj(oldObj);
とでもしているんだろう。
649645:2008/04/14(月) 01:52:20
>>646
テンプレート引数の型は書き変える前も後も true しか扱わないのに異なる型を受け取れるようにしないと
いけない理由が分かりません。
途中で P<false> に変換されているのも確認できませんでした。

>>647
gcc だけで起きる問題なんでしょうか…

>>647
いやしてないのです。上記のソースのみです。
650デフォルトの名無しさん:2008/04/14(月) 02:17:53
質問です。4桁の乱数を取得する関数なのですが
if(num[i] == num[j])以降のdowhileで必ずループに入ってしまうのですが
原因を教えていただけませんか?
void random::gt(){
srand((unsigned) time(NULL));
num[0] = rand() % 10;
if(num[0] <= 0){
do{
num[0] = rand() % 10;
}while(num[0] <= 1);
}
//その他乱数取得
for(i=0;i<4;i++){
if(i <= 4){
for(j=1;j<4;j++){
num[j] = rand() % 10;
if(num[i] == num[j]){
do{
num[j] = rand() % 10;
system("PAUSE");
}while(num[i] != num[j]);
}
};
}
};
}
651デフォルトの名無しさん:2008/04/14(月) 02:47:43
>>649
Pは接頭語みたいなもので一部の例外を除いて単独では使えない
この場合だとP<true>とP<false>が型
たとえばP<true>を定義したとき、もしP(P&)の記述が許されると
コピーコンストラクタP(P<true>)か
引数付きのコピーじゃないコンストラクタP(P<false>)か曖昧になる
652>650:2008/04/14(月) 03:22:48
日本語でおk

dowhileは必ず1回はループ内の処理を実行するが?
あと、その貼ったソースはそのままか?変更して貼ってない?

653645:2008/04/14(月) 03:33:40
>>651
あーなるほど。コピーコンストラクタかコンストラクタが曖昧になるんですね。
P<true> -> P<false> の変換がされると嫌で書き方に困っていたのですが

P<true> -> P<true> OK
P<true> -> P<false> OK
P<false> -> P<false> OK
P<false> -> P<true> NG
の時に

template <bool M>
struct P {
template <bool _M> P(P<_M>& v);
...
};

template <> template <> P<true>::P(P<true>& v) : _p(v.release()) {}
//template <> template <> P<true>::P(P<false>& v); // NG
template <> template <> P<false>::P(P<false>& v) : _p(v._p) {}
template <> template <> P<false>::P(P<true>& v) : _p(v._p) {}

みたいにもできるってことですね!ありがとうございました。
654デフォルトの名無しさん:2008/04/14(月) 03:33:47
あああ、すいません

if(num[i] == num[j]){のところで
変数num[i]とnum[j]が違っていても処理をしてしまう原因

を知りたかったのです
ソースは特に変えてないと思うのですが
どこかおかしいでしょうか
655645:2008/04/14(月) 03:36:18
違った。P<false> -> P<true> が嫌だった。です。
656650:2008/04/14(月) 03:39:19
またもすいません
>>654は>.650です・・・
657デフォルトの名無しさん:2008/04/14(月) 09:29:44
>>650
i が 0 から 3 をとりながら動き、
そのループのなかで j が 0 から 3 をとりながら動くんですよね。
すると, i = j ならば, num[i] == num[j] となって、system("pause") がかならず
実行されることになります。

なさりたいことは、こんなのでしょうか?
(確認環境 WindowsXP, 処理系 cygwin(gcc 3.4.4)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6239.txt
658650:2008/04/14(月) 11:06:42
>>657
まさにそんな感じです
ありがとうございます
659657:2008/04/14(月) 11:24:42
660デフォルトの名無しさん:2008/04/14(月) 14:51:59
set<Class> a, b;とあってaからbに含まれていない要素を取り除きたいときに
remove_ifなんかのアルゴリズムでスマートに書けますか?
661デフォルトの名無しさん:2008/04/14(月) 15:06:05
operator^
662デフォルトの名無しさん:2008/04/14(月) 16:59:15
>>660

#include <iostream>
#include <algorithm>
#include <set>
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>

int main() {
  namespace bll=boost::lambda;
  std::set<int> a,b;
  a.insert(1);
  a.insert(2);
  a.insert(3);
  b.insert(2);
  b.insert(3);

  std::remove_copy_if(a.begin(), a.end(),
                      std::ostream_iterator<int>(std::cout),
                      bll::bind(std::find<std::set<int>::iterator, int>,
                                b.begin(),
                                b.end(),
                                bll::_1 ) == b.end());

  return EXIT_SUCCESS;
}

uu-n...
663デフォルトの名無しさん:2008/04/14(月) 17:49:02
huninnkidearuboost::egg::lazywotukattemitayo

#include <iostream>
#include <algorithm>
#include <set>
#include <boost/lambda/lambda.hpp>
#include <boost/egg/lazy.hpp>
#include <boost/lambda/bind.hpp>
#include <boost/assign/std/set.hpp>
struct base {
  template< class Myself, class Arg0, class Arg1, class Arg2 >
  struct apply {
    typedef Arg0 type; };
  template< class Result, class Arg0, class Arg1, class Arg2 >
  Result call(Arg0 begin, Arg1 end, Arg2 value) const {
    return std::find(begin, end, value);
  } };
typedef boost::egg::function<base> op;
boost::egg::result_of_lazy<op>::type
  const find_lazy = BOOST_EGG_LAZY({});
int main() {
  namespace bll=boost::lambda;
  using boost::assign::operator+=;
  std::set<int> a,b;
  a+=1,2,3; b+=2,3;
  std::remove_copy_if(a.begin(), a.end(),
                      std::ostream_iterator<int>(std::cout),
                      find_lazy(b.begin(), b.end(), bll::_1) == b.end());
}

uuu-nnn...
664デフォルトの名無しさん:2008/04/14(月) 17:52:02
p_stade乙
665デフォルトの名無しさん:2008/04/14(月) 18:01:20
>>660
a = bはだめなの?
だめだから聞いているんだろうけど。
666デフォルトの名無しさん:2008/04/14(月) 18:06:40
>>665
横からだけど

a : 10,20,30,40
b : 20,50

この場合多分望む結果は

a : 20

だろうけど、>>665だと間違った結果を返す。
667デフォルトの名無しさん:2008/04/14(月) 18:37:09
vectorやらlistで

vector<int>の要素が

1 2 (空白) 3 4 (空白) 
の様に途中に空白をいれることはできるのでしょうか?
668デフォルトの名無しさん:2008/04/14(月) 18:46:45
VC++でPC情報を取得するPGを作成します。
プロジェクト作成は(Win32とか)どれを選ぶのが
適当でしょうか?
669デフォルトの名無しさん:2008/04/14(月) 19:40:07
>>668
Linux+GCCがお勧め
670デフォルトの名無しさん:2008/04/14(月) 19:42:55
.exe が出来るならどれでもいいと思う。
671デフォルトの名無しさん:2008/04/14(月) 20:02:18
とあるクラスに関数を一個追加しようとしたところ

.hファイルに関数の本体を書き出すと正常にコンパイルが通るのに
.cppファイルに書き出すと
C2039 'foo' : 'hoge' のメンバではありません。

となってしまいます
これはどういう事でしょうか・・・
672デフォルトの名無しさん:2008/04/14(月) 20:05:04
ソースを見せれ
673デフォルトの名無しさん:2008/04/14(月) 20:10:42
      f´'´      ノ     ヽ  l  、 \!
       l /  / //  ,.ィ´   !', ト、 ヽ. ヽ
.      レ′, / //_,..イ// ,|   l |lλぃ  い. ',
      } / { ‐7Ζ_∠!イ 〃  /リ,}/┤!」l 小 !
     ノ i| 八//'゛ -`l 〃 /ノ'´  j ! |l/| iイ/
     ヽ|l//イ ャ''Tェ歹''`y゙/  'ヾ歹¨リ`イ!ノ//   まさか、ロリコンじゃないわね・・・
      ) 〃A ``''''"´ '^ r;   `'''"´/クK/
      Y/ !トヘ. ////    //// /.ィi| ;|
        |i( l|`Ti\,___  '⌒)   ,∠lj_|iリ
       {い ヾLr┤:.:.:.:.`:、__,,..イ;:.::.:./勹_」!
       ``ァ;=<´ ̄``ヽ:ヽ;‐-/;/``Tr-.、

674デフォルトの名無しさん:2008/04/14(月) 20:13:11
>>671
>.cppファイルに
しか書いてなかったとかいうオチだったら、君が泣くまで殴るのをやめない。
675デフォルトの名無しさん:2008/04/14(月) 20:14:56
>>672
仕事でのデータが含まれてるのでちょっとソースは公開できないですorz

>>674
インテリセンスで関数宣言を確認してから中身を書いてるのでそれはないと思います
676デフォルトの名無しさん:2008/04/14(月) 20:25:23
問題が再現するコードを作ってそれを貼ればいいじゃん。
677デフォルトの名無しさん:2008/04/14(月) 20:27:54
テンプレート関数だったらお前の殴る
678デフォルトの名無しさん:2008/04/14(月) 20:39:03
hppで解決♪
679デフォルトの名無しさん:2008/04/14(月) 20:58:05
リビルドし直したら通った・・・
これはどういう事??
680デフォルトの名無しさん:2008/04/14(月) 21:22:35
VCではよくあること
681デフォルトの名無しさん:2008/04/14(月) 21:53:28
そしてインテリセンスが延々と更新されないことも
682デフォルトの名無しさん:2008/04/14(月) 21:58:23
インテリセンスが嘘つくのも。
683デフォルトの名無しさん:2008/04/14(月) 21:58:43
>>667
vector<int>に整数以外のものは入れられません。
仮に、負値を例外として扱ってよいなら空白の代わりに-1を入れておくと言う手もなくはありませんが、
boost::optionalを使ってみてはどうでしょう。
684デフォルトの名無しさん:2008/04/14(月) 22:18:55
メモリが断片化している場合、ポインタに+1した場合はきちんと断片先に飛んでくれるんですか?
それとも型サイズ分だけ強引にアドレスが+1されるんですか?
685デフォルトの名無しさん:2008/04/14(月) 22:21:43
断片化?
どういう状況を言ってるんだ?
686デフォルトの名無しさん:2008/04/14(月) 22:22:45
vectorではなくdequeの実装を言っているのかもw
687デフォルトの名無しさん:2008/04/14(月) 22:25:23
deque のことなら、イテレータに +1 したら断片化先に飛ぶけどポインタは当然無理だな。
688デフォルトの名無しさん:2008/04/14(月) 22:26:51
>>685
1つのデータがメモリに書き込まれる時は必ず連番のアドレスに配置されるんですか?
689デフォルトの名無しさん:2008/04/14(月) 22:27:37
>>688
少なくとも仮想アドレスは連番だが。
物理アドレスは知らんがな。
690デフォルトの名無しさん:2008/04/14(月) 22:28:51
STLとかboostみたいので
RECTとかSIZEを包んだクラスはありますか?
691デフォルトの名無しさん:2008/04/14(月) 22:31:41
CRectならMFCにあるけどな…
692デフォルトの名無しさん:2008/04/14(月) 22:31:51
WTLにも
693デフォルトの名無しさん:2008/04/14(月) 22:32:58
>>689
つまり&で表示されるアドレスは仮想でWindowsが物理メモリの番地とリンクを取って隙間に埋め込んでるから考えなくていいってことですね
ありがとうございました。
694デフォルトの名無しさん:2008/04/14(月) 22:38:39
>>693
それでいいのか?
本当にそれでいいのか?w
695デフォルトの名無しさん:2008/04/14(月) 22:43:16
C++でプロパティー的なものを表現する場合
getとsetはつけたほうがいいの?それともOR?
696デフォルトの名無しさん:2008/04/14(月) 23:04:14
漢は黙ってpublic:
697デフォルトの名無しさん:2008/04/14(月) 23:06:53
それだとブレークポイントはれないじゃん・・・。
698デフォルトの名無しさん:2008/04/14(月) 23:15:52
__declspec(property(get=getHoge, put=setHoge))
int Hoge;
699デフォルトの名無しさん:2008/04/14(月) 23:43:26
winsockのsock関数の第一引数にAF_BTHを指定すると、AF_BTHが定義されていないとエラーがでます。
winsock2.hはインクルードしてるんですが、ほかになにかインクルードしなければいけないんでしょうか?
700デフォルトの名無しさん:2008/04/14(月) 23:55:47
grepかけたらws2bth.hででてきたけど。
701デフォルトの名無しさん:2008/04/15(火) 00:24:06
std::list<int> iListの参照を作りたいのですがこの場合

std::list<int>& refList = iList;
で良いのでしょうか?
702デフォルトの名無しさん:2008/04/15(火) 00:31:23
アドレスを比べてみたらいいと思うよ
703デフォルトの名無しさん:2008/04/15(火) 00:39:51
>>702
簡単に試してみたけど
大丈夫そうな気がしました
704デフォルトの名無しさん:2008/04/15(火) 00:54:33
C言語での構造体の初期化について質問です。

typedef struct Foo_tag{
 int a;
 int b;
 int c;
} Foo;

というような構造体があったときに、

Foo foo = {0};

という初期化を行っているコードをたまに見かけますが、これは何を行っているのでしょうか?
一応MinGW環境で同様のコードを書いてテストしてみましたが、{0} で初期化した構造体はゼロクリアされており、
初期化しなかった構造体にはゴミが入っていました。
ということは、上記のコードは構造体をゼロクリアするという認識でいいのでしょうか?

それと、標準Cの規格でこういう初期化は許されていますか?
構造体のゼロクリア処理は memset() などを利用して行っているコードが多いことを考えると、標準規格ではなさそうな
気がするんですが…。
705デフォルトの名無しさん:2008/04/15(火) 01:00:36
メンバを途中まで初期化すると
残りは0で初期化されるってヤツだったと思う。
標準Cでどうなのかは知らん。
706デフォルトの名無しさん:2008/04/15(火) 01:04:31
Foo foo = {1};でa=1,b=0,c=0になるのが保証されてる
707デフォルトの名無しさん:2008/04/15(火) 01:12:58
>>705-706
ありがとうございます。途中まで初期化ということができるんですね。
それなら構造体をゼロクリアするときはこれを使うと楽かもしれないですね。
(先頭にネストした構造体があったりするとどうなるのかよくわからないので、汎用ではないのかもしれないですが)
708デフォルトの名無しさん:2008/04/15(火) 01:13:32
>>704
初期化時のみOK
709デフォルトの名無しさん:2008/04/15(火) 01:18:46
memsetだとパディングも初期化できるのが利点だったかな
普通の使い方で初期化する必要があるのかどうかは知らないが
710デフォルトの名無しさん:2008/04/15(火) 01:36:11
>>709
ものすごく行儀の悪いコーディングだけど構造体同士を memcmp で比較できる
711デフォルトの名無しさん:2008/04/15(火) 01:58:11
>>710
あくまで「普通の使い方」の話な
キャストしたりすればいろいろ問題も出てくるだろうよ
712デフォルトの名無しさん:2008/04/15(火) 01:59:59
>>704
標準規格です。
713デフォルトの名無しさん:2008/04/15(火) 02:01:05
>>704
昔のコンパイラだと 0 で初期化されません
714デフォルトの名無しさん:2008/04/15(火) 03:28:46
>>660
template<typename Class>
void assign_intersection(std::set<Class>& a, std::set<Class> const& b)
{
  std::set<Class> result;
  std::set_intersection(a.begin(), a.end(), b.begin(), b.end()
    , std::inserter(result, result.end()));
  a.swap(result);
}
715デフォルトの名無しさん:2008/04/15(火) 08:00:05
*
**
***
****
...
みたいな感じの出力を得たいのですが、***を出力する部分は、なにか特別な書き方とかないですか?
関数を作るしかないですか?
716デフォルトの名無しさん:2008/04/15(火) 08:06:55
>>715
MFCならスタティックテキストの表示を*に変えるという機能(設定)があったり。
自前でもキー入力(KeyDownとか)→別の変数に格納→その文字数だけ*を表示で簡単に出来る。
717デフォルトの名無しさん:2008/04/15(火) 10:30:07
// * を n 個出力する関数
void f(int n){
for(int i = 0; i < n; i++) std::cout << '*';
std::cout << std::endl;
}

void g(int n){
for(int i = 0; i < n; i++) f(i);
}
718デフォルトの名無しさん:2008/04/15(火) 14:19:49
std::string s(length, '*');
std::cout << s << '\n';
719デフォルトの名無しさん:2008/04/15(火) 20:41:31
#include <iostream>
#include <iomanip>

int main()
{
    for (int i = 0; i < 10; ++i)
        std::cout << std::setw(i) << std::setfill('*') << "" << std::endl;
}
ところでC++でいいんだよね?
720デフォルトの名無しさん:2008/04/15(火) 22:13:39
C言語ならこんなもんか
void f1()
{
    int n, i;
    for(n = 1; n <= 10; n ++) {
        for(i = 0; i < n; i ++) putchar('*');
        putchar('\n');
    }
}

void f2()
{
    int n;
    for(n = 1; n <= 10; n ++)
        puts("**********" + 10 - n);
}

void f3()
{
    int n;
    for(n = 1; n <= 10; n ++)
        printf("%.*s\n", n, "**********");
}
721デフォルトの名無しさん:2008/04/16(水) 00:27:56
printfの書式でもっと簡単にできなかったっけ?
イメージ>>720のf3()が近いんだけど・・・使う機会が少ないとすぐにわすれちゃうな・・・
722デフォルトの名無しさん:2008/04/16(水) 00:38:10
>puts("**********" + 10 - n);

このやり方はじめて見た。目から鱗やわ
723デフォルトの名無しさん:2008/04/16(水) 00:42:59
>>722
その鱗はつけておいた方がいいw
724デフォルトの名無しさん:2008/04/16(水) 02:36:32
課題でc++のbasic_stringの様なstringクラスを作っています。
その中でstr >> coutはクラス内でoperator>>を用意することで
動くようになったのですが、cout << strは「二項演算子<<はクラス
strをサポートしていません」と言われてしまいます。
これはどのようにしたらcout << strが出来るようになるのでしょうか?

またお恥ずかしながら、str = "aaa"は作れたのですが、str ="aaa"+"bbb"は
作ることが出来ませんでした。これはどの様に作ったらいいのでしょうか?

どうかよろしくお願いします。
725デフォルトの名無しさん:2008/04/16(水) 02:46:22
なんか物凄く基本的なことのような気がしますが
C言語で、unsigned char から signed char に代入、もしくはその逆を行った場合、ビットバターンは常に保存されますか?
726デフォルトの名無しさん:2008/04/16(水) 02:55:53
>>725
いいえ。
727デフォルトの名無しさん:2008/04/16(水) 03:01:40
>>724
上:strをサポートする二項演算子を書く。
basic_ostream<foobar> & operator <<(basic_ostream<foobar> & os, str & st);
下:無理。
728デフォルトの名無しさん:2008/04/16(水) 03:02:50
>>726
ありがとうございます。そうなると char* を適宜 unsigned char* にキャストしたりしないとダメですね。
一部バイナリが混ざってるファイルを読む必要があったので助かりました。
729デフォルトの名無しさん:2008/04/16(水) 03:58:13
>>728
K&R2 A6.1 (promotion) を参照してください。
char/unsigned char は先に int に変換される点、特に要注意です。
730デフォルトの名無しさん:2008/04/16(水) 04:09:29
>>729 promotion は関係ないだろ。
731729:2008/04/16(水) 04:57:02
>>730
char c = 0x81;
if (c == 0x81)
printf("=\n");
else
printf("!=\n");

の結果って、あれ〜?!ってなりませんか?
732デフォルトの名無しさん:2008/04/16(水) 11:52:33
>>731
char が符号付きで最大値が 127 の場合の話なら、
char c = 0x81 の時点で未定義動作。
問題は promotion じゃなくてオーバーフロー。
733デフォルトの名無しさん:2008/04/16(水) 12:09:54
0x81がunsigned charじゃないじゃん
734732:2008/04/16(水) 12:20:21
> char c = 0x81 の時点で未定義動作。
ごめん。間違い。オーバーフローが問題なのは違いないけど、型変換での
オーバーフローは未定義動作じゃなくて、値が処理系定義のものになるか、
処理系定義のシグナルが発生する、らしい。
735729:2008/04/16(水) 20:42:23
>>732 >>734
了解いたしました。

char buffer[N];
...
while (fgets(buffer, N, fp) != NULL) {
if (buffer[i] == ...)
...
}
などと安易に考えると、(たとえば漢字コードの判別など)わからなくなってしまった経験がありました。
unsigned char buffer[N];
とすれば、問題ないのではありますが。

ご指摘ありがとうございました。 またひとつ賢くなりました。
736デフォルトの名無しさん:2008/04/16(水) 20:49:18
>>735
漢字コードをいろいろ扱うなら >>735 だと unicode の時に困るんじゃなかろうか?
(文字列に \0 が含まれる可能性が高いから)
737デフォルトの名無しさん:2008/04/16(水) 21:04:51
C++では以下のように大丈夫そうですけど。
signed char と unsigned char は同表現と書いている
読み間違い?

A char, a signed char, and an unsigned char occupy the same amount of storage and have the same alignment
requirements (3.9); that is, they have the same object representation. For character types, all bits of
the object representation participate in the value representation. For unsigned character types, all possible
bit patterns of the value representation represent numbers.
738デフォルトの名無しさん:2008/04/17(木) 01:47:49
>>737
読みには自信ないのですが、
単に、
1) char/unsigned char/signed char のいずれも同じ量のメモリを占有する。
2) char/unsigned char/signed char のアラインメント(配置位置、偶数バイトを先頭にする、アドレスが4 の倍数のバイトを先頭にする、など)が同一である。
という意味でのみ same としているだけではないでしょうか。
char / unsigned char / signed char の表現がまったく同一であるというのは不可能と思われますのですが。

後続の文では、
char のすべてのビットが数をあらわしているわけではない(単に関係するといっているだけ、符号の場合もありますよ、ということでしょうか。)
unsigned char はすべてのビットが数を構成する要素となる。
と読めます。
739デフォルトの名無しさん:2008/04/17(木) 07:16:24
template <class T>
template <typename T>
この2つはちがいがありますか?
740デフォルトの名無しさん:2008/04/17(木) 07:21:28
違いは無い
741デフォルトの名無しさん:2008/04/17(木) 08:20:34
class じゃないのも使うよなーとか思っていつも typename にする俺
742デフォルトの名無しさん:2008/04/17(木) 08:26:55
俺もある時期から、typenameが手癖になってしまった。
別にこだわるわけじゃないから、もし仮にclassと書いてくれと職場で言われたら
二つ返事でclassにするけど。
743デフォルトの名無しさん:2008/04/17(木) 08:30:00
なんとなく表明の意味で使い分けるかも。
その後しっかり中でstatic_assertするけどね。
744デフォルトの名無しさん:2008/04/17(木) 10:03:28
クラス配列をnewで生成する時に呼ばれるコンストラクタを指定できますか?
745デフォルトの名無しさん:2008/04/17(木) 10:06:12
残念ながらできない。
746デフォルトの名無しさん:2008/04/17(木) 11:04:06
strcatを使わずに
char src[ ] = "seikima"
char dest[4] = "tsu"
という文字列を結合し、表示させることが出来ますか?
747デフォルトの名無しさん:2008/04/17(木) 11:10:49
>>746
char result[11];
sprintf(result, "%s%s", src, dest);
printf("%s\n", result);
748746:2008/04/17(木) 11:14:54
746です。言葉足らずでした。
sprintfも使わずにforを使って何とか表示させたいのですが
いかがでしょうか?
749デフォルトの名無しさん:2008/04/17(木) 11:25:24
>>747じゃないがやっつけ仕事なんで間違ってたらごめん


char ret[11];

for(int i =0 ; i < strlen(src) ; i++)
{
ret[i]= src[i];
}
for(int i=0 ; i <strlen(dest) ; i++)
{
ret[i+strlen(src)}=dest[i];
}
printf("%s\n",ret);
750746:2008/04/17(木) 11:27:20
>>749

>>746に書いたんですが、今回string.hに関するものは使っちゃいけないので
strlenも使用出来ない感じです。
751デフォルトの名無しさん:2008/04/17(木) 11:34:17
>>746にそんなこと書いてNEEEEEEEwwwww

strlen()をsizeof()-1に変えれば同じ動作だ
752デフォルトの名無しさん:2008/04/17(木) 11:37:17
>>746
条件後だししすぎ

char result[20], *p, *q;

for(p=result,q=src;*p++=*q++;);
for(p--,q=dest;*p++=*q++;);
753746:2008/04/17(木) 11:46:22
重ね重ね、申し訳ないです。

ポインタも使ってはいけないようです。
754デフォルトの名無しさん:2008/04/17(木) 11:50:24
宿題かよ。消えろ。
755デフォルトの名無しさん:2008/04/17(木) 11:51:00
ついでに、その出題者はぶん殴っていい。
756デフォルトの名無しさん:2008/04/17(木) 11:55:25
宿題なら学習内容に沿ってるはずだから
テキストでも目を通した方が早いんじゃないの?

何の項目についての課題か分からないんじゃ答えようがないわ
757デフォルトの名無しさん:2008/04/17(木) 11:57:30
入念な釣りだなあ。

次は「 [] 演算子も使えません 」とか?
758746:2008/04/17(木) 11:59:26
一旦、整理してみます。

課題:配列について
内容:char src[ ] = "seikima";
char dest[4] = "tsu";
と配列を用意し、destの中身をsrcに結合させる。
ただし、for文を使うこと・ポインタ、string.hは使ってはならない。
759デフォルトの名無しさん:2008/04/17(木) 12:03:12
>>758
宿題は宿題スレへ。

C/C++の宿題を片付けます 105代目
http://pc11.2ch.net/test/read.cgi/tech/1208268461/
760746:2008/04/17(木) 12:03:56
>>759

誘導ありがとうございます。ご迷惑をおかけしました。
761デフォルトの名無しさん:2008/04/17(木) 12:06:07
連結するための容量は確保しなくていいのか、とか
dest を書き換えずに src に書き込むのか、とか、
宿題にしてもクソすぎるだろ。学校名晒してくんない?
762デフォルトの名無しさん:2008/04/17(木) 12:12:22
746の時点で明らかに宿題じゃないか。なにを今更
763デフォルトの名無しさん:2008/04/17(木) 12:21:40
printfの様な、引数の数が一定しない関数を作るにはどう定義し
中でどう読めば良いのでしょか。
764デフォルトの名無しさん:2008/04/17(木) 12:25:31
Cで標準ライブラリが用意されてない環境なら、自動的に>>758の条件に
近くなると思うけど、ポインタも駄目てのは解らん。
765デフォルトの名無しさん:2008/04/17(木) 12:30:14
>>763
関数のオーバーロードとかでできんじゃね
766デフォルトの名無しさん:2008/04/17(木) 12:30:41
可変長引数でぐぐる
767デフォルトの名無しさん:2008/04/17(木) 12:30:53
768デフォルトの名無しさん:2008/04/17(木) 12:31:06
>>763
可変長引数とかva_argsなんかでググるといいと思うよ。
769デフォルトの名無しさん:2008/04/17(木) 12:31:25
>>763
可変引数または可変個引数でぐぐる
770デフォルトの名無しさん:2008/04/17(木) 12:34:09
重婚もいいところだな
771763:2008/04/17(木) 12:37:07
有り難うございます。
stdarg.hなんてヘッダ、目にした事すらありませんでした。
772デフォルトの名無しさん:2008/04/17(木) 12:40:07
ところで可変長引数って設計的にどうなのかな?
個人的には設計に失敗してやむなく・・・ってイメージがあるのだが
773デフォルトの名無しさん:2008/04/17(木) 12:45:05
ハックやチートの部類に入りそうなやり方してるよね。
774763:2008/04/17(木) 12:46:42
>>772
**でも事足りるんですが、その場でわざわざポインタの配列を用意しないと
いけない場合が出てくるだろうし、その場で列挙出来たら楽かなぁとか。
775デフォルトの名無しさん:2008/04/17(木) 12:50:54
>>772
型安全性に問題があるから、特に C++ ではやむなくって意識でいいと思う。
C++ 的には iostream や boost::format みたいに演算子で繋ぐのが正解かな。
776デフォルトの名無しさん:2008/04/17(木) 22:15:48
CかC++の組み込みの勉強したいんですがお勧めの本ありませんか?
組み込みの本って探してもどこにも無いし、ネットで買おうにも中身がどんな感じかも分からないんでどれを買えばいいのか分からないです
あとできれば必要で組み込み初めてに適した機材とかも教えて欲しいです
777デフォルトの名無しさん:2008/04/17(木) 23:24:03
ソフィアシステムズで評価ボードを買ってBSPをいじって動作確認すればいいお^^
778デフォルトの名無しさん:2008/04/18(金) 00:41:53
以下の2つは戻り値以外に何か違いがありますか?

fwrite(buf, 1, 1024, fp);
fwrite(buf, 1024, 1, fp);
779デフォルトの名無しさん:2008/04/18(金) 00:45:24
沢山の実数(doubleとか)が生成されるときに、その分散を計算したいんですが、これってやはり一度生成される全部の実数を
どこか配列とかに格納しないとだめでしょうか?
780デフォルトの名無しさん:2008/04/18(金) 01:00:21
>>779
分散=(X^2 の平均) - (Xの平均)^2
を使用すれば、1pass で計算できますよ。
781デフォルトの名無しさん:2008/04/18(金) 01:04:09
値が生成されるたびに、X^2とXの平均を計算しておくのですね。
782デフォルトの名無しさん:2008/04/18(金) 01:07:17
逐一平均を計算するんじゃなくて、合計値と要素数を記憶だな。
最後にまとめりゃOK
783デフォルトの名無しさん:2008/04/18(金) 01:23:46
>>778
もしかしたら処理速度が変わるかも・・・ね?
784デフォルトの名無しさん:2008/04/18(金) 02:02:27
色々ありがとうございました。クラスをつくってみました。
class stat
{
public:
stat() : sum(0), sum_square(0), num(0) {}
void push(double a) {
sum += a;
sum_square += a*a;
++num;
}
double mean() {
return sum / num;
}
double variance() {
return sum_square/num - (sum/num)*(sum/num);
}
private:
double sum;
double sum_square;
int num;
};
785デフォルトの名無しさん:2008/04/18(金) 07:50:12
意図した通りに受け取れないのですが、なぜでしょうか。
「GCCではgetche」の行のprintf()をコメントアウトするとちゃんと取れるのですが


#include <stdio.h>

int main(void)
{
int for1inc = 0;
char userinput = 0;

for(for1inc=0; for1inc < 10; for1inc++)
{
printf("文字を入力 : \n (GCCではgetche()が使えず改行コードと共に入力されるので5回までしか入力不可) \n\n");
userinput = getchar();
printf("Your input is %c. ""%c"" ASCII code is %d. \n", userinput, userinput, userinput);
for( ; userinput; userinput--)
{
printf("%c", '.');
}
printf("\n");
}
return 0;
}
786デフォルトの名無しさん:2008/04/18(金) 09:32:34
>>778
>783の戯言はさておき、途中でエラーが発生したときの扱いが違う。
前者は書き込みに成功したバイト数が得られるが、
後者は1024バイト全てが書き込めたかどうかしか判らない。
787デフォルトの名無しさん:2008/04/18(金) 10:10:31
>>786 それが戻り値の違いなんでしょ。
788141:2008/04/18(金) 10:29:25
すみません。以下のコード、BCCでは一応正常にファイルから
読み込んで画面に表示してくれますが、VC++では表示してくれ
ません。プログラムで何か処理が抜けているんでしょうか?

#include "stdafx.h" // VC++の場合
#include <iostream>
#include <fstream>
using namespace std;

int main()
{
int i;
double x,y;

ifstream fin;
fin.open("aaa.dat");

while(fin >> i>> x >> y) cout << i << ' ' << x <<' ' << y << endl;

fin.close();

// cin>>i; // VC++の場合
return 0;
}
aaa.datの中身(テキスト)
1 10.0 12.3
2 20.0 20.5
3 30.0 30.8
4 40.0 50.6
789デフォルトの名無しさん:2008/04/18(金) 10:39:04
↑名前の141、以前のもので意味はありません。
790デフォルトの名無しさん:2008/04/18(金) 11:04:56
VC9で普通に動いてるけど。
791デフォルトの名無しさん:2008/04/18(金) 11:14:42
メイン文で使っている*argv[]をユーザ関数内で使いたいので
ユーザ関数では仮引数をchar **a[]にしているのですが、実引数は何にすればいいのか分からないので教えて下さい
792デフォルトの名無しさん:2008/04/18(金) 11:15:46
>>791
argv そのまま渡せるように引数も同じ型にしとけよ。
793デフォルトの名無しさん:2008/04/18(金) 11:27:51
>>792
argvをそのまま渡すようにするには、ユーザ関数の仮引数と呼び出す際の実引数は何にすればいいのでしょう?
794デフォルトの名無しさん:2008/04/18(金) 11:30:16
>>793 仮引数は main にある argv と「同じ型」、実引数は argv 。これでいいか?
795デフォルトの名無しさん:2008/04/18(金) 11:48:44
>>794
分かりました、ありがとうございました。
796デフォルトの名無しさん:2008/04/18(金) 13:36:50
>>788
エラーとかじゃなくて単に何も表示されない?
797デフォルトの名無しさん:2008/04/18(金) 13:39:11
ファイルの置き場所ミスってるだけじゃねーの?
798788:2008/04/18(金) 15:50:11
VC++2008 Express Editionでdebugモードでコンパイルし、
データファイルaaa.datをdebugフォルダに入れて実行ファイル
を実行すると正常に実行されます。ですが、統合環境では何も
表示されないです。

Projects\test\test (testは私がつけたプロジェクト
名のフォルダ) というフォルダにデータファイルを置
くと統合環境ではうまくいくようです。しかし、こん
なこと最初はわかんないよ。
799デフォルトの名無しさん:2008/04/18(金) 15:55:53
>>798
フルパスでファイルを扱うのでなければ、カレント
ディレクトリをちゃんと意識するようにしないと。
800デフォルトの名無しさん:2008/04/18(金) 16:00:30
is_openでちゃんと開けたか確認したほうがいいよ
801デフォルトの名無しさん:2008/04/18(金) 16:29:49
open使わずに
std::ifstream fin("...");
てやったほうがいいよ
close後何も処理しないのならcloseも不要だよ
802デフォルトの名無しさん:2008/04/18(金) 18:12:43
C++やろうと思うんですけど、オススメの教本教えてください
Cとjavaは一応できます
803デフォルトの名無しさん:2008/04/18(金) 18:15:06
boostのソースコード(無料)(偏差値70)
804デフォルトの名無しさん:2008/04/18(金) 19:10:22
メモリは並列にアクセスできますか? 例えばHDDだと2台あればパフォーマンス落ちずに同時アクセスできますが
805デフォルトの名無しさん:2008/04/18(金) 19:17:44
>>804
NUMAとかそーいうキーワードで調べてみるといいと思う。
806デフォルトの名無しさん:2008/04/18(金) 19:38:09
>>777
ありがとう。評価ボード調べてみたらくそ高けぇw
ごめんなさい勉強用程度なら1万程度もあれば揃うだろうとなめてました
807デフォルトの名無しさん:2008/04/18(金) 19:42:52
>>806
こんなのから始めた方がいいよ。
ttp://hijiri3.s65.xrea.com/sorekore/develop/pic/00_start.htm
808デフォルトの名無しさん:2008/04/18(金) 19:51:44
>>807
d これは面白そう
もうちょっとググって組み込みのこと勉強してきます
809デフォルトの名無しさん:2008/04/18(金) 20:07:21
>>805 トンクス!
810デフォルトの名無しさん:2008/04/18(金) 20:32:22
>>785
提示されたコードをコンパイルしましたが、特に異状はないと思います。
環境とコンパイルオプションを教えてください。
当方が確認した環境は WindowsXP, コンパイラはgcc3.4.4(cygwin)です。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6272.txt
811デフォルトの名無しさん:2008/04/18(金) 22:15:10
>>798
[プロジェクト]-[プロパティ]-[構成プロパティ]-[デバッグ]-[作業ディレクトリ]
812デフォルトの名無しさん:2008/04/18(金) 22:41:28
#include <stdint.h> はどの環境でも使えますか?
とブーストとかSTL portとか入れればどれでも使えますか?
32bit環境で、64bit整数のビット演算、掛け算の速度をかなり速いです
使い物になるので使いたいのですが互換性はなかなかあるんですか
813デフォルトの名無しさん:2008/04/18(金) 22:42:11
文書が色々とおかしいです 
エスパーでおねがいします
814デフォルトの名無しさん:2008/04/18(金) 22:55:18
VC2008で対応していなかった為、stdint.h使うのをやめることにしました
815デフォルトの名無しさん:2008/04/18(金) 22:56:44
わかりました
がんばってください
816デフォルトの名無しさん:2008/04/18(金) 22:58:30
>>812
> #include <stdint.h> はどの環境でも使えますか?

いいえ。

> とブーストとかSTL portとか入れればどれでも使えますか?

いいえ。

> 32bit環境で、64bit整数のビット演算、掛け算の速度をかなり速いです

いいえ。

> 使い物になるので使いたいのですが互換性はなかなかあるんですか

いいえ。
817デフォルトの名無しさん:2008/04/18(金) 23:08:19
日本語学びたての外国人か
コンピューターにものすごい興味がある赤ん坊のどちらかだな。
818デフォルトの名無しさん:2008/04/18(金) 23:22:53
外国人の人だと思うので、添削してみました。頑張ってね。


初心者なのですが、いくつか質問させてください。
#include <stdint.h>はどの環境でも使えますか?
boostとかSTL portとかは、インストールすれば使えますか?
32bit環境で、64bit整数のビット演算、掛け算がかなり速くできて、
使い物になりそうなので使いたいのですが、互換性についてはどうでしょうか?
819デフォルトの名無しさん:2008/04/18(金) 23:23:06
  std::vector<std::string> vtSource; を UTF16 に変換して std::vector<std::wstring> vtDest; に保存したいと思っています.

// string >> wstring 変換関数(中身はダミー)
std::wstring A2WString(const std::string& strSource))
{
  return std::wstring(L"out");
}

  この変換関数での変換は以下のコードでできました.

  std::vector<std::string> vtSource;
  std::vector<std::wstring> vtDest;

  vtSource.push_back( "AbC" );
  std::transform( vtSource.begin(), vtSource.end(), std::inserter( vtDest, vtDest.end() ), A2WString );

  しかし,変換関数にデフォルト引数があるとコンパイルエラーになりました.

std::wstring A2WString2(const std::string& strSource, int i=0)//デフォルト引数がある
{
  return std::wstring(L"out");
}

  transform 第4引数で bind2nd や ptr_fun を使用すればいいような気がするんですが,どのように書けばいいんでしょうか?

  std::transform( vtSource.begin(), vtSource.end(), std::inserter( vtDest, vtDest.end() ),  
           std::bind2nd( std::ptr_fun(A2WString2), 0) );//コンパイルエラー

Window2000
Visual C++ 2005 express edition
820デフォルトの名無しさん:2008/04/18(金) 23:26:01
>>812
C++なら、Boostを入れると<boost/cstdint.hpp>が使える。
名前空間boostに入っていること以外はだいたいC99の<stdint.h>と同じ。
821デフォルトの名無しさん:2008/04/18(金) 23:27:47
>>819
いったん別の関数を挟めばいいはず。
inline std::wstring A2WStringHelper(const std::string& strSource)
{
  return A2WString(strSource);
}
こういうものを作って、std::transformにはこれを渡す。
822デフォルトの名無しさん:2008/04/18(金) 23:54:40
スタティックテキストのプロパティCaptionを変更するにはどうすればいいんですか?
IDC_STATIC.Caption("aaa");
で動かないんですけど
823デフォルトの名無しさん:2008/04/19(土) 00:01:09
IDC_STATIC.Caption = "aaa";
GetDlgItem(IDC_STATIC)->Caption = "aaa";
これでも動きません
824デフォルトの名無しさん:2008/04/19(土) 00:09:19
>>822
IDC_STATICは言わばワイルドカードなので、
キャプションを変えたいスタティックテキストに個別のIDを割り当てる必要があります。
825デフォルトの名無しさん:2008/04/19(土) 00:10:34
つーか、そもそも書き方も判ってなくてコンパイルも通らないならエラーメッセージを張れと。
826デフォルトの名無しさん:2008/04/19(土) 00:22:56
ありがとうございます。名前を付けました
GetDlgItem(IDC_STATICTIME)->Caption = "aaa"
error C2039: 'Caption' : 'CWnd' のメンバではありません。
となります
827デフォルトの名無しさん:2008/04/19(土) 00:27:11
IDC_STATICTIME->Caption = "aaa"
これだと
error C2227: '->Caption' : 左側がクラス、構造体、共用体、ジェネリック型へのポインタではありません。
こういうエラーになります。
828デフォルトの名無しさん:2008/04/19(土) 00:27:43
Captionなんて無いよ・・・とエラーが教えてくれてるじゃん
なんでそんなにCaption大好きなの?

GetDlgItem(IDC_STATICIME)->SetWindowText("aaa");
829デフォルトの名無しさん:2008/04/19(土) 00:30:40
ありがとうございます
別に好きなわけじゃないんです
VBの時はこうやっていたので
プロパティの項目で設定できないのならVC++で項目の意味はあるんですか?
全部のプロパティの設定方法を調べなきゃいけないんでしょうか?
830デフォルトの名無しさん:2008/04/19(土) 00:35:46
プロパティ?ダイアログの? 
あんなのは飾りだ。
831デフォルトの名無しさん:2008/04/19(土) 00:39:07
意味があるとしたら、設計時に入れれば、コーディングしなくて良い事ぐらいかな?
VCは他もみんなこんな感じだから、VBからだと慣れるしかないな。

プロパティのVisible項目→コーディング時はShowWindow();
832デフォルトの名無しさん:2008/04/19(土) 00:44:01
OK覚悟はできたwwww
833デフォルトの名無しさん:2008/04/19(土) 00:55:43
C#を一通りやった者ですが、CよりC++の方が始め易いでしょうか?
834デフォルトの名無しさん:2008/04/19(土) 01:08:42
C# からなら C は不便に感じると思う。
C++ のがいいかと。
835819 :2008/04/19(土) 01:46:47
>>821 ありがとう.とりあえずそうやればできました.

   ただ,何でこれは通らないんでしょうか?

  std::transform( vtSource.begin(), vtSource.end(), std::inserter( vtDest, vtDest.end() ),  
           std::bind2nd( std::ptr_fun(A2WString2), 0) );

   A2WString2() の第一引数の参照型をやめたらこれでもコンパイルできましたが,
 もしよろしければどなたかご教示願います….

//引数の参照型をやめる
std::wstring A2WString2(const std::string strSource, int i=0)
{
  return std::wsting(L"out")
}
836デフォルトの名無しさん:2008/04/19(土) 05:07:02
JavaとかC#から始めた人はCやC++の世界には入ってこないでください。
837デフォルトの名無しさん:2008/04/19(土) 07:57:16
>>836
どうして?
838デフォルトの名無しさん:2008/04/19(土) 09:33:00
ガベージコレクタは便利かもしれないが、その便利さゆえに何か重要なことを失くしているような気がする。
839デフォルトの名無しさん:2008/04/19(土) 09:33:54
「JAVAスクールの危険」ってはなし?
840デフォルトの名無しさん:2008/04/19(土) 09:48:02
Java はアレだが、C# はまだマシだと思うけどな。まあ。
841デフォルトの名無しさん:2008/04/19(土) 10:27:27
>>835
それは有名な参照の参照問題
詳細はSTL バインダで検索して一番上あたりがそのものズバリだと思う
解決策だけ抜きだすとboostのfunctional.hppのboost::bind2ndを使う
さらにptr_funを使わずにboost::bind2nd(A2WString2)と書けるところも利点だ
842デフォルトの名無しさん:2008/04/19(土) 11:43:18
>>837
温室育ちが軍隊に入ったら周りが迷惑するだろ
843デフォルトの名無しさん:2008/04/19(土) 11:48:42
軍隊という表現は語弊があるな
せめてど田舎とか電気が通ってないとかそういう表現にしないと
844デフォルトの名無しさん:2008/04/19(土) 13:06:49
その表現もかなりニュアンス違うな。
まぁ、無理して比喩を使う必要はない場面だと思う。
845デフォルトの名無しさん:2008/04/19(土) 14:05:31
2chにゆとりが入って来たでおk
846デフォルトの名無しさん:2008/04/19(土) 14:06:52
>>845
いまいちだな
847デフォルトの名無しさん:2008/04/19(土) 14:58:24
オートマ車しか乗ったことが無い人が、
マニュアル車に乗る感じとか。

でもC/C++をちゃんと理解して使い始めるなら、良いと思う。

理解するフェーズで挫折する人は、諦めてもらって、
理解するフェーズを無視して使い始める人は氏ねば良いと思うよ。
848デフォルトの名無しさん:2008/04/19(土) 15:10:55
1速のままで法定速度維持してエンジン壊すってか。
849デフォルトの名無しさん:2008/04/19(土) 15:20:18
「郷に入っては郷に従え」でいいんじゃないかと
850デフォルトの名無しさん:2008/04/19(土) 15:21:01
> 理解するフェーズを無視して使い始める人は氏ねば良いと思うよ。
多言語から移ってきた人の3割くらいはこれかな・・・?
851デフォルトの名無しさん:2008/04/19(土) 15:27:51
映画と小説の共存が可能なように美麗な3Dグラフィックゲームと想像力をかきたてる2Dのドット絵ゲームというのは共存が可能だと思うのだがいかがなものか
852デフォルトの名無しさん:2008/04/19(土) 15:31:57
ドット絵すらないroguelikeもよろしく
853デフォルトの名無しさん:2008/04/19(土) 15:55:49
文字は高尚なドット絵だよ!
854デフォルトの名無しさん:2008/04/20(日) 10:27:45
ぷァ
855デフォルトの名無しさん:2008/04/20(日) 10:48:12
*nixのフレームバッファコンソール上でハードウェアアクセラレーションを使って描画とかしたい
856デフォルトの名無しさん:2008/04/20(日) 11:39:26
すみません 圧縮・解凍DLLを利用して、どの形式のファイルを渡されても
同一の方法で展開することのできるライブラリってありませんか?
ファイルをチェックして適切なDLLへ渡すやつです。
857デフォルトの名無しさん:2008/04/20(日) 12:11:41
>ファイルをチェックして
ファイル名で?ファイルの中身で?
858デフォルトの名無しさん:2008/04/20(日) 12:12:58
ファイルの中身です EXEでも解凍できるやつもあります そういうのも展開したいです
859デフォルトの名無しさん:2008/04/20(日) 12:20:41
とりあえずは 拡張子判別DLL(ググって) と 統合アーカイバ の組み合わせかな。

exeは知らない。アーカイブ本体をexe末端に付けてるか、
リソースとして持ってるか、とかの方式で変わってくるだろうし。
860デフォルトの名無しさん:2008/04/20(日) 12:25:42
対応形式が多いのはXacRett.dllかな
861デフォルトの名無しさん:2008/04/20(日) 12:25:40
それらを自動でやってくれるのはないかと…
862デフォルトの名無しさん:2008/04/20(日) 12:28:04
サンクス
863ミミ:2008/04/20(日) 13:10:19
Visual C++ でデバッグバージョンのバイナリを作るときって、
みなさんは名前を変えますか?どんな方法にしてますか?

[方法1]
Debug も Release も同じファイル名にして、ビルドすると上書きされるようにする。

[方法2]
Debug バージョンには _d のようなサフィックスを付ける。
some_d.exe hoge_d.lib など。

[方法3]
Debug と Release で出力フォルダを分ける。
bin/Debug/some.exe bin/Release/some.exe など。
864デフォルトの名無しさん:2008/04/20(日) 13:23:48
デフォルトは方法3だよな。
単独で動かす時はそれで十分やね。

他のアプリから利用する必要がある場合は方法2じゃないと都合が悪い。

方法1は論外っすね。
865デフォルトの名無しさん:2008/04/20(日) 14:40:32
>>858
そういうものがあるとしたら、そういうフリーのソフトが公開されている筈だよな。
そういう公開ソフトはないのだから、当然そういうDLLはない。
まぁ、>859にある「統合アーカイバ・プロジェクト」辺りを見てこいと。
866デフォルトの名無しさん:2008/04/20(日) 15:20:46
XacRettで解決したんですけど…
867デフォルトの名無しさん:2008/04/20(日) 17:28:14
最近ゲームのプログラムいじってたらprint系で浮動小数が出力できなくなってしまったんだが、
同じようになったことある人いる?いたら解決策とか教えて欲しいです。
症状としては、%fを含むprint系の関数(wsprintfとかvfprintf)を実行すると
「問題が発生したため〜」っていうおなじみのダイアログが出てきて落ちちゃうんです。
868デフォルトの名無しさん:2008/04/20(日) 17:30:03
言語再インストール
869デフォルトの名無しさん:2008/04/20(日) 18:34:25
ウィンドウを作成して、そこにビットマップを表示させたりするDLLを作ってるんだが、
外部からもらったバイナリBMPデータをどういじればいいのか分からん。。。

//---
PAINTSTRUCT psPaint;
HDC hWndDC;
HDC hMemDC;
HBITMAP hBitmap;
HGDIOBJ hGdiObj;

hWndDC = BeginPaint(g_hWnd, &psPaint);
hMemDC = CreateCompatibleDC(GetDC(g_hWnd));
hBitmap = CreateComptibleBitmap(hMemDC, 100, 100);


hGdiObj = SelectObject(hMemDC, hBitmap);

/* ここでバイナリをhBitmapに設定したい */

BitBlt(hWndDC, 0, 0, 100, 100, hMemDC, 0, 0, SRCCOPY);
//---

ビットマップバイナリをどうにかしてhBitmapに突っ込んでやれば良いのかと思ってるんだけど、
方法がわからん…
そもそも考え方が間違ってる?
870デフォルトの名無しさん:2008/04/20(日) 18:45:57
>>869
SetDIBits
871デフォルトの名無しさん:2008/04/20(日) 18:59:48
CreateDIBitmap
872デフォルトの名無しさん:2008/04/20(日) 19:08:32
>>867
再現ソースとエラーを張れと何度いったことか
873デフォルトの名無しさん:2008/04/20(日) 19:46:11
>>872
再現コードの作成はちょっと全体の量も多いし見当もつかないので難しいです・・・。
関係あるとしたらどんなことが考えられるでしょうか?ロケールとか?
874デフォルトの名無しさん:2008/04/20(日) 20:00:57
>>873
スタックを壊したとか関数テーブルを壊したとか
多分バッファオーバーフローか未初期化ポインタを使って
アクセスしてはいけないメモリを壊した可能性が高い
875デフォルトの名無しさん:2008/04/20(日) 20:01:01
だからエラーメッセージ張れつ〜うの。テンプレに書いてあるでしょ
呼び出し規約とかランタイムとかリンクされるライブラリとか
なんかプロジェクトの設定いじったでしょ。それを直せばいい
876デフォルトの名無しさん:2008/04/20(日) 20:45:31
>>863
デバッグ版はインストール先のフォルダ。
リリース版はインストーラ作成のフォルダ。
877デフォルトの名無しさん:2008/04/20(日) 21:22:45
>>874-875
レスありがとうございます。以前できていたところがいじってないのに
急になったので875さんの臭いかも知れないけど、気づいたらなってしまってました・・・
BCCでやっててエラーメッセージを取得できる部分が見当たりません・・・。
こういう時ってどうやってメッセージを受け取るんでしょう?すいませんアホで・・
878デフォルトの名無しさん:2008/04/20(日) 21:58:31
浮動小数とか言ってる時点でキミがアホなのはみんな分かってるよ
879デフォルトの名無しさん:2008/04/20(日) 22:11:33
これでまったく関係ない場所でゼロ除算で落ちてたとかだとウケるな
880デフォルトの名無しさん:2008/04/20(日) 22:24:46
あっwsprintfかw
printf系じゃないから%fとか無理
sprintfつかえ
881デフォルトの名無しさん:2008/04/20(日) 22:29:26
snprintfとかswprintfでもいいよ
882デフォルトの名無しさん:2008/04/21(月) 01:09:03
>>870
>>871
さんくす。
CreateDIBitmap使ってやってみたらいけた。

表示用のビットマップはCreateCompatibleBitmapで作って、
外部からもらったバイナリを描画するビットマップをCreateDIBitmapで作成

BitBltで転送して実装できたよ

ありがとう
883デフォルトの名無しさん:2008/04/21(月) 20:49:40
>>879確実にvsprintfで落ちてました。
>>880-881ダメでした。あきらめます。
親切にレスしてくださった皆様、ありがとうございました
884デフォルトの名無しさん:2008/04/21(月) 21:15:55
null = new int[10]
で確保した領域はどこに存在するの?
delete[]しなければ、この確保した領域はプログラムが終了してもずっとそこに存在したままになるの?
885デフォルトの名無しさん:2008/04/21(月) 21:18:33
>>884
ヒープ領域のどこか

終了したらちゃんと解放される
一部されないOSもなくはない
886デフォルトの名無しさん:2008/04/21(月) 21:38:02
コンパイル時にtype_infoみたいな感じで静的にクラス名の文字列を取得できる方法ってありますか?
テンプレートクラスで例外を投げる時に使いたいんですが・・・
887デフォルトの名無しさん:2008/04/21(月) 21:52:34
>>886
boostのこの辺のが役に立つかもしれない
ttp://www.kmonos.net/alang/boost/classes/enable_if.html
888デフォルトの名無しさん:2008/04/21(月) 22:10:44
boostって本当にすごいね・・・そんなのも判定できるとは
でも型名の取得は厳しいのかな・・・
889デフォルトの名無しさん:2008/04/22(火) 01:38:20
やっぱりboostでtypeofってのがあって、それで
型名は取得できるのだけど、staticな処理じゃないんだよね。
なのでその用途だとtypeid使うのとあまり変わりない。
ttp://www.kmonos.net/alang/boost/classes/typeof.html
890デフォルトの名無しさん:2008/04/22(火) 03:19:09
STLをはじめ、テンプレートをよく使いなさい。
型の完全名がカオスになって諦めがつくから。
891デフォルトの名無しさん:2008/04/22(火) 04:20:31
void CtimerDlg::OnBnClickedButton2()
{
// TODO: ここにコントロール通知ハンドラ コードを追加します。
msgdlg aaae = new msgdlg();
aaae.Create(IDD_DIALOG1, this);
aaae.ShowWindow(SW_SHOW);

}

このボタンを押すとダイアログウィンドウが一瞬表示されたようにみえるのですが、表示されません。
SW_SHOWがいけないんでしょうか?
892デフォルトの名無しさん:2008/04/22(火) 07:09:45
それコンパイル通るの?
893デフォルトの名無しさん:2008/04/22(火) 07:55:39
コンパイルできないし、それが単なるtypoだったとしても資源の管理はどうなってるんでしょうね、と。
894デフォルトの名無しさん:2008/04/22(火) 09:21:56
コンパイルはできますがやはりaaae.ShowWindow(SW_SHOW);で消滅します
895デフォルトの名無しさん:2008/04/22(火) 09:25:14
あ、aaaeをポインタにしたら出来ました。
896デフォルトの名無しさん:2008/04/22(火) 20:23:53
単にスコープ抜けたから、msgdlgのインスタンスが死亡しただけだろう。
897デフォルトの名無しさん:2008/04/22(火) 21:23:39
vsprintfについてなんですけど、下記のva_end(..)っているのですか?

xx func(const char* format, ...) {
char buf[256];
va_list args;
va_start(args,format);
vsprintf(buf, format, args);
va_end(args); // <=== これ必要なんですか?
...
}
898デフォルトの名無しさん:2008/04/22(火) 21:30:35
規格で、同じネストレベルでva_start,va_endの組で使うことになっている。
899デフォルトの名無しさん:2008/04/22(火) 21:32:48
実装によるかも知れんがメモリとかがぶっ壊れるんじゃまいか
900デフォルトの名無しさん:2008/04/22(火) 21:49:24
すいませんちょっとお聞きしたいのですが、GCCで

if(ret = 1){
int dt = 1;
}

みたいにしたら、
「真偽値として使われる代入のまわりでは、丸括弧の使用をお勧めします」
と言われたので、

if((ret = 1)){
int dt = 1;
}

みたいにしたら、許してもらえました。

なぜ ((ret = 1)) の方がよいのでしょうか??
901デフォルトの名無しさん:2008/04/22(火) 21:52:09
>>900
ret==1って書いたらその警告消えてくれるよ。
902897:2008/04/22(火) 21:54:54
>>898-899 どうも、
ここのサンプルではva_end使ってないんです
http://msdn2.microsoft.com/ja-jp/library/28d5ce15(VS.80).aspx
そして、http://www.bohyoh.com/CandCPP/C/Library/vsprintf.html
ここに、「本関数は、va_endマクロを呼び出さない」 と記述があるんです
903デフォルトの名無しさん:2008/04/22(火) 22:00:56
>>900
==の間違いだったりしませんよね?大丈夫?っていう警告だからそういうもんだと思え
別に前の書き方でも問題ない

(())の方がよいというわけじゃない
904900:2008/04/22(火) 22:05:44
>>901 さん
>>903 さん
なるほど!ありがとうございます!
905デフォルトの名無しさん:2008/04/22(火) 22:28:34
>>902
VCに限っていえばva_endマクロは何もしないから呼ばなくても問題はない。
しかし、他の処理系で動くとは限らない。
906デフォルトの名無しさん:2008/04/22(火) 23:00:01
>>902
書かなくてもいい環境が有るとはいえ、プログラムとしては書かないと駄目。
運悪く駄目なサンプルに当たったね。
907デフォルトの名無しさん:2008/04/22(火) 23:05:39
>>896
なるほど!
msgdlg aaae = new msgdlg();
をグローバル領域に持って行っても起動しました。
ポインタの理解が深まりました。ありがとう!
908デフォルトの名無しさん:2008/04/22(火) 23:07:36
ちょっとぉぉぉぉぉ
909デフォルトの名無しさん:2008/04/22(火) 23:13:26
これが
「何か適当にいじったら動いた」
という奴か
910デフォルトの名無しさん:2008/04/22(火) 23:14:27
> グローバル領域
深まってない悪寒
911デフォルトの名無しさん:2008/04/22(火) 23:15:55
さすがにこれをコンボでくらったら元のソースを自分で書いていたとしてもデバッグしたくなくなるな
(だから、その変てこなのは後から馬鹿が弄ったんだってば ><)
912デフォルトの名無しさん:2008/04/22(火) 23:18:30
>msgdlg aaae = new msgdlg();
このコード、何度見ても謎が残りすぎ。
913デフォルトの名無しさん:2008/04/22(火) 23:29:02
>891の段階で既に釣りだったんじゃね?
914デフォルトの名無しさん:2008/04/22(火) 23:30:42
>>907
C++の入門書か入門サイトをもう一度見て回った方が良いと思うぞ。
煽りとかじゃなくて本当に。基礎は大事だから。

とりあえず、理解する必要のあるキーワードとしては、
   ポインタ、参照、自動変数、デストラクタ、delete、スコープ、スタック、ヒープ
あたりかな。
915デフォルトの名無しさん:2008/04/22(火) 23:32:33
釣りなら、それはそれでおk。
916デフォルトの名無しさん:2008/04/23(水) 00:24:05
switchのcase文内で、auto変数を宣言しようとすると、{}をつかってブロックを
作らないとだめですか?
917デフォルトの名無しさん:2008/04/23(水) 00:25:05
だめです
918デフォルトの名無しさん:2008/04/23(水) 00:30:02
>>916
例えばこういうことならできる。
switch (value) {
int someVar;
case 0:
someVar = 0;
break;
case 1:
someVar = -1;
default:
someVar = value;
break;
}
919デフォルトの名無しさん:2008/04/23(水) 00:35:00
>>914
レベルアップした気分ですごく満足なのですが
もう一度新C++言語入門シニア編上下を読み直してみます・・・
が、ずばり一言でどこがおかしいですか?頭関係以外でおねがいします。
920デフォルトの名無しさん:2008/04/23(水) 00:35:09
>>917-918
ありがとうです。
918はやり方自体知らんかったス。
921デフォルトの名無しさん:2008/04/23(水) 01:01:17
>>919
頭関係以外で一言にまとめるには、対象が「少数」の「具体的なディテール」である必要がある。
でも君の場合、「基本的な抽象概念」の理解が「幾つも」欠けているように見受けられるから、まとめようがない。
だから>>914も困った挙げ句
> ポインタ、参照、自動変数、デストラクタ、delete、スコープ、スタック、ヒープあたり
という言い方になってるんだよ(これでも親切に用語を絞って挙げてるほう)。
922デフォルトの名無しさん:2008/04/23(水) 02:37:20
>>919
msgdlg aaae; //○msgdlg型の変数
msgdlg aaae = new msgdlg(); //×msgdlg型の変数にmsgdlg*型の値を代入
msgdlg *aaae = new msgdlg(); //○msgdlg*型の変数にmsgdlg*型の値を代入
一言でいうと,どこがイコールよ?



923デフォルトの名無しさん:2008/04/23(水) 07:18:54
>>919

void CtimerDlg::OnBnClickedButton2()
{
  // new msgdlg() → msgdlgのインスタンスをヒープに確保。
  //
  // msgdlg aaae = ... → msgdlgのインスタンスをスタックに確保して、
  // msgdlg(msgdlg* ptr)に適合するコンストラクタで初期化。(※1)
  msgdlg aaae = new msgdlg();

  ...

  // 自動変数のaaaeがスコープから外れるのでデストラクタが呼ばれ、
  // aaaaが保持していたウィンドウなどが削除される。
  //
  // (※1)のポインタptrをdeleteしていなければメモリリーク。
}

が理解出来ていないように見える。

作りたいのがモーダルダイアログなら、
{
  msgdlg aaae;
  aaae.Create(IDD_DIALOG1, this);
  aaaa.DoModal();
}

関数を抜けてもmsgdlgを保持するなら、
グローバルでなくCtimerDlgのメンバにする。
924デフォルトの名無しさん:2008/04/23(水) 07:20:43
よく見たらeだった。
× aaaa
○ aaae
925デフォルトの名無しさん:2008/04/23(水) 09:41:18
ビットフィールドは、

unsigned char x : 50;

のように元の型を超えていても定義できますか?

926デフォルトの名無しさん:2008/04/23(水) 09:43:54
unsigned char配列を、38 、 6 、 4 のように分けたいのですが、ビットフィールドで出来ますか?
あと、38bitの部分は、=で比較できますか? 無理な場合、別の方法はないでしょうか
927デフォルトの名無しさん:2008/04/23(水) 09:51:28
このようにしたら、確保する領域は、40bit + 8bitになりますよね?
33 + 7 ではないですよね?

class A{
public:
bitset<33> a;
char b : 7;
};
928デフォルトの名無しさん:2008/04/23(水) 10:06:17
自己解決しました
これで長い列に変換出来ました


bitset<40> *p;
unsigned char s[5]={1,255,1,255,128};
p=(bitset<40>*)&s;
cout<< *p;
929デフォルトの名無しさん:2008/04/23(水) 10:53:08
そ れ は 偶 然 だ
930デフォルトの名無しさん:2008/04/23(水) 11:16:25
>>922>>923
ありがとうございます。すごくよくわかりました。
void CtimerDlg::OnBnClickedButton2()
{
// TODO: ここにコントロール通知ハンドラ コードを追加します。
int a =0;
while(a < 100){
msgdlg *aaae = new msgdlg[100];
aaae[a]->Create(IDD_DIALOG1, this); // エラー
aaae[a]->ShowWindow(SW_SHOW);
aaae[a]->OnBnClickedOk();
delete aaae[a];
a++;
}
}
error C2819: クラス 'msgdlg' にはオーバーロードされたメンバ 'operator ->' がありません。

これは何がいけないんでしょうか?
931デフォルトの名無しさん:2008/04/23(水) 11:32:26
下記のコードを実行したときに test::aaa で内部的に確保されたメモリ(?)が解放されず、
メモリリークが起きてしまっているようで解決方法が見つからず困っています。
STLなどの場合、確保したメモリを明示的に解放する関数などがあるのでしょうか?
( aaa.clear() や aaa.~vector() などは試してみたのですが駄目でした)
それとも test::aaa 自体も new で確保して delete で解放したほうが良いのでしょうか?
環境はVC++2005です、よろしくお願いします。

class base {
public:
~base(){ destory(); }
virtual void destory(){};
};
class test : base {
public:
std::vector< int > aaa;
void destory(){ aaa.clear(); }
};

void main(){
void *p;
{
test *ptest;
ptest = new test;
ptest->aaa.resize(100);
p = (void*)ptest;
}
//ここではポインタ p の基本クラスが base ということ以外はわからない
delete (base*)p;
}
932デフォルトの名無しさん:2008/04/23(水) 11:39:01
デストラクタで仮想関数呼び出すとか馬鹿じゃねーの?
933デフォルトの名無しさん:2008/04/23(水) 11:42:12
古い形式のキャスト使ってるとか馬鹿じゃねーの?
スマートポインタ使ってないとか馬鹿じゃねーの?

いやいや、馬鹿じゃないって。
デストラクタの中から仮想関数呼び出すのはさすがにないけど。
934デフォルトの名無しさん:2008/04/23(水) 11:44:25
>>930
これはひどい
935デフォルトの名無しさん:2008/04/23(水) 11:57:28
… ~base() が呼び出されるときは
既に test::destory の実体はなくなっているからでしょうか?
馬鹿ですみません…
こういう場合、クラスtestで確保したメモリは
どう解放したら良いのでしょうか?
936デフォルトの名無しさん:2008/04/23(水) 11:59:40
しかも書いてありました。
スマートポインタで調べてみます。
937デフォルトの名無しさん:2008/04/23(水) 12:31:15
baseのデストラクタにvirtualをつけて上で
testに自分のdestoryを呼ぶデストラクタを書けば
baseのデストラクタの最初でtestのデストラクタが呼ばれて、testのdetoryが呼び出されるため
この場合はmain内部の変更無しでメモリリークがなくなるけど、それじゃ駄目なの?
938デフォルトの名無しさん:2008/04/23(水) 13:22:22
>>937
ありがとうございます、無事に解放されるようになりました。
いろいろと勉強不足でした。
仮想デストラクタにしないと派生クラスのデストラクタが呼び出されないのはもちろん
メンバ変数のデストラクタも呼び出されないということ(?)なんですね。
939デフォルトの名無しさん:2008/04/23(水) 13:39:34
>メンバ変数のデストラクタも呼び出されない
詳しくは覚えてないが、デストラクタが仮想関数(virtual)であれば、delete演算子が
渡されたポインタから仮想関数テーブルを辿って継承関係を把握できるとか
だったと思う(逆に言えば仮想関数でないと把握できない)。
ちなみに勘違いしてそうなので書いておくけど、デストラクタとは
~クラス名();←引数無し
のこと。destroyとか勝手に名前つけたらそれはただのメンバ関数だよ。
この場合正しくは virtual ~base();とかだ。
940デフォルトの名無しさん:2008/04/23(水) 13:43:43
あ、そういえば~base()はちゃんと書いてあるのかw
941デフォルトの名無しさん:2008/04/23(水) 14:11:20
なるほど…仮想関数テーブルですか、
virtual指定はなんだか漠然としていて理解しにくかったですが
なんとなくはどう動作するかが理解できました。
ありがとうございます。
942デフォルトの名無しさん:2008/04/23(水) 14:16:49
>>930
下のソースはコンパイル可能
行数減らしたから少し見辛いかも
>>914の言うようにポインタと参照について学んだ方がいい

struct CTest{ void test(){} };
void f(){
CTest a;
CTest* b = new CTest();
CTest* c = new CTest[1];
CTest d[1];
a.test(); (*&a).test(); (&a)->test(); (&a)[0].test();
(*b).test(); b->test(); b[0].test();
(*c).test(); c->test(); c[0].test();
(*d).test(); d->test(); d[0].test();
delete b;
delete[] c;
}
943デフォルトの名無しさん:2008/04/23(水) 14:47:49
>>942
感動しました。こんなにわかりやすいの初めてみました。がんばります!
944デフォルトの名無しさん:2008/04/23(水) 15:37:22
物凄い初歩的な質問なんですが
上手い方法を教えてもらいたくて質問します。

ある文字列があって
1文字ずつ処理していくんですが、
何か文字に変化があった時だけ処理を行いたいのです。

char str[]="ああいうええお";//何か文字列
int len=strlen(str);
char current_c;

current_c=str[0];//内容を覚える
for(int i=0; i<len; i++){
if(current_c!=str[i]){//連続している文字が変われば
//処理
}
}

こんなのを思いついたんですが
これだと、1つ目の文字が当然処理されません。
current_c=str[0];//内容を覚える
これを
current_c=str[0]+1;//内容を覚える
として、必ず1回目は処理が行われるようにするのも考えたんですが
もっとちゃんとしたスマートな方法があると思うんですが・・・
こういう場合、どうやるのが一般的なのでしょうか?
945デフォルトの名無しさん:2008/04/23(水) 15:46:25
str[0]+1なんて代入しなくても、0で初期化しておけばいいんじゃないの?
946デフォルトの名無しさん:2008/04/23(水) 15:48:09
>>944
charは1バイトだから平仮名みたいな多バイト文字はうまくゆかないよ。
分かっているならごめん。
947デフォルトの名無しさん:2008/04/23(水) 16:11:33
>>945
0に相当する文字が来た時に駄目でしょ。
948デフォルトの名無しさん:2008/04/23(水) 16:12:08
>>944

typedef char val_t;
val_t str[]="aabbbcccddee";

typedef val_t* iter_t;
for(iter_t begin=str,end=str+strlen(str),back,it=begin; it!=end; ++it){
  if(it==begin || *back!=*it){
    //処理
    back=it;
  }
}


(・∀・)
949デフォルトの名無しさん:2008/04/23(水) 16:13:42
>>947
それはひょっとしてギャグでいってるのか・・・・
950デフォルトの名無しさん:2008/04/23(水) 16:19:37
>>944
最初に1文字目と異なる値 str[0]+1 で初期化しとけば良いんじゃね?
ってのは結構頭の良い発想。凡百の徒には嫌われるけどね。

でもそういうときの current_c は普通 prev_c だな。
951デフォルトの名無しさん:2008/04/23(水) 16:22:12
>>950
そうか?ムダじゃね?
952デフォルトの名無しさん:2008/04/23(水) 16:33:50
一つ目の文字が変わるっていう意味が分からんw
953948:2008/04/23(水) 16:41:36
struct CTest{
  bool operator!=(const CTest& o){
    // ...
    return true;
  }
};
template<typename iter_t> void unique_each(iter_t begin, iter_t end){
  for(iter_t back,it=begin; it!=end; ++it){
    if(it==begin || *back!=*it){
      //処理
      back=it;
    }
  }
}
void f(){
  CTest v[10];
  // v[0] ...
  unique_each(v,v+sizeof(v)/sizeof(*v));
}

(∩゜д゜)アーアーきこえなーい
954デフォルトの名無しさん:2008/04/23(水) 16:46:59
>>951
今回は文字だから 0 にしときゃ良いけど、
一般に先頭要素または直前のと異なる要素を
判定していくには良い方法だよ。
955デフォルトの名無しさん:2008/04/23(水) 16:58:36
>>945の前提条件
nul終端文字列

>>947の前提条件
文字列

>>950の前提条件
コピーコンストラクタ
operator+
operator!=
を持っている型

>>953の前提条件
operator!=
を持っている型
956デフォルトの名無しさん:2008/04/23(水) 17:04:34
>>955
もう>>944とは別世界に行ってるなw
957デフォルトの名無しさん:2008/04/23(水) 17:31:55
PHPやperlでprint を使いながらデバッグするような方法をC++でもやりたいのですが、どうすればよいでしょうか??
そういうデバッグの仕方はC++では難しいのでしょうか。
958デフォルトの名無しさん:2008/04/23(水) 17:32:34
>>944 ちょっとトリッキー、でもうまいやり方
>>945 一番シンプル
>>946 一番重要なレスw
>>953 汎用化し杉ワロタw
959デフォルトの名無しさん:2008/04/23(水) 17:44:15
>>944
#include <algorithm>
#include <string>
#include <iostream>
#include <functional>

int main() {
  std::wstring src = L"ああいうええお";
  src.push_back(0);
  ::setlocale(LC_ALL, "ja_JP.UTF-8");
  for (std::wstring::iterator i = src.begin(); *i != 0; ++i) {
    i = std::adjacent_find(i, src.end(), std::not_equal_to<wchar_t>());
    std::wcout << i-src.begin() << *i << std::endl;;
  }
}

終端一つ加えて条件が逆のadjacent_find

>>957
エスパーするとコードを読ませて実行時に一時的な値を見るとかならデバッガ
gdbとVC付属のやつとか
960デフォルトの名無しさん:2008/04/23(水) 17:44:31
>>944は、charの取りうる最大値を指していた場合
+1すると、オーバーする。

>>945は、処理内容次第では、\0がいきなり来た場合にヤバい。
が、あのプログラムの場合strlenの値がループの実行回数だからOK

>953は、恐らく>>944が本当に必要だったものではない可能性が高いw
961デフォルトの名無しさん:2008/04/23(水) 17:47:00
>>959 さん
なるほどデバッガで変数に格納されてる値を見ることが出来るんですね。
ありがとうございましたm(_ _)m
962デフォルトの名無しさん:2008/04/23(水) 17:51:55
>>>944は、charの取りうる最大値を指していた場合
>+1すると、オーバーする。

するってーと current_c=~str[0]; が適切?
963デフォルトの名無しさん:2008/04/23(水) 17:53:43
オーバーフローしても大丈夫だろ。
964デフォルトの名無しさん:2008/04/23(水) 17:55:39
あ、一文字目が処理されない
965デフォルトの名無しさん:2008/04/23(水) 17:56:06
>>963
実動はともかく、規格的にはアウトだろ
966959:2008/04/23(水) 18:12:21
リベンジ

#include <algorithm>
#include <string>
#include <iostream>
#include <functional>

int main() {
  std::wstring src = L"ああいうええお";
  ::setlocale(LC_ALL, "ja_JP.UTF-8");
  std::wstring::iterator i = src.begin();
  if (!src.empty()) {
    do {
      std::wcout << *i << std::distance(src.begin(), i) << std::endl;
      i = std::adjacent_find(i, src.end(), std::not_equal_to<wchar_t>());
    } while(i++ != src.end());
  }
}

967デフォルトの名無しさん:2008/04/23(水) 18:15:31
そして通告されるeucJP
968デフォルトの名無しさん:2008/04/23(水) 19:01:21
vectorの配列を作ろうと思い

vector<vector<string> > vecStrDim;
vector<string> vecStr;
string strTest = "test";

vecStr.push_back(strTest);
vecStrDim[0].push_back(vecStr);

とやってみました。コンパイルは通るのですが
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
とでて実行してもデバッグエラーになります

vecStrDim[0].push_back(vecStr);が悪いのはわかるのですが、方法が思いつきません
どうすればデバッグエラーを対処できるのでしょうか?
969デフォルトの名無しさん:2008/04/23(水) 19:06:06
>>968
×vecStrDim[0].push_back(vecStr);
○vecStrDim.push_back(vecStr);
970デフォルトの名無しさん:2008/04/23(水) 19:10:40
>>969
あわわ……とんでもなく馬鹿なことしてすみません
解決しました
971デフォルトの名無しさん:2008/04/23(水) 19:14:36
そのコードがコンパイルが通ることが不思議だ…
972デフォルトの名無しさん:2008/04/23(水) 19:29:14
シングルバイト限定なら、current_cをintか何かにして、charで表現できないデカい値にしとけばいい。
973デフォルトの名無しさん:2008/04/23(水) 20:44:51
class内で、static付けたものは、配列にしたときコピーは作られないんですよね? すべて同じ物を参照するんですよね
974デフォルトの名無しさん:2008/04/24(木) 00:27:08
まあ配列にしなくても1つしか実体が存在しないようになるけどな
975デフォルトの名無しさん:2008/04/24(木) 00:49:34
#include <stdio.h>
void main(void)
{
int a;
pirntf("何か入力してください\n\n");
scanf("%d",&a);
while(1){
printf("ぐははははははは!!\n\a");
}
}
この程度しか俺は中なので書けません。プログラマーさん
お願いします。

976デフォルトの名無しさん:2008/04/24(木) 00:50:21
↑MISSりました

#include<stdio.h>
void main(void)
{
int a,b,c;
printf("数字を入力してください\n");
scanf("%d",&a);
printf("数字をまた入力してください\n");
rewind(stdin);
scanf("%d",&b);
printf("数字をまたまた入力してください\n");
scanf("%d",&c);

if(a == b == c)
printf("等しいです,\n");
else
printf("等しくないです,\n");
}


これでa==b==cだったら"等しい"と表示させるように組んでるのに 1、1、1以外の数字は入力してもは全部"等しくないです"になるのは
なんででしょうか?
977デフォルトの名無しさん:2008/04/24(木) 00:52:43
>>976
a == b == c は、(a == b) == c と解釈される。つまり、使い方が間違っている。
その場合、恐らくa == b && b == c でいいだろう。
978デフォルトの名無しさん:2008/04/24(木) 00:57:13
980あたり、次スレたのむぜ
979デフォルトの名無しさん:2008/04/24(木) 00:59:27
>>977
おおwなるほど!
ありがとうございました^^
980デフォルトの名無しさん:2008/04/24(木) 01:11:37
>>990にパス
981デフォルトの名無しさん:2008/04/24(木) 01:14:03
>>976
移動前のスレのコメントにもありましたが、
「君が参考にしてるものは信用しないほうがいい」
です。void main(...) はまずい。
982デフォルトの名無しさん:2008/04/24(木) 01:17:45
void main は g++ でエラーになるしな。
gcc だと警告ですむけど。
983981:2008/04/24(木) 01:34:22
rewind() も、あるのかわからない.....。stdin に対して rewind() ?
984デフォルトの名無しさん:2008/04/24(木) 03:35:46
1〜100までの数字でひとつだけない数字があるのでそれを探すという問題なのですが
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6318.cpp
でひとつひとつ探す方法はあるのですが
他の方法で、まず
1〜50までの個数と51〜100までの個数を数えて
1〜50が49個
51〜100が50個で1〜50にあるとして
次は1〜25、26〜50とどんどん減らして
26〜38と39〜50の割り切れないときは13と12にしたりなどして
最後2つの数字にし
48が1個
49が0個で49がない数字とするプログラムを作りたいのですが
どなたか例みたいなものを書いていただけないでしょうか?
985デフォルトの名無しさん:2008/04/24(木) 03:41:23
数えながら2つのファイル(小さい,大きい)に書き出していけばいいんじゃねの?
986デフォルトの名無しさん:2008/04/24(木) 03:42:37
どこにあるのかわからないなら、ひとつひとつしらべるのが最善
987デフォルトの名無しさん:2008/04/24(木) 03:48:07
問題でこのような方法で作りなさいとあるので作りたいんですがダメでしょうか?
#include<stdio.h>
#define N 100
int main(void){
int min , max , mid;
int count1, count2;
int data, i;
FILE *fp

ここまでの指定はあるのですが、今自力でやってみてるんですが
どう二つに分けそれ以降どのように区切っていけばいいのかよくわからないんです
988デフォルトの名無しさん:2008/04/24(木) 04:42:58
物凄い無駄な処理だなw

再帰呼び出しを使うのが良いよ
989988:2008/04/24(木) 04:46:09
ああ、ごめん。数字は順番に並んでるわけじゃないのか
990デフォルトの名無しさん:2008/04/24(木) 04:54:26
諦めて全部足して5050から引け
991デフォルトの名無しさん:2008/04/24(木) 05:18:22
#include <vector>

//trueならmidより上、falseなら下
bool hilow(int min, int mid, int max,
  std::vector<int> src, std::vector<int> dst)
{
dst.clear();
std::vector<int> hi, low;

//中間数超と以下でhi, lowに分ける
for(size_t c=min; c <= max; c++) {
if(src[c] <= mid) low.push_back(src[c]);
else hi.push_back(src[c]);
}

//個数が規定値か調べて多い方を返す
if(hi.size() == max - mid ) {
dst.swap(hi);
return ture;
}

dst.swap(low);
return false;
}


続く
992デフォルトの名無しさん:2008/04/24(木) 05:33:54
続き
void main() {
std::vector<int> num;
//ファイルからnumに一度全部読み込む
//ここは自分で書けるでしょ?

int min, mid, max;
min = 1;
max = 100;

do {
(max - min + 1) % 2 ? mid = (max - min + 1) / 2 + 1 : mid = (max - min + 1) / 2;
if( hilow(min, mid, max, num, num) ) min = mid + 1;
else max = mid;
} while(max - min > 2);

//完了

}
993デフォルトの名無しさん:2008/04/24(木) 05:36:05
あー色々間違ってたw

bool hilow(int min, int mid, int max,
  std::vector<int>& src, std::vector<int>& dst)

dst.clear(); は無し


f(hi.size() == max - mid ) {
dst.swap(low);
return false;
}
dst.swap(hi);
return true;
}
994デフォルトの名無しさん:2008/04/24(木) 05:37:10
試してないけどこんな感じで良いと思うよ。
中間の出し方は微妙に間違ってるかもしれんので、自分で検証してね。
995デフォルトの名無しさん:2008/04/24(木) 05:56:21
exeを逆アセンブルしてソースコードに組み込む定番のやり方教えて下さい
996デフォルトの名無しさん:2008/04/24(木) 06:00:08
ソースコードでよくみかける10Lや1Lってなんのことなんでしょうか?
「1Lとは」などで検索したのですが見つかりません。
環境はC++、BCCです。どなたか回答頂ければ幸いです。
997デフォルトの名無しさん:2008/04/24(木) 06:09:58
>>996
整数のあとにつくLはlong intであることを表す。
10はintの10。10Lはlong intの10。
998デフォルトの名無しさん:2008/04/24(木) 06:31:33
>>997
ありがとうございます!
long intをキーワードに検索したら大体わかってきました。
long intを代入するときはLをつけるという解釈であってますか?
999デフォルトの名無しさん:2008/04/24(木) 06:39:42
違うよ。整数リテラルそのものにも型があるの。

1 は int型
'1' は char型
1.0 は double型
1L は long型
1000デフォルトの名無しさん:2008/04/24(木) 06:49:16
重ねてありがとうございます!
詳しい説明でよくわかりました(多分)。
単なる1でも勝手にintにされてるんですね。
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。