Fedora 10...

最近一直在折腾机器玩。打算把这经历写一篇长小说,有点像硬盘的那个。

从Ubuntu 8.10换到了Fedora 10. 里面的KDE开同样的设置,Fedora要慢两点。

switch.ch是个好东西。使rpmfusion的时候要动手编辑/etc/yum.repos.d/里面的文件,都加上一个.sixxs.org,还要把#去掉。

scim不好,应该改成iBus.

compiz千万别用。至少就目前(2008年12月17日)而言。

texlive已经有东亚包了,按以前的方法折腾是折腾不下去的。愤而直接挂texlive.iso,谁叫我菜呢。

终端下的head和tail是个好用的东西。

多弄几个桌面,可以换着玩。sweet是个小孩子玩的桌面,准备给下一代玩吧。。。。

搞Fortran就用Eclipse带Photran,但是一定要装C包。这玩意源里面有,但是依赖关系还没有加。我要报告!

以上。

Photran的用法(转载自eclipse官网)

Getting Started with Managed Make

If your system has the GNU gfortran compiler installed, try this.

  1. File | New | Fortran Project
  2. Call it whatever
  3. Choose the Executable (Gnu Fortran) from the project type list   注:对于Ubuntu 8.10系统已经不再提供G77支持了,因此,编译器一定要选gfortran,即GNU Fortran
  4. Choose GCC Toolchain from the toolchain list (you may need to uncheck the "Show project types..." check box at the bottom of the window)
  5. Click Next
  6. Click on Advanced Settings
  7. Expand C/C++ Build in the list on the left, and click on Settings
  8. Click on the Binary Parsers tab.  Check the appropriate parsers for your platform. If you are using Windows, check PE Windows Parser and/or Cygwin PE Parser; if you are using Linux, check Elf Parser; if you are using Mac, check Mach-O parser.
  9. Click on the Error Parsers tab. Check the error parser(s) for the Fortran compiler(s) you will use.
  10. Click OK
  11. Click Finish
  12. Click File | New | Source File
  13. Call it hello.f90; click Finish
  14. Type the standard "Hello, World" program, and click File | Save.

    program hello
        print *, "Hello World"
        stop
    end program hello
  15. Open the Console view, and make sure "make" ran OK and compiled your program
  16. In the Fortran Projects view, expand the Binaries entry, and click on your executable (e.g., "whatever - [x86le]") 这个设计很好很强大到让人摸不着头脑,因为用M$的V$已经用惯了。。。
  17. Run | Run As | Run Local C/C++ Application (yeah, I know, it should say "Fortran Application", but it doesn't)
  18. Choose GDB Debugger (Cygwin GDB Debugger if you're under Windows)
  19. Check the Console view, and make sure Hello World appeared.

Getting Started with Standard Make

To get started, try this.  If you're under Windows, you need to be running Cygwin, c:\cygwin\bin and c:\cygwin\usr\bin should be in your system path, and the g95 libraries need to be copied into /usr/lib (to make things easier for yourself, at least).

  1. File | New | Fortran Project
  2. Call it whatever
  3. Choose Makefile Project from the project type list (it has a folder icon; do not expand it)
  4. Choose "-- Other Toolchain --" from the toolchain list <--li>Click Next
  5. Click on Advanced Settings
  6. Expand C/C++ Build in the list on the left, and click on Settings
  7. Click on the Binary Parsers tab.  Check the appropriate parsers for your platform. If you are using Windows, check PE Windows Parser and/or Cygwin PE Parser; if you are using Linux, check Elf Parser; if you are using Mac, check Mach-O parser.
  8. Click on the Error Parsers tab. Check the error parser(s) for the Fortran compiler(s) you will use.
  9. Click OK
  10. Click Finish
  11. File | New | File
  12. Call it Makefile
  13. Click Finish
  14. We assume you're familiar with how to format a Makefile.  Something like this will work for now.  Remember to start the g95 line with a tab, not spaces.  The -g switch instructs g95 to include debugging symbols in the generated executable so that it can be debugged later.

    all:
        g95 -g hello.f90

    clean:

  15. File | New | Source File
  16. Call it hello.f90
  17. Click Finish
  18. Type the standard "Hello, World" program.

    program hello
        print *, "Hello World"
        stop
    end program hello
  19. Project | Clean; then click OK
  20. Open the Console view, and make sure "make" ran OK and compiled your program
  21. In the Fortran Projects view, expand the Binaries entry, and click on your executable (e.g., "whatever - [x86le]")
  22. Run | Run As | Run Local C/C++ Application (yeah, I know, it should say "Fortran Application", but it doesn't)
  23. Choose GDB Debugger (Cygwin GDB Debugger if you're under Windows)
  24. Check the Console view, and make sure Hello World appeared.

ubuntu 8.10平台eclipse + photran部署成功

要点

 

先装cdt. 一定要和eclipse主程序的版本对上。

再装对应版本的photran(从achieve里找)。万勿追最新版,切记!特别是eclipse是从源里装的情况下。

所有的安装不要直接从压缩包里装,应该解压。解压的文件夹中应该包括两个子文件夹feature和plugins。然后,从Help - Software Updates里开,选New features to install 下一步,找到文件夹装上。

Ubuntu下关进程的办法

终端下skill <进程名>。

不行的话就 kill -9 <进程号>

注意进程号应该由ps -e 命令列出。

Ubuntu 下 Mathematica 5.2 for Linux 的透明字体解决方案 zz

说明

本文参考了鱼一尾《beryl下如何是mathematica正常显示》一文(http://acevery.blogcs.com/2007/03/berylmathematica_1.html),经实验后,稍加改动。特此致谢。

*** 引用开始 ***

发现Methematica出现严重的透明,后来一查才知道是因为visual模式选择的问题。解决方法很容易,用 mathematica -virsualchooser 启动Mathematica,然后从下往上尝试(越下面效果越高),记下第一个可以使用的模式,如我用的32。然后打开Mathematica安装目录下 SystemFiles/FrontEnd/SystemResources/X/XMathematica,修改下面几行:
*best: False
*visualClass: DirectColor <--这个是32模式的类别,要看你用的模式!
*visualID: 32
之后,Mathematica就能正常显示了。

*** 引用结束 ***

实验结果:

首先应该记得安装目录在哪里,不行就用nautilus搜,要那个大一点的目录(/usr/share下面的那个基本不是),本人找到文件的地址是/usr/local/Wolfram/Mathematica/5.2/SystemFiles/FrontEnd/SystemResources/X。

*visualID不改也能用,但是*visualClass一定要根据实际情况改。

XP与Vista双系统 tooold

在XP与Vista双系统的情况下,只有Vista“固若金汤”是不行的。XP的Admin一旦被攻陷,使用某种设置就可以破坏Vista的文件,轻而易举,不可不防焉。虽然是老话,也要有重提的必要。

zz 似曾相识么?《よく似たC言語》

 http://www.geocities.jp/eyeofeconomyandhealth/homepage/hojo/mame/c.html#c

よく似たC言語


Fortranだけに限りませんが、プログラミング言語というのは、1種類覚えてしまえば他の言語にも簡単に乗り換えることができるといわれています。それは、どれも書き方が似たものであるからです。僕もFortranのほかに、C言語を学びました(本との基礎だけですけど)。最初はビビリまくりでC言語に突入しましたが、少しの違いだけ呑み込めば、後はすんなりと学習が進んでいきました。ですから、Fortranを学ぶことは、その効果はFortranだけにとどまらないということです。
沢山あるプログラミング言語の中でも、Fortranのように科学計算の中心として使われ、またFortranと似た感覚で使用することができるC言語を少しだけ紹介してみたいと思います。全体の概念さえ理解してしまえば、後は命令文の呼び方の違いぐらいなので、少しがんばってみればプログラミングの代表言語であるC言語を簡単に会得することができます(高度なものはさすがにそれ相応の努力が必要ですが)。Fortranが分かっていれば、乗り換えは簡単です。
  • C言語では、カラム(欄・列)の概念がありません。また行も存在しません。どういうことかというと、Fortran固定形式では7欄から書かないといけないとか、1行に2つの命令文を書くことができないとかがありますが、C言語では何列目、何行目に書くこともでき、行がないので改行も空白として認識されます。C言語は行の概念がなく、どこに書いても構わないのですが、命令文が終了するときには日本語の句点の役割を持つ「;」をうつ必要があります。またFortran90のように「;」を挟みさえすれば、文を一行に何個でも書くことも可能です。
  • 空白は単なる語と語の接続(くっつかないように間隔をあける)だけの役割なので、何個空白を使っても一つの空白と同じに認識されます。なので、ソースコードを見やすくするために空白で文の位置を調節することができます。
  • Fortranよりも前の言語であるアセンブリ言語(機械語に近い言語)のように、コンピュータに対する操作能力が非常に大きいです。つまり、コンピュータを他の言語よりもいじりやすのです。。
  • プログラムの先頭でヘッダファイルをインクルードする。ヘッダファイルとは、拡張子が「.h」で、C言語で目的の操作を行なうために必要な環境を整備するためのファイルです。インクルードとは、ヘッダファイルをそのプログラムに組み込むという意味です。ヘッダファイルの概念は、Fortranのモジュールをイメージしてみると分かりやすいと思います。変数やサブルーチンをモジュールで定義すれば、USE文を使用したプログラム単位でその内容が使用(参照)可能となりましたよね。ヘッダファイルを組み込むというのもこれと同じで、C言語では変数だけでなく全ての操作がヘッダファイルの中で定義されていて、ヘッダファイルをインクルードしないと、何もできません。例えば、入出力をする場合には「stdio.h」を、Fortranでの組み込み関数を使用するには「math.h」をインクルードする必要があります。ヘッダファイルは、コンパイラを持っていればそのフォルダの中に用意されています。
  • C言語では、全てのプログラム単位が関数で成り立っています。ここがFortranと大きく違うかもしれません。関数副プログラムは関数でしたから難なく理解できると思いますが、C言語では主プログラムの部分(PROGRAM)も関数でできています。名称は「main()」です。つまり、主プログラムも副プログラムも関数なのです。
  • 関数の初めと終わりには中括弧が付きます。「main()」にも当てはまります。これはFortranでは「PROGRAM」や「SUBROUTINE」ではじまり、「END」で終了していたところが、C言語では「{」で始まり、「}」で終了します。このほうが無駄に長い英字で始まりと終わりを宣言しなくていいので、見やすくなります。くれぐれも中括弧を入力するときには、しっかりshiftキーを押してくださいね。僕はよく失敗して、中括弧とよく似た大括弧で入力してしまい、わけの分からないコンパイルエラーを受けてしまいます。
  • C言語では「ポインタ」という道具が有名です。同時に、これがC言語を難しい言語としてしまっている存在であるともいえます。ポインタとは、「指示するもの」という意味です。「アドレス」という、変数(データ)のメモリー上の住所を指し示し、そのアドレスにある値を表示します。これを使用することにより、コンパクトな記述、配列ではできないことが可能となります。ポインタの操作は強力で、時には重大なエラーを生じさせてしまうことがあるが、ハードウェアへの強力な力を発揮します。Fortranにそこまでのポインタ能力はありません。
  • ダイクストラの構造化プログラミングの主張の後に登場した言語なので、構造化思考が整っています。とくにgoto文を使用しないことに徹底していて、文番号の概念がありません。

試しにC言語でプログラムを書いてみましょう。Fortranで書いた例文が下の文です。

program main
print *,'Hello world!'
end program

そして、これがC言語で記述した場合の文です。

#include
void main(){
printf("Hello world!¥n");
return 0;
}

結構見た目が変わりましたね。でも、最初に適切なヘッダファイル(C言語に必須なのは「stdio.h」)、主プログラムも関数になること、関数の初めと終わりは中括弧、あとは命令文の名称の違いだけ理解できれば、ほとんど同じであることが分かると思います。ちなみに、「void」とあるのは、「この(main)関数は値を返し(持ち)ません」という意味で、それを実行しているのが「return 0」です。値を返すというのは、Fortranでの副プログラムの結果変数に値をしまうことです。この場合は、副プログラムを使用していませんので、mainプログラムを呼び出した別のプログラム単位(例えばFortranのサブルーチン)mainプログラムの値を返す必要がないので、「値0を返す」、つまり値を返さない処理を行なっているというわけです。
では下に、Fortranで使用されている命令文が、C言語ではどのような名称で呼ばれているのかを紹介していきたいと思います。簡単にしか紹介しないので、少ないですが、C言語にはFortranを超える沢山の命令文が他にも用意されています。

integer int a;
real float a;
character char a;
double precision double a;
配列 int a[3];
write
print
printf("この答えは%d",a);
read scanf("%d %d",&a,&b);
if else endif if(a>3){命令文;}
else{命令文;}
case switch(a){
case 0:命令文
break;
case 1:命令文
break;
default:命令文
break;
}
do for(i=1;i<8;i++){命令文;}
while(i>=2){命令文;}
do{命令文;]while(i=3);
save static
type mainよりも上側で
struct Student{
char name;
int number;
};

void main(){
struct Student seito
seito.number=11
function mainよりも上側で int sum(int x,int y);

void main(){  int x,y,z;
z=sum(x,y);  printf("和は%d",z);
return 0;
}

int sub(int x,int y){
int z;
z=x+y;
return z;
}


どうですか。これは本の一部ですが、結構C言語の言葉はFortranと似ているのではないかと思います。後は慣れです。書き方の形式に慣れてしまえば(特に中括弧とセミコロン)、後はFortranで培った知識を生かせば、簡単にC言語のプログラミングを行なうことができます。C言語にはポインタに代表されるようなFortranよりも強力な操作が可能なので、Fortranでは簡単すぎて飽き飽きしてしまった人にはぴったりかもしれません。
もしC言語をやってみたい・もっと詳しく知りたいと思った人は、ぜひ『プログラムを書こう! C入門』を訪れてみてください。このページはC言語を詳しく分かりやすく書いているページでオススメです。さらにC言語の進化形であるC++や、C言語と並んで有名なJavaも扱っているので、みんなまとめて学習するのもいいと思います。せっかくFortranを学んだなら、C言語にもチャレンジしてみてくださいね。 

很菜的Sodoku Solver

其实是模拟了手工填写数独的方法,用的排除法。这个代码的不足在于没有怎么规划,其实board::pencilMark()完全可以做成按行、列、正方形顺序将所有的方格的pencil mark全部填好。稍加改动,可以解16*16或8*8的数独。

  1. using namespace std;
  2.  
  3. class cell
  4. {
  5. private:
  6.     int number;
  7.     int pencil;
  8. public:
  9.     bool getPencil(int num);
  10.     bool setPencil(int num);
  11.     bool isHavingPencil(void);
  12.     int  getAllPencil(void);
  13.     bool erasePencil(int num);
  14.     int  getNumber(void);
  15.     bool fillNumber(int num);
  16.     bool initCell(int num);
  17.     bool clearPencil(void);
  18. protected:
  19. };
  20.  
  21. bool cell::getPencil(int num)
  22. {
  23.     return (pencil & (1<<num))?true:false;
  24. }
  25.  
  26. bool cell::setPencil(int num)
  27. {
  28.     if(!num)
  29.         return true;
  30.     if(pencil & (1<<num))
  31.         ;
  32.     else
  33.         pencil += (1<< num);
  34.     return true;
  35. }
  36.  
  37. bool cell::isHavingPencil(void)
  38. {
  39.     return pencil?true:false;
  40. }
  41.  
  42. int  cell::getAllPencil(void)
  43. {
  44.     return pencil;
  45. }
  46.  
  47. bool cell::erasePencil(int num)
  48. {
  49.     if(!num)    //Meet zero
  50.         return true;
  51.     if(pencil & (1 << num))
  52.         pencil -= 1<< num;
  53.     return true;
  54. }
  55.  
  56. int  cell::getNumber(void)
  57. {
  58.     return number;
  59. }
  60.  
  61. bool cell::fillNumber(int num)
  62. {
  63.     number = num;
  64.     clearPencil();
  65.     return true;
  66. }
  67.  
  68. bool cell::initCell(int num)
  69. {
  70.     number = num;
  71.     pencil = num?0:((1 << 10) - 2);
  72.     return true;
  73. }
  74.  
  75. bool cell::clearPencil(void)
  76. {
  77.     pencil = 0;
  78.     return true;
  79. }
  80.  
  81. class board
  82. {
  83. private:
  84.     cell boardCells[10][10];
  85.     int blankCell;
  86.     int cellSolved;
  87. public:
  88.     bool solveOneStep(void);
  89.     bool pencilMark(int x, int y);
  90.     bool decideNumber(void);
  91.     void printBoard(void);
  92.     bool readCell(void);
  93. protected:
  94.  
  95. };
  96.  
  97. void getSquare(const int x, const int y, int & left, int & top)
  98. {
  99.     static int coordinates[]={0,1,1,1,4,4,4,7,7,7};
  100.     left = coordinates[x];
  101.     top = coordinates[y];
  102.     return;
  103. }
  104.  
  105. bool board::pencilMark(int x, int y) //True for having pencil mark, false for not.
  106. {
  107.     int linearPointer, sqLinePointer, sqColumnPointer, sqLeft, sqTop;
  108.     int reading;
  109.  
  110.     if(!(boardCells[x][y].getNumber())) //Blank Cell.
  111.     {
  112.         boardCells[x][y].initCell(0);   //Initialize pencil marks.
  113.         //Line
  114.         for(linearPointer = 1; linearPointer <= 9; linearPointer ++)
  115.         {
  116.             if (linearPointer == y)
  117.                 continue;
  118.             reading = boardCells[x][linearPointer].getNumber();
  119.             if (reading)
  120.                 boardCells[x][y].erasePencil(reading);
  121.         }
  122.    
  123.         //Column
  124.         for(linearPointer = 1; linearPointer <= 9; linearPointer ++)
  125.         {
  126.             if (linearPointer == x)
  127.                 continue;
  128.             reading = boardCells[linearPointer][y].getNumber();
  129.             if (reading)
  130.                 boardCells[x][y].erasePencil(reading);
  131.         }
  132.        
  133.         //Square
  134.         getSquare(x, y, sqLeft, sqTop);
  135.         for(sqLinePointer = 0; sqLinePointer < 3; sqLinePointer ++)
  136.         {
  137.             if (x - sqLeft == sqLinePointer)
  138.                 continue;
  139.             for(sqColumnPointer = 0; sqColumnPointer < 3; sqColumnPointer ++)
  140.             {
  141.                 if(y - sqTop == sqColumnPointer)
  142.                     continue;
  143.                 reading = boardCells[sqLeft + sqLinePointer][sqTop + sqColumnPointer].getNumber();
  144.                 if(reading)
  145.                     boardCells[x][y].erasePencil(reading);
  146.             }
  147.         }
  148.     }
  149.     else
  150.         return true;
  151.     return boardCells[x][y].isHavingPencil();
  152. }
  153.  
  154. bool board::decideNumber(void) //True for progress, false for no.
  155. {
  156.     int x, y, marks;
  157.     bool retlog;
  158.  
  159.     cellSolved = 0;
  160.  
  161.     //Calculate pencil marks.
  162.     for(x = 1; x <= 9; x++)
  163.     {
  164.         for(y = 1; y <= 9; y++)
  165.         {
  166.             retlog = pencilMark(x, y);
  167.             if(!retlog)
  168.                 goto noSolution;
  169.         }
  170.     }
  171.  
  172.     //Search for single pencil mark.
  173.     for(x = 1; x <= 9; x++)
  174.     {
  175.         for(y = 1; y<= 9; y++)
  176.         {
  177.             if(boardCells[x][y].getNumber()) //Already have number
  178.                 continue;
  179.             marks = boardCells[x][y].getAllPencil();
  180.             if(!(marks & (marks - 1))) // Only have one number.
  181.             {
  182.                 switch(marks)
  183.                 {
  184.                 case 2:
  185.                     boardCells[x][y].initCell(1);break;
  186.                 case 4:
  187.                     boardCells[x][y].initCell(2);break;
  188.                 case 8:
  189.                     boardCells[x][y].initCell(3);break;
  190.                 case 16:
  191.                     boardCells[x][y].initCell(4);break;
  192.                 case 32:
  193.                     boardCells[x][y].initCell(5);break;
  194.                 case 64:
  195.                     boardCells[x][y].initCell(6);break;
  196.                 case 128:
  197.                     boardCells[x][y].initCell(7);break;
  198.                 case 256:
  199.                     boardCells[x][y].initCell(8);break;
  200.                 case 512:
  201.                     boardCells[x][y].initCell(9);break;
  202.                 default:
  203.                     cout << "ERROR! ";
  204.                 }
  205.                 blankCell--;
  206.                 cellSolved++;
  207.             }
  208.         }
  209.     }
  210.     if(cellSolved)
  211.         return true;
  212.    
  213.     int searchNum;
  214.     int markCount;
  215.     int lastPos, lastSqX, lastSqY;
  216.     int linearIndex, sqRowIndex, sqColumnIndex, sqLeft, sqTop;
  217.     //Search for only candidates.
  218.          
  219.     //By Row
  220.     for(x = 1; x <= 9; x++)
  221.     {
  222.         for(searchNum = 1; searchNum <= 9; searchNum ++)
  223.         {
  224.             markCount = 0;
  225.             lastPos = 0;
  226.             for(linearIndex = 1; linearIndex <= 9; linearIndex++)
  227.             {
  228.                 if(boardCells[x][linearIndex].getPencil(searchNum))
  229.                 {
  230.                     markCount ++;
  231.                     lastPos = linearIndex;
  232.                 }                   
  233.             }
  234.             if(markCount == 1)
  235.             {
  236.                 boardCells[x][lastPos].initCell(searchNum);
  237.                 goto foundSolution;
  238.             }
  239.         }
  240.     }
  241.  
  242.     //By Column
  243.     for(y = 1; y <= 9; y++)
  244.     {
  245.         for(searchNum = 1; searchNum <= 9; searchNum ++)
  246.         {
  247.             markCount = 0;
  248.             lastPos = 0;
  249.             for(linearIndex = 1; linearIndex <= 9; linearIndex++)
  250.             {
  251.                 if(boardCells[linearIndex][y].getPencil(searchNum))
  252.                 {
  253.                     markCount ++;
  254.                     lastPos = linearIndex;
  255.                 }                   
  256.             }
  257.             if(markCount == 1)
  258.             {
  259.                 boardCells[lastPos][y].initCell(searchNum);
  260.                 goto foundSolution;
  261.             }
  262.         }
  263.     }
  264.    
  265.     //By Square
  266.     for(sqLeft = 1; sqLeft < 9; sqLeft += 3)
  267.     {
  268.         for(sqTop = 1; sqTop < 9; sqTop += 3)
  269.         {
  270.             for(searchNum = 1; searchNum <= 9; searchNum ++)
  271.             {
  272.                 markCount = 0;
  273.                 lastSqX = 0, lastSqY = 0;
  274.                 for(sqRowIndex = 0; sqRowIndex < 3; sqRowIndex ++)
  275.                 {
  276.                     for(sqColumnIndex = 0; sqColumnIndex < 3; sqColumnIndex++)
  277.                     {
  278.                         if(boardCells[sqLeft + sqRowIndex][sqTop + sqColumnIndex].getPencil(searchNum))
  279.                         {
  280.                             markCount ++;
  281.                             lastSqX = sqRowIndex, lastSqY = sqColumnIndex;
  282.                         }
  283.                     }
  284.                 }
  285.                 if(markCount == 1)
  286.                 {
  287.                     boardCells[sqLeft + lastSqX][sqTop + lastSqY].initCell(searchNum);
  288.                     goto foundSolution;
  289.                 }
  290.             }
  291.         }
  292.     }
  293.            
  294.     if(blankCell)   //Not solved yet.
  295.         cout << "Cannot solve. " << endl;
  296.     return false;
  297.  
  298. foundSolution:
  299.     cellSolved ++;
  300.     blankCell --;
  301.     return true;
  302.    
  303. noSolution:
  304.     cout << "No Solution!!" << endl;
  305.     return false;
  306.    
  307. }
  308.  
  309. bool board::solveOneStep(void)
  310. {
  311.     int x, y;
  312.     for(x = 1; x <= 9; x++)
  313.         for(y = 1; y<= 9; y++)
  314.             pencilMark(x,y);
  315.     return decideNumber();
  316. }
  317.  
  318. bool board::readCell(void)
  319. {
  320.     int x, y, recv;
  321.     blankCell = 0;
  322.     for(x = 1; x <= 9; x++)
  323.         for(y = 1; y <= 9; y++)
  324.         {
  325.             cin >> recv;
  326.             boardCells[x][y].initCell(recv);
  327.             if(recv==0)
  328.                 blankCell++;
  329.         }
  330.     return true;
  331. }
  332.  
  333. void board::printBoard(void)
  334. {
  335.     int x, y, num;
  336.     num = 0;
  337.     for(x = 1; x <= 9; x++)
  338.     {
  339.         for(y = 1; y <= 9; y++)
  340.         {
  341.             num = boardCells[x][y].getNumber();
  342.             cout << " " << num;
  343.         }
  344.         cout << "\n";
  345.     }
  346. }
  347.  
  348. int _tmain(void)
  349. {
  350.         board game;
  351.     int counter = 0;
  352.    
  353.     cout << "VIKTOR\'S SODUKU SOLVER VER 1.00A SEPT 7, 2008\n";
  354.     cout << "Input soduku, 0 for blank\n";
  355.    
  356.     game.readCell();
  357.     cout << "Your initial soduku is: \n\n";
  358.     game.printBoard();
  359.  
  360.     while(game.solveOneStep())
  361.     {
  362.         counter ++;
  363.     /*DEBUG CODE
  364.         cout << "The " << counter << " step of soduku is: \n\n";
  365.         game.printBoard();
  366.     */
  367.     }
  368.  
  369.     cout << "Your soduku is solved after " << counter << " steps as follows: \n" ;
  370.     game.printBoard();
  371.    
  372.     return 0;
  373. }
  374.  
  375.  

Viktor的Fortran手记之五 IFC可视化设计(二)

5 连接变量和对话框

对话框必须连接到变量上。变量的类型是

type(dialog)

并且定义在IFLOGM.F90模块中。(CFC是定义在DIALOGM模块中)具体的连接方式如下:

use iflogm
include 'resource.fd' !默认的资源文件头
type(dialog) dlg
logical retlog
retlog = DlgInit(IDD_WINDOW, dlg)

6 使用对话框的一般过程

  1. 建立TYPE(dialog)型变量,并调用DlgInitDlgInitWithResourceHandle函数连接对话框。
  2. DlgSet等手段,赋予控件初始值。
  3. 使用DlgSetSub函数,规定控件响应回调程序。
  4. 显示对话框。模态可用DlgModal,无模态情况下用DlgModeless函数调用,并在消息处理例程中增加DLGISDLGMESSAGE事件。
  5. DlgGet等手段取用控件值。
  6. DlgUninit释放对话框。(必要!)

7 Edit和Static

这些都是最普通的控件,使用时,没有必要附加属性指定,因为得以存取的,无非是字串(对应字串型)。DlgGet与DlgSet是重载函数。如果用逻辑型变量存取,修改的是Enabled属性。IFC Documentation给出了一个内部读写的例子,插在事件处理回调程序中:

!无关定义等略

character(256) text !按Viktor的习惯还是写character(len=256)好
logical retlog

select case (control_name)
    case (IDC_EDIT_CELSIUS)
        retlog = DlgGet(dlg, IDC_EDIT_CELSIUS, text) !将Edit内容装入text中
        read (text, *, iostat = retint) cel !所谓“内部读取”,其实是数据转化过程
        if (retint .eq. 0) then !成功,以免没有读到正确的值
            far = (cel - 0.0) * (212.0 - 32) / 100.0 + 32.0 !为什么不化简?
            write (text, *) far !内部输出。不用判断了。
            retlog = DlgSet(dlg, IDC_EDIT_FAR, trim(adjustl(text))) !左对齐好看
        end if
    !下略
end select case

Viktor的Fortran手记之四 IFC可视化设计(一)

呵呵……原来在日文版的浏览器下FCKEditor也会变日文版的……很好很强大……

下列内容根据Intel(R) Visual Fortran Compiler Documentation编译。

1 控件类型支持

除ActiveX外,Intel Visual Fortran Compiler(以下简称IFC)支持十五种控件:

  1. Button
  2. Check box
  3. Combo box
  4. Edit box
  5. Group box
  6. List box
  7. Picture
  8. Progress bar
  9. Radio button
  10. Scroll bar (horizonal)
  11. Scroll bar (vertical)
  12. Slider
  13. Spin control
  14. Static text
  15. Tab control

2 控件值的取用: DLGGET()

注意,该东西是个函数,返回逻辑型(.true.对应“成功”,.false.对应“成仁”)。需要什么,应该写成参数。写法是

逻辑值 = DlgGet(对话框变量, 控件ID, 存放值的变量, 需要的值的名称)

比如

retlog = DlgGet(dlg, IDC_SCROLLBAR_TEMPERATURE, slidepos, DLG_POSITION)

需要注意的是,读EDIT控件只能读字符串,存到字符串(一般可用txt之类的名字)中。需要数值时再用read读数值:

double precision :: tol

...

retlog = DlgGet(dlg, IDC_EDIT_TOL, text)
!因为Edit的默认属性就是框里的内容
read (text, *) tol

3 将H文件转化为FD文件

IFC提供DEFTOFD程序。是不是自动的,没试,不敢说。

4 主程序要求

必须

use iflogm

也必须包含.fd文件,如

include 'resource.fd'