Share to: share facebook share twitter share wa share telegram print page

サブルーチン

プログラミングにおけるサブルーチン: subroutine)は、プログラム中で意味や内容がまとまっている作業をひとつにまとめたものである。サブプログラムあるいは副プログラム: subprogram[1]とも呼ばれ、単に「ルーチン」(: routine)と呼ばれることもある。プログラミング言語によっては、関数: function)やプロシージャあるいは手続き: procedure)とも呼ばれる。

概説

繰り返し利用されるルーチン作業モジュールとしてまとめたもので、呼び出す側の「主」となるもの(メインルーチン)と対比して「サブルーチン」と呼ばれる。

プログラムのソース中で、繰り返し現れる処理をサブルーチン化することで、可読性や保守性を高く保つことができる。繰り返し現れる処理でなくても、意味的なまとまりを示すためにサブルーチン化することもある。また、キャッシュのような階層的メモリの設計を持つコンピュータ(現在のパソコンワークステーションなどほぼすべて)では、よく使われるサブルーチンがキャッシュに格納されることで高速な動作を期待できる。

呼び出しと入出力

サブルーチンが結果として値を返す場合、その値は戻り値(もどりち)または返り値(かえりち)と呼ばれる。

プログラミング言語によっては、サブルーチンに相当する処理のまとまりを、「結果として値を返すもの」と「処理だけを行ない値を返さないもの」に分類・区別することがある。この区分はプログラミング言語の仕様で定められるため、言語により区分や名称が異なる。例えば、Pascalでは戻り値があるものを関数と呼び、戻り値がないものを手続きと呼ぶ。C言語ではいずれも関数と呼ぶ。ALGOLではいずれも手続きと呼ぶ。これらは慣習的なものであり、手続き型プログラミング関数型プログラミングといったプログラミングスタイルあるいはプログラミングパラダイムの分類とは関係がない。サブルーチンが属するスコープなどの特性によって名称を変えているものもあれば、特に区別せず同じ名称を与えているものもある。

日本の情報処理推進機構 (IPA) が運営している基本情報技術者試験で使われる疑似言語では、サブルーチンを戻り値の有無により「関数」と「手続」(てつづき)に分類している。戻り値があるほうが関数であり、戻り値が無いほうが手続である[1]。これはPascalの慣習と同じだが、もともとアルゴリズムの記述にはALGOLやPascal系の構文をもとにした疑似言語が使われることが多かった、という事情もある[2]

なお、サブルーチンは呼び出し時に入力として引数(ひきすう)を受け取り、サブルーチンの中で宣言された「仮引数」と呼ばれる変数を通じて内部処理に使うことができる。引数の渡し方には、一般的なものとして以下の2つがある[3]

  • 実引数を渡すときにその値だけを渡して、記憶場所(アドレス)は渡さない方法を「値呼び出し」または「値渡し」という。値呼び出しで変数を渡す場合、メインルーチンとは別にサブルーチン側で変数の記憶領域を確保し、そこにいったん値(データ)をコピーする。そのため、サブルーチン側で変数の値を変更しても、メインルーチンに戻ったときには元の値のままになる。
  • 実引数を渡すときにその記憶場所(アドレス)を渡す方法を「参照呼び出し」または「参照渡し」という。参照呼び出しで変数を渡す場合、メインルーチンとサブルーチンとで、変数の記憶領域が共有される。そのため、サブルーチン内でその変数に対して行なった変更操作は、メインルーチンに戻ってもそのまま反映される。

一般的には戻り値によって単一の結果を出力として返すが、参照呼び出しを使うことによって複数の結果を出力として返したり、受け渡しの際のデータコピーのコストを低減したりすることもできるようになる。

なお、Pascalでは関数/手続きの内部に、それらの中でのみ呼び出し可能な別の関数/手続きを記述することもできる。関数内関数やローカル関数などと呼ばれることもある。

一般的にサブルーチンにはプログラムソースコード上で識別可能な何らかの名前が付けられ、呼び出しの際にはその名前をもとに参照されるが、名前を持たないサブルーチン(無名関数、ラムダ式)を定義できる言語もある。

