Skocz do zawartości
Morzan

Pomoc młodemu programiście C

Rekomendowane odpowiedzi

Niedawno zacząłem programować i co rusz wpadam na jakieś problemy. Jeśli wśród Was znajdzie się ktoś, któ zna się na C, ma za dużo wolnego i miałby ochotę poodpowiadać na parę pytań może liczyć na moją wielką wdzięczność ;)

mój aktualny problem to "expected expression before ‘obrazek’"

Nie rozumiem dlaczego kompilator nie ma problemu z "void negatyw (obrazek *ob)", ale kiedy przychodzi do wynonania funcji problem się pojawia. (program docelowo ma działać na tablicach dynamicznych)

praogram wygląda tak (wersja okrojona):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
#include "mod5.h"
#include <string.h>
#include <stdlib.h>

#define MAX 512            /* Maksymalny rozmiar wczytywanego obrazu */
#define DL_LINII 1024    

int main()
{


            printf("tworzenie negatywu...\n");
         
          negatyw(obrazek *ob);
                printf("wykonano\n");
         

return 0;
}

void negatyw (obrazek *ob)
{
    int i,j;               /*od maksymalnej wartsci szarosci odejmuje kazdy element tablicy*/
    for (i=0; i<ob->wym_y;++i)
    {
        for (j=0; j<ob->wym_x;++j)
            ob->obraz[j]=ob->odcieni-ob->obraz[j];
    }
}

i plik nagłówkowy

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define DL_LINII 1024
#define MAX 512

typedef struct /*inicjacja struktury zawierającej odcienie, wymiary i adres tablicy*/
{ 
  int wym_x, wym_y, odcieni;
  int **obraz; 
}  obrazek;

void negatyw (obrazek *ob);

Będę straszliwie wdzięczny za każdą pomoc ;)

edit: racja jest bardziej czytelne, ale za to krzaczy forum ;/

Edytowane przez Morzan

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Na przyszłość użyj http://www.wklej.org/ lub czegoś podobnego, aby innym lepiej sie czytalo.

Tu jest twój problem

negatyw(obrazek *ob);

Do funkcji musisz przekazać adres w pamięci do obrazka(do pozyskania adresu z pamięci używasz & przed zmienną). Czyli:

struct obrazek ob;

negatyw(&ob);

 

Edytowane przez Misiek

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

struct obrazek ob;

Służy deklaracji zmiennej o nazwie "ob", którą możesz przekazać do funkcji. Bo w twoim przypadku nic nie przekazujesz.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dalej nie rozumiem o co Ci chodzi. Próbowałem do tego podejść na parę różnych sposobów i to daje najmniej błędów. Mianowicie tylko storage size of ‘ob’ isn’t known. Stworzyłem nową strukturę i z tego co rozumiem nie pokrywa się z tą która ma otrzymać dane. 

 

teraz wygląda tak

biblioteka

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

typedef struct /*inicjacja struktury zawierającej odcienie, wymiary i adres tablicy*/
{ 
  int wym_x, wym_y, odcieni;
  int **obraz; 
}  obrazek;
void negatyw(obrazek *ob);

kod

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

int mian (){
printf("tworzenie negatywu...");
struct obrazek ob;                                                                       /*zmiana*/
printf("wykonano");
negatyw(&ob); 
return 0;
}
void negatyw(obrazek *ob)
{
    int i,j;               /*od maksymalnej wartsci szarosci odejmuje kazdy element tablicy*/
    for (i=0; i<ob->wym_y;++i)
    {
        for (j=0; j<ob->wym_x;++j)
            ob->obraz[i][j]=ob->odcieni-ob->obraz[i][j];
    }
}

Ciężko mi znaleźć jakiś konwenter, który nie obędzie krzaczył forum, ani się nie rozjedzie :/

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
#include <stdio.h>
#include <string.h>
#include <stdlib.h>  

typedef struct /*inicjacja struktury zawierającej odcienie, wymiary i adres tablicy*/
{
	int wym_x, wym_y, odcieni;
	int **obraz;
}  obrazek;

void negatyw(obrazek *ob)
{
	int i, j;               /*od maksymalnej wartsci szarosci odejmuje kazdy element tablicy*/
	for (i = 0; i<ob->wym_y; ++i)
	{
		for (j = 0; j<ob->wym_x; ++j)
			ob->obraz[i][j] = ob->odcieni - ob->obraz[i][j];
	}
}

int main() {
	printf("tworzenie negatywu...");
	obrazek ob;                                                                       /*zmiana*/
	printf("wykonano");
	negatyw(&ob);
	return 0;
}

Powyższy kod odpalilem w gcc i sie skompilowal bez problemu.

Edytowane przez Misiek

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nie ma struct przed obrazek ob.

Wielkie dzięki. Nie wiem, czy sam bym do tego doszedł. Pozostaje mi sprawdzić, czy po zaimplementowaniu tego program będzie działać. Mam napisać, jeśli wszystko będzie działało poprawnie?

I mam nadzieję, że nie zająłem za dużo czasu ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Czy masz już konto? Zaloguj się poniżej.

Zaloguj się

×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę. Polityka prywatności