リストを作れ!!
ニューロンの祖対値を動的に作成する子にしたので、動的な配列が必要です。
でも、しかし、C言語にはないのですね。だから、古風な言語はあまり使いたくないのです。
もちろん、ライブラリーはあるのでしょうが...。
オブジェクト
関数ポインターを用いて継承後の子を復元する作用のあるオブジェクトをつくり
すべてのオブジェクトは継承しなくてはならないとしても良いのですが、
意味がないのでやりません、もちろんいつでも書く直できるようにくくっておきますが、
たかだか doubleを保持するために、大それことをすることはないとおもいます。
ということで、doubleと相手先のnuronの参照を保持するlistを作ります。とりあえず、
nuronはダミーを用意しておきます。
List
ガルベージコレクターの世界ではつまり現在では、常に相手先の
参照を保持しているためにGCしずらい構造として、使えないものになりつつある
アルゴリズムです。 もちろんC言語のように自分でdeleteやfreeする分には
良い思うのですが...、
関数ポインターに対しての誤解
誤解1 ::
たとえば、動物オブジェクトをつくるとして、関数は hello(オブジェクト,変数)と
いった形なる。私はオブジェクトの部分を省略できるような気でいた。これはものすごい
勘違いでした。
誤解2 ::
NULLは#incude<stdio.h>しないと使えない。
Listを作るのはやめて....
listを作るのはやめて listっぽいものに変更する。
とりあえずlistはdataを保持する入れ物のようなものなのだけれども、
listは実はdataを継承したものとすると、listもdataのように使える用になる。
これは、とても便利なデーター構造だ!!。ディレクトリーだとか見たいなものになります。
うーん、これはactioncriptだとか、PHPだと簡単に実装できることですが、型がしっかりしている
言語だと、少々面倒なものだったのですね。
もちろん、作りませが..。
現在までの進行状況
./list.h
typedef struct list_s *List;
typedef struct data_s *Data;
typedef void (*addData)(Data,Data);
typedef int (*nextList)(List);
typedef void (*addList)(List,Data);
struct data_s
{
int nuro;
double soutai;
Data right;
Data left;
addData add;
};
struct list_s
{
Data point;
Data end;
Data Item;
int length;
nextList next;
addList add;
};
/*************************************/
./list.c
#include "list.h"
#include<stdio.h>
void _addData(Data own,Data dat)
{
Data temp;
temp = own->right;
own->right = dat;
dat->left= own;
dat->right =temp;
}
Data newData()
{
Data dat= (Data)malloc(sizeof(struct data_s));
dat->nuro = 0;
dat->soutai = 0;
dat->right = NULL;
dat->left = NULL;
dat->add =(addData)_addData;
return dat;
}
int _nextList(List list)
{
if(list->point->right !=NULL){
list->point = list->point->right;
return 1;
}else
{
return -1;
}
}
void _addList(List list,Data data)
{
list->end->add(list->end,data);
list->end = data;
}
List newList()
{
List list;
list = (List)malloc(sizeof(struct list_s));
list->end = list->point = list->Item = newData();
list->next = _nextList;
list->add = _addList;
return list;
}
int main()
{
Data temp;
List list = newList();
list->add(list,newData());
temp = list->Item;
while(1){
if(temp != NULL)
{
printf("%d\n",list->Item->nuro);
temp = temp->right;
}
else
{
break;
}
}
return 0;
}
とりあえず追加できるようになりました
次いきましょ。listの機能は適宜追加していくして、Nuronを作成します。Nuronはとても最初に言ったように
とても単純です。簡単なテストプログラムも書いてみることにしましょう。
あと、継承っぽいことをC言語でやるのは無しにします。今日で冬休みが終わりだからです。
後から確認してみるのがベターな気がします。拡張すかもしれないのは、別のニューロンの課題が出たとき
なので、それは、そのときにプログラムを改造するのも良いとおもうので、
次