通例、サブルーチンとその呼び出し元の間での引数および戻り値の受け渡しや、サブルーチンが終了したときに呼び出し元にフロー制御を戻すための復帰位置(リターンアドレス)の一時記憶、サブルーチン内のローカル変数の割り当てには、コールスタックやレジスタが使われる。引数がスタックに積まれる順序やメモリレイアウトなどの呼び出し規約は、プログラミング言語やプロセッサ (CPU) のアーキテクチャにも依存するが、コンパイラ固有の修飾子(キーワード)によって指定できる環境もある[4][5]x64ARMのように、特定の条件を満たす引数についてはスタックではなくレジスタを経由して受け渡しされるアーキテクチャもある[6][7]

環境によっては、呼び出し規約を規定し、また引数と戻り値のデータ型を基本数値型やポインタ型などのPOD英語版型に限定することで、異なる言語間で相互運用可能なABI互換性のあるサブルーチンを定義することができる。例えばCで書かれた関数をダイナミックリンクライブラリ (DLL) や共有ライブラリ (so) にエクスポートし、Pascalの関数または手続きとして呼び出したりすることも可能となる。別の例として、Microsoft Excelでは、C/C++やPascalやVisual Basicなどを使ってDLLに実装された関数を、Visual Basic for Applications (VBA) のコードモジュールからプロシージャとして呼び出したり、ワークシートから直接利用したりすることができる[8][9]

数学の関数との違い

引数をとり、値を返すという、数学における関数との類似性から、言語によっては関数 (function) とも呼ばれるわけであるが、一般にプログラミング言語における関数は、数学におけるそれとは以下のような点が異なる。

  • 引数が同じでも状況に応じて戻り値が異なる(状態を持つ)
  • 関数の処理の実行によってシステムに変化が発生する(副作用を持つ)
  • (「関数」と「手続き」を区別しない言語では)戻り値が存在しない場合がある

これに対し、関数型言語では状態や、プログラム自身に影響するような副作用をもたないことを基本とするなど、数学の関数に近い性質を持つ。特に純粋関数型言語では数学の関数と同等であり、同様の性質(参照透過性など)を持つことが利用される。

オブジェクト指向言語の場合

多くのオブジェクト指向プログラミング言語では、何らかのオブジェクトあるいはクラスに属するサブルーチンは、メソッドと呼ばれている。Cから発展し、Simulaの影響を強く受けたC++では、クラスや構造体に属する関数はメンバー関数と呼ばれている。

JavaC#など、サブルーチンはクラスや構造体などの型に属するメソッドもしくはメソッド内のローカル関数として記述しなければならず、どこにも属さない関数(フリー関数)は定義できないオブジェクト指向言語もある。一方、C++Swiftのように、必ずしもクラスや構造体に属する必要はなく、名前空間スコープに関数を直接定義できるオブジェクト指向言語もある。

歴史

サブルーチンという考え方は、ことさら新しいものではない。アルゴリズムなどにおいて、問題を部分問題に切り分けて解くという分割統治法はコンピュータ以前からあり、コンピュータプログラミングについても、EDSACのプログラミングについて出版された、この分野の世界最初の書籍とされる The Preparation of Programs for an Electronic Digital Computer(1951)においても part one, chapter 2 がサブルーチンに関する章である。

各プログラミング言語におけるサブルーチン

おおむね歴史が古い言語から説明する。

FORTRAN

Fortranでは、値を返すサブプログラムは関数(function)、値を返さないサブプログラムはサブルーチン(subroutine)と呼ばれる。Fortran 90以降の関数はPURE属性により副作用を持たないことを明示できる。

LISP

LISPでは関数と呼ばれることが多く、Common Lispでも関数と呼ぶ。しかしSchemeの仕様では手続きという用語を使っている。なおLispにはサブルーチンをマクロで実装するという重要な手法もある。

BASIC

古典的なBASICでは、GOSUB 命令によるサブルーチンがあった。インタプリタは GOSUB 命令を見つけると、GOSUB 命令の終わりの場所(アドレス)をインタプリタ内のスタックにプッシュして保存し、命令で指定された行に飛び、実行を続ける。その後、実行中に RETURN 命令を見つけると、スタックから先ほど保存しておいた呼び出し元の場所をポップして取り出し、そこに飛び、GOSUB 命令の次の命令から実行を再開する。サブルーチンを作成したい場合は、ユーザーは「この行からこの行まではサブルーチンとする」と決めてプログラムを作成した。以上のように「RETURN できる GOTO」でしかない(引数も返り値もローカル変数もない)ため、(グローバル)変数を経由する、配列をユーザースタックとして使うなど、技巧を必要とした。比較的高機能な実装では、DEFFN 命令により、式一個で記述できる範囲という制限ながらも、引数と返り値のあるユーザー定義関数の追加(拡張)が行えるものもあった。

Pascal

Pascalではfunctionおよびprocedureという予約語を使って宣言する[注釈 1]

C言語

カーニハンリッチーによる解説書『プログラミング言語C』、いわゆる「K&R」には、C言語の関数はPascalの「手続き」や「関数」に相当すると書かれてある[10]。つまりC言語では戻り値の有無にかかわらず「関数」(function) と呼んでいる。

関数の定義の書式は次の通りである[10]

<戻り値の型> <関数名>( <引数> )
{ 
  関数内の処理の記述
}

C言語では歴史的な理由から、値を返さない関数を宣言および定義する場合は、関数の型(返戻値の型)を書く場所にvoidvoid型)と書く[注釈 2]

関数の宣言が複数ある場合、どの順番で書いても良いし、複数のファイルに分けて書いても良い[10]。ただし、ひとつの関数を複数のファイルに分けて書いてはいけない[10]

なお、K&RのCはANSI C(C89)として標準化される前の古い仕様に基づいており、Cの歴史を知るうえでは重要だが、2023年現在はISO/IEC 9899規格を参照することが望ましい。

Perl

Perlでは、ユーザー定義のものはサブルーチンであるが、引数を渡すことができ、値を返すこともできる。サブルーチン内からは、渡された引数には特殊変数からアクセスし、値を返すにはreturn文[注釈 3]を使う。

Visual Basic

Visual Basic (VB)、Visual Basic for Applications (VBA)、Visual Basic .NET (VB.NET) では、サブルーチンをプロシージャと総称しており、値を返すプロシージャを「Functionプロシージャ」、値を返さないプロシージャを「Subプロシージャ」と呼ぶ。さらにプロパティを定義するための構文として「Propertyプロシージャ」がある[11][12]

Microsoft Excelにおける関数は、主に、計算をしたり、データの検索や集計をしたり、表示を変換したりするものである。合計値を求めるSUM関数や、平均値を求めるAVERAGE関数、条件演算子に相当するIF関数など、100を超える組み込みの「ワークシート関数」が存在する。一方、VBAコードからのみ利用可能な「VBA関数」もある。例えばIIf関数[13]はIF関数に似た働きをするが、ワークシート上の数式内では利用できず、VBAからのみ利用可能である。ワークシート関数およびVBA関数はいずれもユーザー定義の関数を登録して利用することもできる。

再帰呼び出し

あるサブルーチンfの定義中でf自身を再度呼び出すことを再帰呼び出し(さいきよびだし、recursive function call)という[14][1]。再帰呼び出しを使うと、ある処理で得られた値に対しさらに同じ処理を何度も繰り返すような場合に簡潔な記述にすることができる[15]。たとえば階乗の計算をするために使ったり[1]ファイルシステムのような木構造の探索に使ったり[16]オセロソフトチェスソフト将棋ソフト囲碁ソフトなどの「先読み」に使ったりできる[注釈 4][17][18][19][20]

なお、一般的なコンピュータおよびプログラミング言語では、サブルーチン呼び出しの際はコールスタックに引数やローカル変数などの領域が確保されるが、パーソナルコンピュータのような比較的リソースに余裕のある環境であっても、このコールスタックの容量は既定でスレッドごとに数MiB程度に設定されており、サブルーチンの呼び出し階層が深すぎるとスタックオーバーフローを引き起こす場合がある。特に再帰呼び出しは呼び出し階層が深くなりがちで、再帰回数が多すぎるとスタックオーバーフローを引き起こしやすい。

脚注

注釈

  1. ^ C言語と違い、中身の記述すなわち定義まで含むものもPascalでは「宣言」と言う。
  2. ^ 標準化以前(K&R初版時代のC)は、省略した場合のデフォルトとしてintを返すと解釈される仕様だったという経緯があり、互換性を保つためにそれが標準とされたため、値を返さない場合にはvoidを書いて明示しなければならない、という仕様になっている。
  3. ^ http://perldoc.perl.org/perlsub.html には return statement とあるが、return 自体の解説は http://perldoc.perl.org/functions/return.html のように関数扱いになっている。
  4. ^ オセロゲームの盤面先読みのコードは、以前、基本情報技術者試験に出題されたことがあり教科書や問題集などでも掲載されるようになっていた。

