Datum i vreme: 13.01.2018., 07.40
Dobro Došli, Gost! (Prijava — Registracija)
Ubuntu-RS forumi
  • Početna
  • Pravilnik
  • Pretraga
  • Pomoć
  • Planeta
  • Wiki
  • Sajt
  • Kalendar
  • RSS
Nove poruke Današnje poruke Spisak članova Spisak prijatelja
Važno obaveštenje
Izašao je novi LiBRE, broj 47
Ubuntu 17.10 spreman je za preuzimanje

Ubuntu-RS forumi Ubuntu opšta podrška Programiranje v
« Prethodno 1 2 3 4 5 6 ... 11 Sledeće »

Ubuntu [Rešeno] C - strukture i header - pomoc

Tema je Zatvorena 
 
Ocena Teme:
  • 0 Glasov(a) - 0 Prosečno
  • 1
  • 2
  • 3
  • 4
  • 5
Niz | Puni Prikaz
[Rešeno] C - strukture i header - pomoc
Autor Poruka
komarx6 Nije na vezi
Član
***

Poruka: 135
Dao zahvalnica: 3
Dobio zahvalnica: 0 u 0 poruka
Pridružen: Oct 2009
Ugled: 0
Poruka: #1
[Rešeno] C - strukture i header - pomoc
У code blocks пројекту имам ова 3 фајла:
main.c
Kod:
#include <stdio.h>
#include <stdlib.h>
#include "zast.h"
int main()
{
    t1 *a = malloc(sizeof(t1));
    a->unu.d = 1.0;
}

zast.h
Kod:
#ifndef ZAST
#define ZAST
typedef struct test1 t1;
typedef struct test2 t2;
#endif

zast.c
Kod:
#include "zast.h"

struct test1
{
    t2 unu;
};
struct test2
{
    double d;
};

Кад покушам превести добијем следећу поруку преводиоца:
Kod:
||=== beze, Debug ===|
/home/marko/Documents/Projekti/beze/main.c||In function ‘main’:|
/home/marko/Documents/Projekti/beze/main.c|6|error: invalid application of ‘sizeof’ to incomplete type ‘t1’ |
/home/marko/Documents/Projekti/beze/main.c|7|error: dereferencing pointer to incomplete type|
/home/marko/Documents/Projekti/beze/main.c|8|warning: control reaches end of non-void function [-Wreturn-type]|
||=== Build finished: 2 errors, 1 warnings ===|

Зна ли неко гдје сам погрјешио и како треба поставити структуре у хедере.
Ово је само тестни примјер програма, грешка ми се јавила у јендом много већем програму. АЛи ето ја не знам ни као да је исправим у овом.
Циљ ми је да структуре одвојим у посебан фајл, направим хедер и користим их у другим фајловима.
Уколико не користим показивач, нпр:
main.c
Kod:
#include <stdio.h>
#include <stdlib.h>
#include "zast.h"
int main()
{
    t1 a;
    a.unu.d = 1.0;
}
Добијем следећу поруку:
Kod:
/home/marko/Documents/Projekti/beze/main.c|6|error: storage size of ‘a’ isn’t known|

Очигледно преводилац не зна ништа о тој структури иако сам укључио zast.h. A изгледа да ни ја не знам како треба ставити структуре у хедере. Да ли је (једино) рјешење да ставим чиставу структуру у хедер, а не само декларацију.
(Poslednja izmena: 27.08.2012. 23.12 od komarx6.)
27.08.2012. 22.58
Pronađi sve korisnikove poruke
[+]
caslav.ilic Nije na vezi
kde-l10n-sr
****

Poruka: 265
Dao zahvalnica: 0
Dobio zahvalnica: 38 u 25 poruka
Pridružen: May 2007
Ugled: 4
Poruka: #2
[Rešeno] C - strukture i header - pomoc
Мораш да ставиш целу декларацију структуре у заглавље, али се декларацијом не назива typedef ... већ оно што ти зовеш читавoм структуром:
Kod:
/* декларација структуре */
struct test1
{
    double d;
};
/* дефиниција типа */
typedef struct test1 t1;
Ово је неопходно зато што чим треба резервисати простор за примерак структуре, или се неки њен члан помене, компилатор мора да зна типове и величине поменутог. Додатно се обично декларација стопи са typedef, и употреби исто име, па испадне:
Kod:
typedef struct test1
{
    double d;
} test1;

