C/C++小心者スレッドP ..
[2ch|▼Menu]
666:デフォルトの名無しさん
09/12/13 21:19:00
>>663
この辺があやしい

if (cuetarget=NULL){ 



667:663
09/12/13 21:27:17
解決しました。ありがとうございます。我ながら何をやっているのか…。

668:デフォルトの名無しさん
09/12/14 20:10:06
定数を左辺値にしないから・・・・・

669:デフォルトの名無しさん
09/12/14 20:27:02
いまどきのコンパイルなら警告出るだろ

670:デフォルトの名無しさん
09/12/14 22:50:01
脳内警告が常に出ます

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

672:デフォルトの名無しさん
09/12/15 10:30:07
>>671
右の間違いだろ

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

674:デフォルトの名無しさん
09/12/15 11:21:39
なんだ嫌なのか。

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

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

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

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

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

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

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

679:デフォルトの名無しさん
09/12/15 12:21:59
ハーブサッターの言葉?

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

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

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

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

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

684:デフォルトの名無しさん
09/12/15 15:17:15
小心者はどこへいった・・・

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

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

687:デフォルトの名無しさん
09/12/15 23:37:27
\(^o^)/オワタ

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

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

690:デフォルトの名無しさん
09/12/16 14:09:20
タイプミスばっかでげんなり

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

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

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

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

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

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

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

698:デフォルトの名無しさん
09/12/17 08:04:46
何でC/C++スレで2038年問題を?

699:デフォルトの名無しさん
09/12/17 11:32:43
「C/C++スレ」ではなく「小心者スレ」だから

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

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

701:541
09/12/17 17:41:27
>>541で質問した者です。

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

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

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

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

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

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

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

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

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

707:デフォルトの名無しさん
09/12/18 11:38:27
失礼、挿入整列法でした。

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

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

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

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

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


713:デフォルトの名無しさん
09/12/19 08:32:55
>>712
URLリンク(msdn.microsoft.com)

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

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

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


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

717:デフォルトの名無しさん
09/12/20 16:18:46
>>716 URLリンク(www.kouno.jp)

718:デフォルトの名無しさん
09/12/20 17:25:17
>>717
ありがとうございます
0のところだけ別に入れます

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


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

720:デフォルトの名無しさん
09/12/20 20:04:57
定数は左に、インド人は右に。

721:デフォルトの名無しさん
09/12/20 20:44:05
なつかしいなおいw

722:デフォルトの名無しさん
09/12/20 21:42:41
インド人は右ってどういう意味?


723:デフォルトの名無しさん
09/12/20 21:51:22
ハンドルは右

724:デフォルトの名無しさん
09/12/20 21:54:28
そういう意味か!!!

725:デフォルトの名無しさん
09/12/20 22:49:34
>>724 「インド人を右に」でぐぐれ

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

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

728:デフォルトの名無しさん
09/12/21 22:37:27
VS2010β2のC++を使ってみました。

UInt32 aa;
aa = 0x12;

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

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

729:デフォルトの名無しさん
09/12/21 23:35:48
>>728
CLIの質問は大胆すぎるので別スレでどうぞ


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

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

731:728
09/12/22 01:08:58
>>730
すいません、他のサブルーチンがひっかけてました。
ありがとうございました。

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

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

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

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

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

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

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

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

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

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

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

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

738:デフォルトの名無しさん
09/12/28 16:24:50
マルチスレッド

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

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

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

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

742:デフォルトの名無しさん
09/12/28 17:15:41
マルチプロセスとマルチスレッドは一般的には別物だぜ

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

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

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

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



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

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

748:デフォルトの名無しさん
10/01/05 01:18:43
>>745
>>746
>>747

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

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

750:デフォルトの名無しさん
10/01/07 14:17:20
const Hoge*
const Hoge&
Hoge const*
Hoge const&

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

751:デフォルトの名無しさん
10/01/07 16:17:41
実例だったら自分で組んでみれば分かるだろ。

752:デフォルトの名無しさん
10/01/07 17:02:22
俺も
const&
の2つがよくわからん。

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

754:753
10/01/07 17:19:46
ごめん
何かわけのわからんことを言った
参照はもともと変更不可だから Hoge& const のようなものは無かった
Hoge* const はある

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

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

757:デフォルトの名無しさん
10/01/07 22:21:38
適切に使えば

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

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

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

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

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

761:デフォルトの名無しさん
10/01/08 09:42:09
int a = 10, b = 20;
int &r = a;
std::cout << &a << ' ' << &b << std::endl;
std::cout << r << ' ' << &r << std::endl;
r = b;
std::cout << r << ' ' << &r << std::endl;

実行結果:

0x22cce4 0x22cce0
10 0x22cce4
20 0x22cce4

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

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

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

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

763:デフォルトの名無しさん
10/01/08 09:56:55
x[0]が未初期化

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

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

765:デフォルトの名無しさん
10/01/08 13:29:43
staticイニシャライザじゃダメなの?

766:765
10/01/08 13:30:28
ごめんJavaと勘違いしてました

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

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

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

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

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

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

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

770:デフォルトの名無しさん
10/01/15 17:10:45
そういう命名がふさわしい場合が滅多に無いから

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

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

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

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

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

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

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

776:デフォルトの名無しさん
10/01/15 22:33:15
意味は異なるが関連のある変数?
なら構造体にするとか

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

p[-4] = 0;

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

779:デフォルトの名無しさん
10/01/17 00:43:20
けどすごい紛らわしい書き方だな…

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

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

781:デフォルトの名無しさん
10/01/17 18:13:26
一連の流れでmalloc/freeを連想した

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

783:デフォルトの名無しさん
10/01/17 20:17:49
そんな書き方、文法が許しても俺が許さん

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


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

786:デフォルトの名無しさん
10/01/18 09:40:05
なれねーよw

787:デフォルトの名無しさん
10/01/18 21:22:34
マジックナンバーならまだ一目でわかるが

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

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

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

789:デフォルトの名無しさん
10/01/19 21:05:01
たかが76000個くらい気にしない、というのも一つの解決方法

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


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

792:デフォルトの名無しさん
10/01/19 23:57:49
それは本当に配列でなければいけないの?

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

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

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

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


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

797:デフォルトの名無しさん
10/01/27 18:44:46
>>796
ソースがあれば、いただけると幸いです。

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

本当に困ってます

799:デフォルトの名無しさん
10/01/29 17:43:15
留年したまえ

800:デフォルトの名無しさん
10/01/29 17:53:41
>落ちていませんでした

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

801:デフォルトの名無しさん
10/01/29 20:13:46
>>800
なんでだよw

802:デフォルトの名無しさん
10/01/29 20:25:14
>>801
なんでだよじゃねえだろ。失礼甚だしい

803:801
10/01/29 22:04:27
>>802
まあ・・・確かに落ちているという表現はあまり良くなかったかもしれんな。

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


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

805:デフォルトの名無しさん
10/01/30 00:01:15
>>804
いや別人だから失敬な。


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


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

807:805
10/01/30 16:26:09
>>806
このスレには低能力者しかいないから
別のスレ(スレリンク(tech板)とか)
に行ってみたらどうでしょうか?

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

808:805
10/01/30 18:03:11
>>806
言い忘れたが、常識で考えてくれ。
このままだとマルチポストになるぞ。

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


809:デフォルトの名無しさん
10/01/30 18:25:36
すいませんでした。別スレ行きます

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

811:保守
10/02/06 11:57:12
URLリンク(exlight.net)
C++の初期化指定は複雑
C++の初期化は恐ろしく複雑になってて,

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

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


812:デフォルトの名無しさん
10/02/06 13:12:32
複雑というより落とし穴だらけ、という感じだな

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

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

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

815:デフォルトの名無しさん
10/02/06 17:49:22
テンプレートの部分特殊化のルールは複雑だと思う

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

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

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

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

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

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

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

821:デフォルトの名無しさん
10/02/10 05:43:20
>>819 boost::array<double, 3>

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

823:デフォルトの名無しさん
10/02/10 07:26:33
boost::arrayがせいかいじゃね?

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

825:デフォルトの名無しさん
10/02/10 11:09:45
>>821
そんなのがあったのですね。トンクス

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

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

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

828:デフォルトの名無しさん
10/02/18 15:12:40
デバッグビルドにするとか

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

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

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

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

↓↓C++にて↓↓
今までは
#define max_num 100
としていたところをヘッダに
const int max_num = 100;
と書けばよい。
URLリンク(www7b.biglobe.ne.jp)


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

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

835:デフォルトの名無しさん
10/02/26 00:36:35
2つ質問させていただきます

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

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

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

int main()
{
test(5);
}

を実行すると、

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

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


836:デフォルトの名無しさん
10/02/26 02:03:41
>>835
(1) URLリンク(www.kouno.jp)
(2) URLリンク(www.kouno.jp)

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

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

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

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

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

840:デフォルトの名無しさん
10/02/26 04:12:29
>>839
コンパイラが違う

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

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

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

843:デフォルトの名無しさん
10/02/26 04:41:14
C99制定前からのGCC独自拡張です

844:デフォルトの名無しさん
10/02/27 14:16:59
質問です。
URLリンク(bal4u.dip.jp)
ここの「数字変換 10進数を2進数に変換 dec2bin」を、
10進数から3進数へ変換するようにしたいのですが、うまくいきません。
どのようにしたらよいでしょうか。

845:デフォルトの名無しさん
10/02/27 14:43:18
>>844
どうしたらうまくいかなかったを書かないとなんともいえない。


846:デフォルトの名無しさん
10/02/27 15:32:41
親クラス -(継承)-> 子クラス -(継承)-> 孫クラス

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

(親クラス型)孫クラス

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

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

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

}while(non_zero);

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

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

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

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

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

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


851:846
10/02/28 15:24:38
>>848
すみません、何か勘違いしていたようです。
問題なく動きました。
失礼しました。

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

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


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

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

MFCの用語はスレチな気がする。
スレリンク(tech板)
こことかか?

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

856:デフォルトの名無しさん
10/03/07 21:01:36
>>854
> C/C++にそんな型は存在しません。

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

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


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


858:デフォルトの名無しさん
10/03/07 21:40:13
コード見たほうが早いなたぶん

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

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

861:デフォルトの名無しさん
10/03/08 12:43:22
>>860
エイリアシングルールというものがあってだな。
URLリンク(www.radiumsoftware.com)

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

863:デフォルトの名無しさん
10/03/12 22:33:09
unionつかったらエンディアンの問題はどうするの?

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

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

866:864
10/03/13 01:38:25
>>865
ありがとうございます。
アセンブラは読めませんが、がんばって解読してみます。

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

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

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

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



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

4744日前に更新/246 KB
担当:undef