スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

まずい

まずいぞ。ほんとまずいぞ。

なにがまずいか。

それは

macのGUIの作り方が思った以上に難しいからだ


予想外だな。このパターン。

絶対Objective-Cをマスターしたら、GUIなんて、別にフレームワーク使うだけだから簡単だろ?って感じで構えてたけど違っタ。

文法は分かっててもフレームワークの意味が分からん。Objective-C.......とか書いてたら今スピーカから破裂音が!
バチ!って言った。クイックタイム7を未だに入れていなかったからだ。

ほんとなんかobjective-Cが簡単過ぎだったんじゃね?ていうくらい難しく感じる僕は大丈夫なんでしょうか?
スポンサーサイト

iPhoneSDKがなぜかfirefoxではダウンロードできない件について

なんか、知らないけど、僕のデフォルトウェブブラウザは、firefoxなんですが、何回やっても何回やってもダウンロードできないんですね。

...


iPhone SDKが

いや、知らなかったんです。はい。safariの方がGUIが好きだけれども(macだし)、なぜかブラウザだけはfirefox使ってるんですね。ははh。

いや、結構あれでしょ、追加機能が多いから(アドオンで)好きなようにできるから(最近はなにやらクロームが出てきた見たいだけど)

まぁとにかくダウンロード中です

scanfのバグ

どうも

今日は非常に困ったscanfのバグについて

@説明開始
【scanfのバグ】
もともとscanfという便利なCの標準ライブラリ関数は、非常にバグの多い関数なんですね(ネットの皆さんの大多数の意見、それから詳解Objective-C2.0より)。だから、練習用にはいいけどあんまり使いすぎないようにって僕のObjective-Cの源の一つの詳解Objective-C2.0に書いてありました(笑~)。ですが、あんまり気にしてなかったんですね。
そしたら、つい先日作ったプログラムがどうしてもscanfの部分だけ反応しないってことになりました。ほんと頑張ってたんですが、コンパイラはこういうときに限って(今回は別にしょうがないのだが)、黙ってるし、ああああああ分からんってことで考えた結果。
「そうだ!google先生に聞いてみよう」
ってことにしたんです。するとwikipediaの文字が!
wikipedia先生によると、なんか、scanf入力終了の合図のようなエンターを押す行為。これが、scanfによって変数に取り込まれてるらしいんですね。
つまり、printf関数を挟まず立て続けにscanfを使うとその中でエンターを変数に格納してしまう馬鹿なのかよくわからないscanf関数が存在するんです。
これを回避するには
scanf(" %d", &a);
みたいに%の前にスペース入れるらしいです。

@説明終了

wikiへのリンクはhttp://ja.wikipedia.org/wiki/Scanfです。

では。

プロトコルの作成、宣言、継承、多重継承。

どうもお久しぶりです。

ええとですね。前まではObjective-C勉強ログだったんですが、もうObjective-Cの基本的なことは理解してしまったので勉強ログじゃなくなってしまいましたが、備忘録として、更新します。

今回は、、、うーんと。どうしよう。どこまで説明したか忘れてしまった。じゃぁ適当にプロトコルあたりで行きますか。

@説明開始

【プロトコルってなに?】
プロトコルってよく聞く言葉ですよね。httpとかftpとか。これは、インターネットの通信のための分類のプロトコルですが、obj-cのプロトコルでもだいたい雰囲気は同じです。要するに、いろいろなところで使うメソッドを集めておける部分です。プロトコル自体はオブジェクトにはできませんが、クラスが準拠(プロトコルを継承するようにした後実装すること)して、プロトコルを採用できます。

