スレを勃てるまでもな ..
[2ch|▼Menu]
511:デフォルトの名無しさん
07/10/23 00:00:22
>>506は「そんなこと、したことないぞ」と言っている通り、思い込みで書き込んでいるんだよ。

512:デフォルトの名無しさん
07/10/23 00:02:01
vector<string> に何か意味をもたせるとして、所詮 vector 程度なら変数名で十分示せると思う。
vector<string> はオブジェクト指向だよ。

513:デフォルトの名無しさん
07/10/23 00:27:02
>>507
それは実装依存だな。

どーでもいい場所なら乱暴なコーディングをしても構わないし、すべきだろうが、
重くないとか十分に速いとか言ってるようじゃ、C++使う意味がないんじゃないか。

>>509
文字どおりさ。
動けば何でもいい、そういうやりかた。

>>510
何らかの意味があるのだからtypedefすべきだし、
大抵の場合は何か付随したデータがあるわけで、
それと本体のvector<string>を別管理するのは、
不適切だと思う。

>>512
オブジェクト志向と言いながら、
BASICやスクリプト言語のように、型にルーズでどうしようもない代物を作る人を、見てきたわけだが。
彼らは万能ナイフを作ることに喜びを感じているようだが。

514:デフォルトの名無しさん
07/10/23 08:58:30
ふ〜ん。君はそういう事に喜びを感じているんだね。

515:デフォルトの名無しさん
07/10/23 09:02:19
そこでboost::ptr_vector, ptr_list
内部ではvoid*として保持されているためコードサイズ膨張対策にもなる
重いオブジェクトのコンテナならこれで決まり☆

516:デフォルトの名無しさん
07/10/23 10:21:21
>>513 のやり方を推し進めたら、プログラム中に出てくる概念全部を
typedefなりクラス化なりすることになるな
アホとしか思えん

いちいち型を定義してたら型がむやみに大量発生するし、
そのせいでtypedefされた型の元の型がわからなくなって
どういう操作ができるのかいちいち調べる羽目になる

名前の一覧は vector<string> names; で十分
過度の抽象化は毒であると知れ

517:デフォルトの名無しさん
07/10/23 10:44:09
>>516の書き込みをみて
VC++が頭をよぎった。
ふとよぎった。


518:デフォルトの名無しさん
07/10/23 10:50:52
>>513は早すぎる最適化をやっちゃうタイプだな

519:デフォルトの名無しさん
07/10/23 10:51:54
>>516
> 名前の一覧は vector<string> names; で十分

名前だけで単独なんだ・・・どういう場合?

520:デフォルトの名無しさん
07/10/23 15:36:35
スイッチを押すと外部割り込みでInterrupt関数が呼び出されて、スイッチを押した回数を数えて変数countに保存し、
タイマ割り込みで一定時間ごとにTimer関数を呼んで押した回数ごとに行動を変えるプログラムを作りたいです。
グローバル変数を使う以外に二つの関数の間でcount変数の値を渡す方法はありますか?

521:デフォルトの名無しさん
07/10/23 16:04:40
つまり、二つの割り込み関数からそれぞれ設定と参照を行いたいわけだな。

グローバル変数の代わりに、それらの関数をメンバとして持つクラスを作ってそのメンバとしてcountを持てばいい。
勿論、そのクラスの生存期間に注意が必要。

522:520
07/10/23 16:23:07
せっかく回答してくれたのにすみません。
C++ではなくCで行う方法を教えてください。

523:デフォルトの名無しさん
07/10/23 16:37:47
>>520
設定も参照もどちらも割り込みルーチンから行なうのなら、
グローバル変数にしておくのが無難だがなぁ。
グローバル変数にしたくない理由は?

524:デフォルトの名無しさん
07/10/23 16:44:44
メインで変数作ってポインタ渡せば?
グローバルと同じような物だけど

525:520
07/10/23 17:49:50
>>523
やはりグローバル変数がいいですか・・・。
プログラム作ってる途中でよくわからなくなることが多くて個人的にあまり好きじゃないだけです。

526:デフォルトの名無しさん
07/10/23 18:12:44
>>520
gccなら関数内関数で外側のローカル変数を参照出来るはず。
グローバル変数以上に問題のあるコードかもしれんが。

527:デフォルトの名無しさん
07/10/23 19:13:25
>>524
割り込み処理だと渡しようがないと思うんだ。

528:wolf ◆8VH3XAqjlU
07/10/23 21:52:40
>>520
>>525
1.割り込みマスク外した後ならsignal関数では?
2.共通の割り込みハンドラで割り込みを1箇所で受けられるかな?

529:デフォルトの名無しさん
07/10/24 07:25:37
ここで聞いてよいのかわからないのですが・・・
CPadてVistaでも使えるものなんでしょうか?

とりあえず実行すると〜.exeが見つかりません〜てなエラーが出てきます。
これはOSとCPadとの相性が悪いのか、自分が何かミスを犯しているのか、どちらなのでしょう?

530:デフォルトの名無しさん
07/10/24 07:29:32
調べてみたら自己解決できそうなので、自分で調べてみます。

531:デフォルトの名無しさん
07/10/24 07:32:45
解決、スレ消費申し訳ありませんでした。

532:デフォルトの名無しさん
07/10/25 16:20:24
VCでコントロール(仮にオリジナルのペイントソフト)を作成して
それをVB.NETから呼び出して、VBで作成したインターフェース内に埋め込みたいのですが
VCで作ったものをDLLにまとめることくらいしか現在わかっていません。
何に対応(例えば継承させるクラス)させればよいのかなどおおまかに教えていただけないでしょうか?


533:デフォルトの名無しさん
07/10/25 16:23:09
VBのスレで聞いたら?

534:デフォルトの名無しさん
07/10/25 18:26:14
>>532
> 何に対応させればよいのか

> コントロール

自分で書いていて気がつかないとは。

535:デフォルトの名無しさん
07/10/25 19:31:24
ABのどっちが好き?

