LINUX.ORG.RU

Два вопроса, почему strcpy ругается варнингом и почему сигфолт?


0

0

1) есть прога, которая с помощью ИмаджМаджика дергает и выводит яркости пикселов на стдаут:


#include <stdlib.h>
#include <stdio.h>
#include <magick/api.h>

int main(int argc,char **argv) {
  ExceptionInfo
    exception;
  Image
    *image;
  ImageInfo
    *image_info;
  PixelPacket
    *pixels;
  ViewInfo
    *vinfo;
// Initialize the image info structure and read an image.
  InitializeMagick(*argv);
  GetExceptionInfo(&exception);
  image_info=CloneImageInfo((ImageInfo *) NULL);
  (void) strcpy(image_info->filename,"image.gif");
  image=ReadImage(image_info,&exception);
  if (image == (Image *) NULL) {
// print out something to let us know we are missing the
// delegates.mgk or whatever if that is the problem instead of just
// saying the file can't be loaded later
    fprintf(stderr, "readFileMagick: %s: %s\n",
    exception.reason,exception.description);
// MagickError(exception.severity,exception.reason,exception.description);
// Get here if we can't decipher the file, let caller handle it.
    return -1;
  }
// Set the data size to accomodate this new image.
//      width = image->columns;
//      height = image->rows;
// This is the method for reading pixels that compiles and works,
// as opposed to GetImagePixels or GetOnePixel, which wouldn't compile.
  vinfo = OpenCacheView(image);
  pixels = GetCacheView(vinfo, 0,0,image->columns,image->rows);
  if(!pixels) {
    fprintf(stderr, "readFileMagick: unable to get pixel cache.\n");
    return(-1);
  }
  int i,j;
  for (j=0; j<image->rows; j++) {
    for (i=0; i < image->columns; i++) {
// data ranges 0 to 256
// Swap data vertically, to match NM convention.
// file_data[j*width*3+i*3+0]=
      printf("%d ",(int)pixels[i + image->columns*j].blue);
// file_data[j*image->columns*3+i*3+1]=
      printf("%d ",(int)pixels[i + image->columns*j].green);
// file_data[j*image->columns*3+i*3+2]=
      printf("%d \n",(int)pixels[i + image->columns*j].red);
    }
  }
// printf("%d \n",strlen(pixels));
  CloseCacheView(vinfo);
  DestroyImageInfo(image_info);
  DestroyImage(image);
  return(0);
}

компиляется 

[vilfred@mobile100 Test]$ gcc `Magick-config --cflags --cppflags` test.c `Magick-config --ldflags --libs`
test.c: In function `main':
test.c:20: warning: implicit declaration of function `strcpy'
[vilfred@mobile100 Test]$

В чем же может быть проблема??

2) Таже самая прога но на XS:

#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include <math.h>
#include <magick/api.h>
#include "ppport.h"
#define PackageName "MMM"

MODULE = MMM            PACKAGE = MMM

PROTOTYPES: DISABLE

BOOT:
  InitializeMagick(PackageName);

int
pixs(int l)

  INIT:
  ExceptionInfo
    exception;
  Image
    *image;
  ImageInfo
    *info,
    *image_info;
  PixelPacket
    *pixels;
  ViewInfo
    *vinfo;
  CODE:
        GetExceptionInfo(&exception);
        printf("one\n");
        strcpy(image_info->filename,"image.gif");
        printf("one\n");
        image=ReadImage(image_info,&exception);
        printf("one\n");
      RETVAL = l;
  OUTPUT:
      RETVAL

[vilfred@mobile100 MMM]$ perl x.pl
one
one
perl: constitute.c:2609: ReadImage: Assertion `image_info->signature == 0xabacadabUL' failed.
Aborted
[vilfred@mobile100 MMM]$ 

При поптыке втупую скопировать ReadImage метод из Magick.xs 
вылетает на package_info... Вобщем, почему-то не XS не 
работает, почему - я понять не могу :(
☆☆

Я конечно, ни в чем не уверен, но похоже, что здесь:

(void) strcpy(image_info->filename,"image.gif");

происходит запись в неинициализированный указатель...
т.е. может быть нужно выделить памятьперед этим или еще чего?
Или же просто присвоить адрес на строку...

anonymous
()
Ответ на: комментарий от anonymous

я так попробовал:

char * image;
image = "image.gif";
(void) strcpy(image_info->filename,image); 

или

char * image;
image = "image.gif";
(void) strcpy(image_info->filename,*image); 

я даже не пойму, как определить тип "image_info->filename"

вобщем, не шарю в этом деле...

vilfred ☆☆
() автор топика
Ответ на: комментарий от vilfred

Сто пудов что image_info->filename не предоставляет никакого заблаговременно приготовленного буфера. Значит надо:

image_info->filename = "image.gif";

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

Выдало эррор на несовместимость типов... хех. Я думал, что именно из за этого варнинга XS-код и валится, но оказалось, что нет :(

vilfred ☆☆
() автор топика
Ответ на: комментарий от anonymous

варнинг после этого не выдало, все окей, но XS по прежнему ругается на "ReadImage: Assertion `image_info->signature == 0xabacadabUL' failed."

я думал. что в варнинге причина неработоспособности XS-кода, именно по этому и спросил... Ладно, вобщем, спасибо за ответы, буду походу разбираться с этими библиотеками. Просто прикольно было бы получить свой метод доступа к пикселам для 89 форматов изображений, зачем собсно это все и делается...

vilfred ☆☆
() автор топика
Ответ на: комментарий от vilfred

Ха, нашел!

нужна была только строчка image_info=CloneImageInfo((ImageInfo *) NULL);, которая походу дела инициализировала какие-то внутренние структуры ImageMagick.

vilfred ☆☆
() автор топика
Ответ на: комментарий от vilfred

в подобном случае лучше пользоваться strdup(3)

ananas ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.