0

I have this error code:

helpers.c:56:13: warning: implicit declaration of function 'swap' is invalid in
C99 [-Wimplicit-function-declaration]
swap(height, width, image, i, j);
^
helpers.c:62:6: error: conflicting types for 'swap'
void swap(int height, int width, RGBTRIPLE image[height][width], int row...
^
helpers.c:56:13: note: previous implicit declaration is here
swap(height, width, image, i, j);
^
helpers.c:75:31: warning: implicit declaration of function 'value' is invalid in
C99 [-Wimplicit-function-declaration]
image_new[i][j] = value(height, width, image, i, j);
^
helpers.c:75:29: error: assigning to 'RGBTRIPLE' from incompatible type 'int'
image_new[i][j] = value(height, width, image, i, j);
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
helpers.c:87:11: error: conflicting types for 'value'
RGBTRIPLE value(int height, int width, RGBTRIPLE image[height][width], i...
^
helpers.c:75:31: note: previous implicit declaration is here
image_new[i][j] = value(height, width, image, i, j);
^

I understand that implicit declaration of function is linked with not having a function prototype but in my case i do have one.

helpers.c

#include "helpers.h"
#include <math.h>
#include <cs50.h>

// Convert image to grayscale
void grayscale(int height, int width, RGBTRIPLE image[height][width]){
    int average = 0;
    RGBTRIPLE dot;

    for(int i = 0; i < height; i++){
        for(int j = 0; j < width; j++){
            dot = image[i][j];
            average = round((dot.rgbtRed + dot.rgbtGreen + dot.rgbtBlue) / 3.0);

            image[i][j].rgbtRed = average;
            image[i][j].rgbtGreen = average;
            image[i][j].rgbtBlue = average;
        }
    }
    return;
}

int max(int value){
    if(value > 255){
        return 255;
    }
    else{
        return value;
    }
}

// Convert image to sepia
void sepia(int height, int width, RGBTRIPLE image[height][width]){

    for(int i = 0; i < height; i++){
        for(int j = 0; j < width; j++){
            RGBTRIPLE dot = image[i][j];
            image[i][j].rgbtRed = max(round(0.393 * dot.rgbtRed + 0.769 * dot.rgbtGreen + 0.189 * dot.rgbtBlue));
            image[i][j].rgbtGreen = max(round(0.349 * dot.rgbtRed + 0.686 * dot.rgbtGreen + 0.168 * dot.rgbtBlue));
            image[i][j].rgbtBlue = max(round(0.272 * dot.rgbtRed + 0.534 * dot.rgbtGreen + 0.131 * dot.rgbtBlue));
        }
    }
    return;
}

// Reflect image horizontally
void reflect(int height, int width, RGBTRIPLE image[height][width]){
    int n;

    if(width % 2 != 0){
        n = 1;
    }

    for(int i = 0; i < height; i++){
        for(int j = 0, k = (width - n) / 2; j < k; j++){
            swap(height, width, image, i, j);
        }
    }
    return;
}

void swap(int height, int width, RGBTRIPLE image[height][width], int row, int pix){

    RGBTRIPLE temp = image[row][pix];
    image[row][pix] = image[row][width - pix];
    image[row][width - pix] = temp;
}

// Blur image
void blur(int height, int width, RGBTRIPLE image[height][width]){
    RGBTRIPLE image_new[height][width];

    for(int i = 0; i < height; i++){
        for(int j = 0; j < width; j++){
            image_new[i][j] = value(height, width, image, i, j);
        }
    }

    for(int i = 0; i < height; i++){
        for(int j = 0; j < width; j++){
            image[i][j] = image_new[i][j];
        }
    }
    return;
}

RGBTRIPLE value(int height, int width, RGBTRIPLE image[height][width], int x, int y){
    int count = 0;
    int red = 0;
    int blue = 0;
    int green = 0;
    RGBTRIPLE dot;

    for(int i = -1; i <= 1; i++){
        for(int j = -1; j <= 1; j++){
            int length = i + x;
            int spread = j + y;

            if((length >= 0) && (length < height) && (spread >= 0) && (spread < width)){
                red += image[length][spread].rgbtRed;
                blue += image[length][spread].rgbtBlue;
                green += image[length][spread].rgbtGreen;
                count++;
            }
        }
    }

    dot.rgbtRed = round((float)red / count);
    dot.rgbtBlue = round((float)blue / count);
    dot.rgbtGreen = round((float)green / count);

    return dot;
}

helpers.h

#include "bmp.h"

// Convert image to grayscale
void grayscale(int height, int width, RGBTRIPLE image[height][width]);

// Check if color value is within limit
int max(int value);

// Convert image to sepia
void sepia(int height, int width, RGBTRIPLE image[height][width]);

// Reflect image horizontally
void reflect(int height, int width, RGBTRIPLE image[height][width]);

// Swapping pixel
void swap(int height, int width, RGBTRIPLE image[height][width], int row, int pix);

// Blur image
void blur(int height, int width, RGBTRIPLE image[height][width]);

RGBTRIPLE value(int height, int width, RGBTRIPLE image[height][width], int x, int y);

bmp.h

    // BMP-related data types based on Microsoft's own

#include <stdint.h>

/**
 * Common Data Types
 *
 * The data types in this section are essentially aliases for C/C++
 * primitive data types.
 *
 * Adapted from http://msdn.microsoft.com/en-us/library/cc230309.aspx.
 * See http://en.wikipedia.org/wiki/Stdint.h for more on stdint.h.
 */
typedef uint8_t  BYTE;
typedef uint32_t DWORD;
typedef int32_t  LONG;
typedef uint16_t WORD;

/**
 * BITMAPFILEHEADER
 *
 * The BITMAPFILEHEADER structure contains information about the type, size,
 * and layout of a file that contains a DIB [device-independent bitmap].
 *
 * Adapted from http://msdn.microsoft.com/en-us/library/dd183374(VS.85).aspx.
 */
typedef struct
{
    WORD   bfType;
    DWORD  bfSize;
    WORD   bfReserved1;
    WORD   bfReserved2;
    DWORD  bfOffBits;
} __attribute__((__packed__))
BITMAPFILEHEADER;

/**
 * BITMAPINFOHEADER
 *
 * The BITMAPINFOHEADER structure contains information about the
 * dimensions and color format of a DIB [device-independent bitmap].
 *
 * Adapted from http://msdn.microsoft.com/en-us/library/dd183376(VS.85).aspx.
 */
typedef struct
{
    DWORD  biSize;
    LONG   biWidth;
    LONG   biHeight;
    WORD   biPlanes;
    WORD   biBitCount;
    DWORD  biCompression;
    DWORD  biSizeImage;
    LONG   biXPelsPerMeter;
    LONG   biYPelsPerMeter;
    DWORD  biClrUsed;
    DWORD  biClrImportant;
} __attribute__((__packed__))
BITMAPINFOHEADER;

/**
 * RGBTRIPLE
 *
 * This structure describes a color consisting of relative intensities of
 * red, green, and blue.
 *
 * Adapted from http://msdn.microsoft.com/en-us/library/aa922590.aspx.
 */
typedef struct
{
    BYTE  rgbtBlue;
    BYTE  rgbtGreen;
    BYTE  rgbtRed;
} __attribute__((__packed__))
RGBTRIPLE;

I can not think of any way of why this would be wrong.

The code compiles perfectly fine when I do it but on the CS50 compiler, I get those error codes. I tried using my code and saw that the image outcome were coming out right. So I am confused to why am i receiving those errors.

Edit 1: Deleting the return statement in void type functions still does not remove the error.

Edit 2: Link to entire code on a online ide

Edit 4: clang -fsanitize=signed-integer-overflow -fsanitize=undefined -ggdb3 -O0 -Qunused-arguments -std=c11 -Wall -Werror -Wextra -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wshadow -o filter filter.c helpers.c

I am compiling the only two files i can compile which is filter.c and helpers.c

1 Answer 1

1

Simple issue, but I think you're not seeing the forest for the trees.

In short, the code is trying to use a function before it's declared. If you add signature lines for your swap and value functions at the top of helpers.c, that should resolve your issues. Or, move the actual functions above the code that calls them.

If this answers your question, please click on the check mark to accept. Let's keep up on forum maintenance. ;-)

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .