PSP xvi

PSPプログラミングを教えるブログ(本気で頑張る人アクセス大歓迎サイト)

PSP-X.gif

記事の間違いを報告  新アップローダー
記事修正情報 PSPプログラミング資料 自作ゲーム PSP用エミュレータ リンク

公認リンク
公式PSP専科 公式PSVita専科 はじめるPSPSDK PSP EXEC GAME M@STER PSP 猫山のYouTubeチャンネル

TAG
全記事にタグをつけています  http://nekoyama2gillien.blog36.fc2.com/?tag=タグ
PSP PSPプログラミング DXライブラリPortable OSLib ショートプログラム ハローワールド
PSP自作ゲーム PSP自作ソフト エミュレータ ゲームアーカイブス PSP動画
動画 初音ミク ミクミクダンス MMDドラマ ゲーム 魔法少女まどか☆マギカ 侵略!イカ娘
アイドルマスター

このブログについて

このブログでは、非公式のPSPソフト、いわゆる自作ソフト( PSP Homebrew )を作る事を目的とします。

著作権などの こまかい利用規約については、こちらを開いてお読み下さい

このブログについて知りたい方、初めて来訪された方はこちらを開いてお読みください
お問い合わせは 猫山猫宗(nekomune@gmail.com)までどうぞ


当ブログはリンクフリーです。ブログ名は、アルファベットで「PSP xvi」と書いて『ピーエスピー・エクシビ』とお読みください。
相互リンクを希望されるブログ運営者様は、ココで申請して下さい。


このブログで全記事から探し物の方は、ここをクリックして下さい。
http://nekoyama2gillien.blog36.fc2.com/?all

スポンサーサイト 

--/--/--
--. --:--

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

[edit]

CM: --
TB: --

page top

2010年01月10日 更新


一般の C++言語におけるプログラムの記述は、main( ) 関数を

int main( int argc , char * argv[ ] )
{
    なるべく短く簡単に!
}

と記述するのが良い、とされています。

C++ 言語のプログラムは、標準では、まず、main( ) という関数から実行されます。
main 関数は、ソースコードのどの位置にあっても良いのです。main( )関数を一番最後に記述しても良いのですが、見づらい記述方法なので、私は 最初に main( ) 関数を書くように改めました。


  コマンドライン引数の変数には "argc", "argv" が使われます

    argc = argument count
    argv = argument vector

一般では、下記のようになります

    int argc ………… 引数の個数が入ってきます
    char *argv[] …… 引数の文字列が入ってきます


Windowsの場合では、コマンドライン上で 『ファイル名を指定して実行』 を行う際、実行するファイルに、引数(パラメータ類)を渡すことが可能です。


例:COPY コマンド

記述例:  C:> COPY OMAKE.TXT OMAKEDAYO.TXT
目的: OMAKE.TXT をコピーして OMAKEDAYO.TXT というファイルを作成(コピー)

こう記述した場合の 引数は、


引数1 = COPY
引数2 = OMAKE.TXT
引数3 = OMAKEDAYO.TXT
(これらの引数の末尾は、NULL文字 = 0x00 で終わっています)

引数の個数 = 3個


となります。引数の区切りは、半角の空白文字です。



この main( )関数の書き方は、PSPではどうなのでしょうか?

PSPにはコマンドラインは存在しないので、ゲームから EBOOT.PBP を起動させた時の引数を調べます


#include <pspkernel.h>
#include <pspdebug.h>

/* Define printf, just to make typing easier */
#define printf pspDebugScreenPrintf

PSP_MODULE_INFO("TEST",0,1,1);
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER | THREAD_ATTR_VFPU);

int main(int argc , char * argv[ ])
{
pspDebugScreenInit();

printf("argc = %d\n",argc); // 引数の個数を表示
printf("argv[0] = %s\n",argv[0]); // 引数の1個目の文字列を表示

return 0;
}

