尝试在x64 RedHat环境中编译x86 C程序[第2部分]

时间:2019-07-16 01:00:21

标签: c

仍然遵循Cobol开发人员在环境迁移中处理C程序的传奇。

我认为到目前为止,我们可以解决90%的问题,并且大多数C程序现在都可以在RHEL 64位上正常编译。

星期五,我们发现了另一个未编译的模块,我希望成为最后一个。

我收到两个警告,但是对此我一无所知,我们的品牌使我们无法正确地对其进行编译。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <memory.h>
#include <errno.h>
#include </public/prod/src/mfqinc.h>

static FILE *infile = NULL;
static FILE *outfile = NULL;
char inbuf[1024], blockrec[10240];
static char workstring[1024];
static char workstring0[1024];
static char gra2533h [8];
static char gra2401h [8] ;
static char gra2501h [8] ;
static char gra2506h [8] ;
static char  crtn[1]  ; /* {"0x0A"};*/

int i;
int z;
int f;
int resulisn;
int j;
int d;
int ctrrec;
int nb_ecrit;
static int longueur;

void initworkstring()
{
    extern char workstring [1024];
    int ik;
    for (ik=0; ik < 1024 ;ik++)
    {
        workstring [ik]  = NULL;
    }
}

void ecriture()
{
    extern char workstring [1024];
    extern int longueur;
    extern int ctrrec;
    nb_ecrit =  fwrite(workstring,sizeof(char),longueur,outfile);
    ctrrec++;

    if ( nb_ecrit != longueur )
    {
        printf("andlog:erreur d ecriture ");
        printf("Ecrit: %i",nb_ecrit);
        printf("Erreur no: %i",errno);
        exit(60);
    }
}

static void errarg(char *errmsg)
{
    fprintf(stderr,"ERROR - %s\nCommand format :\n\t",errmsg);
    fprintf(stderr,"         :                  \n");
    /*    exit(1); */
}
main (int argc, char *argv[])
{
    if ( argc < 3 )
    {
        printf("<<<  Programme : and015                  >>>\n");
        printf("<<<  Nombre de parametres incorrect      >>>\n");
        printf("<<<  Remove catacteres speciaux          >>>\n");
        printf("<<<  Param # 1 = nom du fichier d'input  >>>\n");
        printf("<<<  Param # 2 = nom du fichier d'output >>>\n");
        printf("\n");
        exit(10);
    }
    if ((infile = fopen(argv[1],"rb")) == NULL )
    {
        printf("Erreur sur fichier input \n");
        exit(20);
    }

    if ((outfile = fopen(argv[2],"wb")) == NULL )
    {
        printf("Erreur sur fichier output \n");
        exit(30);
    }

    initworkstring();
    /* remplir les table de catacteres */
    crtn[0]=0x0a;

    gra2533h[0]=0x1b;
    gra2533h[1]=0x5b;
    gra2533h[2]=0x32;
    gra2533h[3]=0x35;
    gra2533h[4]=0x3b;
    gra2533h[5]=0x33;
    gra2533h[6]=0x33;
    gra2533h[7]=0x48;

    gra2401h[0]=0x1b;
    gra2401h[1]=0x5b;
    gra2401h[2]=0x32;
    gra2401h[3]=0x34;
    gra2401h[4]=0x3b;
    gra2401h[5]=0x30;
    gra2401h[6]=0x31;
    gra2401h[7]=0x48;

    gra2501h[0]=0x1b;
    gra2501h[1]=0x5b;
    gra2501h[2]=0x32;
    gra2501h[3]=0x35;
    gra2501h[4]=0x3b;
    gra2501h[5]=0x30;
    gra2501h[6]=0x31;
    gra2501h[7]=0x48;

    gra2506h[0]=0x1b;
    gra2506h[1]=0x5b;
    gra2506h[2]=0x32;
    gra2506h[3]=0x35;
    gra2506h[4]=0x3b;
    gra2506h[5]=0x30;
    gra2506h[6]=0x36;
    gra2506h[7]=0x48;

while (fgets(inbuf,1024,infile) != NULL )
{
    i=0;
    j=0;
    d=0;
    for (i=0; i < 1024 ; i++)
    {
        if ( inbuf [i] == NULL )
        {
            i = 9999;
        }
        else
        {
            if ( inbuf[i] == 0x1b )
            {
                i++;
                           d=0;
                for (d=0  ;d < 8; d++)
                {
                    if ( inbuf[i] == 0x48 )
                    {
                                         j= j-d;
                                         workstring[j]=0x0a;
                        d=99;
                     }
                    else

                    {
                                    if (inbuf[i] == 0x6d)
                                     {
                                         j= j-d;
                                         workstring[j]=0x0a;
                        d=99;

                                     }

                                    else
                                    {

                                      if (inbuf[i] == 0x53)
                                        {
                                         j=j-d; 
                                         workstring[j]=0x0a; 
                                         d=99;
                                        }
                                      else

                                       {
                        workstring[j] = inbuf[i];
                        j++;
                        i++;
                                       }
                                    }
                    }

                }  /* end du for*/

            }/*fin du if 01b*/

            else
            {
                workstring[j] = inbuf[i];
                j++;
            }
        }
        /*   mettre dans workstring */
        workstring [j] = inbuf [i];
    }
    strcat(workstring,crtn);
    longueur = j ;
    ecriture ();
    initworkstring();

}  /* fin du while */

fclose(infile);
fclose(outfile);
exit(0);
}

这些是我收到的警告。

/exp/prod/src>gcc -m64 mfqlog.c -o mfqlog
mfqlog.c: In function 'initworkstring':
mfqlog.c:48:20: warning: assignment makes integer from pointer without a cast [enabled by default]
   workstring [ik]  = NULL;
                    ^
mfqlog.c: In function 'main':
mfqlog.c:146:18: warning: comparison between pointer and integer [enabled by default]
   if ( inbuf [i] == NULL )

真的很抱歉打扰这个问题。但是我真的需要编译这段代码。

有趣的事实是该程序在我们的实际环境中正常运行(可能是由于某种未知的原因,该程序之前曾在编译,而不再是由于编译器的更改了吗?!?),但是如果我们尝试编译它会失败,并且使其正常工作的唯一方法是还原可执行备份。

当我们迁移到新的64位环境时,必须重新编译它。

谢谢大家的帮助。

1 个答案:

答案 0 :(得分:4)

NULL定义为(void *)0。将NULL替换为'\ 0'或0。

workstring [ik]  = '\0';

if ( inbuf [i] == '\0' )