投稿者
 メール
  題名
  内容 HTMLタグ
    
  画像
 URL
[ ケータイで使う ] [ BBSティッカー ] [ 書込み通知 ] [ teacup.コミュニティ ]

[PR] 求人関西 アクトタウン 愛知の求人・転職  
teacup. ] [ 掲示板 ] [ 有料掲示板 ] [ みんなの掲示板 ] [ ブログ ] [ チャット ]

全100件の内、新着の記事から30件ずつ表示します。 1  2  3  4  |  《前のページ |  次のページ》 

今頃になって思った

 投稿者:猫ノ宮  投稿日:2009年 7月 3日(金)00時43分32秒
  あのイケメンが「スシの暗黒卿」だったんですにゃ!
ソースを使うのにゃ、ルーク!
 

カトリたん

 投稿者:ささき  投稿日:2009年 6月10日(水)14時52分22秒
  >ばくさん
感想ありがとうございます(^^)。気楽にさらさらっと描いてみたカトリですが、かわいく仕上がりました。
アベルはねぇ…あれ以上デフォルメしてしまうと、ほとんどウナギイヌ状態になってしまう問題が(笑
 

香取

 投稿者:ばく  投稿日:2009年 6月 8日(月)19時18分7秒
  わーい,カトリだカトリ(^▽^
アベルはなんかこう…
もっと胴長短足なような気がします(爆

http://baku.sakura.ne.jp/

 

絵掲今昔

 投稿者:ささき  投稿日:2009年 6月 1日(月)11時12分7秒
  某所お絵かき掲示板について、getpic による投稿すなわちアプレット直描きで投稿された作品が幾つあるのか、cgi のログファイルを眺めてみた。100 投稿あたりだから、おおむねそのままパーセントと読んで良い。

1000 番台 26
1100 番台 45
1200 番台 49
1300 番台 54
1400 番台 46
1500 番台 51
1600 番台 35
1700 番台 25
1800 番台 29
1900 番台 36
2000 番台 28
2100 番台 18
2200 番台 12
2300 番台 20
2400 番台 6
2500 番台 6
2600 番台 7
2700 番台 15
2800 番台 7
2900 番台 3

思っていた通り、激減しているなぁ。2900 番台はまだ半分強だから、6〜7 投稿が落としどころか。はじめて 10% を切った 2400 番台は 2006/9〜2007/2 の頃。2700 番台で一時的に上がっているのは…あぁ、すいすいさんが昼休み1作計画に挑戦していた影響だわ。

8年以上も絵掲が続いていること自体が奇跡みたいなものだし、それは素晴らしい作品を投稿してくださる絵描きさんと、素敵なコメントを付けてくださる閲覧者の皆さんあってのこと。これ以上の管理者冥利は無い。現状に文句を付けるつもりは全く無い。

でも、1000 番未満の絵掲ログを見ると、それこそ上手い絵・ヘタな絵・シロウトの絵・玄人の絵、困った絵にネタ絵に意味不明な絵が仲良く並んでいた時代を懐かしく思ってしまうのだ。それはおそらく、過ぎ去った日々に対する郷愁が生み出す幻影に過ぎないのだろうけど。
 

おつかれぎみ

 投稿者:ささき  投稿日:2009年 4月30日(木)16時54分16秒
  >猫の宮さん
整数みたいな単純型をオブジェクトと別枠扱いにするか、それとも整数もあくまでオブジェクトと扱うか、そのへんは言語体系によって違うとこですにゃー。

>zzさん
.asm ファイルをアセンブルすると .obj ファイルが出来るから当然なのにゃー。
 

こんらんしてみる

 投稿者:uta  投稿日:2009年 4月20日(月)18時45分33秒
  アセンブラだと、マクロの定義がクラスで、展開されたコードがオブジェクト?  

中身が同じ

 投稿者:猫ノ宮  投稿日:2009年 4月19日(日)20時18分45秒
  同じ回路をたくさん並べることは良くある話で、極端に言えばメモリなんか1bitの記憶回路が容量の分だけずらりと並ぶわけですにゃー。
そう言う場合、verilogではモジュールとインスタンスという形で対応しますにゃ。

module neko(A, B, C, clk);
input A;
input B[7:0];
output C;
input clk;
(以下、回路記述続く)
endmodule

としてモジュールの内部回路の定義を書いておいて、下のようにインスタンスを並べますにゃー。

neko tama(.A(a), .B(ba), .C(C[0]), .clk(clk));
neko siro(.A(a), .B(bb), .C(C[1]), .clk(clk));
neko momo(.A(a), .B(bc), .C(C[2]), .clk(clk));
neko mie(.A(a), .B(bd), .C(C[3]), .clk(clk));

tama, siro, momo, mieというインスタンス名を持つ、中身が同じで入力ポートBに違う信号が入る回路が4つ合成されますにゃ。Cは出力のつもりで4bitがそれぞれのインスタンスから1bitずつ出てくる感じにゃ。

まあ実際にはこんな無秩序なインスタンス名にすることはありませんけどにゃー。Cの桁に合わせてneko0, neko1みたいに番号振るとかにゃ。


てゆーか、Visual Studio 2008 ヤダー! にゃ。
 

イデア論とか、そっちの方には行かない

 投稿者:ささき  投稿日:2009年 4月19日(日)07時10分57秒
  >猫の宮さん
ビットフィールド型ならC言語にもありますにゃ。滅多に使わないけど。

ハードウェアにおける「構造体」や「オブジェクト」の考えは、デバイスに
なるんじゃないですかにゃ。たとえば UART オブジェクトには command, status,
rxdata, txdata というメンバ(レジスタ)があって、UART が複数乗った基盤とか
SoC はつまり UART 構造体の配列なんですにゃ。

struct uart {
  unsigned char config;
  unsigned char status;
  unsigned char rxdata;
  unsigned char txdata;
};

struct uart uart_channels[2];

ここで config にデータが書き込まれれば UART が初期化されたりモードが
変わったり割り込みがクリアされたり、txdata にデータが書き込まれれば
シリアライザーのシーケンサが初期化されてシリアル送信が開始されると
同時に status の TxBusy ビットが立ち、シリアル送信が終了すると TxBusy が
落ちたりすることになるのにゃ。

この「一連の挙動」じたいはデバイスが同じである限り 1ch でも 2ch でも
変わらないのにゃ。だからソフトウェアではこれを処理するのにサブルーチンや
ポインタを使うのですにゃ。

こういう回路を HDL でどう記述するのか分かりませんが、回路に落ちた段階で
物理的に2つの回路が存在するわけですから、ソフトウェアの場合と等価では
ありませんにゃ。しかし、「どうせ回路に落ちたら同じだから」と、ソースごと
丸コピーして「uart1_xxxx」「uart2_xxxx」などラベルを全置換して、「中身が
全く同じで名前だけ違う」HDL を組むわけはないですにゃ?


ちなみに、UART と言っても昔なつかしい 8251 とか 6850 とか Z80SIO とか
Z8450 とか NS8250 とか、中身はいろいろありますが、「やること」はみんな
基本的に同じですにゃ。しかし、「おなじこと」をやるにも「やりかた」が
違うので、たとえば UART と連動する DMA があったとき、何かの都合で UART
デバイスが差し変えられたら、DMA 側の回路にも変更を加えなければならない
かも知れませんにゃ?これがソフト屋のいう API 互換性問題ですにゃー。

特に PC-9801 の SIO まわりみたいに、8251 単体で足りない機能の一部を外部
回路で補っていたりする場合(たしか 98 の場合は CTS 状態をプリンタポートの
空きビットで読むようになっていたはず)、移植性や互換性は著しく低くなる
ことになりますにゃー。これが所謂「プログラマーに暗黙の約束を強要する」
「きたないプログラム」ということになりますにゃ。

なかには NS16450 と NS16550 みたいに、機能拡張されていながらも見掛け上の
互換性を保っているデバイスもありますにゃ。これは C++ で言うところの継承に
近いものですにゃ。「やること」が同じであれば「やりかた」も合わせてしま
おう、という考えですにゃ。これが進んでゆくと純粋仮想クラスみたいに、
インターフェースだけ決まっていて、機能の中身はカラッポというものが出て
きたりしますにゃ。


>zzさん
クラスとインスタンスの考えは、冠詞のない言語である日本語ではなかなか伝え
にくい概念ですにゃ。

これが英語であれば、例えば名詞「Pen」は「ペンという概念」を現した単語で
あり、現在過去未来に存在する、存在した、存在するかもしれない世界中全ての、
「ペンという概念に当てはまるもの」を意味します。つまり、冠詞のない名詞
は「クラス」です。その「ペンという概念に当てはまる無数の候補」の中から、
どれか一つに絞り込むために冠詞をつけます。するとペンはインスタンスを持ち、
「概念としてのペン(クラス)」から「実体としてのペン(オブジェクト)」になり
ます。

不定冠詞を付けた「A Pen」になると、これは「現在過去未来に存在する、存在
した、存在するかもしれない、ペンという概念に当てはまるモノのうち、どれか
一つのモノ」を意味することになります。つまり「ペンというクラスのインス
タンス」を指しますが、しかしその指している実態はどれでも良いという意味で
あり、ある意味ポインタのようなものです。「I need a PEN!」と言う場合、
ペンであれば誰のペンでも、どんなペンでも良いわけです。プログラムでいえば

draw(pen_t* a_pen)
{
  a_pen->Draw("ABC");
}

みたいな感じです。この場合、a_pen が pen_t という基底クラスから派生した
オブジェクトであり、Draw() というメソッドを持ってさえいれば何でも動作
します。黒のボールペンを渡せば黒くて細い ABC が描かれ、油性の赤ペンを
渡せば赤くて太い ABC が描かれます。

定冠詞を付けた「The Pen」になると、これはもう名指しでオブジェクトを指して
います。その会話の前後で言及され、会話者の両者が共通知識としてその存在を
認識している「あのペン」です。「I need the PEN!」と言う場合、彼が求めている
のは現在過去未来を通して、世界中に1本しか無い、特定の1つの「あのペン」
なのです。プログラムでいえば

draw()
{
  extern pen_t the_pen;
  the_pen.Draw("ABC");
}

ですな。

という感じで、むしろ英語の「名詞と名詞句」「定冠詞と不定冠詞」による
文意ニュアンスの違いを説明するのに、オブジェクト指向の考え方が(相手が
それを理解している限り)便利だったりします。にゃー。
 

いんすたんとなくらす

 投稿者:kazz  投稿日:2009年 4月17日(金)15時14分26秒
  なんか、昔に・・・カメラというクラスを定義して、部屋の数カ所にカメラAとかカメラBとかってインスタンスを・・・ぐちゃぐちゃ習った気がする。
で、そういうヤツの最後に電子レンジだか恒温槽の制御ソフトを組んだような・・・。
コーディングというよりも、モデリングだったけど。
 

HWとか

 投稿者:猫ノ宮  投稿日:2009年 4月15日(水)20時33分30秒
  ハード寄りのverilogだと、メモリの特定アドレスに記録されてるデータを読み出して、ビットの意味ごとに
特定のレジスタに格納する、て回路はこんな記述になりますにゃー。
ポインタに相当するaddで指定されたアドレスから読んできたデータで、いくつかの情報がセットで出てくる
ので、構造体ぽいものではありますにゃー。

input clk;
input [15:0] add;                    // メモリのアドレス線16bit

reg [31:0] mem [0:65535];        // 32ビットレジスタ配列64kワード(メモリ)
wire [31:0] memout;             // メモリの出力(の配線)

reg flag1, flag2;            // なんかのフラグ1bit×2
reg [6:0] dx, dy;            // 移動方向7bit×2(符号付きかどうかはその後の回路次第)
reg [7:0] xx, yy              // 現在位置8bit×2

assign memout = mem[add];         //アドレスaddのワードの情報をtmpに代入

always @(posedge clk)
begin
    flag1 <= memout[31];   // 32ビットのMSBをフラグ1に代入
    flag2 <= memout[30];   // MSBのいっこ下をフラグ2に代入
    dx <= memout[29:23];  // bit23から29の7bitをdxレジスタに代入
    dy <= memout[22:16];
    xx <= memout[15:8];
    yy <= memout[7:0];
end

ここでalwaysのbiginからendまでに書かれた6つのレジスタの代入式は、クロックclkの立ち上がりのタイミングで同時に
行われますにゃ。書いてある順番は関係なしにゃ。
assignの代入は非同期で、単に配線してるだけなのでクロック関係なしにゃ。

サブルーチンてゆーか関数に相当するのはverilonではモジュールで、返り値が無い代わりに引数のところに(上では書いてないけど)入力、出力、双方向のポートを必要に応じて宣言することになりますにゃ。
これも複数のモジュールがあれば全部同時に動いてて、関数みたいにCPUが順番に処理してくわけじゃないのにゃー。
 

あせんぶら

 投稿者:ささき  投稿日:2009年 4月15日(水)16時55分25秒
  >ウタさん
>某chに貼りたいぐらい。(笑
晒しは嫌アアアァァァッ!!(;TДT)

>構造体
構造体でプロトコルメッセージ定義すると、最適化によってアラインされたりして泣きを見たり、キャストした先が 4 の整数倍じゃなくってアドレスエラーで泣いたりします。

>DDT とか SID
Z育ちの坊やが DDT を使うと、MVI とか LHLD とかのインストラクションコードを見てパニックに陥ります。「M ってなんだ、M なんてレジスタがあったのか!」とか。
あぁ、でもオイラも intel ニモニックなんか忘れたな。
8086 の糞アセンブラの文法もだいぶ忘れた。
mov es, seg[label] とか書くんだっけ?
segment 宣言とか assume 宣言とかも綺麗さっぱり忘れたわい。
有難いことじゃ。これが老人力というものか!

>最近やりたいことが
こちらは何もかもやる気が出ません。毎日全身クタクタでよろよろ歩いてます。そろそろ死ぬかもしれません。

>ぱくん
>クラス
構造体わかってない人にクラス説明してもパニクるだけなので、それは後のお楽しみなのです。

>ポインタ
猫の宮さんはIC屋さんがバックグラウンドなので、HWまわりの動作に置き換えて説明したほうが分かりやすいかと。でもアルゴリズムをロジック化するときは、ポインタもサブルーチンも関係ありませんね。
 

くぎり

 投稿者:uta  投稿日:2009年 4月15日(水)13時51分45秒
  アドレスで区切るのは、コボちゃんじゃなくて、大昔のデバッガの影響だと思いますよ。
コードだって、あちこちをORGで切るし。
最初に触ったデバッガはシンボル使えなかったから、いつもMAPファイルと印刷したアセンブルリストが必須だったし。
途中で(DDTからSIDみたいに)シンボリックデバッガになったけど、それでもRAMは見やすい方が楽だし、設計時にはメモリマップを先に作るしね。

ちなみに、件のデータフォーマットにはあちこちにパディングと称して0x40がたくさん埋め込んでありました。(コボちゃん?)
 

こーぞーたい

 投稿者:P-kun  投稿日:2009年 4月15日(水)01時46分49秒
  memset(&structShindeshimahe,0x00,sizeof(structShindeshimahe))
で初期化できるから便利!
関数の引数が長くならんので便利!

くれーしかつかわねー
だめだこりゃ・・・

ちなみに構造体の先にはクラスが待っています、うふ。

>ポインタ
シロートの子には、本の付箋みたいなもんだと説明してます。
メモリの内容が本の文章、ページがアドレス、んで付箋がポインタと。
みんないちおー納得してくれますはい。

>utaさん
>16バイトの整数倍とか256バイト単位とか
Co、Cobolのにおひがする!!
Cobolerはキリが悪いと構造体にダミー変数入れるんだぞ!
ギャーー!!
 

うーみゅ

 投稿者:uta  投稿日:2009年 4月14日(火)17時26分51秒
  いるかどうかは分からないけど、プログラミング勉強中のヒトにはとってもためになるスレですね。
某chに貼りたいぐらい。(笑

構造体・・・某システムでサーバ間のメッセージがそういう感じで、中を見るのにバイナリエディタの構造体編集機能を使わないとわけ分からないので、強引に定義したりしてイメージは掴んでました。
オイラが組んだら、16バイトの整数倍とか256バイト単位とかそういう方向にもっていったんだろうなぁ。と。
元はAS400とのI/F仕様だったらしいし。

最近、やりたいことが発散してこまります。PICとか、真空管とか、ゲルマニゥムとか、とりあえずカメラとレンズを発掘しようと思います。
 

うにゃー

 投稿者:ささき  投稿日:2009年 4月14日(火)07時40分36秒
  >それを教官殿に相談したら、なぜか不機嫌におなりあそばしたのにゃー。

その教官殿は、まだ等速等高度旋回のできない練習生から「宙返りの頂上で姿勢が狂ってしまうんですが、ラダーは右を踏んだら良いのか、左を踏んだら良いのか、どっちですか?」と聞かれたような気分だったでしょうにゃー。

>ポインタとか構造体とか

ハード的な理屈で言うと、構造体はメモリーの塊に過ぎないし、ポインタはメモリーのアドレスに過ぎません。でも、それは「エンジンとは要するに鉄とアルミの塊です」と言っているのと同じで、何の説明にもなっていません。

構造体は、一連の関連するデータを集めて一つの機能単位としたものです。
たとばエイリアンの例ならば、構造体 alien_t がエイリアン一匹に関する
全ての情報を含んでいます。

struct alien_t {
  int x; // 現座標 X
  int y; // 現座標 Y
  int v; // 現移動方向(0,1,2,3)
  int f; // 生存状態フラグ(0,1)
};

しかし X, Y については検非違使や落とし穴でも共有する情報ですから、
これを分離して

struct position_t {
  int x, y;
};

とすれば、

struct alien_t {
  strut position_t pos; // 現座標
  int v; // 現移動方向(0,1,2,3)
  int f; // 生存状態フラグ(0,1)
};

struct hole_t {
  strut position_t pos; // 現座標
  int f; // 穴の状態フラグ(0,1)
};

という書きかたができます。こうしておくと、画面にエイリアンや穴を描くとき

void draw_char(strut position_t* pos, char c)
{
  locate(pos->x, pos->y);
  putch(c);
}

みたいなサービス関数を用意しておいて、

draw_char(&aliens[i].pos, '*');

だとか

draw_char(&holes[i].pos, 'O');

だとか

draw_char(&kebiishi_pos, '&');

だとか、呼び出せば、それぞれ対応する座標に対応するキャラが描かれるはずです。「エイリアン」「穴」「検非違使」それぞれの座標保持の方法が異なっても、「struct position_t」という扱いで、そこから先の処理が共通化できるわけです。
「鉄とアルミの塊」を機能単位で分離して、それに「R-2800-10」とか名前を付けてマニュアルを整備しておけば、載っていた飛行機が旅客機だろうが爆撃機だろうが戦闘機だろうが、降ろしてしまえば(構造体ポインタで扱えば)同じ手順で整備できるようなもの…かな?
 

ぐにゃー

 投稿者:猫ノ宮  投稿日:2009年 4月13日(月)20時21分45秒
  なんでこんなとこに変数定義があるのにゃ。
どうもmainの一部として書きはじめたのが、途中から関数の記述に気が変わったみたいですにゃー。

夕べは夜9時まで映画館で「ワルキューレ」見てて鬱入ったので、サクランボチューハイかっ喰らってたのにゃー。
絶望したにゃ、ドイツの未来に絶望したにゃー!
やぱし酔っぱらって書くとダメにゃ <OΓZ~

で、書き直したにゃ。

int loop(int depth)
{
  int i;
  for (i=0;i<10;i++)
  {
    printf("%d\n", i);
    if (depth < 4)
    {
      loop(depth + 1);
    }
  }
}


一夜明けて、研修のお題も思い出したのにゃ。多重ループじゃなかったにゃ。
確か預金だか借金だかの複利計算で、kingaku *= riritu; みたいな書き方を覚えましょう(そのレベルの研修)みたいなネタだったのにゃ。
それで繰り返し利率を掛けて、掛けた回数と金額の一覧を出しましょうみたいにゃ。
繰り返しの方法に指定がなかったので、リカーシブにしてみたんだけど、なぜか回数(上のdepth相当)を%dのフォーマットで表示させる指定なのに1.00とか%fみたいな表示になる、てけったいな現象に見舞われたのにゃ。
それを教官殿に相談したら、なぜか不機嫌におなりあそばしたのにゃー。

そんなわけだから「->」が出てきたあたりで脳からケムが出てきて、さらに構造体のメンバに構造体を、とか言われて炎上して今に至りますにゃー。
ささきさんの解説のおかげで少しわかったような気がしますにゃー。


>93中練から雷電へ乗り換える

もともと半導体やさんだから、最終的にverilog HDLでハード化するのが目的なので、構造体とかうかつに使うとかえって後が面倒、てのもあるのにゃー。
だからどっちかて言うと、↓この穴ぼこに籠もってた工員を引っ張り出して「ちょっと飛ばしてみ」とか言ってるみたいなものにゃー。
http://www.asahi-net.or.jp/~VD4H-OOTK/fuji/serizawa.jpg
 

日曜の昼飯前になにやってんだか

 投稿者:ささき  投稿日:2009年 4月13日(月)03時39分38秒
  >多重ループ嫌い
ならば単ループに多重 if です。

int i=j=k=l=0;
while (i < 10) {
  printf("%d %d %d %d\n",i,j,k,l);
  if (l++ >= 10) {
    l = 0;
    if (k++ >= 10) {
      k = 0;
      if (j++ >= 10) {
        j = 0;
        i++;
      }
    }
  }
}

ぎゃー(;`Д´)/

>猫の宮さん
うにゃー、こりゃバグだらけだにゃー。まず i がグローバル変数だから、ネストの底で 10 回まわったらネストを全部抜けて終了なのにゃー。仕様どおりに動きませんにゃ。アルゴリズムとしても、関数入り口で depth++ しているのは良くないのにゃー。これは呼び出し側でやるべき処理なのにゃ。判定が関数入り口側にあるから、一番内側のループでも毎回毎回 loop(5); を呼び出して、呼び出された先で depth > 4 判定して return するのは無駄なのにゃー。

>構造体はよくわからんにゃー
それで C++ に手を出すのは93中練から雷電へ乗り換えるようなものですにゃー(;;゜Д゜;;)
構造体の意味はゲームプログラムをやってみれば判りやすいです。例えば昔なつかしい平安京エイリアン。あの敵キャラをどうやって制御するか。エイリアンに「現在位置」「現在の移動方向」「生死」の情報が必要だとして、これを

int alien_x[10], alien_y[10], alien_v[10], alien_f[10];

みたいな定義にして

void move_alien(void)
{
  int x,y;
  for (i=0;i<10;i++) {
    if (alien_f[i]) {
      x=alien_x[i]+XV[alien_v[i]];
      y=alien_y[i]+YV[alien_v[i]];
      switch (MAP(x,y)) {
      .
      .
      .

こんなコードで書くのが FORTRAN 的スタイル。
これを COBOL 的にすると

struct alien_t {
  int x, y, v, f;
};

struct alien_t alien[10];

void move_alien(void)
{
  int x,y;
  for (i=0;i<10;i++) {
    if (alien[i].f) {
      x=alien[i].x+XV[alien[i].v];
      y=alien[i].y+YV[alien[i].v];
      switch (MAP(x,y)) {
      .
      .
      .

になります。はっきり言ってあんまり違いません。むしろ単に読みにくくなっただけのように感じます。
さて、構造化プログラミングではこうなります。

struct alien_t {
  int x, y, v, f;
};

struct alien_t alien[10];

void move_alien(struct alien_t* ap)
{
  int x,y;
  x=ap->x+XV[ap->v];
  y=ap->x+YV[ap->v];
  switch (MAP(x,y)) {
  .
  .
  .

void move_aliens(void)
{
  int i;
  for (i=0;i<10;i++) {
    if (alien[i].f) move_alien(&alien[i]);
  }
}

FORTRAN や COBOL では、「サブルーチン」が「エイリアン10匹を動かす」という機能として実装されていたのに対し、構造化プログラムでは「エイリアン1匹を動かす」関数(あるいはプロシージャ、ないしはメソッド)と「10匹のエイリアンを動かす」機能に分離されています。
こういったプログラミングの何が良いかというと、例えば「パックマン」みたいに、敵キャラに異なる性格付けがされている場合、

void move_aliens(void)
{
  int i;
  for (i=0;i<10;i++) {
    switch (alien[i].f) {
    case 1:
      move_red_alien(&alien[i]);
      break;
    case 2:
      move_pink_alien(&alien[i]);
      break;
    case 3:
      move_blue_alien(&alien[i]);
      break;
    case 4:
      move_green_alien(&alien[i]);
      break;
  }
}

のように、「性格」を別のコーディングとして実装できることです。FORTRAN 型や COBOL 型のプログラミングでは、「性格」に関する変数を新たに増やし、move_alien() サブルーチンの中で性格の if を入れて「逃げるか、向かって行くか、ウロつくか」の判定を入れなければなりません。例えばこんな感じ?

void move_alien(void)
{
  int x,y;
  for (i=0;i<10;i++) {
    if (alien[i].f) {
      x=alien[i].x+XV[alien[i].v];
      y=alien[i].y+YV[alien[i].v];
      switch (MAP(x,y)) {
      case WALL: // 移動先のマップが壁だった場合
        switch (alien[i].f) {
        case 1: // 検非違使へ向かって行く方向へ変針する
          .
          .
          .
        case 2: // ランダム方向へ変針する
          .
          .
          .
        case 3: // 検非違使から逃げる方向へ変針する
          .
          .
          .

こんな switch が「他のエイリアンに当たった場合」やら「文岐路に差しかかった場合」のそれぞれに散りばめられるとプログラムは破綻に近づいてゆきます。構造化プログラミングでは、機能単位の分割に関する考え方が逆になります。共通部分をこそルーチンとして外部に放り出し、「異なる部分」を呼び出し元に残しておくのです。

あぁ、真面目に説法してしまった。絶望した!説法好きな自分に絶望した!!
 

ってしまったにゃ

 投稿者:P-kun  投稿日:2009年 4月13日(月)00時14分18秒
  こんな書き方したら、
「こんな下らない処理に除算なぞ使いおって重いじゃろがボケェェェェ!!死んでしまへ!!」
と化石アセンブラーに怒られるのにゃ。これはきっと孔明の罠なのにゃ。きっとそうなのにゃ!!
ギャーーーー!!
 

こういうことしたら・・・

 投稿者:P-kun  投稿日:2009年 4月12日(日)23時47分23秒
  怒られる?
for (int i=0;i<10000;i++){
printf("%d %d %d %d\n", (i % 10000) / 1000, (i % 1000) / 100, (i % 100) / 10, i % 10);
}
いや、結果同じだし・・・
多重ループ嫌いだし・・・
 

再帰不能

 投稿者:猫ノ宮  投稿日:2009年 4月12日(日)23時20分50秒
  そういや会社のC言語研修(初級)のとき、表示のしかたは違うけど多重ループを

int i, depth;

depth = 0;

int loop(int depth)
{
  depth++;
  if (depth <= 4)
  {
    for (i=0;i<10;i++)
    {
      printf("%d\n", i);
      loop(depth);
    }
  }
}

こんなような書き方したら、教官の人が冷たくなりましたにゃ。
あの研修、ポインタとか構造体とかやらなかった(中級以上でやるらしい)ので、いまだに構造体はよくわかんにゃー。
その辺がC-のマイナスな所以ですにゃー。

http://www.kumei.ne.jp/c_lang/

 

ゐーすたー

 投稿者:ささき  投稿日:2009年 4月12日(日)17時14分46秒
  アメリカはイースターだそうです。
それにしても、なぜ「ウサギ」でなぜ「たまご」なのでしょう。
口惜しいからぐぐったりしません。

>ぱくーん
Perl スクリプトがそんな感じですわ。
戦鳥のスクリプトだと AnsQ とかお絵描き掲示板が1枚モノの巨大スクリプトで、ギボと鳥町が require だの package だの使いまくってファイル分割した細切れスクリプト。でもメンテするのは1枚モノのほうがまだ楽だったりします。

>zzさん
6502 は命令数もレジスタ数も少ないから、逆をやるよりはまだマシでしょう。でも、そんな性根で組み込み業界に居ようとするなんて「フザケルナ」ですね。

>猫の宮さん
「構造化プログラムを組みました!」って、こんなの持ってくるより1億倍マシです。

int i, j, k, l;

func4()
{
  for (l=0;l<10;l++) { printf("%d %d %d\n", i, j, k, l); }
}

func3()
{
  for (k=0;k<10;k++) { func4(); }
}

func2()
{
  for (j=0;j<10;j++) { func3(); }
}

func1()
{
  for (i=0;i<10;i++) { func2(); }
}

冗談みたいだけど、これに近いことやられたことがあります。
絶望しましょう。
 

↓え?

 投稿者:uta  投稿日:2009年 4月10日(金)09時46分36秒
  おお、見た目が綺麗!
って思った私はダメですか?

一番内側のループが重そうだなぁ。
 

ごめんなさいにゃ

 投稿者:猫ノ宮  投稿日:2009年 4月 9日(木)23時19分2秒
  もうこんな書き方しませんにゃ。許してにゃー。

for (i=0;i<10;i++)
{ for (j=0;j<10;j++)
  { for (k=0;k<10;k++)
    { for (l=0;l<10;l++)
      {
         printf("%d %d %d %d\n", i, j, k, l);
} } } }

猫なのでここで勉強して出直しますにゃー。

http://www.kumei.ne.jp/c_lang/

 

ふろはいったか?

 投稿者:kazz  投稿日:2009年 4月 9日(木)22時48分36秒
  昔の仕事で、全行にコメント入れたことも有りましたね。そういう要求仕様だったし。
ret     ;復帰
とか。(笑

defineネタとしては・・・6502のニーモニックを定義したZ80用マクロライブラリを使った事があります。
ええ、作った(使う)ヒトはどんなマイコンでも6502で考えたいそうです。jsrがcallとか、そういうヤツ。

VBAなんて、わからんです。他人の組んだのをメンテするだけで精一杯。
ADOとかDAOとか・・・嫌いだ。
単純に2つのデータベースのテーブルを比較して、更新させるだけなのに・・・面毒せ。
 

けどね

 投稿者:P-kun  投稿日:2009年 4月 9日(木)00時53分24秒
  今日ちょっと脱線してVBAなんか10年ぶりくらいに触ってみたけど・・・
(単に表からソースを作るのめんどいのでVBAで吐き出させる処理を作っただけ)
今日できたソースを見れば、コメント全く無し。
VBのサブルーチンや関数は正直よくわからんので関数一つのみですましたけど、気が付きゃ長さが上から下まで2スクロール位・・・

まあ、周りでVBA読む人がいないし触らせる気が無いのでいいんですけど、
何ていうんですかね、不慣れでよくわからん言語で制限時間内に組むってのは、そういうもんなのかもしれまへんね。

判らなかったら自販機行ってコーヒー一杯飲むくらいの余裕が本来必要なんでしょうねえ・・・
 

浮浪チャート

 投稿者:ささき  投稿日:2009年 4月 8日(水)03時49分51秒
編集済
  昔はフローチャート書けってよく言われましたね。
コードの1行1行に対応するチャートが良いチャートだ、なんて言われて、

LD A,(HL)
CP A,0x80
JR C, SKIP1

みたいなコードに

A レジスタに (HL) の内容を入れる

A レジスタと 0x80 を比較する

キャリーフラグが立ったか? → YES

NO

みたいなチャート書かされて、バカヤローと思っておりました。
こんなの、何の説明にもなってないじゃん。
ここでやっている処理は

(HL) の内容が 128 未満か? → YES

NO

というところに「目的」があって、A レジだのキャリーフラグだのは
「手段」に過ぎないじゃん、って。

そういえば「コメントの付いたコードが良いコードだ」と言われて
一生懸命アセンブリ言語の説明を付けるおばかさんもいましたね。

LD HL,8000H; Set HL 8000H
LD B,80H ; Set B 80H
LD A,0 ; Set A 0
LD (HL),A ; Set (HL) A
INC A ; A=A+1
INC HL ; HL=HL+1
DEC B ; B=B-1
JR NZ, LP1 ; if not Z then goto LP1

こういう人たちは、この一連のコードが「8000H 番地から 128 バイトを
0〜127 の連続数で埋める」という「処理単位」であることを理解できない
ようです。そもそも「処理単位」という概念が根本的に欠如しているんで
しょうな。だから「構造化」が理解できないし、まして「オブジェクト
指向」なんて百年かけても理解できないでしょう。

あぁ、また愚痴になってしまった。絶望した!愚痴ばかり言っている自分に絶望したっ!!
 

あかん

 投稿者:P-kun  投稿日:2009年 4月 7日(火)23時14分3秒
  愚痴がひどいや(笑)
思い出したら腹が立ったということで(^^;;
 

ああいたいた

 投稿者:P-kun  投稿日:2009年 4月 7日(火)22時55分27秒
  携帯やってた頃、間に合わないからこのバグ直してと言われてみたらでそれに近いソースですた。

その処理書いた人間が追加した部分を、ソースから全てコメントアウトしてやりました。
ちっとは身にしみたろうと思ってたら次のプロジェクトでもおんなじよーなしょりがちらほらと・・・
電話口でパのBまで出掛かりました・・・

あとリリース一週間前にデグレート出しやがったやつがいて、そいつの修正箇所みたら・・・
バグ現象のみの修正だけしやがるのはよくあるのですが、デグレートしたのが自分の追加したソースの、同じ関数内のすぐ下の処理という素晴らしいもので・・・

電話で説教食らわせたのは後にも先にもあれが最初で最後ですねえー。
おんなじ派遣PG同士なのに、悲しくなりますた・・・

>こぼらー
ええ?
一番ショックなのは、「Pさんの書いたソースコードは関数ばっかりで見にくい」と言われた事ですね。
死ねと思いました。

あと、Javaで1関数2000行なら見たことあります。
ミカカ○ータな人が作った「サンプル」プログラムですた。

ええ、お金も良くて、ぜひ来てくれといわれた所あったんですが、絶対嫌と蹴り飛ばしました。
我ながら阿呆と思いますが、そんなことしてたら気が付いたら今の謎な職種に・・・
俺、ここ首になったら社会復帰できるんだろうか・・・orz


あー、一応今制御系ですが、何か少しほっとしてます。
 

そこは我々が10年前に通ってきた場所だ

 投稿者:ささき  投稿日:2009年 4月 7日(火)08時08分21秒
  末尾メンバが少し違うだけで 90% 同じ内容の構造体が 20 種類あって、
それぞれの構造体に対する入力・表示・印刷・ロード・セーブの
関数が 20x5=100 本あって、それぞれの「関数」が { から } まで
3000 行くらいの if と switch と for と while の迷宮になっていて
しかもその 3000 行のコード字下げが「5文字」で行われていて、
それが全部スペース下げならともかく、8の整数倍までタブで下げて
残りの部分だけスペースで下げている、というプログラムには
実際に係わり合いになりましたが、なにか?

3000 行のファイル名が c21.c で関数名が int c21() だとか、
#define LE <= とか定義されていて実際 if (i LE 100) { なんて
記述が行われているなんてのはまだ可愛い枝葉末節です(´Д`)

おかげで、COBOL プログラムというものがどういうモノなのか
よくわかりましたよ。
要するに帳票フォーマットの種類だけ RECORD 型があって、
それぞれの帳票に応じた入力・表示・印刷・ロード・セーブの
「サブルーチン」を作って、それらのサブルーチンを呼び出す
「メインルーチン」を書くことが COBOL プログラムの「製造」
なのね。

でもね、C から入ったプログラマーが必ずしも C を理解している
訳じゃないのね。というか、言語云々以前に論理の整理ができない
人っているもんです。
たとえば「1から10の総和を計算して表示する」ってプログラムを
書くとき、わざわざ if-else-if-else を並べて

for (i=0;i<=10;i++){
 if (i==0){
  sum=0;
 } else if (i==10) {
    printf("sum=%d\n", sum);
    break;
 } else {
  sum+=(i+1);
}

こんなド間抜けなコードを書く「プロのプログラマー」、少なくありませんよ。
さぁ、一緒に絶望しましょう。

「絶望した!プロのプログラマーのレベルの低さに絶望したっ!!」
 

ってかいたら

 投稿者:P-kun  投稿日:2009年 4月 6日(月)22時42分1秒
  ↓のGoogleの広告が「COBOL技術者の限定募集」ですか・・・
しかも49歳まで・・・
あるいみCOBOLってすげー
 

以上は、新着順1番目から30番目までの記事です。 1  2  3  4  |  《前のページ |  次のページ》 
/4