Przetwarzanie obrazów, bład przy kompilacji.

0

Witam, mam takie komunikaty przy kompilacji:

modul.c: In function ‘czytaj’:
modul.c18: warning: assignment from incompatible pointer type [enabled by default]
obraz->tablica = (int()[obraz->wymx])malloc(obraz->wymxobraz->wymy*sizeof(int));
^
modul.c: In function ‘przetwarzaj_opcje’:
modul.c4: warning: passing argument 2 of ‘czytaj’ from incompatible pointer type [enabled by default]
czytaj(obraz, wybor->plik_we);}
^
modul.c5: note: expected ‘struct w_opcje *’ but argument is of type ‘struct FILE *’
int czytaj(s_obraz *obraz, w_opcje *wybor){
^
modul.c💯4: warning: passing argument 2 of ‘zapis’ from incompatible pointer type [enabled by default]
zapis(obraz, wybor->plik_we);
^
In file included from modul.c0:
modul.h5: note: expected ‘struct w_opcje *’ but argument is of type ‘struct FILE *’
int zapis(s_obraz *obraz, w_opcje *wybor);
^

Oto plik modul.c

 
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
#include "modul.h"

#define W_OK 0                   /* wartosc oznaczajaca brak bledow */
#define B_NIEPOPRAWNAOPCJA -1    /* kody bledow rozpoznawania opcji */
#define B_BRAKNAZWY   -2
#define B_BRAKWARTOSCI  -3
#define B_BRAKPLIKU   -4
#define DL_LINII 1024

/*Funkcja czytaj*/
int czytaj(s_obraz *obraz, w_opcje *wybor){
  char buf[DL_LINII];      /* bufor pomocniczy do czytania naglowka i komentarzy */
  int znak;                /* zmienna pomocnicza do czytania komentarzy */
  int koniec=0;            /* czy napotkano koniec danych w pliku */
  int i,j;

  /*Sprawdzenie czy podano prawidłowy uchwyt pliku */
  if (wybor->plik_we==NULL) {
    fprintf(stderr,"Blad: Nie podano uchwytu do pliku\n");
    return(0);
  }

  /* Sprawdzenie "numeru magicznego" - powinien być P2 */
  if (fgets(buf,DL_LINII,wybor->plik_we)==NULL)   /* Wczytanie pierwszej linii pliku do bufora */
    koniec=1;                              /* Nie udalo sie? Koniec danych! */

  if ( (buf[0]!='P') || (buf[1]!='2') || koniec) {  /* Czy jest magiczne "P2"? */
    fprintf(stderr,"Blad: To nie jest plik PGM\n");
    return(0);
  }

  /* Pominiecie komentarzy */
  do {
    if ((znak=fgetc(wybor->plik_we))=='#') {         /* Czy linia rozpoczyna sie od znaku '#'? */
      if (fgets(buf,DL_LINII,wybor->plik_we)==NULL)  /* Przeczytaj ja do bufora                */
	koniec=1;                   /* Zapamietaj ewentualny koniec danych */
    }  else {
      ungetc(znak,wybor->plik_we);                   /* Gdy przeczytany znak z poczatku linii */
    }                                         /* nie jest '#' zwroc go                 */
  } while (znak=='#' && !koniec);   /* Powtarzaj dopoki sa linie komentarza */
                                    /* i nie nastapil koniec danych         */

  /* Pobranie wymiarow obrazu i liczby odcieni szarosci */
  if (fscanf(wybor->plik_we,"%d %d %d",&(obraz->wymx),&(obraz->wymy),&(obraz->szarosci))!=3) {
    fprintf(stderr,"Blad: Brak wymiarow obrazu lub liczby stopni szarosci\n");
    return(0);
  }
  /* Pobranie obrazu i zapisanie w tablicy dynamicznej*/
  obraz->wymx = 5; obraz->wymy = 7;
  int (*tablica)[obraz->wymx];
  obraz->tablica = (int(*)[obraz->wymx])malloc(obraz->wymx*obraz->wymy*sizeof(int));
  
  for (i=0;i<obraz->wymy;i++) {
    for (j=0;j<obraz->wymx;j++) {
      if (fscanf(wybor->plik_we,"%d",&(obraz->tablica[i][j]))!=1) {
	fprintf(stderr,"Blad: Niewlasciwe wymiary obrazu\n");
	return(0);
      }
    }
  }
    return ((obraz->wymx)*(obraz->wymy));   /* Czytanie zakonczone sukcesem    */
}                       /* Zwroc liczbe wczytanych pikseli */



int przetwarzaj_opcje(int argc, char **argv, w_opcje *wybor, s_obraz *obraz) {
  int i, prog;
  char *nazwa_pliku_we, *nazwa_pliku_wy;

  wyzeruj_opcje(wybor);
  wybor->plik_wy=stdout;        /* na wypadek gdy nie podano opcji "-o" */

  for (i=1; i<argc; i++) {
    if (argv[i][0] != '-')  /* blad: to nie jest opcja - brak znaku "-" */
      return B_NIEPOPRAWNAOPCJA; 
    switch (argv[i][1]) {
    case 'i': {                 /* opcja z nazwa pliku wejsciowego */
      if (++i<argc) {   /* wczytujemy kolejny argument jako nazwe pliku */
	obraz->nazwa_we=argv[i];
	if (strcmp(obraz->nazwa_we,"-")==0) /* gdy nazwa jest "-"        */
	  wybor->plik_we=stdin;            /* ustwiamy wejscie na stdin */
	else {                              /* otwieramy wskazany plik   */
	  wybor->plik_we=fopen(obraz->nazwa_we,"r");
	  czytaj(obraz, wybor->plik_we);}
      } else 
	return B_BRAKNAZWY;                   /* blad: brak nazwy pliku */
      break;
    }
    case 'o': {                 /* opcja z nazwa pliku wyjsciowego */
      if (++i<argc) {   /* wczytujemy kolejny argument jako nazwe pliku */
	obraz->nazwa_wy=argv[i];
	if (strcmp(obraz->nazwa_wy,"-")==0)/* gdy nazwa jest "-"         */
	  wybor->plik_wy=stdout;          /* ustwiamy wyjscie na stdout */
	else{                              /* otwieramy wskazany plik    */
	  wybor->plik_wy=fopen(obraz->nazwa_wy,"w");
	  zapis(obraz, wybor->plik_we);
	}} else 
	  return B_BRAKNAZWY;                   /* blad: brak nazwy pliku */
      break;
    }
    case 'p': {
      if (++i<argc) { /* wczytujemy kolejny argument jako wartosc progu */
	if (sscanf(argv[i],"%d",&prog)==1) {
	  wybor->progowanie=1;
	  wybor->w_progu=prog;
	} else
	  return B_BRAKWARTOSCI;     /* blad: niepoprawna wartosc progu */
      } else 
	return B_BRAKWARTOSCI;             /* blad: brak wartosci progu */
      break;
    }
    case 'n': {                 /* mamy wykonac negatyw */
      wybor->negatyw=1;
      break;
    }
    case 'k': {                 /* mamy wykonac konturowanie */
      wybor->konturowanie=1;
      break;
    }
    case 'd': {                 /* mamy wyswietlic obraz */
      wybor->wyswietl=1;
      break;
    }
    default:                    /* nierozpoznana opcja */
      return B_NIEPOPRAWNAOPCJA;
    } /*koniec switch */
  } /* koniec for */

  if (wybor->plik_we!=NULL)     /* ok: wej. strumien danych zainicjowany */
    return W_OK;
  else 
    return B_BRAKPLIKU;         /* blad:  nie otwarto pliku wejsciowego  */
}

/* Funkcja wyswietlania obrazu za pomoca 'display' */
void wyswietl(char *n_pliku) {
  char polecenie[DL_LINII];      /* bufor pomocniczy do zestawienia polecenia */

  strcpy(polecenie,"display ");  /* konstrukcja polecenia postaci */
  strcat(polecenie,n_pliku);     /* display "nazwa_pliku" &       */
  strcat(polecenie," &");
  printf("%s\n",polecenie);      /* wydruk kontrolny polecenia */
  system(polecenie);             /* wykonanie polecenia        */
}

/*Wyzeruj opcje*/
void wyzeruj_opcje(w_opcje *wybor) {
  wybor->plik_we=NULL;
  wybor->plik_wy=NULL;
  wybor->negatyw=0;
  wybor->konturowanie=0;
  wybor->progowanie=0;
  wybor->wyswietl=0;
}


/* Funkcja zapisu obrazu do pliku */

int zapis(s_obraz *obraz, w_opcje *opcje) { 
  unsigned int i,j;
  if(opcje->plik_wy == NULL) { fprintf(stderr,"Blad: Nie podano uchwytu pliku\n"); return 0; }
  fprintf(opcje->plik_wy,"P2\n"); fprintf(opcje->plik_wy,"%d %d\n",obraz->wymx,obraz->wymy); fprintf(opcje->plik_wy,"%d\n",obraz->szarosci);
  for(j = 0;j < obraz->wymy; j++) { 
    for(i = 0;i < obraz->wymx; i++) { 
      fprintf(opcje->plik_wy,"%3d ",obraz->tablica[j][i]); }
    i = 0; }
  return 1;}

/* Funkcja negatywu */

void negatyw(s_obraz *obraz){
  int i, j;
  for (j=0; j<obraz->wymx; j++){
    for (i=0; i<obraz->wymy; i++){
      obraz->tablica[i][j]=obraz->odcieni-obraz->tablica[i][j];
    }
  }
 }

/* Funkcja progowania */

void progowanie(s_obraz *obraz, int prog){
  int i, j;
  for (j=0; j<obraz->wymx; j++){
    for (i=0; i<obraz->wymy; i++){
      if (obraz->tablica[i][j]<=prog)
	obraz->tablica[i][j]=0;
      else if (obraz->tablica[i][j]>prog)
	obraz->tablica[i][j]=obraz->odcieni;
    }
  }
}

/* Funkcja konturowania */

void konturowanie(s_obraz *obraz){
  int i, j;
  for (j=0; j<obraz->wymx; j++){
    for (i=0; i<obraz->wymy; i++){
      obraz->tablica[i][j]=abs(obraz->tablica[i][1,j]-obraz->tablica[i][j])+abs(obraz->tablica[i][j+1]-obraz->tablica[i][j]);
    }
  }
}

/* Funkcja rozmywania poziomego */

void rozmywanie(s_obraz *obraz){
  int i, j;
  for (j=0; j<obraz->wymx; j++){
    for (i=1; i<obraz->wymy; i++){
      obraz->tablica[i][j]=(((obraz->tablica[i-1][j])+(obraz->tablica[i][j])+(obraz->tablica[i+1][j]))/3);
    }
  }
}

Modul.h:

#ifndef MODUL_H
#define MODUL_H

/* strukura do zapamietywania opcji podanych w wywolaniu programu */
typedef struct {
  FILE *plik_we, *plik_wy;        /* uchwyty do pliku wej. i wyj. */
  int negatyw,progowanie,konturowanie,wyswietl;      /* opcje */
  int w_progu;
} w_opcje;

typedef struct {
  char *nazwa_we, *nazwa_wy;
  int szarosci;
  int odcieni;
  int wymx;
  int wymy;
  int **tablica;
} s_obraz;

int przetwarzaj_opcje(int argc, char **argv, w_opcje *wybor, s_obraz *obraz);
int czytaj(s_obraz *obraz, w_opcje *opcje);
void wyswietl(char *n_pliku);
int zapis(s_obraz *obraz, w_opcje *wybor);
void negatyw(s_obraz *obraz);
void progowanie(s_obraz *obraz, int prog);
void konturowanie(s_obraz *obraz);
void rozmywanie(s_obraz *obraz);
void wyzeruj_opcje(w_opcje *wybor);
#endif

 

Ktoś może pomóc?

0

I którego słowa nie rozumiesz w tych komunikatach?

0

Tego nie rozumiem: expected ‘struct w_opcje *’ but argument is of type ‘struct FILE *’

0

Naruszenie ochrony pamięci... Program się kompiluje ale po wczytaniu pliku wyskakuje błąd. Co jest nie tak?
modul.h

 
/*STRUKTURA PRZECHOWUJACA TABLICE Z OBRAZEM*/
typedef struct{
	int wymx, wymy;
	int odcieni;
	int *tablica;
}s_obraz;


/*STRUKTURA PRZECHOWUJACA WARTOSCI OPCJI*/
typedef struct {
  FILE *plik_we, *plik_wy;                               /* uchwyty do pliku wej. i wyj. */
  int negatyw,progowanie,konturowanie,wyswietl;          /* opcje */
  int w_progu;                                           /* wartosc progu dla opcji progowanie */ 
} w_opcje;


int czytaj(w_opcje *opcje, s_obraz *obraz);
int wyswietl(char *n_pliku);
int zapis(w_opcje *opcje, s_obraz *obraz);
int negatyw(s_obraz *obraz);
int progowanie(s_obraz *obraz, int prog);
int konturowanie(s_obraz *obraz);
int rozmywanie(s_obraz *obraz);

modul.c:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include "modul.h"          
#define DL_LINII 1024 

/*Funkcja czytaj*/
int czytaj(w_opcje *opcje, s_obraz *obraz) {
  char buf[DL_LINII];      /* bufor pomocniczy do czytania naglowka i komentarzy */
  int znak;                /* zmienna pomocnicza do czytania komentarzy */
  int koniec=0;            /* czy napotkano koniec danych w pliku */
  int i,j;

  /*Sprawdzenie czy podano prawidłowy uchwyt pliku */
  if (opcje->plik_we==NULL) {
    fprintf(stderr,"Blad: Nie podano uchwytu do pliku\n");
    return(0);
  }

  /* Sprawdzenie "numeru magicznego" - powinien być P2 */
  if (fgets(buf,DL_LINII,opcje->plik_we)==NULL)   /* Wczytanie pierwszej linii pliku do bufora */
    koniec=1;                              /* Nie udalo sie? Koniec danych! */

  if ( (buf[0]!='P') || (buf[1]!='2') || koniec) {  /* Czy jest magiczne "P2"? */
    fprintf(stderr,"Blad: To nie jest plik PGM\n");
    return(0);
  }

  /* Pominiecie komentarzy */
  do {
    if ((znak=fgetc(opcje->plik_we))=='#') {         /* Czy linia rozpoczyna sie od znaku '#'? */
      if (fgets(buf,DL_LINII,opcje->plik_we)==NULL)  /* Przeczytaj ja do bufora                */
	koniec=1;                   /* Zapamietaj ewentualny koniec danych */
    }  else {
      ungetc(znak,opcje->plik_we);                   /* Gdy przeczytany znak z poczatku linii */
    }                                         /* nie jest '#' zwroc go                 */
  } while (znak=='#' && !koniec);   /* Powtarzaj dopoki sa linie komentarza */
                                    /* i nie nastapil koniec danych         */

  /* Pobranie wymiarow obrazu i liczby odcieni szarosci */
  if (fscanf(opcje->plik_we,"%d %d %d",&(obraz->wymx),&(obraz->wymy),&(obraz->odcieni))!=3) {
    fprintf(stderr,"Blad: Brak wymiarow obrazu lub liczby stopni szarosci\n");
    return(0);
  }
  /* Pobranie obrazu i zapisanie w tablicy dynamicznej*/
  obraz->tablica = (int *)malloc((obraz->wymy)*(obraz->wymx)*sizeof(int));
  int (*tablica)[obraz->wymx];
  tablica = (int(*)[obraz->wymx]) obraz->tablica;
  for (i=0;i<obraz->wymy;i++) {
    for (j=0;j<obraz->wymx;j++) {
      if (fscanf(opcje->plik_we,"%d",&(tablica[i][j]))!=1) {
	fprintf(stderr,"Blad: Niewlasciwe wymiary obrazu\n");
	return(0);
      }
    }
  }
  return ((obraz->wymx)*(obraz->wymy));   /* Czytanie zakonczone sukcesem    */
}                       /* Zwroc liczbe wczytanych pikseli */


/* Funkcja wyswietlania obrazu za pomoca 'display' */
int wyswietl(char *n_pliku) {
  char polecenie[DL_LINII];      /* bufor pomocniczy do zestawienia polecenia */

  strcpy(polecenie,"display ");  /* konstrukcja polecenia postaci */
  strcat(polecenie,n_pliku);     /* display "nazwa_pliku" &       */
  strcat(polecenie," &");
  printf("%s\n",polecenie);      /* wydruk kontrolny polecenia */
  system(polecenie);             /* wykonanie polecenia        */
}

/* Funkcja zapisu obrazu do pliku */

int zapis(w_opcje *opcje, s_obraz *obraz) { 
  unsigned int i,j;
  int(*tablica)[obraz->wymx]; tablica = (int(*)[obraz->wymx])obraz->tablica;
  if(opcje->plik_wy == NULL) { fprintf(stderr,"Blad: Nie podano uchwytu pliku\n"); return 0; }
  fprintf(opcje->plik_wy,"P2\n"); fprintf(opcje->plik_wy,"%d %d\n",obraz->wymx,obraz->wymy); fprintf(opcje->plik_wy,"%d\n",obraz->odcieni);
  for(j = 0;j < obraz->wymy; j++) { 
    for(i = 0;i < obraz->wymx; i++) { 
      fprintf(opcje->plik_wy,"%3d ", tablica[i][j]); }
    i = 0; }
  return 1;}

/* Funkcja negatywu */

int negatyw(s_obraz *obraz){
  int i, j;
  int(*tablica)[obraz->wymx]; tablica = (int(*)[obraz->wymx])obraz->tablica;
  for (j=0; j<obraz->wymy; j++){
    for (i=0; i<obraz->wymx; i++){
      tablica[i][j]=obraz->odcieni-tablica[i][j];
    }
  }
 }

/* Funkcja progowania */

int progowanie(s_obraz *obraz, int prog){
  int i, j;
  int(*tablica)[obraz->wymx]; tablica = (int(*)[obraz->wymx])obraz->tablica;
  for (j=0; j<obraz->wymy; j++){
    for (i=0; i<obraz->wymx; i++){
      if (tablica[i][j]<=prog)
	tablica[i][j]=0;
      else if (tablica[i][j]>prog)
	tablica[i][j]=obraz->odcieni;
    }
  }
}

/* Funkcja konturowania */

int konturowanie(s_obraz *obraz){
  int i, j;
  int(*tablica)[obraz->wymx]; tablica = (int(*)[obraz->wymx])obraz->tablica;
  for (j=0; j<obraz->wymy; j++){
    for (i=0; i<obraz->wymx; i++){
      tablica[i][j]=abs(tablica[i][1,j]-tablica[i][j])+abs(tablica[i][j+1]-tablica[i][j]);
    }
  }
}

/* Funkcja rozmywania poziomego */

int rozmywanie(s_obraz *obraz){
  int i, j;
  int(*tablica)[obraz->wymx]; tablica = (int(*)[obraz->wymx])obraz->tablica;
  for (j=0; j<obraz->wymy; j++){
    for (i=1; i<obraz->wymx; i++){
      tablica[i][j]=(((tablica[i-1][j])+(tablica[i][j])+(tablica[i+1][j]))/3);
    }
  }
}
 

main.c:

 
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include"modul.h"

/* Funkcja glowna programu z menu switch */

int main() {
  s_obraz *obraz;
  w_opcje *opcje;
  int wybor = 0;
  int prog = 0;
  char nazwa[100], nazwa_ost[100];
  /* Wczytanie zawartosci wskazanego pliku do pamieci */
  printf("Podaj nazwe pliku aby uruchomic menu:\n");
  scanf("%s",nazwa);
  opcje->plik_we=fopen(nazwa,"r");
  czytaj(opcje, obraz);
  if (opcje->plik_we != NULL)
  printf("[1] Wyswietl\n[2] Negatyw\n[3] Konturowanie\n[4] Progowanie\n[5] Rozmywanie poziome\n[6] Zapisz\n[7] Koniec\n"); /*wyswietlanie menu*/
  while(wybor!=7){
  scanf("%d", &wybor);
  switch (wybor){
    case 1:     /*wyswietlanie za pomoca display*/
      fclose(opcje->plik_we);
      wyswietl(nazwa);
      break;
    case 2:    /*negatyw*/
      negatyw(obraz);
      break;
    case 3:    /*konturowanie*/
      konturowanie(obraz);
      break;
    case 4:   /*progowanie*/
      printf("Podaj wartosc progu(0-255):\n");
      scanf("%d", &prog);
      progowanie(obraz, prog);
      break;
    case 5:   /*rozmywanie*/
      rozmywanie(obraz);
      break;
    case 6:   /*zapis do pliku*/
      printf("Podaj nazwe pliku z rozszerzeniem .pgm\n");
      scanf("%s", nazwa_ost);
      opcje->plik_wy=fopen(nazwa_ost, "w");
      zapis(opcje, obraz);
      break;
  }
  }
  return 1;
}
0

Czyli gdzieś odwołujesz się do tablicy poza zakresem.
Odpalasz debuger i sprawdzasz gdzie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1