2016-06-18 1 views
-1

こんにちは私はCでクラス用のlc3アセンブラ(??)を書くはずですが、私はトークナイザを書いていませんでした。私のセグメンテーションの誤り。最初の行の後に。LC3アセンブラのためにCでカスタムトークナイザを書く

\ n \ rと考慮してください。そして新しい行は が

英数字または、または間違ったスペース以外を検討し、コメントをスキップする(初めてのポスターがところで。本当にここに人を愛する!うまくいけば、いつか貢献する十分得られます!)

ありがとうございます。

ファイル入力(run.asm)

.ORIG 0X3000 
HALT 

トークナイザ。

// 512 lines max 
// 10 token max 
// 32 char tokean max. 
char code[512][10][32]; 


//skips comment, 
void Tokenize(FILE *fileIn){ 
    int i = 0; 
    int j = 0; 
    int k = 0; 
    char in = '\0'; 
    bool freshLine = false; 
    bool freshToken = false; 

    while((in = fgetc(fileIn)) != EOF){ 

     if((in >= 'A' && in <= 'Z') || (in >= 'a' && in <= 'z') || (in >= '0' && in <= '9') || in == '-' || in == '.'){ 
      if(freshLine){ 
       code[i][j][k] = '\0'; 
       freshLine = false; 
       freshToken = false; 
       k=0; 
       j= 0; 
       i++; 
       printf("\n"); 
      } 
      else if(freshToken){ 
       code[i][j][k] = '\0'; 
       freshToken = false; 
       k=0; 
       j++; 
       printf("^"); 
      } 
      code[i][j][k++] = in; 
      printf("%c", in); 
     } 
     else if(in == ';' || in == '\n' || in == '\r'){ 
      freshLine = true; 
     } 
     else{ 
      freshToken = true; 
     } 
    } 
} 
+0

は無駄にそれをしました。私はファイルを削除し、コンピュータを再起動し、gccの代わりにclangを使用しました。そのうちの1人はそれを修正しました!助けてくれてありがとうtho! –

答えて

-1

セグメント違反がある場合は、ツールを使用してエラーを調査することをおすすめします。

このプログラムには、あなたの関数Tokenize(変更なし)が含まれ、コンパイルされ、エラーなく実行されます。

#include <stdio.h> 
#include <stdbool.h> 

// 32 char tokean max. 
char code[512][10][32]; 

//skips comment, 
void Tokenize(FILE *fileIn) { 
    int i = 0; 
    int j = 0; 
    int k = 0; 
    char in = '\0'; 
    bool freshLine = false; 
    bool freshToken = false; 

    while ((in = fgetc(fileIn)) != EOF) { 

     if ((in >= 'A' && in <= 'Z') || (in >= 'a' && in <= 'z') || (in >= '0' && in <= '9') || in == '-' || 
      in == '.') { 
      if (freshLine) { 
       code[i][j][k] = '\0'; 
       freshLine = false; 
       freshToken = false; 
       k = 0; 
       j = 0; 
       i++; 
       printf("\n"); 
      } 
      else if (freshToken) { 
       code[i][j][k] = '\0'; 
       freshToken = false; 
       k = 0; 
       j++; 
       printf("^"); 
      } 
      code[i][j][k++] = in; 
      printf("%c", in); 
     } 
     else if (in == ';' || in == '\n' || in == '\r') { 
      freshLine = true; 
     } 
     else { 
      freshToken = true; 
     } 
    } 
} 

int main(int argc, char **argv) { 
    int ch; 

} 

あなたはでプログラムを分析し、何のセグメンテーション違反がないことを確認することができます

~/C/gnu> valgrind ./a.out 
==18584== Memcheck, a memory error detector 
==18584== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al. 
==18584== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info 
==18584== Command: ./a.out 
==18584== 
==18584== 
==18584== HEAP SUMMARY: 
==18584==  in use at exit: 0 bytes in 0 blocks 
==18584== total heap usage: 0 allocs, 0 frees, 0 bytes allocated 
==18584== 
==18584== All heap blocks were freed -- no leaks are possible 
==18584== 
==18584== For counts of detected and suppressed errors, rerun with: -v 
==18584== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) 
関連する問題