iPhone用のプロジェクトで用いる予定です。
途中までできていますが、C言語の素人なもので、以下の点が分かりません。
下記コードの①②③④について、お教えください。
+( ①戻り値の型 )getPathList:(NSString *)path
{
②配列の宣言
FTS* fts;
FTSENT *entry;
char* paths[] = {
[path cStringUsingEncoding:NSUTF8StringEncoding], NULL
};
fts = fts_open(paths, 0, NULL);
while ((entry = fts_read(fts))) {
③絶対パス(entry->fts_path)の配列への格納処理;
}
fts_close(fts);
return ④配列;
}
一般に、C言語で文字列の配列を扱うには、「ポインタへのポインタ」を使います。
まずポインタ群を入れる配列を用意した上で、その配列の個々のポインタに文字列を登録していくわけです。
例示するとこんな感じで:
void main()
{
char **array=func();
printf("%s",array[0]);
printf("%s",array[1]);
・
・
・
}
char **func()
{
char **ret;
ret=(char **)malloc( sizeof(char *) * 10 ); <-文字列10個ぶんのポインタ配列を確保
ret[0]=(char *)malloc( .... ); <-最初の文字列のバッファを確保
strcpy(ret[0] , ..... ); <-最初の文字列をコピー
ret[1]=(char *)malloc( .... ); <-2つ目の文字列のバッファを確保
strcpy(ret[1] , ..... ); <-2つ目の文字列をコピー
・
・
・
return ret;
}
ご質問の例の場合も同様に処理することは可能ですが、fts_read()で得られる要素数の総数が事前にわからないのが難点になります。上記例で最初にretに設定するポインタ配列の総数が事前決定できないのです。
この場合の解決方法はいくつか考えられます。
いずれにしても、少々面倒な実装をする必要が生じます。
C言語で書く場合、こんな感じかと。
「realloc()を使ってポインタ配列を動的に拡張しつつ登録する。」の方針を使ってます。サイズは倍々ゲームで。
char **getPathList(char *path){
FTS* fts;
FTSENT *entry;
int size = 10;
char **retArray = malloc(sizeof(char *)*size)
fts = fts_open(path, 0, NULL);
int i;
for(i=0;entry = fts_read(fts);i++) {
if(i==size){
size *= 2;
retArray = realloc(retArray,sizeof(char *)*size)
}
retArray[i] = malloc(entry->fts_pathlen);
memcpy(retArray[i],entry->fts_path,entry->fts_pathlen);
}
fts_close(fts);
return retArray;
}
ここまで書いといてなんですが、
c言語とobjective-cを混同していません?
ご回答ありがとうございます
もともとobjective-cのNSFileManagerを使っていたのですが、下記の記事を見まして、c言語での配列についてご質問させていただいた次第です。
[iOS] ディレクトリ配下の総ファイルサイズを計算する ~ BSDのftsを使う
http://cocoadays.blogspot.jp/2011/03/ios-bsdfts.html
ご回答ありがとうございます
2012/04/10 22:09:07自分には、少しレベルが高いのですが、時間をかけて理解したいと思います