5: 2010-01-17 (日) 02:50:24 lina[6] [7] | 現: 2024-01-08 (月) 12:58:58 lina[6] [8] | ||
---|---|---|---|
Line 193: | Line 193: | ||
なんでKタンはfgets()を使わずにfscanf()を使ったんだろう?なにか意味がきっとあるはず・・・ | なんでKタンはfgets()を使わずにfscanf()を使ったんだろう?なにか意味がきっとあるはず・・・ | ||
+ | |||
+ | とにもかくにも!!!!! | ||
+ | |||
+ | こんなことしたら、コンパイルが通った。 | ||
+ | fp0 = fopen(optfile, "r"); | ||
+ | if (fp0 == NULL) { | ||
+ | fprintf(stderr, "Can't open \"%s\".\n", optfile); | ||
+ | return 1; | ||
+ | } | ||
+ | // for (i = 0; fscanf(fp0, " %s", fname) == 1; i++) { | ||
+ | for (i = 0; fgets(fname,32,fp0) != NULL; i++) { | ||
+ | fp1 = fopen(fname, "rb"); | ||
+ | if (fp1 == NULL) { | ||
+ | |||
+ | さーて。乱暴者のオラはこれでOSASKをコンパイルしてみようwwww | ||
+ | |||
+ | ダメか・・・ | ||
+ | |||
+ | どうも、fgetsだと改行コードが入り込むらしい。そんならってんで、こんな改行コード抜きを載せてみる。 | ||
+ | |||
+ | for (i = 0; fgets(fname,32,fp0) != NULL; i++) { | ||
+ | |||
+ | //改行コードの引っこ抜き | ||
+ | for ( i2 = 31; i2 != 0; i2--){ | ||
+ | if ( fname[i2] == 0x0a ) fname[i2] = 0; | ||
+ | if ( fname[i2] == 0x0d ) fname[i2] = 0; | ||
+ | } | ||
+ | |||
+ | fp1 = fopen(fname, "rb"); | ||
+ | if (fp1 == NULL) { | ||
+ | err1: | ||
+ | fclose(fp0); | ||
+ | |||
+ | ・・・やっぱだめだなぁ・・・orz | ||
+ | |||
+ | わからんなぁ・・・・・・。こうしてみると・・・ | ||
+ | strcpy (fname,"base.exe"); osalink.optの一行目 | ||
+ | fp1 = fopen(fname,"rb"); | ||
+ | if (fp1 != NULL){ | ||
+ | fprintf(stderr, "testOpenOK!\n", fname); ちゃんとオープンが成功してくれる! | ||
+ | fprintf(stderr, "nagasa=%d\n", strlen(fname)); 長さは8と表示される | ||
+ | fclose(fp1); | ||
+ | } | ||
+ | |||
+ | // for (i = 0; fscanf(fp0, " %s", fname) == 1; i++) { | ||
+ | for (i = 0; fgets(fname,32,fp0) != NULL; i++) { | ||
+ | |||
+ | //改行コードの引っこ抜き | ||
+ | for ( i2 = 31; i2 != 0; i2--){ | ||
+ | if ( fname[i2] == 0x0a ) fname[i2] = 0x0; | ||
+ | if ( fname[i2] == 0x0d ) fname[i2] = 0x0; | ||
+ | } | ||
+ | |||
+ | fp1 = fopen(fname, "rb"); | ||
+ | if (fp1 == NULL) { | ||
+ | err1: | ||
+ | fclose(fp0); | ||
+ | fprintf(stderr, "Can't openaaa \"%s\".\n", fname); オープンに失敗する | ||
+ | fprintf(stderr, "nagasa=%d\n", strlen(fname)); 長さも同じ8。 | ||
+ | return 1; | ||
+ | } | ||
+ | |||
+ | なぜ読み込んで改行抜きをしたfnameではエラーになるんだろう????? | ||
+ | |||
+ | こうやったらうまくいった!!! ・・・・でも納得できない・・・なんでだろう??? | ||
+ | |||
+ | strcpy (fname2,fname); | ||
+ | fp1 = fopen(fname2, "rb"); | ||
+ | |||
+ | |||
+ | *最後! 例のバッファ! [#bb8a6fe7] | ||
+ | |||
+ | このbuf0って、文字通り、対象ファイルを読み込んだものを格納するバッファだよね?? で! | ||
+ | |||
+ | static unsigned char buf0[BUFSIZE]; | ||
+ | |||
+ | この命令で、2 × 1024 × 1024バイトの''空文字が格納された文字変数''を用意したわけだよね?(しかもグローバル変数)~ | ||
+ | ・・・''グローバル変数じゃないもの''にすればOK?? | ||
+ | |||
+ | そんなわけで、こんなことしてみた。すると・・・・ | ||
+ | |||
+ | const int main(int argc, char **argv) | ||
+ | { | ||
+ | FILE *fp0, *fp1; | ||
+ | int i, i2,j, k, size, totalsize = 0; | ||
+ | unsigned char fname[32], name[8], c; | ||
+ | unsigned char fname2[32]; | ||
+ | unsigned char bufX[2*1024*1024]; | ||
+ | |||
+ | おぉ!bufXは使っていないんだけど、とにもかくにもこうやって''グローバルではない変数''しさえすれば、エラーを吐かないぞ? つまり、大きさが問題なんじゃなくて、でかい''グローバル変数''が問題ってことじゃないか! | ||
+ | |||
+ | なぜbuf0はわざわざグローバル変数になってるんだろ? それは、他の関数内でも使われてるからだよね? | ||
+ | |||
+ | const int script(char *opt, char *inp, char *out) | ||
+ | /* スクリプトが4KBを超えたら死にます */ | ||
+ | { | ||
+ | unsigned char *buf = buf0 + 4 * 1024, *scr0 = buf0, *scr1, *s, *s1; | ||
+ | FILE *fp; | ||
+ | int size, memofs, filofs; | ||
+ | |||
+ | |||
+ | ・・・あれ? この、script関数内だけじゃないか!!!!~ | ||
+ | だったらさぁ。こうやって、script関数の引数に、buf0のアドレス(ポインタ)を渡してあげればそれでいいんじゃないの?? | ||
+ | |||
+ | const int script(char *opt, char *inp, char *out, char *helmes_buf) | ||
+ | /* スクリプトが4KBを超えたら死にます */ | ||
+ | { | ||
+ | |||
+ | unsigned char *buf = helmes_buf + 4 * 1024, *scr0 = helmes_buf, *scr1, *s, *s1; | ||
+ | FILE *fp; | ||
+ | int size, memofs, filofs; | ||
+ | |||
+ | COLOR(blue){うぎゃあぁぁぁぁぁぁぁぁぁぁぁぁ!!!!! 動いた! OSASKがうごいたぞおぉぉぉぉ!!!!!} | ||
+ | |||
+ | *誰かCに詳しい人検証してくれww [#x4f02bf0] | ||
+ | |||
+ | #ref(osalink1_src_1.2.zip) |
(This host) = http://osask.net