例えば、子供に人気の某ポケットモンスターというDS用のアプリケーションがあります。このポケットモンスターは『モンスター』が相手をその『モンスター』の持っている「技」を使って、『相手のモンスター』を「攻撃」します。『相手のモンスター』は、その「攻撃を受ける」と攻撃から【防御率】を「引いた値」分【ライフ】が削られます(らしいです)。
ほんとは多分ここまで単調にはならないはずですが、原理は多分こんな感じなはずなんではないでしょうか。ここでは、オブジェクトを『』でくくって、「」がメソッド【】をインスタンス変数で表しました。
@interface monster_a
{
int defence;//スペル間違ってたらすいません。防御率のインスタンス変数
int life;ライフのインスタンス変数
int power;攻撃の時の大きさ
}
- (void)spec_a;//技a
- (int)attack;//相手モンスターを攻撃する時に使う
- (void)damage:(int)a;//受けるダメージを計算する。引数は、相手から受ける攻撃力の大きさ
- (id)initWithDefence:(int)a life:(int)b power:(int)c;//イニシャライザ
}
こんな感じですかね。実装はめんどくさいのでしません。すいません。説明なので、コメントでだいたいを理解してください。
ここから、プロトコルについての話です。何やら、それぞれのモンスターにはタイプが存在するみたいなんですね(炎とか風とか雷とかでしょうか)。これを一つ一つ実装するとなるとさっきのコードに
@interface monster_a
{
int defence;//スペル間違ってたらすいません。防御率のインスタンス変数
int life;ライフのインスタンス変数
int power;攻撃の時の大きさ
int type;//数値でタイプを決める。例えば1だったら雷とか2だったら、光とか。
}
- (void)spec_a;//技a
- (int)attack;//相手モンスターを攻撃する時に使う
- (void)damage:(int)a;//受けるダメージを計算する。引数は、相手から受ける攻撃力の大きさ
- (id)initWithDefence:(int)a life:(int)b power:(int)c;//イニシャライザ
- (void)type;//ダメージ計算の時にこのメソッドを呼び出し、タイプ別計算を行う
}
太字で追加した部分が計算部分です。別にdamageメソッドに追加してもいいのですが、どちらにしてもめんどくさいですね。はい。ここでプロトコル登場です。プロトコルはいろいろなクラスの似てしまう部分をまとめておくことができるので、例えば雷タイプのモンスターのためのプロトコルは
@protocol lightningType
- (void)type;
@end
というのを作り、先ほどのmonster_aクラスがこのプロトコルに準拠するには

@interface monster_a <lightningType>
{
int defence;//スペル間違ってたらすいません。防御率のインスタンス変数
int life;ライフのインスタンス変数
int power;攻撃の時の大きさ
}
- (void)spec_a;//技a
- (int)attack;//相手モンスターを攻撃する時に使う
- (void)damage:(int)a;//受けるダメージを計算する。引数は、相手から受ける攻撃力の大きさ
- (id)initWithDefence:(int)a life:(int)b power:(int)c;//イニシャライザ
}
とすればいいだけなので簡単です。

とは言ってもこの程度のプログラムではあんまり良さが分からないでしょうが、この雷タイプのモンスターはもっとたくさんいるはずです。これらに一つ一つメソッドを実装するよりかは確実に楽ではないでしょうか。

と、まぁこんな感じです。

【プロトコルの継承】
プロトコルの継承もクラスの継承と同じです。

@protocol protocol_b <protocol_a>

とするだけで継承することができ、あとは、クラスの継承と同じように行うことができます。

【多重継承】
実はですね。C++から来た人は知っているけどあんまり使ったことが無いなぁ。と言う多重継承もこのシステムにより一応使うことができます。宣言の方法は、

@interface myClass : NSObject <protocol_a, protocol_b>

とするだけです。簡単ですね。クラスの多重継承はあまり使いませんが、プロトコルの多重継承は大きなプログラムを作成する上では結構お目にかかるシステムだと思います。

@説明終了

まぁプロトコルの概要の説明は終わりました。

ふー疲れた。

ではまた

うん。。。。。初心者すぎる喜びだね。

ええとですね。なんか、1月13日に初コメをいただいていたようです。ありがとうございます。

んまぁ、今回はランタイムについて書こうかどうか迷ってたんですが、これから数十分PCに向かう気力が無くなってしまいました。

理由は...

非常に初心者な喜びですが、初めて、Objective-Cを書いてコンパイラを黙らすことに成功したんです。はい。

とてつもなく簡単なプログラムなのに、なぜこんなに手間取ったんだろう。なかなか、やっぱりなれてないんですね。

では

javascriptについて

Objective-Cを勉強しなければいけないのに、javascriptを勉強したくなってしまったorz

なんか、オブジェクト指向スクリプト言語に惹かれてしまった。Objective-C勉強後にしなければな...

ちょっとあれですから

ああああC言語とかobj-c言語とか勉強しなきゃ行けないけどそれ以上に

英言語を勉強せねば

ということで、あんま更新できないかもです

無題というなの題

なかなか、最近はObjective-Cの理解に苦しんでいます。

ちょっと更新のペースが落ちるかもです。

