ページへ戻る

− Links

 印刷 

hideyosi​/osalink1でお勉強 のバックアップの現在との差分(No.7) :: OSASK計画

osaskwiki:hideyosi/osalink1でお勉強 のバックアップの現在との差分(No.7)

« Prev[4]  Next »[5]
7: 2010-01-17 (日) 16:36:45 lina[6] ソース[7] 現: 2024-01-08 (月) 12:58:58 lina[6] ソース[8]
Line 214: Line 214:
    for (i = 0; fgets(fname,32,fp0) != NULL; i++) {     for (i = 0; fgets(fname,32,fp0) != NULL; i++) {
 + 
      //改行コードの引っこ抜き       //改行コードの引っこ抜き
      for ( i2 = 31; i2 != 0; i2--){       for ( i2 = 31; i2 != 0; i2--){
Line 220: Line 220:
        if ( fname[i2] == 0x0d ) fname[i2] = 0;         if ( fname[i2] == 0x0d ) fname[i2] = 0;
      }       }
 + 
     fp1 = fopen(fname, "rb");      fp1 = fopen(fname, "rb");
     if (fp1 == NULL) {      if (fp1 == NULL) {
Line 227: Line 227:
・・・やっぱだめだなぁ・・・orz ・・・やっぱだめだなぁ・・・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)
« Prev[4]  Next »[5]