#include <iostream.h>
void f(unsigned int u){
 printf("%u", u);
}
main(int argc, char **argv){
 unsigned int u = 0;
 if(argc > 1){
A  u = static_cast<unsigned int>(atoi(argv[1]));
B  sscanf(static_cast<const char *>(argv[1]), "%u", &u);
 }
 f(u);
}

536:デフォルトの名無しさん
07/10/25 19:32:55
lexical_cast<>

537:デフォルトの名無しさん
07/10/25 19:55:07
qa3457974

538:デフォルトの名無しさん
07/10/26 01:33:48
>>535
エラー処理してない点は同じなのでどちらも却下。

だ が 敢 え て 言 わ せ て も ら う

if(1 < argc){

だと!

539:デフォルトの名無しさん
07/10/26 06:44:04
>>538
if(argc > 1)
より
if(1 < argc)
の方がいい理由も添えて書いてくれ。

540:デフォルトの名無しさん
07/10/26 11:33:39
いまどきiostream.hって・・・

541:デフォルトの名無しさん
07/10/26 13:57:17
.h

542:デフォルトの名無しさん
07/10/26 14:13:27
bf

543:538
07/10/26 17:15:12
>>539
半分冗談だったんだけどね(^^; 適当に流して欲しかったんだけど。
単に俺のスタイルなだけ。

例えば、『aが1よりおおきくて、かつ10より小さい』という命題について

if(1 < a && a < 10)

と書くと、常に右が大きくなるでしょ。
完全に主観だけど、あとでソースを見返すとき分かりやすいんですよ。
(数学の)実数線も右が大きいし、なんとなくそういうクセをつけました。

それだけ。



544:デフォルトの名無しさん
07/10/26 17:36:45
>>543
俺もそう書く
理由も同じ

545:デフォルトの名無しさん
07/10/26 21:27:52
vectorは「動的配列」という事なのですが、
これは、

void init_vct()
{
   vector< vector<int> > v;
   v.resize(3);
   for(int i=0; i<v.size(); ++i) v[i].resize(5);

   int array[] = { 0, 1, 2, 3, 4};
}

int main()
{
   init_vct();

   return 0;
}


としたときに、init_vct()関数を抜けても、
int型配列 arrayと違って、vector< vector<int> >型配列 vは、
メモリ上から消されないということですか?

//初歩的な質問で申し訳ありません。

546:デフォルトの名無しさん
07/10/26 21:33:34
消えるだろ ふつう

547:デフォルトの名無しさん
07/10/26 21:37:01
>>545
関数中のvはスコープから抜ける時デストラクタが呼ばれ、
確保された領域は開放される。

v.push_back(i)などで、どんどん追加でき、
サイズが動的に拡張されていく配列。

548:デフォルトの名無しさん
07/10/26 21:57:37
>>543
if( x==0xFF ) などと比較したいのに、誤って代入文 if( x=0xFF ) と
書いてしまう凡ミスを防ぐために変数を右に つまりif( 0xFF==x ) と
書くと良い みたいなことがドコカの本で書かれていた記憶がある

549:デフォルトの名無しさん
07/10/26 22:00:36
>>548
ぱっと見て「ヘタだなぁ」と思うコード その6
スレリンク(tech板)l50
ここで今、思いっきりその話になってます。

550:デフォルトの名無しさん
07/10/26 22:33:42
>>543
俺は『aが1よりおおき』いなら、

if(a > 1)

と書くな。『1がa未満』なら逆に書くけど。

俺も一時期>>543と同じ書き方してたけど、
仕事でプログラム書き始めてからは仕様書通りに書く癖が付いた。

551:デフォルトの名無しさん
07/10/26 23:35:50
sscanf()はバッファオーバーフローがあるから
使ってはいけないんじゃなかったっけ?
普通atoi()だろ。

552:デフォルトの名無しさん
07/10/26 23:39:02
どちらでも仕様書どおりだよ。

553:デフォルトの名無しさん
07/10/26 23:50:21
>>545です。
>>546さんありがとうございます。

以下のようなプログラムを書いたのですが、
正しく表示されるのはたまたまメモリに残っているせい?

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

class VEC{
  private:
  public:
    vector< vector<int> > vec;
    VEC(int num);
    VEC(){};
};

VEC::VEC(int num)
{
  vec.resize(3);
  for(int i=0; i<3; ++i) vec[i].resize(5);

  for(int i=0; i<vec.size(); ++i){
    for(int j=0; j<vec[i].size(); ++j){
      vec[i][j] = num+j;
    }
    num+=vec[i].size();
  }
}

554:デフォルトの名無しさん
07/10/26 23:50:58
class A{
  private:
  public:
    A();
    void Show();
    vector<VEC> v;
};

A::A()
{
  int j=0;
  for(int i=0; i<10; ++i){
    v.push_back(VEC(j));
    j+=10;
  }
}

555:デフォルトの名無しさん
07/10/26 23:51:55
void A::Show()
{
  for(int i=0; i<v.size(); ++i){
    for(int j=0; j<(v[i].vec.size()); ++j){
      for(int k=0; k<(v[i].vec[j].size()); ++k){
        cout << v[i].vec[j][k] << " ";
      }
      cout << endl;
    }
    cout << endl;
  }
}


int main()
{
  A aa;
  aa.Show();

  return 0;
}


556:デフォルトの名無しさん
07/10/26 23:52:44
>>553
関数抜けた時点で解放され、別の値に変わる可能性はある
ゴミ箱の中身消したけど復活できるかどうかと同じ事だ

557:デフォルトの名無しさん
07/10/27 00:04:16
>>553-555
別にどこもおかしなようには見えないが、どこに問題があると思ってるの?

558:デフォルトの名無しさん
07/10/27 00:49:51
>>545です。
>>546
>>547
>>556
さんのご指摘もありますが、
newで確保されていないvector配列の中身(vector< vector<int> > vec)が、
最後まで保持されていること・・・
についてです。

vecはクラスの中で宣言はされているものの、
VEC()で代入される中身は局所的なもので、
VEC()を出たらvec配列の中身は、開放されるのかなぁと。

サイトで「vectorは"動的"配列」というのを目にしたのですが、
これは配列のサイズを"動的"に確保するだけで、
newのメモリの"動的"確保とは別物なのではないか?
と思ったので、試しています。

559:デフォルトの名無しさん
07/10/27 00:51:53
>>545です。
かなりトンチンカンなこと言ってると思いますが、
ご指導お願いいたします。m(_ _)m

560:デフォルトの名無しさん
07/10/27 00:57:53
>>559
クラス内の関数は、抜けても値は保持される 常識だろう vectorとか関係なし

561:デフォルトの名無しさん
07/10/27 00:59:15
>>559
基本的なことが、いくつも、理解できていない気配がする。
泥縄的に教えてもしょーがないので、ちゃんとC++の基本を勉強したほうがいいよ、としか言えない。

562:デフォルトの名無しさん
07/10/27 00:59:20
オブジェクト指向っていうのは、データに対してあれこれ作業をするって事だ
あれこれ作業するごとにデータが消えていたら駄目だろ

563:デフォルトの名無しさん
07/10/27 01:00:16
v.push_back(VEC(j));

VEC(j)はどこいっちゃったの?

ってこと?

564:デフォルトの名無しさん
07/10/27 01:20:13
>>545です。
みなさん、レスありがとうございます。

クラスの中でサイズを指定しないと配列の宣言てできませんよね。
もしコンストラクタの引数の値を配列のサイズにしたいときには、
データメンバに、
int a*;
を入れて、
コンストラクタの中で、
a=new int[コンストラクタの引数の値];
と(私は)します。

だから、私はvector配列をクラスのデータメンバとするときも、
配列のサイズを指定しないから、
どこかでnewすることでvector配列の領域を確保しなければ
ダメなのかぁと思ってしまったわけです。
newをせずに、ただ値を代入しただけでは、
局所な値を代入しているに過ぎないなどと思ってしまいました。

色々考えているうちに、頭の中がごちゃごちゃになってしまいました。
己の力の無さを改めて自覚しました。

565:デフォルトの名無しさん
07/10/27 01:31:07
>>564
vectorの中でnew/deleteしてる。

566:デフォルトの名無しさん
07/10/27 01:32:02
コンストラクタとデストラクタで何か表示するクラス作って
vectorにpush_backしてると何か閃くかもしれない

567:デフォルトの名無しさん
07/10/27 01:38:24
クソッタレな本に引っかかってしまった可哀想な犠牲者なんだろうな。
きちんとした本を読んでいれば間違わないような誤解してるんだもの。

568:デフォルトの名無しさん
07/10/27 01:50:13
これからプログラムを勉強する俺に是非教えてほしい。

ちょっとしたアプリケーションを作りたくて
なんとなく、適当に参考書見て、高校の頃少し勉強した、デルファイに似てるような気がしたから
VBの参考書買って、MSからVS2008bata2をダウンロードしてサンプルプログラムを作っては
自分なりに書き換えて違う結果を出力させたりと、少しずつ理解してきてる・・つもり。

けど、VBとC++はどのスレ見てもVBは糞ってよく見るんだけど、それはなぜですか?
自分は結構VBがなじんできてるしこの頃。。
実際、プログラムの組みやすさ、軽さ、ほか色々。
ここで聞くのはどうかと思うけど、できれば教えてほしい

もし、VBはやめとけ!と言うならばお勧めの言語を教えていただきたい。

569:デフォルトの名無しさん
07/10/27 01:54:18
すいません、教えていただけないでしょうか。

C言語で、2つのスレッドが交互にグローバル変数を参照→インクリメントして、
決められた値になったら終了する。という処理を作りました。
ここからグローバル変数を用いずにスレッド間でデータを渡しあうことで同様の処理を
実現したいのですが、どうすればいいでしょうか。

自分で調べたところ、スレッド間ではお互いのメッセージキューへ格納→読み出しを行えば
データを渡せることがわかったのですが、見当違いな考えかもしれません…。
どのような方法・関数を用いればいいか、ご教授のほど宜しくお願いします。

570:デフォルトの名無しさん
07/10/27 01:59:25
OSぐらい書けよ

571:デフォルトの名無しさん
07/10/27 02:02:14
>>570
申し訳ありませんでしたorz
作成環境は以下のとおりです。

OS:Windows XP
コンパイラ:Microsoft Visual C++ 2005 Express Edition

572:デフォルトの名無しさん
07/10/27 02:03:22
VBが糞と言われる理由

1. VB自体ではなく、VB使いが糞であるため
2. VBでプログラミングを勉強すると糞になるため
3. VBが適切な手段の場合には良いが、そうではないのにVBを使う糞がたくさんいるから
4. VB.NETではないVBは既に終わっており、なおかつ、VB.NETをやるならC#をやるべきだから

573:デフォルトの名無しさん
07/10/27 02:05:35
>>569
質問が抽象的すぎる。
もっと具体的に詳しく。

また、なぜ、グローバル変数をやめようと考えているのか、その理由も。

574:デフォルトの名無しさん
07/10/27 02:16:09
  ∧_∧ クワッ!
 ∩`iWi´∩ 
 ヽ |m| .ノ
  |. ̄|
  U⌒U

575:デフォルトの名無しさん
07/10/27 02:17:26
>>574
それ何か可愛いな。

576:デフォルトの名無しさん
07/10/27 02:25:48
>>573
色々と足りない部分が多くて申し訳ありません。
初心者の為、処理が的確ではないかもしれませんが現在の処理は以下のとおりです。

unsigned __stdcall thread0(void *lpx)
{
 /*排他制御にミューテックスを使っています*/
 HANDLE hM;
 hM = *(HANDLE*)lpx;

 while ( 100 > nCnt )
 {
  WaitForSingleObject( hM, INFINITE );
  nCnt++;
  printf("nCnt = %d", nCnt);
  ReleaseMutex( hM );
 }
 printf("thread0 END");
 return 0;
}

これと同様の処理を行うスレッドがもう一つありまして、
交互にグローバル変数nCntをインクリメントして、100になったら終了させるようにします。
このnCntをグローバル変数ではなく、ローカル変数にしてスレッド間で値を渡し合うことで、
同様の処理ができるようにしてみたいのです。

グローバル変数を使わない理由ですが、現在C言語を勉強中で、
様々な処理方法を試してみたいと思ったからです。

577:デフォルトの名無しさん
07/10/27 02:33:47
そのスレッドに渡すlpxでミューテックスと一緒に共有したいデータを渡すとか。

struct thread_data {
HANDLE hM;
int nCnt;
};
unsigned __stdcall thread0(void *lpx)
{
struct thread_data *data = lpx;
 /*排他制御にミューテックスを使っています*/
 HANDLE hM;
 hM = data->hM;

while ( 100 > data->nCnt )
以下略

578:573
07/10/27 03:03:46
>>576
なるほど。文字どおりの処理をしていたのね。ごめん。

まず、そのプログラムには重大な問題がありそう。

それはともかく、
スレッド毎にメッセージ・キューを持たせて、相互にメッセージを送り合う
ということだと、まず、最初の選択として、
Windowsが提供してくれるメッセージ・キューを使うのか、
それ以外のメッセージ・キューを使うのか、
というのがあるが、とりあえず前者の方向で。

Win32APIのPostThreadMessageを使う。
まずは、MSDNライブラリ等でPostThreadMessageの解説を見よう。

579:デフォルトの名無しさん
07/10/27 03:04:25
>>577
ご助言ありがとうございます。
ただ、私が今回試してみたいのはスレッド間通信?というものになりそうなんですが、
このコードがそういった処理になるのでしょうか。
サンプルコードが分かり辛いと思うので、自信がありません…。

580:デフォルトの名無しさん
07/10/27 03:07:12
>>578
ありがとうございます。
エラー処理や組み方自体についても、学ぶべきことが多いですorz

PostThreadMessageについて、早速見てみます。

581:573
07/10/27 03:14:26
ついでに>>576のプログラムの問題点と解決方法を。

まず、コンパイラの最適化の問題。
変数nCntの宣言にvolatileを付けていますか? 付けていなければ、付けること。

次に、100 > nCnt の比較が、排他制御の外にあること。
nCntに触っていいのは、排他制御の内側だけ。


582:デフォルトの名無しさん
07/10/27 03:28:55
>>581
たしかにこれでは…色々と参考になりました。

MSDNライブラリで調べたところ、
PostThreadMessage関数でデータをポストして、
GetMessage関数でポストされたデータを取得することで、
スレッド間でデータをやりとりできそうなので、早速試してみます。

ご助言いただいた方々、本当に有難うございましたm(_ _)m

583:デフォルトの名無しさん
07/10/27 16:47:47
>>545です。
>>554
のA()で、

A::A()
{
  int j=0;
  for(int i=0; i<10; ++i){
    v.push_back(VEC(j));
    j+=10;
  }
}

としているのですが、ここで作られるVEC型オブジェクトは、
局所的なもので、寿命はfor 1回分の間だけですよね?
コンストラクタが呼ばれた直後にデストラクタが呼ばれるので、

vector<VEC*> v;
と宣言を直して、
A()では、
v.push_back(new VEC(j));
としなければダメですか?

何度も申し訳ないです。

584:デフォルトの名無しさん
07/10/27 16:55:04
VEC(j)のコピーがvector内に追加される

585:デフォルトの名無しさん
07/10/27 16:59:02
> コンストラクタが呼ばれた直後にデストラクタが呼ばれるので、
ただし、Aのvector<VEC> v;は、v.push_backの内部で、
引数を使ったコピーコンストラクタを使い、勝手に保持する。

vector<string> v;でv.push_back("ababa");と渡しても、
const char *pを受け取って内部で string(p) のようにして保持する。

> vector<VEC*> v;
> v.push_back(new VEC(j));

のようなことをするのなら、Aのデストラクタで、
push_backの所でnewしたぶんをdeleteしてやる必要がでてくる。



586:デフォルトの名無しさん
07/10/27 16:59:51
かぶったorz

587:デフォルトの名無しさん
07/10/27 18:34:43
>>583
基本ができてなさすぎ。
ちゃんと勉強して出直せ。

588:デフォルトの名無しさん
07/10/27 20:26:59
>>583
いろいろごっちゃになっているようだが、
・関数内で宣言されたオブジェクトは関数が終わったら破棄される
と言われて、
関数が終わったらvectorの中身が壊れるのでは、と疑問を持ったみたいだけど、
この場合は関数へ渡す引数として宣言した「一時オブジェクト」なので問題ない。
そうでなくても、vectorは要素を「コピー」して保持するので、
元のオブジェクトが破棄されても何ら問題はない。

589:588
07/10/27 20:31:56
間違えた、俺がごっちゃになってるorz
書き直すと、

関数内で作ったオブジェクトをvectorに入れたら、
関数を抜けた時にそのオブジェクトが破棄されてvectorの要素が無効になるのでは、と疑問を持ったみたいだけど、
この場合はvectorへ渡す要素として宣言した「一時オブジェクト」なので問題ない。
そうでなくても、vectorは要素を「コピー」して保持するので、
元のオブジェクトが破棄されても何ら問題はない。

590:588
07/10/27 20:34:03
ああ、いや、一時オブジェクトは関係ないか、結局破棄されるんだから

とにかくvectorはコピーコンストラクタ呼び出してコピーしてるので、
元のオブジェクト破棄しても問題ない

591:588
07/10/27 20:42:08



592:デフォルトの名無しさん
07/10/27 20:47:52
ややこしく考え杉。

int g_c ;

void funcA(int& a) {
int b = a ;
g_c = a ;
}

void testA(void) {
int x = 3 ;
funcA(x) ;
}

これと同じよ

593:デフォルトの名無しさん
07/10/27 21:33:41
フフフフフフハハハハハハ

594:デフォルトの名無しさん
07/10/27 23:07:18
int ary[2] = { 1000 , 2000 };
int *po;

po = &ary[0];
printf("po\t = %x\n" , po);
printf("*po++\t = %d\n" , *po);
po++;
printf("po++\t = %x\n" , po);
printf("*po++\t = %d\n" , *po);
*po++;
printf("po++\t = %x\n" , po);
printf("*po++\t = %d\n" , *po);

これで最後の方で*poに1を加えてるつもりなのですが、変な値になって
*po+=1だと大丈夫です

*poはポインタの中身だと今まで思ってたのですが、、、、なんでなのでしょうか

595:デフォルトの名無しさん
07/10/27 23:09:12
(*po)++;

釣りなんだろうけど

596:デフォルトの名無しさん
07/10/27 23:21:37
理由のところ、教えてくれませんか

なんで()つけないとダメなのか。
というか中身にアクセスするときは()つけた方がいいんでしょうか

597:デフォルトの名無しさん
07/10/27 23:28:44
>>596
演算子の優先度

598:デフォルトの名無しさん
07/10/28 04:23:38
*po++ は *(po++) という意味だから、だな

599:デフォルトの名無しさん
07/10/28 04:48:37
俺は演算子の優先度の表を暗記するだけの頭脳がないので、
決して、
*po++ ;
なんてコードは書かない。
他人が書いたのを読まないといけないときは、優先度の表を見て確認する。

そもそも、後ろに++を付けるのは特別なときだけだし・・・。

600:デフォルトの名無しさん
07/10/28 13:39:19
*++p

601:デフォルトの名無しさん
07/10/28 13:40:46
++(*po);

602:デフォルトの名無しさん
07/10/28 20:56:27
>>601
括弧イラネ

603:デフォルトの名無しさん
07/10/28 21:02:43
優先順位覚えてないから付けといて

604:デフォルトの名無しさん
07/10/28 21:33:35
左側に単項演算子二つで優先順位も糞もないだろ

605:デフォルトの名無しさん
07/10/28 21:52:24
むしろ全ての演算子を単項演算子にすれば頭で思い浮かべたものをキャレットを一々前後させずに一気に書ける

606:デフォルトの名無しさん
07/10/28 21:55:25
>>605
それって何て逆ポーランド記法?

607:デフォルトの名無しさん
07/10/28 23:15:58
★改行が多すぎと言われたので、何度かにわけます。

構造体Sのvectorがあって、SのメンバdoubleDataに関してfindをしようとしています。
(#include <algorithm>しています)

struct S{
string strA;
int intData;
double doubleData;
};

findを使っているところは、こんな感じです。
vector<S>::iterator it;
it = find(VecTest.begin(), VecTest.end(), 1.7);
cout << (*it).doubleData << endl;


608:デフォルトの名無しさん
07/10/28 23:16:34
★続き

Boland55で、以下のようなエラーが出ます。

エラー E2094 c:\Borland\Bcc55\include\algorith.cc 72: != 演算子が使われたがクラ
ス S では double 型のための定義が存在しない(関数 find<S *,double>(S *,S *,const
double &) )
警告 W8057 c:\Borland\Bcc55\include\algorith.cc 75: パラメータ 'last' は一度も使
用されない(関数 find<S *,double>(S *,S *,const double &) )
警告 W8057 c:\Borland\Bcc55\include\algorith.cc 75: パラメータ 'value' は一度も
使用されない(関数 find<S *,double>(S *,S *,const double &) )
*** 1 errors in Compile ***


609:デフォルトの名無しさん
07/10/28 23:17:24
★続き

ちなみに、以下のような演算子オーバーロードをしているのですが、
何がよくないのでしょうか。
bool operator == ( const S& left, const S& right )
{
return left.doubleData == right.doubleData;
}

bool operator != ( const S& left, const S& right )
{
return left.doubleData != right.doubleData;
}



610:デフォルトの名無しさん
07/10/28 23:32:46
find には 1.7 じゃなくて S を渡さんといかんのでは?

611:デフォルトの名無しさん
07/10/28 23:34:03
struct has_double
{
bool operator()(const S& s, double d) const
{
return s.doubleData == d;
}
};

find_if(VecTest.begin(), VecTest.end(), has_double(1.7));

612:デフォルトの名無しさん
07/10/28 23:36:44
まちがった

struct has_double
{
double d;

has_double(double d)
:d(d)
{}

bool operator()(const S& s) const
{
return s.doubleData == d;
}
};


613:デフォルトの名無しさん
07/10/28 23:44:17
>> 612さん

コンパイル、通りました!すごい!!
でも全く解読できましぇん。
一語一句の意味をこれから勉強します。。。


614:デフォルトの名無しさん
07/10/28 23:55:56
>>612
テンプレート使って、

template<double value>
struct has_double
{
bool operator()(const S& s) const
{
return s.doubleData == value;
}
};

find_if(VecTest.begin(), VecTest.end(), has_double<1.7>);

ってのではダメ?

615:デフォルトの名無しさん
07/10/29 00:00:45
はは
定数だからね

616:デフォルトの名無しさん
07/10/29 00:13:48
もっと簡潔・明瞭に書く方法ないのかなぁ。


617:デフォルトの名無しさん
07/10/29 09:53:08
C++勉強しはじめてリファレンスを知って、
ポインタ使うよりずっといいじゃないですかって気分なんですが、
関数の引数としてリファレンス使うときに、

void hoge(int* out1, int* out2); //out2の出力が必要ない場合はout2としてNULLを渡す

のような仕様はリファレンスでは実現できないってことなんでしょうか?
毎回ダミー変数宣言して渡すのも馬鹿らしいし。

618:デフォルトの名無しさん
07/10/29 12:44:05
>>617
どうしてもやりたかったらこういう手はどうだろう。
--
int dummyOut;

void hoge(int & out1, int & out2 = dummyOut)
{
if (& out2 != & dummyOut) {
out2 = someOutput;
}
}
--
ダミーは必要だけど、毎回じゃないし使わないときは出力処理を回避することもできる。

619:かぜひいてます←寝てろ
07/10/29 13:39:10
>>617
ダミー変数を渡すのがバカらしいのなら、ポインタ渡しのままでいいのでは?

参照は、結局ポインタ渡ししてるだけだから、組み込み型を渡すときはあまりメリットがない。
しかも、ポインタ渡しでも上手に組めば代入するのは1、2ヶ所だから読みにくくも無い。

俺のスタイルとしては、値を返すときは参照型ではなくポインタ渡し。

参照型が活きるのはクラス等を渡すとき。
void hoge(vector<char>& ref_v);
void hoge(const vector<char>& ref_v);

メンバアクセス演算子( . -> )がオーバーライドされてる場合でも深く考えなくともよい。


620:619
07/10/29 13:44:56
>>618
それも一応考えてみた。他にもオーバロードって手もあるよね。

621:デフォルトの名無しさん
07/10/29 14:30:48
int val = 100;
val = val++;
int result = val;

このとき、result はいくつになりますか?
また、処理系に依存せず、同じ値になりますか?

622:デフォルトの名無しさん
07/10/29 14:44:58
>>621
URLリンク(www.kouno.jp)

623:デフォルトの名無しさん
07/10/29 14:47:49
>>622
おぉ。ファック。
なんてこった。
ありがとう。

624:デフォルトの名無しさん
07/10/29 14:57:30
ファックしてもいい?

625:デフォルトの名無しさん
07/10/30 00:59:37
>>572
超遅レスで申し訳ない。

VB自体は糞というわけではないのか。。

もし、また改めて勉強するとするならば、VisualC++とVisualC#はどちらがお勧めですか?
もちろんどんな物を作るか、目的は何か、ってのが決まっててこそ選ぶのかもしれないけど、
もし、将来性等考えたらどっちになります??


626:デフォルトの名無しさん
07/10/30 01:01:04
VisualC#

627:625
07/10/30 01:06:12
検索したらいっぱい出てきたんでとりあえず色々眺めて決めます。


・・とおもったらレスがついてた。
>626
なぜですか?よかったら教えてほしいです。

628:デフォルトの名無しさん
07/10/30 01:26:32
自動車に例えるなら、

C# → トヨタ自動車本社の設計技術者
C++ → トヨタに部品を収めている協力会社の設計技術者

そういう感じ。

629:デフォルトの名無しさん
07/10/30 01:41:21
…え。

630:デフォルトの名無しさん
07/10/30 06:09:37
C# → Windowsユーザー
C++ → マイクロソフト

631:デフォルトの名無しさん
07/10/30 10:29:36
>>628
確かに C++ の方がスキルが必要だから間違ってないね。

632:デフォルトの名無しさん
07/10/30 10:36:13
.NET Frameworkって「のり」があるからC#, C++, F#とどれも使えるのが一番だね
状況に応じてシームレスに言語を選択できる開発環境ってのはかなり美味しいだろう
さらにPowerShellスクリプトも使えば窓も*nix系に匹敵するかなり強力な環境になると思う

633:デフォルトの名無しさん
07/10/30 12:24:06
んじゃ、
C→町工場の工員
こんなかんじか?

634:デフォルトの名無しさん
07/10/30 13:09:12
C→拡張しすぎてわけがわからなくなった、おじいちゃん技術者


635:デフォルトの名無しさん
07/10/30 15:43:19
質問させてくださいー・・・。

Visualstudio2005のC++でCのソースをコンパイルしているんですけど、
off_t strip_offset, data_offset, curve_offset;
off_t thumb_offset, meta_offset, profile_offset;
の2行で構文エラーって出るんです。

error C2061: 構文エラー : 識別子 'strip_offset'
error C2061: 構文エラー : 識別子 'thumb_offset'

ココだけ見てもわかんねーよって感じでしょうか・・・。
なんとなく原因が雰囲気でも分かれば教えてください。


636:デフォルトの名無しさん
07/10/30 15:47:08
>>635
off_tのtypedefを探して貼れ

637:635
07/10/30 16:11:04
レスありがとうございます。

typedef、存在しないみたいです。
設定しなきゃ駄目ですか?

638:デフォルトの名無しさん
07/10/30 16:14:16
typedefが存在しないわけがなかろう。
off_tは予約語じゃないぞ。

639:デフォルトの名無しさん
07/10/30 16:16:33
それか、struct off_t strip_offsetとして使うべきものかも。

640:635
07/10/30 16:21:06
>638
off_t、ココにしか出てこない上にtypedefってのも無いんです。
元々Linux用(?)に書かれたソースらしいんですけど、そっちではちゃんと動いているみたいなんですけど・・・。
すみません、いまいちよく分かってなくて。とにかくtypedefしなきゃ駄目って事でしょうか。

>639
struct off_t strip_offsetみたいにしてみたんですけど、、エラーが出ちゃいますね・・・。
「error C2079: 'strip_offset' が 未定義の struct 'off_t' で使用しています。」
だそうです。

641:デフォルトの名無しさん
07/10/30 16:26:44
>>640
じゃあそのソースがインクルードしているソースやヘッダを
全部調べてoff_tの定義を調べるべきだな。

642:デフォルトの名無しさん
07/10/30 16:28:04
もしかしたらtypedefではなく#defineかもしれない。

643:635
07/10/30 16:33:32
>614
インクルードされているファイルって言うと#include <winsock2.h>みたいなやつですよね?
全部調べていくのはちょっと自分には難しいかもしれません。

そっちに原因があるということだったら、コンパイラを変えてみると何とかなるかも、ですか?
MinGWとかでコンパイルできるか試してみます!

>642
#defineもありませんでした。>635に書いた2行以外のどこにも出てこないんです。


644:デフォルトの名無しさん
07/10/30 16:34:14
#include <sys/types.h>

645:デフォルトの名無しさん
07/10/30 16:38:35
>>643
off_tでぐぐるぐらいの事はしてみたよな?

646:デフォルトの名無しさん
07/10/30 16:38:56
typedef long off_t;

647:デフォルトの名無しさん
07/10/30 16:40:53
>>635
検索を使ってちゃんと探してみたか?
俺は自分の環境で探してみつかったぞ。
しかも難しい定義でもなんでもなかったぞ。
答えは言わない。自分で環境全部きちんと探して。


648:647
07/10/30 16:45:36
答えでちゃったね。
VS C++のファイル検索使えば全検索でも何分もかからないのに。
いずれ仕事にするならそれぐらいはきちんと覚えておいて。

649:デフォルトの名無しさん
07/10/30 17:01:56
>644
その記述を入れたらoff_tに関してのエラーは出なくなりました!ありがとうございます。

>645
ググって、検索結果のページも色々参照させてもらったんですけど、なにぶんCそのものについての知識がなさ過ぎて・・・。すみません。

>646
その記述を入れてもoff_tに関してのエラーは出なくなりました!ありがとうございます。

>647
ありがとうございます。皆さんに助けていただいてひとつ前に進めました。
まだエラーが出てるんで先は長そうでけど・・・。

650:デフォルトの名無しさん
07/10/30 20:50:14
理解しないで使うには危険な言語だと思うぞ。


651:デフォルトの名無しさん
07/10/31 12:14:47
>>649
「その記述を入れたら出なくなった」じゃなくて、
なんでエラーが解消できたのかを知っておかないと
これから先苦労するぞ。

652:デフォルトの名無しさん
07/10/31 18:09:26
Win32環境+VS2005で開発を行っています。
ダブルクリックでファイルを開く処理に対応させようと頑張っていた所
Debugビルドでは成功したのですが、Releaseビルドにするとファイルを開かなくなりました。
(でもショートカットに開きたいファイル名を指定するとReleaseビルドでもきちんと開く)

そこで処理を追っていくと、どうもInitInstanceメソッドが呼び出されていないようなのですが、似たような経験をされた方はいらっしゃらないでしょうか?


653:デフォルトの名無しさん
07/10/31 18:11:41
スレ違い

654:652
07/10/31 18:27:32
了解しました、他スレに流れてきます。

655:デフォルトの名無しさん
07/10/31 18:59:54
グリッド状に3次元ボクセルが並んでいる座標を格納したファイルがあって
0 0 0
1 0 3
5 20 9
…(順番はメチャクチャ)

URLリンク(up2.viploader.net)

こういう感じに1層だけ取り出して計算処理。
終わったらその上の層だけ取り出して計算処理

ということをしたいのですが

これって

for(slice=0,slice<MAX;slice++){
while(fscanf(fp,"%d%d%d\n",x,y,z)!=EOF){
array[x][y][z]に層を格納
}
格納した層について計算処理
}

という風に、計算したい層を取り出すために、毎回ファイルを読み込むという賢くない処理をしなくてはならんでしょうか
もう少し賢いやり方をしたいのですが、アドバイスいただけませんか。

656:デフォルトの名無しさん
07/10/31 19:28:37
URLリンク(kansai2channeler.hp.infoseek.co.jp)

これに実験結果を入れたいのですが、どこに入れたらいいか分かりません。
教えてください。

657:デフォルトの名無しさん
07/10/31 19:30:04
>>656
コンパイルして、./a.out 実験結果 とでもすればいいだろ。

658:wolf ◆8VH3XAqjlU
07/10/31 21:09:30
>>655
For your Reference.

Managing Memory-Mapped Files in Win32
URLリンク(msdn2.microsoft.com)

Beej's Guide to Unix Interprocess Communication(Ref. Memory Mapped Files)
URLリンク(www.ecst.csuchico.edu)

659:デフォルトの名無しさん
07/10/31 21:47:11
>>658
thanks for your advice

but I don't mention accessing memory
and that code was rough. so I have some mistake



660:デフォルトの名無しさん
07/11/01 01:31:10
「派生クラスのインスタンスを生成する時、newで生成しないと使えない」
と言われたのですが、何でなのかわかりません。

  親クラス* p= new 子クラス;
  p->なんか関数();

これしか方法はないんですか?

661:デフォルトの名無しさん
07/11/01 01:39:13
>>660
そんな事はない

662:デフォルトの名無しさん
07/11/01 05:49:28
>>655
データ量にもよるが・・・

ファイルの読み書きと計算処理を分離し、
データはすべてメモリに読んでしまい、
計算処理はメモリ上にあるデータに対して行う。
いくつもの計算処理を済ませた後に、
メモリからファイルに書きだす。

663:デフォルトの名無しさん
07/11/01 10:38:55
子クラス kokurasu;
親クラス* oyakuasu = &kokurasu;
oyakurasu->NFunction();

664:デフォルトの名無しさん
07/11/01 16:13:54
>>662さん
レスありがとうございます。
小さいデータ量なら3次元配列に読み込んでしまえばいいのですが
量がメモリの容量を越えてしまうくらい大きいので…

2048×2048×2048の大規模なものや、それ以上を想定しています。。。

メモリに乗り切らない→1層ずつ処理→そのためには?
という考えからきています

665:デフォルトの名無しさん
07/11/01 16:34:53
ファイルを何度もスキャンするくらいなら、
物理メモリに乗らないような巨大なサイズでも、
仮想記憶を使ってメモリ上に読んでしまったほうがマシかもよ。



666:デフォルトの名無しさん
07/11/01 17:00:46
>仮想記憶を使ってメモリ上に読んでしまったほうがマシかもよ。
仮想記憶で扱うということはこれまでやったことが無くて。
どこかわかりやすく参考になるところありますか?

667:デフォルトの名無しさん
07/11/01 17:02:15
>>666
Wikipedia項目リンク

668:デフォルトの名無しさん
07/11/01 17:15:27
教えてください。

(Aが1)、かつ(Bが2)以外に処理を実行するっていう場合どう記述したらいいんですか?


if((A==1)&&(B==2)){

}
else{
  処理
}

でいいのかなぁ?



669:デフォルトの名無しさん
07/11/01 17:17:15
ありがとうございます。
だいぶ難しそうな気配がしています。。。


670:デフォルトの名無しさん
07/11/01 17:19:27
if( (A!=1)&&(B!=1) )
処理

でいんでない

671:よろず
07/11/01 17:21:39
募集してるよん♪
bloom@geocities.co.jp

672:デフォルトの名無しさん
07/11/01 17:22:21
if((A!=1)||(B!=2))
{
処理
}

673:デフォルトの名無しさん
07/11/01 17:22:36
よくねぇよ

674:デフォルトの名無しさん
07/11/01 17:23:05
>>668
ド・モルガンの法則でひっくり返せ。

A != 1 || B != 2

675:デフォルトの名無しさん
07/11/01 17:23:24
>>668
if( !(A==1 && B==2) ) {
 処理
}

676:デフォルトの名無しさん
07/11/01 17:23:40
更新してなかtったorz

677:デフォルトの名無しさん
07/11/01 17:23:51
ありがとう || でやってみます

678:デフォルトの名無しさん
07/11/01 17:24:41
>>666
高々GiBオーダだろ。普通にmalloc()したらOSが勝手に確保してくれて、使うときに勝手にスワップアウトしてくれるよ。
OSがタコじゃなきゃ。

679:デフォルトの名無しさん
07/11/01 17:26:13
WindowsXPはタコですか?

680:デフォルトの名無しさん
07/11/01 17:26:41
>>677
果たして、>670で「(Aが1)、かつ(Bが2)以外」と読めるか?
if (!(A == 1 && b == 2)) {
処理
}
の方が読みやすいかも知れんぞ。
# ド・モルガンの定理を知らん香具師がメンテナンスするかもしれないんだし。

681:デフォルトの名無しさん
07/11/01 17:28:59
「(Aが1以外)且つ(Bが1以外)」と読める

682:デフォルトの名無しさん
07/11/01 17:29:48
どっちも同じようにしか見えない俺は眼が腐ってる

683:デフォルトの名無しさん
07/11/01 17:30:11
だね

684:デフォルトの名無しさん
07/11/01 17:49:50
「(Aが1以外)且つ(Bが1以外)」じゃないの?

685:デフォルトの名無しさん
07/11/01 17:52:10
if( !(A==1 && B==2) ) {
処理
}

こういう記述もできるんですね

みなさんありがとう 勉強になりました

686:デフォルトの名無しさん
07/11/01 18:25:35
>>680
読みやすさとかより
!(A == 1 && b == 2)) と (A!=1)&&(B!=1) は別物なんだが。

687:デフォルトの名無しさん
07/11/01 18:30:38
そりゃそーだ
Bの値が違う

688:デフォルトの名無しさん
07/11/01 18:47:54
>>678
ためしにmallocで 1024 1024 1024 を確保して解放しただけで仮想メモリの警告が出ましたが
確保をしているような感じでした。
ただ、合計4GBくらいになるはずのものが2.5GBで解放されたのが気になりますが。。。


もう少し別のやり方調べてみます。。。

689:デフォルトの名無しさん
07/11/01 19:12:47
>>688
Windowsの32ビットアプリケーションは、
3GiBオプションを付けない限り、ユーザアドレス空間2GiBしかないよ。
その2GiBをプログラム本体や、WindowsのDLL、スタックを差し引いた残りが、
およそmallocほか動的メモリ確保で使用できる領域になる。

それ以上使いたければ、64ビット化するか、2GiB未満に小分けして処理する必要がある。
いずれにせよ、同じ仮想記憶を使うのでも、
単純にmallocでメモリを確保するよりは、メモリマップドファイルにしたほうがいいと思う。

690:デフォルトの名無しさん
07/11/01 20:02:10
>>687
それだけ?

691:デフォルトの名無しさん
07/11/01 20:34:15
うぜ

692:デフォルトの名無しさん
07/11/01 22:00:13
>>689
動的メモリになると2GBの壁がでるのですね…

それだと必然的に1024^3はムリになるので、目的のは出来ないかもしれません
ファイルにランダムアクセスできればいいのですが…
それかファイルをソートする方がはやいのかも

693:デフォルトの名無しさん
07/11/01 22:05:34
>>692
ランダムアクセスはできるよ
テープじゃないんでしょ

694:デフォルトの名無しさん
07/11/01 22:07:58
テープですよ
ランダムアクセスはできるけど

695:デフォルトの名無しさん
07/11/01 22:17:07
>>692
流れをあんまり理解してないけど、
ファイルにランダムアクセスってfseekとかその手の話?

696:デフォルトの名無しさん
07/11/01 22:19:59
まさか数GBのファイルを全部メモリに読むつもりとか

697:デフォルトの名無しさん
07/11/01 22:20:04
そのファイルはテキスト?

698:デフォルトの名無しさん
07/11/01 22:21:37
層毎に読み込むのがいいよ

699:デフォルトの名無しさん
07/11/01 23:21:22
>>655のことです
層ごとに読み込みたくて。

15GBくらいのデータを縦軸・横軸の層で読み込んで計算したくて伺っていました。
テキスト形式のデータで要素数にして数億個のデータです。


700:デフォルトの名無しさん
07/11/01 23:39:36
なんで一度に読み込みたいのかがわからん。
ある層の計算をするときは、他の層がどうなってるかは知らなくていいんじゃないの?

逐次的に計算できるなら、何億個、何兆個データがあっても関係ないでしょ?

701:デフォルトの名無しさん
07/11/01 23:40:03
層順にソートしておくとか

702:デフォルトの名無しさん
07/11/01 23:44:40
何層あるのか知らないけど、元ファイルを順次読み込み、層ごとのファイルに分ける。
slice001.txt, slice002.txt, ... みたいに。
で、それぞれのファイル毎に層毎の計算をする。

で、ダメ?

703:デフォルトの名無しさん
07/11/01 23:45:52
>>700
一度に読み込まないための方法を探してるんです。

>>701
それは考えました。
縦方向に層を作るのであればZだけでソートしたファイルを読み込み処理ですむのですが
横方向に層も必要で
最悪2つの15GBのデータを作らないといけなくなりそうです。



704:デフォルトの名無しさん
07/11/01 23:47:23
あー、2k*2k*2k程度を想定してるのか。
層ごとに分けてしまえば次元が一つ減るから、オンメモリでいけるでしょ。

705:デフォルトの名無しさん
07/11/01 23:48:41
めんどくせーから、64bitOSにしちゃえよ


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

4716日前に更新/260 KB
担当:undef