2012-12-05 74 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 –