png processing with C

Gast #1298342
Lesenswert?

Hallo zusammen.

Ich habe mich gestern und heute nochmals ausführlich mit diesem 
Themenbereich beschäftigt und bin dabei leider auf viele Probleme beim 
Umgang mit den von euch empfohlenen Libs gestoßen. Ein Freund hat mich 
nun jedoch auf das PNM-Format hingewiesen, ds äußerst leicht zu lesen 
und schreiben ist. NähereInformationen findet ihr unter folgendem Link:

http://en.wikipedia.org/wiki/Netpbm_format#Reading_and_Writing_PGM_Image_Using_C.5Bclarification_needed.5D

Leider sind dabei nun auch ein paar Probleme aufgetreten. Ich habe das 
Programm in seinem momentanen Satus mittels

gcc -ansi -o pxm pxm.c

geparst. Leider bekomme ich einen Segmentation fault error und ich weiß 
beim besten Willen nicht, woran das liegt. Ich habe mir die Zeit 
genommen meinen Code ausführlich zu dokumentieren und wäre euch sehr 
dankbar, wenn ihr mal einen Blick auf meinen Quellcode werfen könntet. 
Meine pxm.c findet ihr im Anhang. Vielen dank für euer Verständnis und 
eure Hilfe.

MfG, Andy
Angehängte Dateien:
Gast #1298367
Lesenswert?

Da liegt Dein Fehler:
1
  /* loop over image rows */
2
  for(i = 0; i < pic.height; i++)
3
  {
4
    /* loop over image columns */
5
    for(j = 0; j < pic.width; j++)
6
    {
7
      tmp = rand() % 255 + 1;
8
      pic.matrix[i][j].red = tmp;
9
      tmp = rand() % 255 + 1;
10
      pic.matrix[i][j].green = tmp;
11
      tmp = rand() % 255 + 1;
12
      pic.matrix[i][j].blue = tmp;
13
    }
14
  }

Genauer gesagt da:
1
 pic.matrix[i][j].red = tmp;

und dann entsprechend weiter.
Gast #1298372
Lesenswert?

Und was ist daran falsch? pic ist doch ein Object vom Strukturtyp pnm 
und somit kann ich mit hilfe des Punkt-Operators auf dessen Werte (in 
meinem Fall die Matrix) zugreifen. Die Matrix ist aber nur eine reihe 
von Pointern auf Pixel-Strukturen. Deshlab sollte dieser Zugriff doch 
möglich sein? Entschuldige, wenn ich da falsch liege. Beschäftige mich 
keine 3 Wochen mit C.

MfG, Andy
Gast #1298708
Lesenswert?

Entschuldigt das doppelte Posting. hatte noch etwas Probleme und habe 
nun versucht meinen zugriff auf die Matrix durch eine neue Allocierung 
des Speichers zu beheben. das funktioniert leider auch nicht kann mir 
jemand sagen warum dies so ist?

MfG, Andy

1
pixel **pnmalloc(unsigned int n, unsigned int m)
2
{
3
  /* init matrix pointer */
4
  pixel **p;
5

6
  /* allocate space for rows */
7
  p = (pixel **) malloc(n * sizeof(pixel *));
8

9
  /* validate pointer */
10
  if( p != NULL )
11
  {
12
    /* allocate first column */
13
    p[0] = (pixel *) malloc(n * m * sizeof(pixel));
14

15
    /* validate pointer */
16
    if( p[0] == NULL )
17
    {
18
      /* set pointer to NULL */
19
      free(p);
20
      p = NULL;
21
    }
22

23
    else
24
    {
25
      /* init helper var */
26
      unsigned int i;
27

28
      /* loop over rest of columns */
29
      for(i = 1; i < m; i++)
30
      {
31
        p[i] = p[i-1] + m;
32
      }
33
    }
34
  }
35

36
  return p;
37
}
38

39
void pnmfree(pixel **p)
40
{
41
  /* check for NULL pointer */
42
  if( p != NULL )
43
  {
44
    free(p[0]);
45
  }
46

47
  /* free space */
48
  free(p);
49
}
Die Speicherallocierung habe ich daraufhin wie folgt geändert.
1
  /* init picture */
2
  pnm pic =
3
  {
4
    50,
5
    100,
6
    255,
7
    3,
8
    (pixel **) pnmalloc(pic.width, pic.height)
9
  };

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren