Witam, tak jak w tytule, mam problem z programem. Nie mogę dojsc co jest niepoprawne. Program powinien po wywołaniu z konsoli wykonywać podane polecenia. Wszystko co udało mi sie napisać jest w załączniku. Może dodam, że problem był przy nakładaniu filtrów na obraz. Nie był on modyfikowany. Dodatkowo mam problem z sensowną funkcją wyswietl, jakieś sugestie?

1. modul.h:

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

typedef struct{
	int form;
	int wymx,wymy,szarosci;
	int **tab;
}obraz;

typedef struct{
	FILE *plik_we, *plik_wy;
	int kolorowe,szare,negatyw,progowanie,ppol_czern,ppol_biel,k_gamma,konturowanie,r_poz,r_pion,wyswietlenie,z_poziomow,zapisz,wczytaj;
	int prog,prog_biel,prog_czern;
	double wsp_gamma;
	int w_biel,w_czern;
}opcje;

void wyzeruj_opcje(opcje *wybor);
int przetwarzaj_opcje(int argc, char **argv, opcje *wybor);
int zapisz(FILE *plik_wy,obraz n_obraz);
int wczytaj(FILE *plik_we,obraz *w_obraz);
void wyswietl(char *n_pliku);
void negatyw(obraz w_obraz,obraz n_obraz);
void konturowanie(obraz w_obraz,obraz n_obraz);
void r_poz(obraz w_obraz,obraz n_obraz);
void r_pion(obraz w_obraz,obraz n_obraz);
void progowanie(obraz w_obraz,obraz n_obraz, int prog);
void k_gamma(obraz w_obraz,obraz n_obraz, double wsp_gamma);
void z_poziomow(obraz w_obraz,obraz n_obraz,int w_biel,int w_czern);
void ppol_biel(obraz w_obraz,obraz n_obraz, int prog_biel);
void ppol_czern(obraz w_obraz,obraz n_obraz, int prog_czern);
int tryb_opcje(int argc,char **argv);

#endif

2.modul.c:

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

int i, j;	    /* Pomocnicze zmienne do tablic */

void wyzeruj_opcje(opcje *wybor){
	wybor->plik_we=NULL;
	wybor->plik_wy=NULL;
	wybor->kolorowe=0;
	wybor->szare=0;
	wybor->negatyw=0;
	wybor->progowanie=0;
	wybor->ppol_czern=0;
	wybor->ppol_biel=0;
	wybor->k_gamma=0;
	wybor->konturowanie=0;
	wybor->r_poz=0;
	wybor->r_pion=0;
	wybor->wyswietlenie=0;
	wybor->z_poziomow=0;
}

