This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

unable to use fread() function

Hi,

I am working on MCB2300 (with LPC2378 processor). I have written a small function that will read the values into a matrix. But when the control comes to fread it completely hangs up, nothing can be done. Below is the my function which is giving problem

 void loadImage(FILE* arq, unsigned char** Matrix){
        int i,j;
        unsigned char tmp;
        long pos = 51;

        fseek(arq,0,0);

        for (i=0; i<300; i++){
                for (j=0; j<400; j++){
                        pos+= 3;
                        fseek(arq,pos,0);
                        fread(&tmp,3,1,arq);
                        Matrix[i][j] = tmp;
                }
        }
}

Its working fine in GNU C. But when I have tried to use the same code in Keil uVision4, its is not working. Please let me know how to sort this problem

Parents Reply Children
  • I am trying to store an image into matrix pixel by pixel. The above code is doing the same. First of all I am opening the image in read mode and passing its file pointer (arq) as reference to loadImage() function. In my code inside the loop, 300 and 400 are corresponds to dimensions of the image (height and width respectively). Initially I thought fread() is not working. But I have realised it is working fine. I have tried the code by changing the height (i.e 300). I have used 1 instead of 300 for i . It worked fine and the values are stored in the Matrix. I have increased the value step by step, it worked fine till the value of i in the code is 8 but later on it stucks from there onwards. I think it has something to do with heap size?? Please help to get rid of this problem

  • On what basis do you think that?

    What have you done to confirm whether it is or not?

    "Please help to get rid of this problem"

    First, you need to determine what the problem actually is!

  • The declaration of Matrix looks suspicious:

    unsigned char** Matrix
    

    This is a pointer to a pointer (or array of pointers) to unsigned char. You probably wanted this to be a pointer to a two-dimensional array. Can you show us the call to this function and the types of arguments you pass to it?

  • Thanks very much for your reply.

    First, you need to determine what the problem actually is!

    My apologies for not determining problem properly.

    I am trying to read a 24 bit map file where each pixel is represented with 24 bits (i mean 3 bytes) so I am reading 3 bytes. Let me also explain about tmp. In my code I am using a structure as below

     typedef struct
            {
                    unsigned char RGB[3];
            }RGB;
    

    The declaration for tmp and Matrix are as below

    
    RGB  **Matrix;
    RGB tmp;
    
    

    All the pixels of the matrix are read perfectly. I have inserted a printf statement after read in the above code and all the image values are printed in right way. But problem comes when I am trying to store in the matrix. Infact I was unable to allocate memory for the matrix with required size. So I was unable to store. Here is the code for allocating matrix

    
     createMatrix(){
            RGB** Matrix;
            int i;
            Matrix = (RGB **) malloc (sizeof (RGB*) * height);
            if (Matrix == NULL){
                    printf("Memory is not available");
                    exit(0);
            }
            for (i=0;i<height;i++){
                    Matrix[i] = (RGB *) malloc (sizeof(RGB) * width);
                    if (Matrix[i] == NULL){
                    printf("Memory is not available");
                            exit(0);
                    }
            }
    
    }
    
    
    
    

    What changes do I need to make here to ensure matrix with required size is created?

    Thanks in advance

  • What changes do I need to make here to ensure matrix with required size is created?

    Perhaps you don't have enough heap. Try increasing heap size. It should be specified in your startup code.
    Besides, the way you allocate memory for your bitmap appears inefficient:
    1) The type RGB is 3 bytes, but the compiler could add padding when working with arrays of RGB (sizeof(RGB) == 4). So this could increase memory usage to 4 bytes per one instance of RGB.
    2) A bitmap is essentially a two-dimensional array. Yet you allocate memory for it row-by-row, storing pointers to rows in another array. This way the number of heap allocations is Nrows+1, which adds to memory usage since each heap allocation wastes some memory on bookkeeping. Instead, you should allocate one big chunk of memory for one two-dimensional array. Or even a three-dimensionsl array: unsigned char bitmap[height][width][3].

  • The type RGB is 3 bytes, but the compiler could add padding when working with arrays of RGB (sizeof(RGB) == 4). So this could increase memory usage to 4 bytes per one instance of RGB.

    I have verified the sizeof(RGB) when memory is allocated by giving a printf statement. Always it is showing as 3 bytes only. So here no padding is done by compiler.

    I have already tried previously by allocating one big chunk of memory for a three-dimensionsl array: unsigned char bitmap[height][width][3]. Even it did n't worked. In my application height and width are 320 and 240. But matrix with these values in not working. If height and width are very small values like 10,10 then it is working. But not for larger values

  • If height and width are very small values like 10,10 then it is working. But not for larger values

    How much RAM do you have allocated for the heap? Do you have enough RAM for this? 320x240x3 = 225 Kbytes.

  • Again, that's meaningless!

    You need to state precisely what did happen - and why you consider that to be "not working"!

    What, exactly, failed?

    How did it fail?

    What debugging have you done to find the cause of the failure?

  • I have already tried previously by allocating one big chunk of memory for a three-dimensionsl array:

    unsigned char bitmap[height][width][3]
    

    So it's actually 320 x 240 x3 = 675K

  • I have defined a matrix like below

    unsigned char bitmap[320][240]

    After that I allocated the some elements into that matrix before reading pixel values to make sure whether all elements in the matrix are initialised in the following manner

    for (i=0;i<320;i++){
       for (j=0;i<240;j++){
                     bitmap[i][j]=j;
                           }
                       }
    

    After this I am trying to print the values read in to the matrix using printf statement inthe following manner

    for (i=0;i<320;i++){
       for (j=0;i<240;j++){
                     printf(" %d ", bitmap[i][j]);
                           }
                       }
    

    Once done I have compiled it. Compilation is done but I could n't run it. Nothing is printed

  • Once done I have compiled it. Compilation is done but I could n't run it. Nothing is printed

    You keep ignoring my suggestions. What's the point in posting about your problems when you ignore the responses?
    How much RAM do you have? Do you have enough of it to hold your bitmap?
    If you define a variable at function scope (a so-called automatic variable), memory for it will be allocated on the stack. I am certain that your stack is not large enough to hold a variable that is 75 Kbytes in size. Hence, the program will not work.

  • My default heap size in startup file is Heap_Size EQU 0x00000800.

    I have increased the heap size step by step and tested on images with different sizes. When I have set the heap size to 0x 00007000 , the final image that worked is of size 26.3 KB (109 x 82 x 3). But if I change heap value further it is not working. But my required image size is much larger. What things I need to do so that I can change heap value further and ensure it works with large images?

    My IRAM1 settings are default (IRAM1: 0x40000000 Size: 0x8000)

  • My IRAM1 settings are default (IRAM1: 0x40000000 Size: 0x8000)

    OK, this is the 3rd time I'm asking this: how much RAM do you have? This is important for your application, as you should have realized by now.
    You indicated that you have 32 Kbytes of RAM. Obviously, this is too little.

  • In fact, you seem to ignore all responses from all posters!

    "Compilation is done but I could n't run it"

    There you go again - a meaningless statement!

    Why couldn't you run it?

    What, exactly, prevented you from running it?

    What debugging have you done to find the problem?