出典

  1. ^ a b c d 大滝みや子『2020年版 基本情報技術者 標準教科書』オーム社、2019年。pp.95-96「手続きと関数」「再帰呼び出し」の章
  2. ^ 電子情報通信学会『知識の森』 - 6 群「基礎理論とハードウェア」 - 3 編「アルゴリズムとデータ構造」 - 1 章「アルゴリズムとアルゴリズム解析」
  3. ^ 問49 変数を引数として渡しても、サブルーチンの実行後に変数の値が変更されないことが保証されているものはどれか。 | 日経クロステック(xTECH)
  4. ^ Calling Conventions | Microsoft Learn
  5. ^ Argument Passing and Naming Conventions | Microsoft Learn
  6. ^ x64 calling convention | Microsoft Learn
  7. ^ Overview of ARM ABI Conventions | Microsoft Learn
  8. ^ Working with DLLs | Microsoft Learn
  9. ^ Developing DLLs | Microsoft Learn
  10. ^ a b c d Brian W. Kernighan / Dennis M. Ritchie "The C Programming Language, Second Edition", 1988. ISBN 0-13-110362-8, pp.24-27 "Functions".
  11. ^ Writing a property procedure (VBA) | Microsoft Learn
  12. ^ Property プロシージャ - Visual Basic | Microsoft Learn
  13. ^ IIf function (Visual Basic for Applications) | Microsoft Docs
  14. ^ 自分から自分を呼ぶ? Pythonで「再帰呼び出し」の不思議を体験 | 日経クロステック(xTECH)
  15. ^ 『令和04年 栢木先生の基本情報技術者教室』技術評論社、2021年、p.209「再帰的な関数の例」
  16. ^ .NET TIPS [ASP.NET]データベースからツリー・メニューを生成するには? - C# VB.NET Webフォーム - @IT
  17. ^ Chess programming
  18. ^ 将棋ソフト作成入門
  19. ^ 再帰呼び出し
  20. ^ 囲碁プログラムの作り方(基本編)

関連項目

Read other articles:

För konstmuseet i Antwerpen, se Kungliga museet för sköna konster Antwerpen. Kungliga museet för sköna konster i Belgien Etablerat1803 (invigning)[1]Webbplatshttp://www.fine-arts-museum.be Kungliga museet för sköna konster i Belgien (franska: Musées royaux des Beaux-Arts de Belgique, nederländska: Koninklijke Musea voor Schone Kunsten van België) är en grupp konstmuseer i Bryssel. Det grundades 1803 och i dess samlingar finns över 20 000 konstverk, däribland teckninga…

FirstpostPerusahaan indukNetwork 18Kantor pusatMumbai, IndiaSitus resmiwww.firstpost.com Firstpost adalah sebuah situs web berita dan media Jepang. Situs tersebut adalah bagian dari konglomerat media Network 18 milik Reliance Industries, yang juga menjalankan CNN-News18 dan CNBC-TV18.[1] Referensi ^ About Network 18. Diarsipkan dari versi asli tanggal 2018-12-02. Diakses tanggal 11 January 2014.  Pranala luar Situs web resmi

Die Alu-Polsterschiene ist eine formbare Schiene zur Immobilisation der Extremitäten. Sie wird überwiegend in der präklinischen Notfallmedizin und im Outdoor-Bereich eingesetzt. Alu-Polsterschiene geformt zur Versorgung einer Handgelenkfraktur Als Gattungsnamen für die Alu-Polsterschiene haben sich die Produktbezeichnungen SAM Splint (engl. SAM-Schiene) der Firma SAM Medical Products sowie Koch Splint der Dr. Paul Koch GmbH durchgesetzt. Inhaltsverzeichnis 1 Vorläufer 2 Aufbau 3 Anwendung 4…

Siemens-Schuckert R.VIII (1918) Un Riesenflugzeug (plural Riesenflugzeuge, término alemán que significa avión gigante), a veces denominado coloquialmente en inglés como R-plane, era cualquier miembro de una clase de grandes bombarderos alemanes desarrollados durante la Primera Guerra Mundial, que poseían al menos tres motores, aunque generalmente disponían de cuatro o más. Eran grandes aviones multimotores capaces de volar varias horas con cargas de bombas más grandes que los bombarderos…

