编辑图片打印程序中可用的颜色量。它是用C和Xlib编写的

编辑图片打印程序中可用的颜色量。它是用C和Xlib编写的,c,graphics,fortran,pixel,xlib,C,Graphics,Fortran,Pixel,Xlib,我是一名fortran程序员,使用的是一个用C编写的程序,对此我几乎没有经验 我有一个用fortan编写的程序,它以像素的多维数组的形式创建图像,每种颜色的X值、Y值和RGB值为0-4。然后,它将数组、数组在x和y维度的大小、包含光谱中排列的所有颜色的颜色映射以及光谱中的颜色数传递给一个用C编写的程序,该程序应该使用Xlib绘制图像 当我传递一个带有125种颜色的特定单色贴图时,该程序工作。红色/绿色/蓝色的值为5,但当我尝试增加传递给C程序的颜色量时,我超出了某种限制,程序关闭。如何提高C源代

我是一名fortran程序员,使用的是一个用C编写的程序,对此我几乎没有经验

我有一个用fortan编写的程序,它以像素的多维数组的形式创建图像,每种颜色的X值、Y值和RGB值为0-4。然后,它将数组、数组在x和y维度的大小、包含光谱中排列的所有颜色的颜色映射以及光谱中的颜色数传递给一个用C编写的程序,该程序应该使用Xlib绘制图像

当我传递一个带有125种颜色的特定单色贴图时,该程序工作。红色/绿色/蓝色的值为5,但当我尝试增加传递给C程序的颜色量时,我超出了某种限制,程序关闭。如何提高C源代码中的限制

节目如下:

    #define USEPIXMAP  /* sets drawing into background pixmap of window */

    #include "putras.h"
    #include <stdlib.h>
    static unsigned def_map[256];

    void putras_(int *pixel_values, int *arrayx, int *arrayy,
                int *colormap_entries, int *colormap_size)
    {
      extern Colormap       cmap;
      extern Window         window;
      extern Display        *dpy;
      extern XColor         color;
      extern XWindowAttributes  window_attr;
      extern GC             gc;
      extern XGCValues      gcv;
      extern Pixmap         pixmap;

      static int call_flag = 0;
      char           *display_name=NULL;
      char           *dummy;
      unsigned            pixel;
      int            i, j;
      XPoint         *pointarray[256];
      unsigned            arraylen[256];
      unsigned            maxlen[256];
      int            remain_len;

      if(call_flag == 0) {

        /* THis only gets done on the first call to putras */

        call_flag = 1;
        if( (dpy = XOpenDisplay(display_name) ) == NULL){
          fprintf(stderr,"Error: Couldn't open display\n");
          exit(1);
        }
        XGetWindowAttributes(dpy, RootWindow(dpy,DefaultScreen(dpy)),
                             &window_attr);
        window=XCreateSimpleWindow(dpy, RootWindow(dpy, DefaultScreen(dpy)), 0, 0,
                                 *arrayx, *arrayy,window_attr.border_width,
                                 BlackPixel(dpy, DefaultScreen(dpy)),
                                 WhitePixel(dpy, DefaultScreen(dpy)));

    #ifdef USEPIXMAP
        pixmap=XCreatePixmap(dpy, window, *arrayx, *arrayy,
                             DefaultDepth(dpy,DefaultScreen(dpy)) );
        XMapWindow(dpy, window);
        XClearWindow(dpy, window);
        XCopyArea(dpy, window, pixmap, DefaultGC(dpy, DefaultScreen(dpy)),
                  0,0,*arrayx, *arrayy, 0,0);
        XFlush(dpy);
    #else
        XMapWindow(dpy, window);
    #endif

        cmap=DefaultColormap(dpy,DefaultScreen(dpy));

        color.flags=DoRed|DoBlue|DoGreen;
        for (i=0;i<(*colormap_size);i++){
          color.pixel= colormap_entries[4*i];
          j = color.pixel;
          color.red=colormap_entries[4*i+1];
          color.green=colormap_entries[4*i+2];
          color.blue=colormap_entries[4*i+3];
          XAllocColor(dpy, cmap, &color);
          def_map[j] = color.pixel;
        }

        gc = XCreateGC(dpy, window, 0, NULL);

      } /* Endif - first time through */

      /* The following gets done on each call */
      for (i=0; i<256; i++){

          pointarray[i]=(XPoint *)malloc((*arrayx)*(*arrayy)/128*sizeof(XPoint));
          maxlen[i]=(*arrayx)*(*arrayy)/128 -1;
          arraylen[i]=0;
      }
        for (j=0; j<(*arrayy); j++) {
         for (i=0; i<(*arrayx); i++) {
           /*pixel = def_map[pixel_values[j * (*arrayx) + i]];*/
           pixel=pixel_values[j*(*arrayx)+i];
           /*pixel=1;*/

            if (arraylen[pixel]==maxlen[pixel]) {
              pointarray[pixel]= (XPoint *)realloc(pointarray[pixel],
                                                   2*maxlen[pixel]*sizeof(XPoint));
              maxlen[pixel]=2*maxlen[pixel];
          }

              pointarray[pixel][arraylen[pixel]].x=i;
           pointarray[pixel][(arraylen[pixel])++].y=j;
         } /* end for loop*/
        } /* end for loop*/

      for (i=0; i<256; i++) {
        XSetForeground(dpy, gc, def_map[i]);/*dpy,gc,i);*/
         if (arraylen[i]>=MAXPOINT) { 
            for (j=0; j<=(arraylen[i]/MAXPOINT); j++) {
               remain_len=(arraylen[i]-MAXPOINT*j);
    #ifdef USEPIXMAP
               XDrawPoints(dpy, pixmap, gc,(pointarray[i]+j*MAXPOINT),
                          ((remain_len<MAXPOINT)?remain_len:MAXPOINT),
                          CoordModeOrigin);
    #else
               XDrawPoints(dpy, window, gc,(pointarray[i]+j*MAXPOINT),
                          ((remain_len<MAXPOINT)?remain_len:MAXPOINT),
                          CoordModeOrigin);
    #endif

            } /* end for loop */
         } else {

    #ifdef USEPIXMAP
             XDrawPoints(dpy, pixmap, gc, pointarray[i], arraylen[i],
                         CoordModeOrigin);
    #else
             XDrawPoints(dpy, window, gc, pointarray[i], arraylen[i],
                         CoordModeOrigin);
    #endif
          } /*  end if */
      } /* end for loop 256 */

    #ifdef USEPIXMAP
      XSetWindowBackgroundPixmap(dpy, window, pixmap);
      XClearWindow(dpy, window);
    #endif

      XFlush(dpy);
      for (i=0; i<256;i++)
        free(pointarray[i]);

      return;
    }


    void unmap(void)
    {
    /*  extern Pixmap pmap; */

      extern Window window;
      extern Display *dpy;

    /*  int width, height; */

      XUnmapWindow(dpy, window);
      XFlush(dpy);
      return;
    }

    void remap(void)
    {
      extern Window window;
      extern Display *dpy;

      XMapRaised(dpy, window);
      XFlush(dpy);
      return;
    }

当程序退出时打印什么?它只是退出并在检查了一些后说分割错误当colormap_size的值达到256及以上时发生分割错误您知道seg错误的确切行吗?def_map[j]=color.pixel;看起来很可疑,因为它被定义为只有256长/大。我将程序中的每个256实例加倍到512,128到256,在segfault发生之前,颜色的数量现在增加到511。所以我解决了更多颜色的问题,但现在我不知道为什么它会起作用,或者我是否在将来的某个地方给自己造成了错误。我还将无符号变量更改为无符号int,以提供更多空间。