0

Could someone help me understand this usage error when I try to run resize?

Usage: resize [-v] [-u] [-c] [-s [rows cols]]

I don't see it in the source and don't get what it's supposed to mean.

Here's my code:

// resizes a BMP file

#include <stdio.h>
#include <stdlib.h>

#include "bmp.h"

int main(int argc, char *argv[])
{
    // ensure proper usage
    if (argc != 4)
    {
        fprintf(stderr, "Usage: resize n infile outfile\n");
        return 1;
    }

    // save second argument as global variable
    char *N = argv[2]

    // remember filenames
    char *infile = argv[1];
    char *outfile = argv[2];

    // open input file
    FILE *inptr = fopen(infile, "r");
    if (inptr == NULL)
    {
        fprintf(stderr, "Could not open %s.\n", infile);
        return 2;
    }

    // open output file
    FILE *outptr = fopen(outfile, "w");
    if (outptr == NULL)
    {
        fclose(inptr);
        fprintf(stderr, "Could not create %s.\n", outfile);
        return 3;
    }

    // read infile's BITMAPFILEHEADER
    BITMAPFILEHEADER bf;
    fread(&bf, sizeof(BITMAPFILEHEADER), 1, inptr);

    // read infile's BITMAPINFOHEADER
    BITMAPINFOHEADER bi;
    fread(&bi, sizeof(BITMAPINFOHEADER), 1, inptr);

    // ensure infile is (likely) a 24-bit uncompressed BMP 4.0
    if (bf.bfType != 0x4d42 || bf.bfOffBits != 54 || bi.biSize != 40 ||
        bi.biBitCount != 24 || bi.biCompression != 0)
    {
        fclose(outptr);
        fclose(inptr);
        fprintf(stderr, "Unsupported file format.\n");
        return 4;
    }

    // width of 1st image * user input
    bi.biWidth2 = bi.Width * N

    // determine padding of first image for scanlines
    int padding1 = (4 - (bi.biWidth * sizeof(RGBTRIPLE)) % 4) % 4;

    // determine padding of second image for scanlines
    int padding2 = (4 - (bi.biWidth2 * sizeof(RGBTRIPLE)) % 4) % 4;

    // biHeight times user input
    bi.biHeight *= N

    // new bfSizeImage
    bi.biSizeImage = ((sizeof(RGBTRIPLE) * (bi.biWidth2) + padding2) * abs(bi.biHeight)))

    // new bfSize
    bf.bfSize = bi.biSizeImage + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)

    // write outfile's BITMAPFILEHEADER
    fwrite(&bf, sizeof(BITMAPFILEHEADER), 1, outptr);

    // write outfile's BITMAPINFOHEADER
    fwrite(&bi, sizeof(BITMAPINFOHEADER), 1, outptr);


    // iterate over infile's scanlines
    for (int i = 0, biHeight = abs(bi.biHeight); i < biHeight; i++)
    {
        // iterate over pixels in scanline
        for (int j = 0; j < bi.biWidth2; j++)
        {
            // temporary storage
            RGBTRIPLE triple;

            // read RGB triple from infile
            fread(&triple, sizeof(RGBTRIPLE), 1, inptr);

            // write RGB triple to outfile
            fwrite(&triple, sizeof(RGBTRIPLE), 1, outptr);
        }

        // skip over padding, if any
        fseek(inptr, padding, SEEK_CUR);

        // then add it back (to demonstrate how)
        for (int k = 0; k < padding; k++)
        {
            fputc(0x00, outptr);
        }
    }

    // close infile
    fclose(inptr);

    // close outfile
    fclose(outptr);

    // success
    return 0;
}

Any other advice that could steer me in the right direction would be great as well. I've watched the walkthrough multiple times and still feel lost as to how to approach this. Thank you.

1

clearly, you ran the following command: resize 1 file1.bmp file2.bmp. This produced the output you received because along with being the name of this pset exercise, it's also the name of a linux utility related to resizing a window. If you execute resize without the leading ./, it will use the resize that is in the system path, not your code.

Having said that, I tried to compile the code posted above. It produces a number of errors and will not compile. Time to go back to work on cleaning up existing errors.

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

  • Hm, I thought I compiled it without errors, but I must not have been in the right directory or something. I'll go back, try again, and address the errors (many of which are probably missing semicolons haha). Thank you! – roy_t Sep 8 '19 at 21:37
1

You declared 'N' as pointer-to-character. Later, you're using it as an integer to scale the width and height, which is illegal as it's a pointer. I'd suggest dereferencing it using '*N', or simply using the atoi() function on argv[1].

You must log in to answer this question.

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