Julian Draxler Draxler playing for Germany in 2019Informasi pribadiNama lengkap Julian Draxler[1]Tanggal lahir 20 September 1993 (umur 30)[1]Tempat lahir Gladbeck, GermanyTinggi 185 m (606 ft 11 in)[2]Posisi bermain Attacking midfielder, wingerInformasi klubKlub saat ini Al AhliNomor 7Karier junior1998–2000 BV Rentfort2000–2001 SSV Buer 07/282001–2011 Schalke 04Karier senior*Tahun Tim Tampil (Gol)2011–2015 Schalke 04 119 (18)2015–2016 VfL Wol…

هذه المقالة يتيمة إذ تصل إليها مقالات أخرى قليلة جدًا. فضلًا، ساعد بإضافة وصلة إليها في مقالات متعلقة بها. (مارس 2019) Robert Abernathy معلومات شخصية الميلاد 6 يونيو 1924  الولايات المتحدة  الوفاة 6 أبريل 1990 (65 سنة)   توسان، أريزونا  مواطنة الولايات المتحدة  الحياة العملية المه…

Yu-Gi-Oh! 5D'sLogo Tiếng Nhật của Yu-Gi-Oh! 5D's遊☆戯☆王: 5D's(Yu-Gi-Oh: 5D's)Thể loạiThám hiểm, Viễn tưởng AnimeĐạo diễnKatsumi OnoKịch bảnNaoyuki KageyamaHãng phimStudio Gallop Kênh khác The CW4Kids & Cartoon Network Network Ten CITV & Sky One (chỉ chiếu 14 tập đầu) RTE Two YTV ZAZ Phát sóng 2 tháng 4 năm 2008 – 30 tháng 3 năm 2011Số tập154 +1 special (danh sách tập) MangaTác giảSatou MasashiNhà xuất bảnShueishaĐối…

Plaza de Teucro Praza do Teucro Pontevedra, España España Datos de la rutaTipo PlazaCruces Calle RealUbicación 42°25′58″N 8°38′44″O / 42.432805555556, -8.6454444444444Mapa Plaza de Teucro Ubicación en Provincia de Pontevedra.[editar datos en Wikidata] La plaza de Teucro es una plaza de origen medieval situada en el corazón del casco antiguo de la ciudad española de Pontevedra. Es la plaza medieval de proporciones más armoniosas de la ciudad. O…

Wapen van de familie de Schietere De Schietere is een notabele en adellijke Zuid-Nederlandse familie waarvan de gedocumenteerde gegevens te vinden zijn vanaf de dertiende eeuw. De uitgebreide genealogie is exemplarisch voor de al dan niet opwaartse beklimming van de sociale ladder in een bepaalde familie. Oorsprong Twee lijnen worden onderscheiden, vanaf het einde van de dertiende eeuw, waarvan de gemeenschappelijke voorouder niet is gevonden. Het gaat om Pieter de Schietere, poorter van Oudenaa…

باول إم. دوتي معلومات شخصية الميلاد 1 يونيو 1920  تشارلستون، فيرجينيا الغربية  الوفاة 5 ديسمبر 2011 (91 سنة) [1][2]  كامبريدج، ماساتشوستس  مواطنة الولايات المتحدة  عضو في الأكاديمية الوطنية للعلوم،  والأكاديمية الأمريكية للفنون والعلوم،  والأكاديمية الصرب

Hyun BinHyun Bin pada tahun 2019LahirKim Tae-pyung25 September 1982 (umur 41)Seoul, Korea SelatanAlmamaterUniversitas Chung-Ang[1]PekerjaanAktorTahun aktif2003-sekarangAgenVAST EntertainmentTinggi184 m (603 ft 8 in)[1]Suami/istriSon Ye-jin ​(m. 2022)​Anak1Nama KoreaHangul현빈 Hanja玄彬 Alih AksaraHyeonbinMcCune–ReischauerHyŏnbinNama lahirHangul김태평 Hanja金太平 Alih AksaraGim Tae-pyeongMcCune–ReischauerKim T'ae…