↑↑ このプログラムを終了するには PSPの電源を切って下さい(手抜きです、ごめんなさい)。

↓↓実行結果(/GAME150/の下に、/Where/フォルダーを作って その中にEBOOT.PBP を貼り付けてみました)
実行結果サンプル.png

この結果、argc は常に 1 で、argv[0] には、EBOOT.PBP の在り処(フルPATH) が入る事が判明しました。

上記結果を参考にして、引数の 'EBOOT.PBP'文字 の手前(フォルダPATH)までを グローバル変数に退避しておく事により、下記のことが可能

ms0:/PSP/GAME150/HoeHoe/EBOOT.PBP
ms0:/PSP/GAME150/HoeHoe/image/画像_0001.png

/HoeHoe/ は、使用者が勝手に作るフォルダで、製作者は まさか /HoeHoe/ フォルダに入れられるとは予想もしなかった。だが、image/画像_0001.pngファイル名は固定で分かっているので、image/画像_0001.png のフルPATH を突き止めたい!!

    'ms0:/PSP/GAME150/HoeHoe/EBOOT.PBP'

(1) argv[0]の文字列情報から、EBOOT.PBP のフルPATH を取得します
(2) そのフルPATHから、EBOOT.PBPの文字列を削除します
(3) すると、EBOOT.PBP のあるフォルダPATHが判明するので、そのPATH以下に image/画像_0001.png 文字列を付け足します
(4) 完成!

'ms0:/PSP/GAME150/HoeHoe/EBOOT.PBP'
         ↓('EBOOT.PBP'文字列を削除)
'ms0:/PSP/GAME150/HoeHoe/'
         ↓('image/画像_0001.png'文字列を付け足す)
'ms0:/PSP/GAME150/HoeHoe/image/画像_0001.png'

作成した PATH へアクセスして、データを取得可能!!


main( ) の引数から 実行した EBOOT.PBP の入っているフォルダ(在り処)を突き止める関数が、既にRukaさま(NesterJ作者さま)により開発済みですので、紹介します。

NesterJ のソース内の、 pg.c中 の pgMain( ) という関数がそうです。

NesterJ 関連のダウンロード
http://rukapsp.hp.infoseek.co.jp/PSPSoftware/NesterJ.htm
↑↑ ここから、NesterJ for PSP Ver 1.11 source というのをダウンロードして下さい。

無許可ですが、続きに その関数を改変したソースを貼り付けておきます(Rukaさん、改変禁止でしたらご一報下さいませ)

2010年01月10日 更新


////////////////////////////////////////////////////////////////////////////
//
// 起動した EBOOT.PBP が、
// どこのフォルダにあるのかを突き止めるプログラム
//
// これがあれば、EBOOT.PBP のインストール先がどこであっても
// 画像データや音声データを 正確なPATH で取り込むことが可能になります!
//
// 製作:Rukaさん@NesterJ のソース
//
///////////////////////////////////////////////////////////////////////////
// インクルード

#include <pspkernel.h>
#include <pspdebug.h>

// 数値の定義
#define MAX_PATH 512 // PATH の長さを 半角 512文字までとする

// 使用する関数の定義
void pgMain(int , char *argv[]); // eboot.pbp の在り処を突き止める関数
char* _strcpy(char *dest, const char *src); // 文字列複写関数
char* _strncpy(char *dest, const char *src, int size); // n個の文字列複写関数
int _strlen(char *str); // 文字列の長さ取得

// デバッグの pspDebugScreenPrintf関数の記述簡略化
#define printf pspDebugScreenPrintf

// グローバル変数
char pg_workdir[MAX_PATH]; // PATH の最長を MAX_PATH文字(半角個数)とする
// ↑↑ この変数に、EBOOT.PBP の PATH が入ります。

PSP_MODULE_INFO("Where",0,1,1);
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER | THREAD_ATTR_VFPU);

///////////////////////////////////////////////////////////////
// メイン
///////////////////////////////////////////////////////////////