とある音声入力

ちょっと試しにiphone(僕はdocomoだからipodtouchだが)アプリのとある音声入力可mailソフトを使ってみたところ僕が

「ガベージコレクションとは、いらなくなったインスタンスを削除することができる機能です」
と言ってみたところ
「食べるコレクションとは。いやだから解散総削除することができる。きのうです」
ってなった。爆笑どころじゃない。

なぜ「いやだから解散総削除」!?
いくらなんでも、インスタンスが解散総になるのはおかしいだろ。(笑)

アクセサ

はいどうも、小さなプログラマです。

今回は、僕が方程式のプログラムを作る上で非常に悩んで(結果的にそのせいでやめてしまった)、内容を解決することができるものを紹介します。

@説明開始

【悩んでたこと】
ええと、インスタンス変数に僕はあまりまだ触れていなかったので、なかなか難しいところでしたんですが、ええと、ほかのクラスのメソッドから、インスタンス変数にアクセスするにはどうすればいいんだ。ってなってあきらめました。これを解決するもの今回は説明します。(というか考えればできるはず)

【アクセサ】
はい、アクセサとはほかに、アクセサメソッドとか言います。つまり、アクセサっていうメソッドを作ろうって言う話なんですね。
このアクセサはどのようなメソッドにするのか。これはずばりインスタンス変数そのもののメソッドを新しく作って、その中で、変更を加えるって言う感じですかね。
あ、でもそのものの、って言ってもあれですよ。名前などが同じつまり、人間から見ておんなじようにするって分けで、コンピュータにとっては全く違う物です。
セッタ、ゲッタというものがあります。それぞれ前者は取ってきた値(インスタンス変数)を変更するメソッド、後者は、値を参照(ポインタ)するメソッドのことで、宣言として前者はsetから始まるメソッド名、後者は、getから始まるメソッド名で書くことが、習慣みたいなんです。しかし、ゲッタのgetの方はつけない人の方が多いらしいです。(Objective-Cでは確実に。ほかのプログラミング言語は知りません)

【アクセサの必要性】
なんで、こんなめんどくさいことをいちいちしなきゃ行けないんでしょうか?これは、後々変更を加えるときそのインスタンス変数を直接取ってきていると変更があちこちになってどこがどこだか分からなくなりやっかいなんです(C言語で僕はその経験があります)。しかし、この方法を使えばそのメソッドのみを見れば良いので楽なんですね。ハイ。というより、ほいほい取ってくるんだったら、グローバル変数と変わらないですね。


@説明終了

もう、備忘録になってて、たいして説明にはならなくなってきました。(いつもこんなこと書いてるな)

では

間違いがありました。

指定イニシャライザに関する記事が、間違っていることに気づきました。

すいません。

指定イニシャライザとは、正確にはNSObjectなどのルートくらすには、無いイニシャライザのことを指します。

(NSObjectの場合はinit以外のものです)

そして、指定イニシャライザを作ると何が便利かと言いますと、普通のinitのイニシャライザの場合は、初期化するとき引数がを渡すことができないんですね。

しかし、この新しく作ったイニシャライザの場合は、引数をつけさせることも可能です。

どのように書くかというとですね

- (void)initWithtesta:(int)a testb:(int)b;

のように宣言します。

またこのイニシャライザを作るときには必ずルートクラスのイニシャライザを読み込み、オーバーライド(上書き)しなければなりません。しかし、オーバーライドしてしまっては、せっかくのNSObjectのinitイニシャライザが使えません。しかし、そんなときに出てくるのが、ちょっと前に話した「super」というやつです。つまり、initもメソッドの一つなので、

[super init]

で、それまでのやつは使うことができるんです

無責任ですが、詳しくはここで。

では

祝MacAppStore開設

いや、来ましたねMac App Store。

いつか僕もここに投稿できるようになるといいな

ターミナルがクソ落ちる

はいどうも。さきほどのプログラムにmallocによる改訂版を作りました

そして、分かったのは1億1番目の素数は、2038074751
だということですね。

でも、次の瞬間。ターミナルが落ちました。(笑)

ちょ、表示するのを少なくしなきゃですね。

ちなみに、この知識はかじっただけですから、自分が納得できる説明ですんで、他人には分からないかもしれないですね。この説明だと

ちなみにね。さっきのクラメルの公式で、
1x+ 1y+ 1z= 1
1x+ 2y+ 3z =4
4x+ 3y+ 2z =1