Изузетак је када се помиње само показивач на примерак структуре, јер пошто величина показивача не зависи од типа на који показује, компилатор мора да зна једино да тип постоји. Ово се користи да би се избегло укључивање заглавља у заглавља колико је могуће, чиме се смањује број датотека које треба поново компиловати када се неко заглавље промени:
Kod:
/* test1.h */
#ifndef TEST1
#define TEST1

/* Нормална декларација test1. */
typedef struct test1
{
    double d;
} test1;

#endif

Kod:
/* test2.h */
#ifndef TEST2
#define TEST2

/* Унапредна декларација test1, без укључивања test1.h. */
typedef struct test1 test1;

typedef struct test2
{
    test1 *a;
} test2;

void func2 (test2 *b);

#endif

Kod:
/* test2.c */
#include <stdio.h>
#include "test2.h"
/* Сада мора да се укључи test1.h, пошто се доле помињу чланови test1. */
#include "test1.h"

void func2 (test2 *b)
{
    printf("%f\n", b->a->d);
}

Kod:
/* main.c */
#include <stdlib.h>
/* Сада мора да се укључи и test1.h и test2.h, пошто се доле
   стварају њихови примерци и помињу чланови. */
#include "test1.h"
#include "test2.h"

int main ()
{
    test2 *b = malloc(sizeof(test2));
    b->a = malloc(sizeof(test1));
    b->a->d = 3.14159;
    func2(b);
    free(b->a);
    free(b);
    return 0;
}

Часлав Илић
28.08.2012. 11.28
Pronađi sve korisnikove poruke
[+]
komarx6 Nije na vezi
Član
***

Poruka: 135
Dao zahvalnica: 3
Dobio zahvalnica: 0 u 0 poruka
Pridružen: Oct 2009
Ugled: 0
Poruka: #3
[Rešeno] C - strukture i header - pomoc
Znaci ipak je jedini nacin da stavim cijelu strukturu u zaglavlje. OK. Ja sam to vec uradio u svom programu, ali sam mislio da postoji i neki drugi nacin.

Hvala na pomoci u svakom slucaju.

Citat:али се декларацијом не назива typedef ... већ оно што ти зовеш читавoм структуром:
Akoje tacno to sto kazete, onda se to ne slaze sa deklaracijom i definicijom funkcije. Kod funkcija, analogna stvar typedef-u je deklaracija (samo portotip funkcije npr:
Kod:
void funk(char*);
)
,a analogna stvar cijeloj (tj. ovim sto Vi nazivate deklaracijom) strukturi je definicija funkcije.
Da se niste mozda pomijesali deklaraciju i definiciju?

mogao bih staviti [RESENO], zar ne?
28.08.2012. 12.19
Pronađi sve korisnikove poruke
[+]
« Starije Teme | Novije Teme »
Tema je Zatvorena 


Verovatno Povezane Teme...
Tema: Autor Odgovora: Pregleda: Poslednja Poruka
  Header u WordPress temi ubuntu-marko 13 3,408 29.04.2013. 08.04
Poslednja Poruka: ubuntu-marko

  • Verzija Za Štampu
  • Pošalji ovu Temu Prijatelju
  • Prati ovu temu


Kontakt Ubuntu LoZa Srbije Povratak na Vrh Povratak na Sadržaj Mobile Version RSS Prijava greške
© 2005-2018 Ubuntu LoCo Serbia. Ubuntu and Canonical are registered trademarks of Canonical Ltd.
Powered_by MyBB, © 2002-2018 MyBB Group.
Designed by : ZeRQ and Ubuntu LoCo Serbia
Hosted by mCloud