int main(int argc, void *argv[])
{
pgMain(argc, argv); // main()の引数をそのまま渡す

pspDebugScreenInit();
printf("PATH = %s\n",pg_workdir); // PATH を表示

return 0;
}

///////////////////////////////////////////////////////////////
// EBOOT.PBP の在り処を突き止める関数(pg.cに収録されています)
///////////////////////////////////////////////////////////////

void pgMain(int argc, char *argv[])
{
int n;
char pg_mypath[MAX_PATH]; // 作業用

_strncpy(pg_mypath,argv, sizeof(pg_mypath)); // EBOOT.PBP の在り処の文字列を複写
pg_mypath[sizeof(pg_mypath)-1]=0x00; // 文字列の末尾は NULL文字です。

_strcpy(pg_workdir,pg_mypath); // 取り敢えず複写
for (n=_strlen(pg_workdir); n>0 && pg_workdir[n-1]!='/'; --n) pg_workdir[n-1]=0x00;
/* ↑↑ EBOOT.PBP の PATH の文字列末尾からスラッシュ記号の手前までをNULL文字で埋めます */
/* つまり、フルPATHの'EBOOT.PBP' という文字列部分を NULL文字に置き換えているのです。 */
}

///////////////////////////////////////////////////////////////
// 文字列の複写をする関数(string.c に収録されています)
///////////////////////////////////////////////////////////////

char* _strcpy(char *dest, const char *src) // NULL文字まで文字列複写
{
int i;

for(i=0; src[i]; i++)
dest[i] = src[i];
dest[i] = 0;

return dest;
}

char* _strncpy(char *dest, const char *src, int size) // 指定文字数の文字列複写
{
int i;

for(i=0; src[i] && size; i++, size--)
dest[i] = src[i];
while (size--) {
dest[i] = 0;
i++;
}

return dest;
}

int _strlen(char *str) // 文字列の長さ取得
{
int count=0;

while((*str++)!=0) {
count++;
}
return (count);
}
関連記事
スポンサーサイト

[edit]

CM: 5
TB: 1

page top

この記事に対するコメント

argv[0]ってそんなんだったんですかw

もうなにやってるのかなんとなくしかわからんw

solve #- | URL | 2009/08/28 00:40 * edit *

PSPやし(^^;;;;;

Windows用の C++の参考書はあっても、PSP用の C++参考書は無いのですぅ~。

だから、どんなんになるかは解らなかったと?

誰かが紐解いてやらにゃあならんのか(ぉ)。

猫山猫宗 #HfMzn2gY | URL | 2009/08/28 15:05 * edit *

argv[0]の意味を僕もはじめて知りました。
いつもこのサイトを参考にさせてもらっています。
今後もがんばってください。

lime #- | URL | 2009/08/28 19:42 * edit *

lime さんwwww

コマンドライン取得の方法なのです。

ナイスな記事がサクっと見付からなかったので作ってみたのです。

DXP では、ms0:/PSP/GAME/ナントカ/EBOOT.PBP の位置を検出するようですな。どうやってるんだろ?ソース解析するか。

猫山猫宗 #HfMzn2gY | URL | 2009/08/28 20:28 * edit *

>>二つ上の猫山猫宗さんのコメント
DXPでは相対パスを使っています。つまり、検出していませんwww

憂煉 #- | URL | 2009/08/30 17:20 * edit *

page top

コメントの投稿

Secret

page top

トラックバック

トラックバックURL
→http://nekoyama2gillien.blog36.fc2.com/tb.php/136-43340fae
この記事にトラックバックする(FC2ブログユーザー)

意外に、ディレクトリ関係の問題かもしれない

今日、ネットで実機で動かない原因をググってみました。 その中で、参考になりそうなだなと思ったページがいくつかりました。 以下、そう...

ブックカバー と 世界とのつながり と 偏頭痛 と | 2009/08/28 23:58

page top


h o m e |


 

2017-04