っていうのはできません。なぜでしょう?

それはですね。例えば下の二つの式を足して、できる式 5x+5y+5z =5を考えて、すると、一番下の式を新しくできた式と置き換えて大丈夫なんですね(5x+5y+5z=5 から真ん中の式を引けば、その式を作れるから)。そして、この新しくできた式を「5」で割ると、一番上の式を作ることができますよね?

つまり、この条件は、二つしか式を与えていない、というのに等しいんですね。
すると、一応あのプログラムでは、「できません」的なことを言うようにしといたんですけどね。

まぁそんな感じです。そして、それはクラメルの公式では、3つの変数を公式にかけて出る値が0になると、そうなるんですね。(ちなみに上に上げた意外に矛盾しているというときも、そうなります。)つまり、FF関数のalphaの値が0になると、すぐにreturnするようにプログラムされてますね。

矛盾というのは、簡単には、
1x+1y+1z=1
1x+1y+1z=5

とかいう式を打った瞬間です。その場合もできないとプログラムが勝手に言います。

コメントアウトがない代わりにちょっと、補足しておきました。

ノシ

知ったかぶっちゃ行けないね。誰だよフレネルの公式ってこの公式をHPに書いてたやつ。

すいませーん!!

フレネルの公式とか書いてたけど、正確には

クラメルの公式でした。


すいませんでした。

注意書き

あ、それと、その計算メモリリークしまくりです。

まぁそこまででも無いけど。

malloc関数は、勉強中です。

素数計算アルゴリズム

あ、ついでに、15分で作った素数計算のプログラム。

効率悪いけどまぁまぁ。
コメントアウト無くて分かりにくいけど、まぁまぁ。




/*
* Prime algorithm.c
*
*
* Created by 小さなプログラマ on 11/01/04.
* Copyright 2011 初心者のObjective-C勉強ログ. All rights reserved.
*
*/

#include
#include
#include
#define MAX 1000000

int main(void)
{

int prime[MAX];
int i = 3;
double a;
int b;
int n;
int c = 0;
clock_t t;
double e;

t = clock();
while (MAX >= c+2) {
prime[0] = 2;
prime[1] = 3;
a = sqrt(i);
while ( (int) a >= prime[n]){
b = i % prime[n];
if (b == 0)
break;
n++;
}
if (b != 0) {
prime[c+2] = i;
c++;
}
i++;
i++;
n = 0;
}
t = clock() - t;
e = (double)t/CLOCKS_PER_SEC;

int d;
for (d = 0;d < MAX;d++){
if (d % 5 == 0)
printf("\n");

printf("%d ", prime[d]);
}
printf("\n");
printf("実行時間は%f秒でした\n", e);
return 0;
}

やっぱりコードそのまま載っけました。

アレだめだった。

長いけど、コード載っけます。


/*
* Frenel formula.h
* ↓
* FF
* 機能:フレネルの公式を計算します。
* Created by 小さなプログラマ on 11/01/05.
* Copyright 2011 初心者のObjective-C勉強ログ. All rights reserved.
*
*/

#include
int FF(double *a, double *b, double *c, double *q, double *w, double *e, double *x, double *y, double *z, double *num, double *numb, double *N, double *xx, double *yy, double *zz)
{

double alpha;
double aa;
double bb;
double cc;

alpha = *a * *w * *z + *b * *e * *x + *c * *q * *y - *c * *w * *x - *a * *y * *e - *b * *q * *z;
if (alpha == 0)
return 2;

aa = *num * *w * *z + *b * *e * *N + *c * *y * *numb - *c * *w * *N - *e * *y * *num - *z * *numb * *b;
bb = *a * *numb * *z + *num * *e * *x + *c * *N * *q - *c * *numb * *x - *e * *N * *a - *z * *q * *num;
cc = *a * *w * *N + *b * *numb * *x + *num * *y * *q - *num * *w * *x - *numb * *y * *a - *N * *q * *b;


*xx = aa / alpha;
*yy = bb / alpha;
*zz = cc / alpha;

return 1;
}



/*
* Fresnel formula.c
* 機能:フレネルの公式により、3変数の時の連立方程式を解く
* ver.1.0
* Created by 小さなプログラマ on 11/01/05.
* Copyright 2011 初心者のObjective-C勉強ログ. All rights reserved.
*
*/

