のりを さんが書きました: ↑3年前
スタートが「aaa(10進数だと0)」、終了が「baa(10進数だと262144)」以降だとすると、
Convert_10_64(start_num, &set64,strlen("aaa"));
このようにして文字数を渡して、0から262143までは64進数変換後の文字数に応じて先頭に「a」と追加するということでしょうか?
そうなると、無駄(というと語弊がありますが)な処理をしていると思うのですが、どのように対処するべきでしょうか?
まず、毎回strlenを呼ぶのは無駄(運が良ければ最適化してくれるかもしれませんが、無駄な可能性)ですね。
ループ前に長さを1回取得し、それを使うといいでしょう。
コード:
const char* start = "aaa", *end = "ccc";
int len = strlen(start);
Convert_Str_10(start, end);
while(start_num <= end_num) //266304 != 532680
{
Convert_10_64(start_num, &set64, len);
start_num++;
}
また、10進数から64進数の変換処理では、
現在「xが0になるまで」となっている場所を、「xが0になるか、指定の桁数に到達するまで」とする方法があります。
しかし、これだと0に対する無駄な割り算が発生してしまいます。
「先頭にaを追加する」という処理の方が無駄が少ないでしょう。
のりを さんが書きました: ↑3年前
char set64[]をグローバル変数にして
wsprintf(set64,"%s",set);
とした場合は問題ないでしょうか?
wsprintfを使うと無駄にWindowsに依存する上、
UNICODEマクロが定義されていると文字列の型が合わなくなってしまうので、よくないですね。
今回の場合、char set64[]をグローバルの十分な要素数の配列とし、
を使うといいでしょう。
もしくは、setを経由せずstrから直接strcpyをしてもいいでしょう。