2012-12-05 110 views
2

我遇到了一個我正在製作的C程序的問題。當我編譯它並在我的Mac(在Windows 7分區上)和我的工作電腦(Windows 7上)上運行它時,它工作正常,但我需要它在運行CNC的PC上運行,它在Windows XP上。我可以改變兩臺電腦上的程序位置,但它不會在Windows XP電腦上的任何地方工作它似乎崩潰時,它必須寫一個文本文件,但它可以覆蓋一個......是否有一些功能與Windows XP不兼容?我會再嘗試一些,如果我遇到過什麼,我會讓你知道。當從計算機移動到計算機時發生崩潰程序

P.S.無法使用此計算機上的調試器,因爲我無法安裝程序...(工作計算機)。

這裏是造成問題的代碼:

int WritePrograms(int vitesse, double hauteur, int longueur, int largeur, double localRabotage, double localGroove, int overdrive) 
    { 
     char nameOfFile[75]; 
     char nomProgramR[75]; 
     char nomProgramG[75]; 
     char cheminDaccesR[100]; 
     char cheminDaccesG[100]; 
     char cheminDaccesGen[] = "programmes/"; 
     char genR[] = "_Rabotage.nc"; 
     char genG[] = "_Groove.nc"; 
     char confirmation [3]; 
     int i = 0; 
     int c = 0; 

     char *nomProgram = NULL; 
     char *caractere = NULL; 

     FILE* fichierRabotage = NULL; 
     FILE* fichierGroove = NULL; 

     do 
     { 
      memset(nomProgramG,0,sizeof(nomProgramG)); 
      memset(nomProgramR,0,sizeof(nomProgramR)); 
      memset(nameOfFile,0,sizeof(nameOfFile)); 
      memset(cheminDaccesG,0,sizeof(cheminDaccesG)); 
      memset(cheminDaccesR,0,sizeof(cheminDaccesR)); 
      do 
      { 
      printf("\nVeuillez choisir un nom pour votre programme : "); 
      nomProgram = Saisie(nameOfFile,60); 
      }while (nomProgram == "0"); 

      if (strcmp(nomProgram,"exit") == 0) 
      { 
       printf("\nVous avez decider de ne pas creer le programme\n\n"); 
       Sleep(2000); 
       exit(0); 
      } 
      else if (strcmp(nomProgram,"\0") == 0) 
      { 
       printf("\nVous n'avez pas rentrer de nom pour votre programme\n"); 
       sprintf(nomProgramR,"%dX%.0fX%dX%d_Rabotage.nc",vitesse,hauteur*10000,longueur,largeur); 
       sprintf(nomProgramG,"%dX%.0fX%dX%d_Groove.nc",vitesse,hauteur*10000,longueur,largeur); 
       printf("\nUn nom generique lui a ete attribuer\n"); 
       sprintf(nomProgram,"%dX%.0fX%dX%d",vitesse,hauteur*10000,longueur,largeur); 
       printf("\n%s\n",nomProgram); 
       strcpy(cheminDaccesR,cheminDaccesGen); 
       strcpy(cheminDaccesG,cheminDaccesGen); 
       strcat(cheminDaccesR,nomProgramR); 
       strcat(cheminDaccesG,nomProgramG); 
      } 
      else 
      { 
       strcpy(nomProgramG,nomProgram); 
       strcpy(nomProgramR,nomProgram); 
       strcpy(cheminDaccesR,cheminDaccesGen); 
       strcpy(cheminDaccesG,cheminDaccesGen); 
       strcat(nomProgramR,genR); 
       strcat(nomProgramG,genG); 
       strcat(cheminDaccesR,nomProgramR); 
       strcat(cheminDaccesG,nomProgramG); 
      } 

      fichierRabotage = fopen(cheminDaccesR,"r"); 
      fichierGroove = fopen(cheminDaccesG,"r"); 
      if (fichierRabotage != NULL || fichierGroove != NULL) 
      { 
       do 
       { 
       printf("\nLe fichier existe deja, voulez-vous le remplacez (O/N)?"); 
       caractere = Saisie(confirmation,3); 
       }while (strcmp(caractere,"O") != 0 && strcmp(caractere,"o") != 0 && strcmp(caractere,"n") != 0 && strcmp(caractere,"N") != 0); 
       if (strcmp(caractere,"O") == 0 || strcmp(caractere,"o") == 0) 
       { 
        c = 1; 
       } 
      } 
      else 
      { 
       c = 1; 
      } 
     }while (c != 1); 
     fclose(fichierGroove); 
     fclose(fichierRabotage); 

     fichierRabotage = fopen(cheminDaccesR,"w+"); 
     fichierGroove = fopen(cheminDaccesG,"w+"); 
     if (fichierRabotage != NULL && fichierGroove != NULL) 
     { 

     } 
     else 
     { 
      printf("\nLe programmme n'as pas pu etre creer\n"); 
      Sleep(2000); 
      exit(0); 
     } 
     fprintf(fichierGroove, "[OUTIL 3-CARBIDE 1/8-TEMPS: 7MIN] \n"); 
     fprintf(fichierGroove, "[MATERIEL-MOUSSE RPM 200]\n"); 
     fprintf(fichierGroove, "G20\nG00\nG90\nT2\nG53 Z\nG53 XY\nG92 Z%.4f\nG4 [Changer l'outil]\nM03\n",localGroove); 
     fprintf(fichierGroove, "G0 X2.5\nG0 Y2.5\nG0 Z%.4f\n",hauteur); 

     return 0; 
    } 

,這裏是headers.h如問:

#ifndef HEADERS_H_INCLUDED 
#define HEADERS_H_INCLUDED 

char *Saisie(char *str,int n); 
void viderBuffer(); 
int SaisieNombre(char *chaine,int a); 
double SaisieNombreDecimal(char *chaine,int a); 
double LireValeurCorrespondante(double thick); 
int GetLocals(double *groove, double *rabotage); 
int WritePrograms(int vitesse, double hauteur, int longueur, int largeur, double localRabotage, double localGroove, int overdrive); 

#endif // HEADERS_H_INCLUDED 
+0

你的代碼太長了,沒人會閱讀全部。你不能縮小它嗎? – BlackBear

+2

TL; DR!這很可能是緩衝區溢出,使用未初始化或NULL指針或類似的東西。您已經有很多'printf'語句,您可以添加更多以縮小範圍。 –

+0

當它退出時是否打印出錯信息? – stark

回答

1

這裏的問題是,通過打開兩個文件,以檢查他們是否存在,如果其中一個存在。該程序會告訴我,如果我想覆蓋它。如果需要,我會關閉這兩個文件並覆蓋它們,但如果它們沒有打開,它會嘗試關閉一個NULL指針。因此,解決辦法是要做到這一點:

if (fichierGroove != NULL) 
    { 
    fclose(fichierGroove); 
    } 
    if (fichierRabotage != NULL) 
    { 
    fclose(fichierRabotage); 
    } 

課在這裏:你可以關閉Windows 7中一個空指針,但不能在XP

不知道所有其他操作系統。

+0

@DavidBrabant,謝謝你解釋他/她的錯誤,但請用英語進行。我碰巧知道一些法語,但不是每個人都這樣做。 – Shahbaz

+1

他只是在糾正我的法語:p –