arrayscimagevisual-studio-codepgm

C Argument number to create PGM images


I have to do a task for university in C. The program creates images in PGM format.The program compiles successfully, however, I can't run the program correctly. At the beginning of the main function the if operator needs 2 argc, but every time I try to run the program I just have one argc and I get the result

"Error: missing or bad parameters, usage a3 [imagefile]"

The code is:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <math.h>

const double PI = 3.1415926535897932;

int** loadImage (const char *filename, int* width, int* height);
bool saveImage (const char *filename, int **pixels,
                const unsigned int width, const unsigned int height);

/* *** task (a) *** */

int normalize(int value) {
  return 0;    // Dummy return
}

/* *** task (b) *** */

int** createImage(unsigned int width, unsigned int height, int value){
  
  return NULL;    // Dummy return
}

/* *** task (c) *** */

void freeImage(int** pixels, unsigned int width, unsigned int height){
  
}

/* *** task (d) *** */

int** inverter (int **pixels, int width, int height)
{
  
  return NULL;    // Dummy return
}

/* *** task (e) *** */

int** laplace (int **pixels, int width, int height)
{
  
  return NULL;    // Dummy return
}

/* *** task (f) *** */

int** rotate (int** pixels, int width, int height, double angle, int background)
{

  return NULL;    // Dummy return
}

int main (int argc, char **argv)
{
  if (argc == 2)
  {
    int width=0, height=0;
    int **image = loadImage (argv[1], &width, &height);
    if (image != NULL)
    {
      int **image1 = inverter (image, width, height);
      int **image2 = laplace (image, width, height);
      int **image3 = rotate (image, width, height, 150, 128);

      saveImage ("image0.pgm", image,  width, height);
      saveImage ("image1.pgm", image1, width, height);
      saveImage ("image2.pgm", image2, width, height);
      saveImage ("image3.pgm", image3, width, height);

      freeImage (image, width, height);
      freeImage (image1, width, height);
      freeImage (image2, width, height);
      freeImage (image3, width, height);
    }
  }
  else {
    printf ("Error: missing or bad parameters, usage a3 [imagefile]\n");
  }
  return 0;
}

/* *** Bild aus Datei laden *** */
int** loadImage (const char *filename, int* width, int* height)
{
  const char *delimiter = " \n\r\t";
  FILE *file = fopen (filename, "rt");
  int** pixels;
  bool isValid = true;

  if (file != NULL)
  {
    char line [80];
    int n = 0, params [3];

    if (fgets (line, 80, file) == NULL) isValid = false;
    if (strlen (line) != 3 || strncmp (line, "P2", 2)) isValid = false;
    while (isValid && fgets (line, 80, file) != NULL)
    {
      if (strlen (line) <= 71)
      {
        if (line[0] == '#') continue;
        char *p = strtok (line, delimiter);
        while (isValid && p != NULL)
        {
          if (n < 3)
          {
            int a = atoi (p);
            if (a <= 0) {isValid = false;}
            else {params[n++] = a;}
          }
          else
          {
            if (n == 3)
            {
              if (params[2] != 255) {isValid = false;}
              else {
                pixels = createImage (params[0], params[1], 0);
                *width = params[0];
                *height = params[1];
              }
            }
            if (n-3 < *width * *height)
            {
              int x = (n-3) % *width;
              int y = (n-3) / *width;
              int value = atoi (p);
              pixels[y][x] = normalize(value);
              n++;
            }
            else {isValid = false;}
          }
          p = strtok (NULL, delimiter);
        }
      }
      else { isValid = false;}
    }
    fclose (file);
    if (n-3 != *width * *height) {isValid = false;}
    if (!isValid) freeImage (pixels, *width, *height);
  }
  return isValid ? pixels : NULL;
}

/* *** Bild in Datei speichern *** */

bool saveImage (const char *filename, int **pixels, unsigned int width, unsigned int height)
{
  FILE *file = fopen (filename, "wt");

  if (file != NULL && pixels != NULL)
  {
    fprintf (file, "P2\n");
    fprintf (file, "%d %d\n", width, height);
    fprintf (file, "%d\n", 255);
    for (int y = 0; y < height; y++)
    {
      for (int x = 0; x < width; x++)
      {
        fprintf (file, "%d\n", pixels[y][x]);
      }
    }
    fclose (file);
    return true;
  }
  return false;
}

The professor also said we should add following argument to the task in VSCode:

"args": [
"-g",
"-std=c99",
"-Wall",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}",
"-lm"
],

Solution

  • Your program a3.exe requires an argument which is the file name. To run it from command line, enter

    .\a3.exe YourFilename
    

    replacing YourFilename with the actual file name you want to use.