トップページ⇒tech
1001コメント351KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2007/11/03(土) 00:20:13
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.43【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1190860744/l50
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0449デフォルトの名無しさん2007/11/23(金) 14:44:32
>>448
なんとなく書いてみただけからスルーしてもらっておkです

#include <stdio.h>

typedef void (*func_t)(void);
typedef func_t (*func2_t)(void);

void hello(void){printf("Hello\n");}
func_t hello_func(void){return hello;}
func2_t hello_func_func(void){return hello_func;}

int main(void){
hello_func_func()()();
return 0;
}
0450デフォルトの名無しさん2007/11/23(金) 14:45:20
ここはお前の日記帳j(ry
0451デフォルトの名無しさん2007/11/23(金) 17:01:21
処理Aと処理Bがあって、
Aは1秒ごとに、Bは5秒ごとに呼ばれるものとします。
この1秒と5秒はおおよそで良いので、sleepで止めます。

このAとBを並行して実行させたいとき、
普通はマルチスレッドにするものですか?
Linuxです。
0452デフォルトの名無しさん2007/11/23(金) 17:03:53
おおよそでいいならA5回ごとにB呼べば?
04534512007/11/23(金) 17:16:07
>>452
そこまでは「およそ」じゃないんです。
リアルタイム性は要らない程度の意味でした。
設定秒数を渡して5秒とか1秒ってのは変わりうるので。
0454デフォルトの名無しさん2007/11/23(金) 17:40:44
んじゃ、sleepで1秒待つループを作って、設定秒数ごとにそれぞれを呼ぶと。
0455デフォルトの名無しさん2007/11/23(金) 17:42:29
for (unsigned cnt; ;) {
sleep(1);
++cnt;
if (cnt % intervalA == 0) A();
if (cnt % intervalB == 0) B();
}
04564512007/11/23(金) 18:00:21
>>454-455
それだと、usleepなんかにして1秒の倍数じゃないときに駄目なんで。
0457デフォルトの名無しさん2007/11/23(金) 18:39:37
ひとつの処理にどれくらいの時間がかかるかと、
どれくらいの誤差まで許されるかが問題だな
0458デフォルトの名無しさん2007/11/23(金) 18:40:50
>>456
だからなんなんだw
455のソースをms単位に変更するだけじゃないか
0459デフォルトの名無しさん2007/11/23(金) 18:44:39
ns単位(ry
0460デフォルトの名無しさん2007/11/23(金) 18:59:33
まあ、マルチスレッド使えるんなら使うのが素直な気はする。
0461デフォルトの名無しさん2007/11/23(金) 22:10:54
すいません。
いきなりスコープ解決演算子を二つ続けて、関数を呼び出す意味が分からないのですが、
普通は [クラス名] :: [関数名]() のようにして、どのクラスのメソッドを呼び出しているか
指定する為に使うんですよね?
誰かクラス名が無い場合の意味を教えてください
0462デフォルトの名無しさん2007/11/23(金) 22:19:15
わからないままでいいんじゃないかなぁ
そこらへんは趣味の世界だし
0463デフォルトの名無しさん2007/11/23(金) 22:22:29
>>461
そのクラスに属していない、グローバルネームスペースの関数を呼び出すことを明示するために使う。
MFCのソースはその典型。
0464デフォルトの名無しさん2007/11/23(金) 22:23:41
>>461
どこのクラスにも名前空間にも属していない名前を明示的に指定したいときに使う。

void f(); //(1)

class Hoge
{
    void f(); //(2)

    void g()
    {
        ::f(); //(1)を呼ぶ
        f(); //(2)を呼ぶ
        this->f(); //(2)を呼ぶ
    }
};
0465デフォルトの名無しさん2007/11/23(金) 22:37:18
>>462->>464
ありがとうございます
なくても良かったんですね^^;
聞いて本当によかった。もうすぐ発狂するところでした。
0466デフォルトの名無しさん2007/11/23(金) 22:47:33
>>465
分かっているとは思うけど、「なくても良い」ではないよ。
>>464の(1)を呼ぶ例のように、場面によっては必要だからね。
0467デフォルトの名無しさん2007/11/23(金) 22:57:44
('∀`)そうだと思ってました本当です。
0468デフォルトの名無しさん2007/11/23(金) 22:58:29
>>465
>>464を読んで「なくても良かった」という結論はないな。
0469デフォルトの名無しさん2007/11/23(金) 23:42:39
無くてもいい場面も多いけどな
0470デフォルトの名無しさん2007/11/24(土) 00:11:40
簡単な使い捨てコードなら namespace 気にしないでもいいと思う。
かったるいし。
0471デフォルトの名無しさん2007/11/24(土) 22:04:08
質問です。
Visual Studio .NET 2005 C++ の WIN32 プロジェクトで、

TRACE("hogehoge="+hogehoge)

のように、自分用デバッグログを出力ウィンドウかどこかに出したいのですが、方法がわかりません。
標準出力に出力してもどこにも出力されていません(と思う)
どなたかご教授お願いいたします。
0472デフォルトの名無しさん2007/11/24(土) 22:19:47
>>471
基本はOutputDebugString。ただし引数は文字列の一つのみ。
CRTのデバッグルーチンも悪くないが、引数が真面目過ぎて多少面倒。
void dbgprintf (LPCTSTR fmt, ...)
みたいなのを自分で用意しておくのが無難じゃないかな。
0473デフォルトの名無しさん2007/11/24(土) 22:51:16
質問です。
C言語を使って構文解析ソフトCaboChaを使いたいのですが

ttp://chasen.org/~taku/software/cabocha/libcabocha.html
↑このサイトの通りに以下のプログラムを実行してみたのですが

Undefined symbol: cabocha_destroy_
Undefined symbol: cabocha_new_
Undefined symbol: cabocha_sparse_tostr_

↑このようなエラーが表示されてうまくできません。
どなたかわかるかたいらっしゃいませんか?

〜実行したプログラム〜
#include <cabocha.h>
#include <stdio.h>

int main (int argc, char **argv)
{
cabocha_t *c;
char p[1024] = "太郎は次郎が持っている本を花子に渡した。";

c = cabocha_new(argc, argv);

printf ("INPUT: %s\n", p);
printf ("RESULT:\n%s", cabocha_sparse_tostr(c, p));

cabocha_destroy(c);

return 0;
}
0474デフォルトの名無しさん2007/11/24(土) 22:54:04
csvファイルを読み込み、各データをint型の変数に代入するプログラムを作りました。
以下がソースです。
  ifstream fin;
  TCHAR line[252];
  LPTSTR buff[3];
  int result[64][3];
  stringstream ss;

  fin.open(_T("temp.csv"));

  if(!fin.is_open()) // 開いていなければ、FALSEを返す
  {
    return FALSE;
  }

  int i = 0;
  while (!fin.eof()){
    fin.getline(&line[0],sizeof(line));

    buff[0] = strtok(line,",");
    buff[1] = strtok(NULL,",");
    buff[2] = strtok(NULL,",");

    ss.str(""); //stringstreamをクリア
    ss << buff[0] << _T(" ") << buff[1] << _T(" ") << buff[2];
    ss >> result[i][0] >> result[i][1] >> result[i][2];

    //カウンタ
    i++;
  }

  fin.close();
0475デフォルトの名無しさん2007/11/24(土) 22:54:37
csvファイルの中身は以下のような並びになっています。
  2,2,49,
  2,4,0,
  ...
  2,46,27
  2,48,0

fin.close()のひとつ前の行でブレークポイントを入れると「アクセス違反」のエラーがでます。
i++の行でブレークポイントを入れると、i=0のときはうまくresult配列にデータが入ってくれますが、
i=1以降は、何も代入されないようです。
これを直す方法をご教授くださいませんか。
なお、今回のcsvファイルにはint型に代入するデータしかありませんが、
以下のような文字交じりのcsvファイルも使用したいので、string型の変数に代入する予定です。
  36,1,1,3,Orange,50,長崎
  24,1,2,2,Red,50,静岡
  ...
↑のプログラムがうまくいっていたら、stringstreamから>>演算子でstring型の変数に代入するつもりでしたが、
stringに代入するにあたって、何か注意するべき点がありましたら、ご教授ください
0476デフォルトの名無しさん2007/11/24(土) 22:55:44
>>473
「コンパイル方法」の項を読めば分かる
0477471 2007/11/24(土) 23:17:36
>>472さん
お答いただいてありがとうございます。

  OutputDebugString("hoge");

でコンパイルすると、

error C2664: 'OutputDebugStringW' : 1 番目の引数を 'const char [5]' から 'LPCWSTR' に変換できません。(新しい機能 ; ヘルプを参照)
指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。

とコンパイルエラーにになり(昔はでなかったような)、そこで

const char a[] = "hoge";
OutputDebugString((LPCWSTR)a);


とやってみたところ、コンパイルは通り、実行もできるのですが、残念ながらあいかわらずどこに"hoge"が出力されるのかわかりませんでした。
何か良い方法がありましたらお願いします。
0478デフォルトの名無しさん2007/11/24(土) 23:18:32
>>477
OutputDebugStringA
0479デフォルトの名無しさん2007/11/24(土) 23:51:42
OutputDebugString(_T("hoge"));
の方が好みだなー
0480471 2007/11/25(日) 00:00:46
>>478さん

OutputDebugStringA !!目から鱗ありがとうございます!!!

コンソールにも出したかったのですが、これは一応自己解決しましたのでご報告。

FILE *stream;
if (!::AttachConsole(ATTACH_PARENT_PROCESS)) { //XP以降はアタッチ
::AllocConsole(); //無理な場合は新たに開く
}
freopen_s(&stream, "CON", "r", stdin); // 標準入力の割り当て
freopen_s(&stream, "CON", "w", stdout); // 標準出力の割り当て

cout << "hoge" << endl;

::FreeConsole(); //アタッチ解放

以上です、ありがとうございました!
0481デフォルトの名無しさん2007/11/25(日) 00:02:56
イベントログに出力しちゃいなYO!
04824732007/11/25(日) 01:26:22
>>473
自己解決しました
0483デフォルトの名無しさん2007/11/25(日) 13:11:04
    if ("a" < "b")
        cout << "ok" << endl;
    else
        cout << "ng" << endl;

この場合はokと表示されるのですが

    if ("aa" < "bb")
        cout << "ok" << endl;
    else
        cout << "ng" << endl;

この場合はngと表示されます。

aのほうが文字コードが小さいのでokと表示されることを期待しているのですが
なぜこうなってしまうのでしょうか?
0484デフォルトの名無しさん2007/11/25(日) 13:15:39
文字列リテラルを不等号で大小比較比較しても、それはただ文字列リテラルの値(=アドレス値)の
大小を比較しているだけだよ。
文字順の比較をしたければ strcmp などを使え。

上記の意味が分からなければ、まずはちゃんとした入門書などを読んだほうがいい。
0485デフォルトの名無しさん2007/11/25(日) 14:39:57
string
0486デフォルトの名無しさん2007/11/25(日) 15:45:20
>>483
それは文字列が格納されているメモリアドレスを比較してるだけ
文字列の内容を比較したいなら strcmp を使え
0487デフォルトの名無しさん2007/11/25(日) 16:09:55
>>483
つ[ std::string("aa") < std::string("bb")]
0488デフォルトの名無しさん2007/11/25(日) 16:17:47
構造体を色んなソースで使いまわしたいのですが上手くいきません。

 共通ヘッダ: typedef struct TAG TYPE_NAME;
          TYPE_NAME nantoka1;

   ソースA: struct TAG { int a; int b; };

   ソースB: nantoka1 = { 3, 5 }

こんな風にしてみたんですが、ソースBは 'TAG' を認識してくれません。
どうすればいいでしょうか
0489デフォルトの名無しさん2007/11/25(日) 16:27:38
>>488
共通ヘッダ:
 struct TAG { int a; int b; };
 extern struct TAG nantoka1;
ソースA:
 いらない。
ソースB:
 struct TAG nantoka1 = {3, 5}
 
0490デフォルトの名無しさん2007/11/25(日) 16:39:43
リンクが絡まりそうなヘッダだな。
nantoka1が必要なソースでexternするようにした方がいいと思う。
04914882007/11/25(日) 17:05:02
489さんのやり方でやってみたら上手くいきました。ありがとうございます。
0492デフォルトの名無しさん2007/11/25(日) 23:01:29
ねーねー
連結リストの先頭のHeadをポインタで宣言しないのはどうして?
ポインタで宣言したほうが構造体分無駄にならなくなくない?
0493デフォルトの名無しさん2007/11/25(日) 23:03:56
boost初心者です。

以下がVC+2005ではコンパイル・実行できますが、Linux g++ 4.0ではコンパイル
できません。エラーコードはテンプレートだらけでよくわかりません。
何が違うのでしょうか?

#include <iostream>
#include <boost/bind.hpp>
using namespace std;
using namespace boost;

int someKeisan(int n1, int n2)
{
 return n1 * n2;
}

int main()
{
 cout << bind(someKeisan, _1, 10)(6) << endl;

 return 0;
}
0494デフォルトの名無しさん2007/11/25(日) 23:06:44
>>492
ポインタで宣言できるなら、そうすればいいんじゃないか?
むしろ、先頭用の構造体を持ってる実装のほうが珍しいと思うが。
0495デフォルトの名無しさん2007/11/25(日) 23:11:42
>>494
そうなの?
Googleとかで引っかかるサイトだと普通に宣言してるのが多いから
そういうもんかと思ってたよ
何にしてもありがとう
疑問が一つ解けたよ
0496デフォルトの名無しさん2007/11/25(日) 23:16:08
>>493
Cygwinでg++ 4.1.1だけどコンパイルできたよ。
0497デフォルトの名無しさん2007/11/25(日) 23:17:45
>>495
「連結リスト」でググって一番上にあるサイトからポインタで実装してるぞw
その次のはダミー作ってたけど。
0498デフォルトの名無しさん2007/11/25(日) 23:18:38
>>496
ヘッダーも存在してるし、
実装が未熟なんですかね?
0499デフォルトの名無しさん2007/11/25(日) 23:22:47
ちなみに
OS : Fedora Core 4
g++ 4.0.0でデフォルトのものを使ってます。

0500デフォルトの名無しさん2007/11/25(日) 23:26:35
>>499
boostを入れてないってことないか?
0501デフォルトの名無しさん2007/11/25(日) 23:29:22
>>500
functionやtokenizerは動作しますんで
boostは入ってると思います。
/usr/include/boostにhppファイルはあります。
0502デフォルトの名無しさん2007/11/25(日) 23:41:10
うちのFedora7でもだめだった。
0503デフォルトの名無しさん2007/11/26(月) 00:02:09
>>495
先頭要素が必ず存在するようにしたほうがコードを簡略化できるケースもあるから
あえてポインタではなく構造体を使用するということもあるよ。
よほど大きな構造体でない限り、高々1個を省略することは大きな意味はないから。
0504デフォルトの名無しさん2007/11/26(月) 00:22:16
>>502
そうですか。
tr1/functionalヘッダとtr1::placeholdersを指定しても
ダメでした。
VC++で我慢します。
05055022007/11/26(月) 01:38:50
気になったんで試してみた。同じ g++でも環境によって違うみたい。FreeBSDでは成功した。
以下結果と環境だけ。エラーメッセージは長いので省きます。

[FreeBSD 6.2R : コンパイル成功]
>GNU C++ version 3.4.6 [FreeBSD] 20060305 (i386-undermydesk-freebsd)
> compiled by GNU C version 3.4.6 [FreeBSD] 20060305.
>GGC heuristics: --param ggc-min-expand=30 --param ggc-min-heapsize=4096

[ Fedora7 : コンパイル失敗 ]
>GNU C++ version 4.1.2 20070925 (Red Hat 4.1.2-27) (i386-redhat-linux)
> compiled by GNU C version 4.1.2 20070925 (Red Hat 4.1.2-27).
>GGC heuristics: --param ggc-min-expand=98 --param ggc-min-heapsize=129178

[ Cygwin : コンパイル失敗 ]
>GNU C++ version 3.4.4 (cygming special, gdc 0.12, using dmd 0.125) (i686-pc-cygwin)
> compiled by GNU C version 3.4.4 (cygming special, gdc 0.12, using dmd 0.125).
>GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072


コンパイル失敗した二つは同じエラーが出てる。
>a.cpp:13: error: no match for call to ‘(boost::_bi::bind_t<int, int (*)(int, int), boost::_bi::list2<boost::arg<1>, boost::_bi::value<int> > >) (int)’
05065032007/11/26(月) 01:49:36
boostのversionの問題かも。
以下boost/version.hpp 内の定義比較。

[FreeBSD 6.2R]
>#define BOOST_VERSION 103401
>#define BOOST_LIB_VERSION "1_34_1"

[Fedora7][Cygwin]
>#define BOOST_VERSION 103301
>#define BOOST_LIB_VERSION "1_33_1"

コンパイル成功したFreeBSDだけ、1_34_1 だ
05075022007/11/26(月) 01:51:57
上ネーム欄間違い、503じゃなくて502。

これがboostのバージョンが原因なら、boostバージョンアップで解決するかもね。
0508デフォルトの名無しさん2007/11/26(月) 02:06:32
cout << bind(&someKeisan, _1, 10)(6) << endl;

にしたらどう?
05095022007/11/26(月) 02:19:41
Cygwin に boost 1_34 入れてみたら、コンパイル通った。
なんか修正されたんだな。リリースノートどこにあるんだろ・・・。

とりあえずすっきりした。これで寝れる。

>>508
だめ。
0510デフォルトの名無しさん2007/11/26(月) 15:06:00
VS2005スレで聞いたほうがよいのか迷いましたが、まずはこちらで質問させてください
VS2005でC++を使って組んでいるのですが、「関数宣言はされているものの実態が存在しない」というリンクエラーが大量に出て困っています。
(私の言う関数とは、クラスの関数。つまりメソッドです)

自分で作ったのなら当然実体も定義するのですが、これは他人のソースで、さらにその人は「とりあえずヘッダに必要そうな関数をかたっぱしから宣言しておく」人のようです。

実体が存在しない関数に関しては「一度も呼び出した無い」そうで、コンパイルオプションだかで「一度も呼び出してない関数は、宣言もろとも無視する」ことができる(そうやって実行ファイルを作りテストした)そうなのですが、どうすればよいのでしょうか?
(残念ながら、そのソースを書いた人自身に質問することができないのです)
0511デフォルトの名無しさん2007/11/26(月) 15:08:02
>>510
警告じゃなくて?
0512デフォルトの名無しさん2007/11/26(月) 15:18:44
>>510
仮想関数の場合は実体は必要だけどね。
0513デフォルトの名無しさん2007/11/26(月) 15:19:50
まさかデフォルトコンストラクタ?
0514デフォルトの名無しさん2007/11/26(月) 15:22:34
>>511-513
すいません、自己解決しました
>>510は友人の悩みをヒアリングして私が(私の体験っぽく)書き込んだのですが、511の指摘で「確かに警告ならわかるんだけどなぁ」と思い私自身でソースを調べてみました。

単に友人が渡されてるlibファイルを組み込んでいないだけの話でした(ちなみにその関数はちゃんと呼び出されていました。呼び出されていたからこそ警告ではなくエラーとなっていました)
お騒がせしてすいませんでした
0515デフォルトの名無しさん2007/11/26(月) 15:25:21
>>514
そんなミスは誰でもよくやることですから気にしなくてよいのですよ。

と、ご友人にはお伝えください。
0516493=5042007/11/26(月) 15:41:12
boostを1.3.4にバージョンアップしたら
コンパイル・実行できました。
0517デフォルトの名無しさん2007/11/26(月) 23:15:38
すみません、くだらない質問なのですが
これまでマクロとか使ったことがなくて…教えてください。

#define IX(i,j) ((i)+(N+2)*(j))
と書かれていて
1次元の配列ポインタに x[IX(i,j)]
こう書かれていた場合、どこをアクセスしてるのでしょうか。

また
#define SWAP(x0,x) {float * tmp=x0;x0=x;x=tmp;}
これも意味がわかっていません。

おねがいします、助けてください
0518デフォルトの名無しさん2007/11/26(月) 23:21:23
>>517
落ち着いて展開すれば大丈夫。
x[ IX( i, j ) ]→x[ i + N + 2 * j ]
一次元配列を二次元配列のように扱う時に使ったりするかな?

SWAPのほうは単純に2つの値(float *)を入れ替えてるだけ。
SWAP( fp1, fp2 );とかけば
{ float * tmp = fp1; fp1 = fp2; fp2 = tmp; }
0519デフォルトの名無しさん2007/11/26(月) 23:34:20
ありがとうございます(;;
ものすごい優しく応えてくれて、なんかほんとに涙出てきました。

>一次元配列を二次元配列のように扱う時に使ったりするかな?
まさしくその通りです。
1次元配列の i+N+2*j ということですね。

{1 2 3 4
5 6 7 8
9 8 7 6
5 4 3 2} の場合 2段目の6にアクセスしたいとき N=4だから
IX(1,1) = 1+4+2*1 = 6 つまり、前から6番目の6にアクセスできますね!
ありがとうございます。。。ほんとようやくわかりました(;;

SWAPの方は、入る値は float * 型じゃないとダメ、ですよね?
これに1次元の配列ポインタが入ると、配列そのものが入れ替わる、ということですよね?

ほんと、、、わからなくて、悶々として、誰にも聞けなかったので
本当に助かりました。ありがとうございました(;;
0520デフォルトの名無しさん2007/11/27(火) 01:11:23
>>519
>これに1次元の配列ポインタが入ると、配列そのものが入れ替わる、ということですよね
単に変な文章になっているだけかもしれないけど、配列そのものが入れ替わるのではなく、
ポインタが指しているものが入れ替わるだけだよ。

int a[100], b[100];
int *p = a;
int *q = b;

SWAP(a, b); // コンパイルエラー
SWAP(p, q); // pがbを指し、qがaを指すようになる。a, bの実体は何も変わらない。
0521デフォルトの名無しさん2007/11/27(火) 14:42:13
最大で2000ほどの双方向リストがあるのですが
これを高速にソートするにはどういった方法があるのでしょうか?
頻繁にソートが呼び出されるのでバブルソートでいいものなのかどうなのか判断つきません
0522デフォルトの名無しさん2007/11/27(火) 14:51:15
マージソートとかクイックソートとか

頻繁の程度にもよるし、どの程度の遅さまで許容されるかにもよるし、
実際やってみて遅くなければ別にいいんじゃね?
0523デフォルトの名無しさん2007/11/27(火) 15:04:46
だからって、バブルソートなんか実装したら間抜けだけどな。
0524デフォルトの名無しさん2007/11/27(火) 15:11:55
頻繁にソートする必要があるのなら、常にソート済みの状態にしておくべき。
0525デフォルトの名無しさん2007/11/27(火) 16:36:22
マージソートでいってみようと思います
ありがとうございました
0526デフォルトの名無しさん2007/11/27(火) 18:19:50
普通に STL のソートじゃダメなの?
0527デフォルトの名無しさん2007/11/27(火) 21:00:21
Cなのかもしれないし、C++コンパイラは使えるけどSTLがないのかもしれない。
0528wolf ◆8VH3XAqjlU 2007/11/27(火) 22:09:04
>>521
>>525

**** may be something complicated *****

strategy pattern
http://home.earthlink.net/~huston2/dp/strategy.html
0529デフォルトの名無しさん2007/11/28(水) 00:48:43
mapのキーに構造体を利用してデータを格納しているのですが、
[]を使用した際に想定した動きをしてくれません。
下記がそのソースです。

#include <iostream>
#include <map>
#include <string>

// キー
struct StaffKey {
int section;
std::string code;
};
bool operator <(const StaffKey& lhs, const StaffKey& rhs) {
return lhs.section < rhs.section || lhs.code < rhs.code;
}
// データ
struct StaffData {
std::string name;
};
// キーとデータを紐付ける
typedef std::map<StaffKey, StaffData> StaffMap;

void insert(StaffMap& staffs, int sect, const char* cd, const char* nm) {
StaffKey key = {sect, cd};
StaffData& data = staffs[key];
data.name = nm;
}
05305292007/11/28(水) 00:49:27
int main() {

StaffMap staffs;
insert(staffs, 1, "ab123", "Taro");
insert(staffs, 2, "ab123", "Jiro");
insert(staffs, 1, "ab111", "Hanako");
insert(staffs, 1, "ab133", "Ken");

for (StaffMap::iterator it = staffs.begin(); it != staffs.end(); ++it) {
const StaffKey& key = it->first;
const StaffData& data = it->second;
std::cout << key.section << "," << key.code << ":" << data.name << std::endl;
}
std::cout << std::endl;
for (StaffMap::iterator it = staffs.begin(); it != staffs.end(); ++it) {
const StaffKey& key = it->first;
const StaffData& data = staffs[key];
std::cout << key.section << "," << key.code << ":" << data.name << std::endl;
}
}
05315292007/11/28(水) 00:50:28
----------------
実行結果
----------------
1,ab111:Hanako
1,ab123:Taro
1,ab133:Ken
2,ab123:Jiro

1,ab111:Hanako
1,ab123:Taro
1,ab133:
2,ab123:Jiro

はじめにイテレータを用いて全件のダンプを出力しています。
次に、[]を使ってデータを取得&出力しているのですが、
一部のデータのみ値が取得できない状態に陥っています(ab133:Kenのデータ)
独学で勉強しており他の人に聞くことが出来ないため、どこがおかしいのか全く判りません。
どうか助力をお願いします

長々とすみません。
なお、環境はLinux + GCC4.1.2です。
0532デフォルトの名無しさん2007/11/28(水) 00:53:27
>>531
allocator が無いからじゃないかな?(綴り怪しいけど)
0533デフォルトの名無しさん2007/11/28(水) 00:58:09
>>529
> bool operator <(const StaffKey& lhs, const StaffKey& rhs) {
> return lhs.section < rhs.section || lhs.code < rhs.code;
> }

これが順序付けになってないっぽい。
↓これでいいかな?

if (lhs.section < rhs.section) return true; else if (rhs.section < lhs.section) return false;
return lhs.code < rhs.code;
05345292007/11/28(水) 01:11:31
>>532
mapのテンプレート引数にstd::allocator<StaffKey> を追加してみましたが変わらずでした。
(見よう見まねに意味判らずやってます)

>>533
出来ました!!
||だとショートサーキットが有効になるので大丈夫だろうと思って深く考えていませんでしたが
やはり単純なミスだったんですね。。。

助かりました。どうもありがとうございました
0535デフォルトの名無しさん2007/11/28(水) 01:16:33
そもそも StaffKey::section の比較で両者とも同じだった(順序付けできなかった)場合に、
という仕様とは完全に異なるからな。
05365292007/11/28(水) 01:27:07
右辺値のsectionと左辺値のsectionが等しかった場合の考慮がされていなかった
ってことですよね?
だから正しく順序付けが出来ず、key指定時にデータの特定が出来なかった。
0537デフォルトの名無しさん2007/11/28(水) 02:17:08
a.i.u.e.oとかa->i->u->e->o(以下果てしなく続く)のような
ながーい構造体とかポインタの参照は
コンピュータ内部では一つ一つ計算してたぐり寄せているのでしょうか?
仮にそうだとして10万くらい続いているとしたら
終わりのx->y->z ←こいつのポインタを持っておけば無駄が省けるのでしょうか?
0538デフォルトの名無しさん2007/11/28(水) 02:19:17
省ける
持っておけるなら。
0539デフォルトの名無しさん2007/11/28(水) 02:25:03
>>538
やはりそうでしたか
これでまた一つ疑問が解けました
ありがとうございました
0540デフォルトの名無しさん2007/11/28(水) 04:46:32
a.b.cの形は、オフセット計算だけで、コンパイル時に確定してるから無意味だよ。
a->b->cは間接参照で、実行時に中身を追うから、bに相当するポインタをtmpとして持つ意味があるけど。

もちろんこれはC/C++の話で、
他言語だとCの->に相当する部分で.を使用するから別の話になるし
配列として宣言して、あえて->を使う場合なんかはあてはまらないけどね。
0541デフォルトの名無しさん2007/11/28(水) 09:31:45
一時的に特定のキーボードのキー入力を受け付けなくする方法か関数を教えてください
0542デフォルトの名無しさん2007/11/28(水) 10:02:24
我慢する
0543デフォルトの名無しさん2007/11/28(水) 10:07:21
キーボードクラッシャーにお願いする
天皇陛下万歳
0544デフォルトの名無しさん2007/11/28(水) 10:08:20
キーを外してしまうのは確かに有効だな
0545デフォルトの名無しさん2007/11/28(水) 10:40:10
ああ、おれもPOWERキーとかWINキーとかは外してるな。
0546デフォルトの名無しさん2007/11/28(水) 12:01:54
こんにちは.改行制限で見難くなっていますがどうかお許しください.

シリアルポートの開け方について質問させてください.
環境は…Windows XP SP2,Borland C++ Compiler 5.5,言語はC言語です.
この環境で下のコードをコンパイルしようとするのですが,
C:\borland\bcc55\Include\winuser.h 4804: 宣言が正しく終了していない
C:\borland\bcc55\Include\winuser.h 4811: 型名が必要
という二つのエラーがでて,コンパイルできません.
winuser.hの該当箇所は, typedef struct tagINPUT{…} の部分です.
いろいろいじってみたのですが,どうも見当がつきません.どこがおかしいのでしょうか.
下のコードは,
ttp://www.geocities.jp/terukat/_geo_contents_/win/comm.html
ttp://members.jcom.home.ne.jp/0434383301/vc10.htm
ttp://plaza.harmonix.ne.jp/~ahoshino/vb/CreateFile.htm
を参考にしました.

#include<windows.h>
int main(void){
HANDLE hComm = CreateFile(
"COM1",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);
return 0;
}
0547デフォルトの名無しさん2007/11/28(水) 12:05:11
>>546
bccで他にWinAPIを呼ぶプログラムを書いたことは?
それがあるならそれを参考に見直してみればいい。
そうでないなら、そういうサンプルを探せばいい。
0548デフォルトの名無しさん2007/11/28(水) 12:20:06
>>541
Ctrl + Alt Dlt を無視したいとかそういうアプリではどうにもならない割り込みのあれかな?
■ このスレッドは過去ログ倉庫に格納されています