#include "Fresnelformula.h"

#include

int main(void)
{

double a[3];
double b[3];
double c[3];
double num[3];//右辺の数値
char yes;
double ans[3];
int i;
double meson;
double meson2;
double xx;
double yy;
double zz;
int which;

printf("3変数の連立方程式を解きます。\n");
while (1) {
for (i = 0; i < 3; i++) {

do{
printf("まず%dつめの式の1つ目の変数の値を入力してください。", i+1);
scanf("%lf", &a[i]);
printf("2つ目を入力してください");
scanf("%lf", &b[i]);
printf("3つめ");
scanf("%lf", &c[i]);
printf("右辺整数を入力してください。");
scanf("%lf", &num[i]);
printf("%gx", a[i]);
if (b[i] > 0)
printf("+%gy", b[i]);
else if (b[i] < 0)
printf("%gy", b[i]);
if (c[i] > 0)
printf("+%gz", c[i]);
else if (c[i] < 0)
printf("%gz", c[i]);
printf("= %g", num[i]);
printf("\nこれでよろしいですか?y/n?");
scanf("%s", &yes);
}while(yes != 'y');
}
if (a[0] == a[1] && b[0] == b[1] && c[0] == c[1]){
printf("記入された式の2つ以上が同じ式になっています。");
continue;
}
else if (a[0] == a[2] && b[0] == b[2] && c[0] == c[2]){
printf("記入された式の2つ以上が同じ式になっています。");
continue;
}
else if (a[2] == a[1] && b[2] == b[1] && c[2] == c[1]){
printf("記入された式の2つ以上が同じ式になっています。");
continue;
}
else {
break;
}
}


which = FF(&a[0], &b[0], &c[0], &a[1], &b[1], &c[1], &a[2], &b[2], &c[2], &num[0], &num[1], &num[2], &xx, &yy, &zz);

if (which == 2){
printf("誠に申し訳ないことに、この条件ではこのプログラムで計算することが不可能です。\n");
return 0;
}
printf("x = %g\n", xx);
printf("y = %g\n", yy);
printf("z = %g\n", zz);

return 0;
}

いらない変数多!とか言われるかもしれませんが、まぁまぁ。

ポインタの必要無い!!とかも言われるかもしれませんが、仕様変更して必要無くなったけど変えるのがめんどかっただけです。

ノシ

フレネルの公式

どうも。実はですね。ちょっと事情により、フレネルの公式を使うことにしました。

Fresnelformula.c.c
Fresnelformula.h.h

この二つですね。

まぁブログ転載したい人なんて滅多にいないとは思いますが(このコードがカスすぎるから)、ここのリンク張っていただけるのなら、使っていただいて結構です。

多分動きますよ。

まぁ、いらない変数とか作ってますけど、たかが知れてますから無視しといてください。

ノシ

まもなく、obj-cで完成させます

また、報告。

Cにて、素数を求めるプログラムを書きました。

そして、今回こそは、発展してObj-cにすることが目標ですが、

時間がない。

まずいな。もう正月終わったし。

暇だったら発展します。

(まぁ基本結構暇だけど)

いやぁ結構感動ですよコレは

やっとできた。

ここまで長かったと感じる。

僕の短いプログラマ人生の中の今までで一番長くかかってしまったプログラムがついに完成した。はぁ

とは言っても1日半だけどね。(笑)

連立方程式を3変数の時に解くプログラムです。

フレネルの公式を使えば簡単なんだけど、それじゃぁつまんないとか思った僕が馬鹿だった。

こんだけがんばったのは初めてだ

あ、すいません。これもCで作っちゃいました(笑)

あきらめた

やっぱりあきらめました

Cverでもういいじゃん!って感じで(笑)

なんか、配列の書き方が分からない。

だめだ、どうしてもCの配列の書き方が分からない。

だから、めんどくさくなって、さぼってました。Objective-cを。

Cのどうでもいいようなプログラムばっか作ってましたね。

これからがんばることにします。
プロフィール

小さなプログラマ

Author:小さなプログラマ
小さなプログラマです。

これはあくまで、「勉強ログ」なので間違っている場合が多々あります。

なので、このブログに書いてあることは、8%くらいの信じ度でお願いします。

間違っているじゃないか!と言われてもあれなので。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
メールフォーム

名前:
メール:
件名:
本文:

カテゴリ
カウンター
検索フォーム
RSSリンクの表示
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。