КалендаріАкрополь, Афіни Базові поняття Час Минуле Сьогодення Майбутнє Вічність Доба Тиждень Місяць Рік зоряний календарний тропічний Десятиліття Століття Тисячоліття Ера Інтеркаляція Високосна секунда Високосний рік Сучасні Місячний Місячно-сонячниий Сонячний Будд…

Indian actress In this Indian name, the name Surendran is a patronymic, and the person should be referred to by the given name, Anikha. Anikha SurendranBorn (2004-11-27) November 27, 2004 (age 19)Manjeri, Kerala, IndiaOccupationActressYears active2010–present Anikha Surendran (born 27 November 2004), also known as Baby Anikha, is an Indian actress known for her work in the Malayalam, Tamil and Telugu film industries. She acted in Kadha Thudarunnu (2010), Yennai Arindhaal (2015) and V…

Este artigo não cita fontes confiáveis. Ajude a inserir referências. Conteúdo não verificável pode ser removido.—Encontre fontes: ABW  • CAPES  • Google (N • L • A) (Agosto de 2020) Ajude a melhorar este artigo sobre Arquitetura ilustrando-o com uma imagem. Consulte Política de imagens e Como usar imagens. Coordenadas: 07º 39' 00 S 014º 41' 00 E O Forte de São José do Encoje localiza-se na localidade de São José do Enco…

Disparities in educational performance This article is part of a series onEducation in theUnited States Summary By state and in insular areas By subject area History of education in the United States History of education in Chicago History of education in Kentucky History of education in Massachusetts History of education in Missouri History of education in New York City Issues Accreditation Primary and secondary Post-secondary Financing Educational attainment Law Literacy Policy Post-secondary …

Kunlun Energy Limited昆仑能源有限公司TypeState-owned enterprise (Red chip)Traded asSEHK: 135IndustryOil and natural gas explorationFounded1994HeadquartersHong Kong Island, Hong KongArea servedPeople's Republic of ChinaKey peopleChairman: Mr. Li HualinParentChina National Petroleum CorporationWebsitewww.kunlun.com.hk Kunlun EnergySimplified Chinese昆仑能源有限公司Traditional Chinese昆侖能源有限公司TranscriptionsStandard MandarinHanyu PinyinKūnlún Néngyuán Yǒ…

Manuskrip VoynichBahasaVoynichese (en) Diterbitkannilai tidak diketahuiTipe mediaVellum Pages272 OCLC1088207234Selengkapnya di Wikidata Manuskrip Voynich ditulis dengan aksara yang tidak diketahui. Manuskrip Voynich adalah buku ilustrasi misterius dengan isi yang tidak dapat dimengerti. Manuskrip Voynich menurut penanggalan radiokarbon, diperkirakan ditulis antara tahun 1450 sampai tahun 1520 oleh pengarang yang tidak diketahui serta dalam bahasa dan sistem penulisan yang juga tidak diketahui. M…

1999 film directed by Albert Pyun This article has multiple issues. Please help improve it or discuss these issues on the talk page. (Learn how and when to remove these template messages) This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Corrupt 1999 film – news · newspapers · books · scholar · JSTOR (May 20…

Denmark padaOlimpiade Musim Dingin 2010Kode IOCDENKONKomite Olimpiade Nasional dan Konfederasi Olahraga DenmarkSitus webwww.dif.dk (dalam bahasa Denmark)Penampilan pada Olimpiade Musim Dingin 2010 di VancouverPeserta18 dalam 7 cabang olahragaPembawa benderaSophie Fjellvang-Sølling (upacara pembukaan)[1]Johnny Frederiksen (upacara penutupan)Medali 0 0 0 Total 0 Penampilan pada Olimpiade Musim Dingin (ringkasan)1948195219561960196419681972–198419881992199419982002200…

Tennis tournamentThailand OpenDefunct tennis tournamentFounded2003Abolished2013LocationBangkokThailandVenueImpact ArenaCategoryATP International Series(2003–2008)ATP World Tour 250 series(2009–2013)SurfaceHard / indoorsDraw32S/16D The Thailand Open was a professional tennis tournament played on indoor hard courts. It was part of the ATP World Tour 250 series of the ATP Tour. It was held annually in Bangkok, Thailand, in the third week of September, since 2003. From 2005 to 2007, a WTA Tier I…

Kembali kehalaman sebelumnya