Donc, comme le dit le titre, jessaye de faire le pset4 où jobtiens cette erreur quand Jessaye dexécuter le programme. Jai recherché le forum et aussi Reddit, et jai compris que jai un problème avec le malloc (). Jai trouvé que quand jobtiens ce type derreur, cela signifie que je ne suis pas allouer suffisamment de mémoire à mon pointeur. Je suis désolé si cette question a été répondue ou si cest trop idiot, mais je suis bloqué sur cette erreur pendant 5 jours consécutifs. Voici donc mon code et je serais plus quheureux si quelquun pouvait me faire voir ce que je « fais mal. Merci pour votre temps!

 // Copies 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: copy infile outfile\n"); return 1; } // remember filenames int n = atoi(argv[1]); char *infile = argv[2]; char *outfile = argv[3]; // check if n is correct if (n < 0 || n > 100) { fprintf(stderr, "n must be a positive integer less than or equal to 100\n"); return 1; } // open input file FILE *inptr = fopen(infile, "r"); if (inptr == NULL) { fprintf(stderr, "Could not open %s.\n", infile); return 1; } // open output file FILE *outptr = fopen(outfile, "w"); if (outptr == NULL) { fclose(inptr); fprintf(stderr, "Could not create %s.\n", outfile); return 1; } // 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 2; } // determine padding for scanlines int infilePadding = (4 - (bi.biWidth * sizeof(RGBTRIPLE)) % 4) % 4; // update output file"s header info while keeping the old one int infileBiWidth = bi.biWidth; int infileBiHeight = bi.biHeight; bi.biWidth *= n; bi.biHeight *= n; // use malloc for creating memory to store pixels of outfile RGBTRIPLE* ppixel = malloc(sizeof(RGBTRIPLE) * bi.biWidth); // create a variable for keeping track of ppixelIndex int ppixelIndex = 0; // calculate padding bytes for output file int outfilePadding = (4 - (bi.biWidth * sizeof(RGBTRIPLE)) % 4) % 4; // recalculate header info bi.biSizeImage = ((sizeof(RGBTRIPLE) * bi.biWidth) + outfilePadding) * abs (bi.biHeight); 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; i < abs(infileBiHeight); i++) { // iterate over pixels in scanline for (int j = 0; j < infileBiWidth; j++) { // temporary storage RGBTRIPLE triple; // read RGB triple from infile fread(&triple, sizeof(RGBTRIPLE), 1, inptr); // store each pixel n times to ppixel for (int l = 0; l < n; l++) { ppixel[ppixelIndex] = triple; ppixelIndex++; } } // for each pixel write it n times for (int m = 0; m < n; m++) { for (int p = 0; p < n; p++) { // write RGB triple to outfile fwrite(&ppixel[p], sizeof(RGBTRIPLE), 1, outptr); } // write outfile"s padding for (int k = 0; k < outfilePadding; k++) { fputc(0x00, outptr); } } // skip over infilePadding, if any fseek(inptr, infilePadding, SEEK_CUR); } // close infile fclose(inptr); // close outfile fclose(outptr); // free ppixel free (ppixel); // success return 0; } 

Commentaires

  • Merci @ MARS de mavoir aidé avec le format. Cétait mon premier message, excuses …

Réponse

Je pense avoir trouvé la réponse. Le principal problème était que je définissais la variable ppixelIndex hors de la boucle for et que je lincrémentais beaucoup trop. Donc, lors de la première itération pour le la première ligne se termine, je ne lai pas réinitialisée, donc lors de la deuxième itération, jessayais datteindre la mémoire qui nétait pas allouée. Jai également modifié un peu mon code, mais la solution principale était de déplacer le ppixelIndex variable à lintérieur de la boucle. Jespère que cette solution aide quelquun 🙂

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *