2

我正在制作的一个小 C 程序有问题。当我编译它并在我的 Mac(在 Windows 7 分区上)和我的工作电脑(也是 Windows 7)上运行它时它工作正常,但我需要它在运行 CNC 的 PC 上工作并且它在 Windows XP 上. 我可以更改两台计算机上的程序位置,但它在 windows XP pc 上的任何地方都无法运行当它必须写入文本文件但它能够覆盖一个文件时似乎崩溃了......是否有一些功能与 Windows XP 不兼容?我会再试一些,如果遇到什么我会告诉你的。

PS 无法在这台计算机上使用调试器,因为我无法安装程序...(工作计算机)。

这是导致问题的代码:

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
4

1 回答 1

1

这里的问题是,通过打开两个文件来检查它们是否存在以及其中一个是否存在。程序会告诉我是否要覆盖它。然后,如果需要,我会关闭这两个文件并覆盖它们,但如果它们没有打开,它会尝试关闭一个 NULL 指针。所以解决方案是这样做:

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

这里的教训:您可以在 Windows 7 中关闭 NULL 指针,但在 XP 中不能

不确定所有其他操作系统。

于 2012-12-06T14:22:21.767 回答