int przetwarzaj_opcje(int argc, char **argv, opcje *wybor) {
	int prog,wart_biel,wart_czern,w_czern,w_biel;
	double w_gamma;
	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 */
	nazwa_pliku_we=argv[i];
	if (strcmp(nazwa_pliku_we,"-")==0) /* gdy nazwa jest "-"        */
	  wybor->plik_we=stdin;            /* ustwiamy wejscie na stdin */
	else                               /* otwieramy wskazany plik   */
	  wybor->plik_we=fopen(nazwa_pliku_we,"r");
      } 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 */
	nazwa_pliku_wy=argv[i];
	if (strcmp(nazwa_pliku_wy,"-")==0)/* gdy nazwa jest "-"         */
	  wybor->plik_wy=stdout;          /* ustwiamy wyjscie na stdout */
	else                              /* otwieramy wskazany plik    */
	  wybor->plik_wy=fopen(nazwa_pliku_wy,"w");
      } else 
	return B_BRAKNAZWY;                   /* blad: brak nazwy pliku */
      break;
    }
      
    case 'd': {                 /* mamy wyswietlic obraz */
      wybor->wyswietlenie=1;
      break;
    }
    
    case 'n': {                 /* mamy wykonac negatyw */
      wybor->negatyw=1;
      break;
    }
    case 'p': {
      if (++i<argc) { /* wczytujemy kolejny argument jako wartosc progu */
	if (sscanf(argv[i],"%d",&prog)==1) {
	  wybor->progowanie=1;
	  wybor->prog=prog;
	} else
	  return B_BRAKWARTOSCI;     /* blad: niepoprawna wartosc progu */
      } else 
	return B_BRAKWARTOSCI;             /* blad: brak wartosci progu */
      break;
    }
    case 'c':{
	if(++i<argc){
	if(sscanf(argv[i],"%d",wart_czern)==1){
		wybor->ppol_czern=1;
		wybor->w_czern=wart_czern;
	}else
	return B_BRAKWARTOSCI;
	}else
	return B_BRAKWARTOSCI;
	break;
	}
	case 'b':{
	if(++i<argc){
	if(sscanf(argv[i],"%d",wart_biel)==1){
		wybor->ppol_biel=1;
		wybor->w_biel=wart_biel;
	}else
	return B_BRAKWARTOSCI;
	}else
	return B_BRAKWARTOSCI;
	break;
	}
	case 'g':{
	if(++i<argc){
	if(sscanf(argv[i],"%d",w_gamma)==1){
		wybor->k_gamma=1;
		wybor->wsp_gamma=w_gamma;
	}else
	return B_BRAKWARTOSCI;
	}else
	return B_BRAKWARTOSCI;
	break;
	}
	case 'z':{
	if(++i<argc){
	if(sscanf(argv[i],"%d %d",w_biel,w_czern)==2){
		wybor->z_poziomow=1;
		wybor->w_biel=w_biel;
		wybor->w_czern=w_czern;
	}else
	return B_BRAKWARTOSCI;
	}else
	return B_BRAKWARTOSCI;
	  break;
	}
    case 'k': {                 /* mamy wykonac konturowanie */
      wybor->konturowanie=1;
      break;
    }
    case 'x':{
      wybor->r_poz=1;
	  break;
	}
	case 'y':{
		wybor->r_pion=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  */
}

void wyswietl(char *n_pliku){
	
	char polecenie[DL_LINII];
	strcpy(polecenie,"display");
	strcat(polecenie,n_pliku);
	strcat(polecenie,"&");
	strcat("%s\n",polecenie);
	system(polecenie);
}

int zapisz(FILE *plik_wy,obraz n_obraz){
	
	fprintf(plik_wy,"P2\n%d %d\n%d\n",n_obraz.wymx,n_obraz.wymy,n_obraz.szarosci);
	for(i=0;i<n_obraz.wymy;i++){
		for(j=0;j<n_obraz.wymx;j++){
			fprintf(plik_wy,"%d\n",n_obraz.tab[i][j]);
		}
}
}

int wczytaj(FILE *plik_we,obraz *w_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 l_mag;

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

  /* Sprawdzenie "numeru magicznego" - powinien byc P2 lub P3 */
  if (fgets(buf,DL_LINII,plik_we)==NULL)   /* Wczytanie pierwszej linii pliku do bufora */
    koniec=1;                              /* Nie udalo sie? Koniec danych! */
	
	if(((buf[0] != 'P') || (buf[1] != '2') || koniec) && ((buf[0]!='P') || (buf[1]!='3') || koniec))
    {  /* Czy jest magiczne "P2" lub "P3"? */
      fprintf(stderr, "Blad: To nie jest plik PGM ani obraz PPM \n");
    }
    l_mag=buf[1];

  /* Pominiecie komentarzy */
  do {
    if ((znak=fgetc(plik_we))=='#') {         /* Czy linia rozpoczyna sie od znaku '#'? */
      if (fgets(buf,DL_LINII,plik_we)==NULL)  /* Przeczytaj ja do bufora                */
	koniec=1;                             /* Zapamietaj ewentualny koniec danych 	*/
    }  else {
      ungetc(znak,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(plik_we,"%d %d %d", &w_obraz->wymx, &w_obraz->wymy, &w_obraz->szarosci)!=3) {
    fprintf(stderr,"Blad: Brak wymiarow obrazu lub liczby stopni szarosci\n");
    return(0);
  }
  
  if(l_mag=='2'){
	w_obraz->tab=(int**)malloc(w_obraz->wymy*sizeof(int*));
	for(i=0;i<w_obraz->wymy;i++){
		w_obraz->tab[i] = (int*)malloc(w_obraz->wymx*sizeof(int));
	}
	for(i=0;i<w_obraz->wymy;i++){
		for(j=0;j<w_obraz->wymx;j++){
			if(fscanf(plik_we,"%d",&(w_obraz->tab[i][j]))!=1){
				fprintf(stderr,"Blad: Niewlasciwe wymiary obrazu\n");
			}
		}
	}
  }
  
  if(l_mag=='3'){
  	int a,b,c;
	w_obraz->tab=(int**)malloc(w_obraz->wymy*sizeof(int*));
	for(i=0;i<w_obraz->wymy;i++){
		w_obraz->tab[i] = malloc(w_obraz->wymx*sizeof(int));
	}
	for(i=0;i<w_obraz->wymy;i++){
		for(j=0;j<w_obraz->wymx;j++){
			if(fscanf(plik_we,"%d %d %d",&a,&b,&c) == 3){
				w_obraz->tab[i][j]=(a+b+c)/3;
			}
		}
	}
  }
  }
  	
void negatyw(obraz w_obraz, obraz n_obraz){
	
	for(i=0;i<w_obraz.wymy;i++){
		for(j=0;j<(w_obraz.form*w_obraz.wymx); j+=w_obraz.form){
			n_obraz.tab[i][j]=(w_obraz.szarosci-(w_obraz.tab[i][j]));
		}
	}
	printf("Wykonano negatyw obrazu\n");
}

void konturowanie(obraz w_obraz,obraz n_obraz){
	
	int x,y;
	
	for(i=0;i<w_obraz.wymy;i++){
		for(j=0;j<(w_obraz.form*w_obraz.wymx); j+=w_obraz.form){
			if(i+1<w_obraz.wymy)
			x=1;
			else
			x=0;
			if(j+1<w_obraz.wymx)
			y=1;
			else
			y=0;
			
		n_obraz.tab[i][j]=(x*abs(w_obraz.tab[i+1][j]-w_obraz.tab[i][j])+y*abs(w_obraz.tab[i][j+1]-w_obraz.tab[i][j]))/2;
		}
	}
	printf("Wykonano konturowanie obrazu\n");
}

void r_poz(obraz w_obraz,obraz n_obraz){
	
	for(i=0; i<w_obraz.wymy;i++){
		for(j=0;j<(w_obraz.form*w_obraz.wymx); j+=w_obraz.form){
		n_obraz.tab[i][j]=(w_obraz.tab[i][j-1]+w_obraz.tab[i][j]+w_obraz.tab[i][j+1])/3;
		}
	}
	printf("Wykonano rozmycie poziome obrazu\n");
}

void r_pion(obraz w_obraz,obraz n_obraz){
	
	for(i=0; i<w_obraz.wymy;i++){
		for(j=0;j<(w_obraz.form*w_obraz.wymx); j+=w_obraz.form){
		n_obraz.tab[i][j]=(w_obraz.tab[i-1][j]+w_obraz.tab[i][j]+w_obraz.tab[i+1][j])/3;
		}
	}
	printf("Wykonano rozmycie poziome obrazu\n");
}

void progowanie(obraz w_obraz,obraz n_obraz, int prog){
	
	if(prog<=w_obraz.szarosci && prog>=0){
		for(i=0;i<w_obraz.wymy;i++){
			for(j=0;j<(w_obraz.form*w_obraz.wymx); j+=w_obraz.form){
			if(w_obraz.tab[i][j]<=prog)
			n_obraz.tab[i][j]=0;
			else
			n_obraz.tab[i][j]=w_obraz.szarosci;
			}
		}
		printf("Wykonano progowanie obrazu\n");
	}
	else
	printf("Podano zla wartosc progowania\n");
}

void k_gamma(obraz w_obraz,obraz n_obraz, double wsp_gamma){
	
	if(wsp_gamma>0){
		for(i=0;i<w_obraz.wymy;i++){
			for(j=0;j<(w_obraz.form*w_obraz.wymx); j+=w_obraz.form){
			n_obraz.tab[i][j]=pow((double)w_obraz.tab[i][j] / w_obraz.szarosci, 1 / wsp_gamma) * w_obraz.szarosci;
			}
		}
		printf("Wykonano korekcje gamma\n");
	}
	else
	printf("Wspolczynnik gamma ma byc dodatni\n");
}

void z_poziomow(obraz w_obraz,obraz n_obraz,int w_biel,int w_czern){
	
	if(w_czern<0 || w_czern>w_obraz.szarosci)
	printf("Bledne wartosc czerni\n");
	else if(w_biel<0 || w_biel>w_obraz.szarosci)
	printf("Bledne wartosc bieli\n");
	else{
	for(i=0;i<w_obraz.wymy;i++){
		for(j=0;j<(w_obraz.form*w_obraz.wymx); j+=w_obraz.form){
		if(w_czern<w_obraz.tab[i][j] && w_obraz.tab[i][j]<w_biel){
			n_obraz.tab[i][j]=((w_obraz.tab[i][j]-w_czern)*(w_obraz.szarosci/(w_biel-w_czern)));
		}
		else if(w_obraz.tab[i][j]<=w_czern)
		n_obraz.tab[i][j]=0;
		else
		n_obraz.tab[i][j]=w_obraz.szarosci;	
		}
	}
	printf("Wykonano zmiane poziomow\n");
	}
}

void ppol_biel(obraz w_obraz,obraz n_obraz, int prog){
	
	if(prog<=w_obraz.szarosci && prog>=0){
		for(i=0;i<w_obraz.wymy;i++){
			for(j=0;j<(w_obraz.form*w_obraz.wymx); j+=w_obraz.form){
			if(w_obraz.tab[i][j]<=prog)
			n_obraz.tab[i][j]=w_obraz.tab[i][j];
			else
			n_obraz.tab[i][j]=w_obraz.szarosci;
			}
		}
		printf("Wykonano polprogowanie bieli w obrazie\n");
	}
	else
	printf("Podano zla wartosc progu bieli\n");
}

void ppol_czern(obraz w_obraz,obraz n_obraz, int prog){
	
	if(prog<=w_obraz.szarosci && prog>=0){
		for(i=0;i<w_obraz.wymy;i++){
			for(j=0;j<(w_obraz.form*w_obraz.wymx); j+=w_obraz.form){
			if(w_obraz.tab[i][j]<=prog)
			n_obraz.tab[i][j]=0;
			else
			n_obraz.tab[i][j]=w_obraz.tab[i][j];
			}
		}
		printf("Wykonano polprogowanie czerni w obrazie\n");
	}
	else
	printf("Podano zla wartosc progu czerni\n");
}

3.tryb_opcje.c:

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

int i, j;
int modyfikacja=0;                /* Zmienna mĂłwiaca funkcjom, z ktĂłrej tablicy korzystac.0 - w_obraz, 1 - n_obraz */
int odczytano=0;

int tryb_opcje(int argc, char **argv){
	
	obraz stary_obraz,nowy_obraz;
	opcje opcje;
	
  if(W_OK != przetwarzaj_opcje(argc,argv,&opcje)){
      fprintf(stderr,"Nie udalo sie wczytac parametrow. \n");
      return B_NIEPOPRAWNAOPCJA;
    }
    
 	if(opcje.plik_we==NULL){
      fprintf(stderr,"Nie udalo sie wczytac pliku. \n");
      return B_BRAKPLIKU;
    }
    
    if (opcje.plik_we != NULL) {      /* co spowoduje zakomentowanie tego warunku */
	odczytano = wczytaj(opcje.plik_we, &stary_obraz);
	fclose(opcje.plik_we);
 	modyfikacja = 0;               /* Poniewaz wczytano nowy obraz */
	}
	
	
	/*         ZAPIS             */
	if(odczytano!=0){
	if(modyfikacja==0){
		zapisz(opcje.plik_wy,stary_obraz);
	}
	else{
		zapisz(opcje.plik_wy,nowy_obraz);
		for(i=0;i<nowy_obraz.wymy;i++){
		free(nowy_obraz.tab[i]);
		}
		}
	fclose(opcje.plik_wy);
	}
	else
	fprintf(stderr,"Blad: Nie ma pliku!\n");
	
	if(odczytano != 0) {
 	for(i=0; i<stary_obraz.wymy; i++) { 
  	free(stary_obraz.tab[i]);
 	}
	}
	
	
	if(opcje.wyswietlenie==1){
 /* UWAGA - brak pomysłu na inne */ 
  	wyswietl(argv[4]);          
	}
		
		
		
	if(opcje.negatyw==1){
	if(modyfikacja==0){
	negatyw(stary_obraz,nowy_obraz);
	modyfikacja=1;
	}
	else
	negatyw(nowy_obraz,nowy_obraz);
	}
	
	if(opcje.konturowanie==1){
	if(modyfikacja==0){
	konturowanie(stary_obraz,nowy_obraz);
	modyfikacja=1;
	}
	else
	konturowanie(nowy_obraz,nowy_obraz);
	}
	
	if(opcje.r_poz==1){
	if(modyfikacja==0){
	r_poz(stary_obraz,nowy_obraz);
	modyfikacja=1;
	}
	else
	r_poz(nowy_obraz,nowy_obraz);
	}
	
	if(opcje.r_pion==1){
	if(modyfikacja==0){
	r_pion(stary_obraz,nowy_obraz);
	modyfikacja=1;
	}
	else
	r_pion(nowy_obraz,nowy_obraz);
	}
	
	if(opcje.progowanie==1){
	if(modyfikacja==0){
	progowanie(stary_obraz,nowy_obraz, opcje.prog);
	modyfikacja=1;
	}
	else
	progowanie(nowy_obraz,nowy_obraz, opcje.prog);
	}
	
	if(opcje.k_gamma==1){
	if(modyfikacja==0){
	k_gamma(stary_obraz,nowy_obraz, opcje.wsp_gamma);
	modyfikacja=1;
	}
	else
	k_gamma(nowy_obraz,nowy_obraz, opcje.wsp_gamma);
	}
	
	if(opcje.z_poziomow==1){
	if(modyfikacja==0){
	z_poziomow(stary_obraz,nowy_obraz,opcje.w_biel, opcje.w_czern);
	modyfikacja=1;
	}
	else
	z_poziomow(nowy_obraz,nowy_obraz,opcje.w_biel, opcje.w_czern);
	}
	
	if(opcje.ppol_biel==1){
	if(modyfikacja==0){
	ppol_biel(stary_obraz,nowy_obraz, opcje.prog_biel);
	modyfikacja=1;
	}
	else
	ppol_biel(nowy_obraz,nowy_obraz, opcje.prog_biel);
	}
	
	if(opcje.ppol_czern==1){
	if(modyfikacja==0){
	ppol_czern(stary_obraz,nowy_obraz, opcje.prog_czern);
	modyfikacja=1;
	}
	else
	ppol_czern(nowy_obraz,nowy_obraz, opcje.prog_czern);
	}
	
	return W_OK;
}

4. main.c:

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


int main(int argc, char ** argv) {
	
	tryb_opcje(argc,argv);

}