FC2ブログ

メモ:C言語のポインタ面白い使い方

φ(..)メモメモ

主に私が使ってる奴で教本に載ってないやり方集
マイクロコンピュータのためのプログラミングが多いがね

1.構造体+ポインタ
struct,unionは使えるが、ビットフィールドに適用できない。

typedef struct {
  char aa;
  char bb;
  int cc;
} STR;

この構造体があるときポインタ変数に置き換える。

STR A;
char *p = (char *)&A;

*pは次のように使える。
*pの初期アドレス→[1バイト:aa][1バイト:bb][4バイト:cc]
で全部で6バイトの変数になる。

*p++をすれば、bbにアクセスできる。

記憶方式に注意点
*p='d';
とかけば
A.aaの中身は'd'が入る。

*(p+2)='5'-'0';
とかけば、*(p+2)は5が入る。
A.ccの中身は、5が入るのだ。

*p++しながら、ちょうどA.ccの領域に入った時、
0x1,0x2,0x3,0x4を入れると
A.ccの値は、0x04030201となる。



2.二重ポインタ
char ss[50][50];

*p=ss;
**p=&p;

によって定義できる。
pp=ssとかはできない

記憶順序は
[0][0]、[0][1]、[0][2]・・・[0][49]、[1][0]、[1][1]・・・


代入の仕方

*(*p+n)=X;

記憶順序からn項目にXを代入する。
nは配列の変数の数にきまるので、50x50=2500が最大。

↓配列がm個あると考えてしまうので注意
p+m

↓配列の先頭アドレス+mを表すアドレス
*p+m

*(アドレス)で中身を表示するのはポインタの基本

テーマ : プログラミング
ジャンル : コンピュータ

へー

64bit=エクステンド
32bit=ダブルワード(クワッドバイト)
16bit=ワード(ダブルバイト)
8bit=バイト
4bit=ニブル
1bit=ビット

4ビット処理は私も多用しますが
ニブルって読み方聞かないよね(´・ω・`)

4bitは16進数一桁のことなんだよね!

テーマ : ひとりごとのようなもの
ジャンル : 日記

5月から力いれてた思いついた技術ができそう(ファイル圧縮)

思いついた圧縮方式が完成に近い!!
11KBのBMPがJPGだと4KBだが、自分が考えたやつは2KBだ!!
しかもJPGみたいにデータを削って解像度が悪くなることはない。
1ビットデータを失うことなくもとのデータに再現できるのだ。

pdfでも235kB→202KBだ
これをZIPにすると226KBです
私の大勝利です^^


でもちゃんとBMPにもどせるならいいけど・・・
デコーダはまだ未完成

もう一息だ
特許狙うか?


発端として
・畳み込み積分
・排他的な演算
・二分木の概念を廃止
で思いついたんだけどね



昨日麻雀やってて
リンシャンカイホウ3回引いた私なので
なりかけも何回かあったけど
一時の調子が出てきたみたいですね

調子いいときは人並み以上だけど
悪いときは人並み以下なんですよ;

テーマ : 頑張れ自分。
ジャンル : 日記

CPUの負担が少なくメモリも消費しにくいレジスタ操作考えた

mbedはC++でも動くようなのでいいですね^^

これならかなり無駄がなく計算処理も
少ないので私のお気に入入りコードにしようと思う


#include <iostream.h>

using namespace std;

typedef unsigned char byte;

typedef union {
byte data;
struct {
byte b0:1;
byte b1:1;
byte b2:1;
byte b3:1;
byte b4:1;
byte b5:1;
byte b6:1;
byte b7:1;
} bit;
} memory;


class Register {
public:
volatile memory *memp;
Register(byte &dat);
inline void inc(void);
inline void dec(void);
inline byte getbit(int n);
inline void binary(void);
};

Register::Register(byte &dat){
byte *buff=&dat;
memp=(memory *)buff;
}

inline void Register::inc(void){
(memp->data)++;
}

inline void Register::dec(void){
(memp->data)--;
}

inline byte Register::getbit(int n){
switch(n){
case 0 : return memp->bit.b0;
case 1 : return memp->bit.b1;
case 2 : return memp->bit.b2;
case 3 : return memp->bit.b3;
case 4 : return memp->bit.b4;
case 5 : return memp->bit.b5;
case 6 : return memp->bit.b6;
case 7 : return memp->bit.b7;
default : return 0x0;
}
}

inline void Register::binary(void){
for(int i=7;i>=0;i--){
cout<<(int)getbit(i);
}
}

int main(void){
byte aa;
aa=0x30; /* ASCIIでは文字としての0 */

cout<<"使用データ:"<
Register rc(aa);
rc.inc();
rc.inc();
rc.inc();
cout<<"3回インクリメント:"<
rc.dec();
cout<<"デクリメント:"<
cout<<"バイナリ表示:";
rc.binary();
return 0;
}






共用体により8bitレジスタを代入するスペースを
作り、それと同じアドレスにビットフィールドをつくります。

レジスタクラスのコンストラクタ内で
レジスタのアドレスを共用体そのものへ渡します。
参照渡しによって実現します。

1加算のインクリメント
1減産のデクリメント
nビット目を抽出するgetbit
2進数を表示するbinaly

のメソッドをテスト用に作成


結果は・・・・

使用データ:0
3回インクリメント:3
デクリメント:2
バイナリ表示:00110010



となります。
00110010=0x32
なのでこれであっているのだ

なぜなら2はASCIIコードで0x32なので
その2進数表示は結果のとおり。

テーマ : 今日のつぶやき。
ジャンル : 日記

【Java】swingで2種類以上のレイアウトを使用する。

久々に技術話題をしよう。
Javaでプログラミングするのは久々だねぇ~^^
最近、自作したH8/3664Fのテストボードを操作するために使うだけさ。
VisualStadioは正直欲しいけど値段がなぁー・・・。

さてと、
複数のレイアウトを使いたいと思ったことはないかね?

このやり方は、すでにあるかもしれないけど私なりのやり方を載せる。


例えば、こういうダイアログボックスを作ってみようか。
java1.png

実はこのダイアログボックス、「FlowLayout」「GridLayout」の2つのレイアウトを使っているのだ。
フレーム以外のサイズ設定は一切しておりません!


FlowLayoutは、規定の大きさの部品をフレーム上に詰めていくしかない。
GridLayoutは、分割されたフレームいっぱいに部品を広げて表示してしまう。

互いに使えそうで、大げさな表示をしてしまう欠点はあるのだ。


処理の流れは、

2つのクラスを定義する。
JDialogを継承したダイアログのクラス、
JPanelを継承した埋め込み用パネルのクラス。

2種類上のレイアウトは抱合関係によって実現できるのだ。
よって、クラスごとに分けるとする。
いくつかメソッドも使用するので、そのほうが都合がいいのだ。

JDialogのクラス内でJPanelを使います。
そこでは、GridLayoutを使用します。
GridLayoutはただ部品の配置を教えるだけです。


// 2行1列のGridLayoutを使用します
class MyDialog extends JDialog .....
...........
JPanel jp = new JPanel(new GridLayout(2,1));


addによってコンポネントを追加するのが普通ですね!
JLabel lbl = new JLabel("ダイアログボックス!");
JButton btn_on = new JButton("OK");
...
jp.add(lbl);
jp.add(btn_ok);
this.add(jp);
this.setVisible(true);

というふうに記述すれば、普通にGridLayoutで表示されます。

GridLayout(2,1)のみ使用した場合はこれ↓
java2.png

これじゃ、ぜんぜんダイアログボックスぽっくないですね~。

じゃ、FlowLayoutのみだとどうなる?
↓こうなります。
java3.png

さきほど言ったJPanel抱合によって両方の利点を
取ることができます。

GridLayoutのひとつのセル内にFlowLayoutを表示すればいいわけだから

JPanelで継承させたクラスに、FlowLayoutを記述します。
同じように
addでコンポネントを入れて、最後にsetVisible(true)で
JPanelの表示をするよう促します。

その作成したクラスをダイアログボックスのクラス
GridLayoutで指定したJPanelのaddでコンポネントとして追加すればいいわけです。


ソースコードはこちら↓


/* コンポネントにレイアウトを適用するクラス */
class InPanel extends JPanel {
public InPanel(LayoutManager layout,Component comp){
super(layout);
this.add(comp);
this.setVisible(true);
}
}

/* ダイアログボックス用 */
class MyDialog extends JDialog implements ActionListener{
private static JButton btn_ok;
private static JLabel lbl;
private static JPanel jp1;

public MyDialog(JFrame parent,boolean mode,String lab){
super(parent,"Warning!",mode);
jp1 = new JPanel();
this.setLocation(parent.getX()+100, parent.getY()+100);
this.setSize(210,100);
jp1.setLayout(new GridLayout(2,1));

lbl = new JLabel(lab);

btn_ok = new JButton("OK");
btn_ok.addActionListener(this);

/* 何かボタンを押したら閉じる */
btn_ok.addKeyListener(new KeyAdapter(){
public void keyTyped(KeyEvent e) {
setVisible(false);
}
});

        /* lblというコンポネントをFlowLayoutとして追加 */
jp1.add(new InPanel(new FlowLayout(FlowLayout.CENTER),lbl));
/* btn_okというコンポネントをFlowLayoutとして追加 */
jp1.add(new InPanel(new FlowLayout(FlowLayout.CENTER),btn_ok));

        /* Xボタンをクリックすると閉じる */
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
setVisible(false);
}
});

this.add(jp1); //パネル情報をフレームに追加
this.setResizable(false); //フレームのサイズ変更禁止
this.setVisible(true); //フレームを表示する
}

public void actionPerformed(ActionEvent e) { //OKをクリックしたら閉じる
setVisible(false);
}
}



JFrameはswingアプリならなんでもご自由に!

テーマ : プログラミング
ジャンル : コンピュータ

うおおおおおおおっ!!

GCCコンパイラでWin32APIのライブラリにデバイスドライバのキット
あったあああああ!!!キタ━━━━━━━(゚∀゚)━━━━━━━!!!!
ってか今まで知っていましたけどね^^使い時がきた!

なにこれすごいww

SCSI
RS232C
AUDIO
USB

なんでもござれww

マイコンPIC18とかUSBの機能あるから
これで爆ぜる!!!

Java用に作って
JNIでライブラリにしたい!


めんどくさかったら
RS232のとき見たく、ネットから拾ってくるしかないな


個人的には
上級者向けでもあり汎用性の高い
C,C++,Java
を極めつくしてきたが

他の言語で簡単にやっちゃうのは情弱と思っている。
サポートされすぎだから

アセンブラでやっちゃう人こそ情報神だ。

Core2とかi3、i7のニーモニックとかオペランドコードとか
わからないし・・

レジスタサイズが32bitや64bitとでかいからなぁ

テーマ : 今日の出来事
ジャンル : 日記

プラグインしたらコンセントがないと

Androidのプラグインと
Eclipseのプラグインの
デザイン方法が同じだ

プラグイン開発の本がほしい

H8マイコンへ書き込むための
プラグインを作りたいな
C言語限定で
H8/3048かH8/3052が対象
べりファイ無し
まずはそれから

それと、シリアルポート開いて
通信できるように対応すれば・・・

それには秋月の無料ツールを
使ってMOTファイルの作成がいるかもしれない。

ルネサスのHEW使えば楽なのに!

しかし、
プラグイン作るには
濃厚なJavaとXMLの
知識が要る
Androidもだ。
JSPの場合は
SQLも要る

たいへんだぁー^^

テーマ : 日記というか、雑記というか…
ジャンル : 日記

JavaでRS232C制御したいならば・・

まず、下のZIPをダウンロードして、
リンク先の通りにインスコして使ってね^^ノ


zip内容:win32com.dll、javax.comm.jar、javax.comm.properties
javacomm.zipにしてね

参考文献:JavaによるRS232Cの制御


おいらIT系じゃなくて電子技術系が主体だけど
そんなIT系じゃないおいらでもできる(`・ω・´)

あきらめそうになったら修造のホームページへいくんだぞ

テーマ : プログラミング
ジャンル : コンピュータ

珈琲「Java」

復活するために復習中さ!
AndroidのSDKとADTプラグインも入れて
がんばるお!

とりあえず、
byte型、char型は16ビット
const修飾子よりfinal修飾子

ポインタ変数なんてないし、どうやって
参照渡しするかと・・
文字列もString型

あぁ・・配列の[]も変数の一部なんだね。

可変引数も簡単になって
これは新しい!


C++の名前空間の概念が当たり前になっていて
breakやcontinue文にラベルがつけられる
{}でブロック処理ができるな


あとは例外処理、抽象クラス、インターフェイス
コンストラクタ、継承
オーバーライド、オーバーロード
AWT,アプレット、Swing,SWTとかあるよね

オブジェクト指向言語は簡単だからすぐわかるが


Androidの技術者が少ないので私が直接
力つけようかのぉ~
無料で開発環境手に入るからな!


やっぱ、作成した回路をおいらのAndroidケータイで
操作できればうれしいからね
シーケンスもあればそうしたい

テーマ : 雑記
ジャンル : 日記

アルゴリズム【スマート記述クイックソート】

さて、みなさんおなじみのクイックソート。
値を交換するときに空白の変数を使用しない方法と、
二分木のノード(点)にきたとき再帰コールを使ったやつです。

quicksort.png

ピボットという中央値は使ってないです。
メジアン探すのに、交換だけじゃなくてループも探すし
改良して、メジアン決めるのもいいかも

簡単のため、2分割していやす

まぁ、奇数個ある列に対しては並び替えた後の配列の
おしりから、比較しながら、右シフト代入してるんですけどね!


さて、aとbを入れ替えるとき、

a=a+b
b=a-b
a=a-b

と記述するだけで入れ替えることができます。


a=3,b=7
としたときの様子を見てみましょう

①a=a+bによって、a=10,b=7となります。
②b=a-bによって、a=10,b=3となります。
③a=a-bによって、a=7,b=3となります。

順番に解釈、実行されることを利用した交換法ですな


ピボットを使った改良版は下のとおりです。

quick_kai.png

ふぅ・・・。
時系列のランダムでピボット選んで、並び替えをして
分岐処理します。

以外に、難しかったけどね。

スマートかどうかは、ちょっと首を傾げるかもしれませんね^^;

テーマ : 日記・日誌
ジャンル : コンピュータ

ぶろぐかんりしゃ

SmartWoods
最近MoEは・・・
一休み

***** ひとこと *****

MoEの後継ともいわれる
Resonance gamez
完全スキルMMOが
気になるところ



********************


↓2016/3/26更新
My MoE









**********

NEWとらっくばっく
あーかいぶ
かてごりー
リンク
ぶろぐないけんさく
RSSふぃーど
おともだちになろ

この人とブロともになる