"globalna" struktura (struct), jak?

0

Witam. Pisze dosyć rozbudowany program (jako projekt na studiach) w c++ i jak do tej pory dawałem rade przeczesując pomoce w necie, tak teraz nie mogę znaleźć pomocy...

Otóż w pewnej funkcji1 zadeklarowałem i używałem struktury. Teraz tej samej (wypełnionej już danymi) struktury muszę użyć w funkcji2. Jak to zrobić?

void Func1()
{
struct pliki_s
	{	CString sciezka;
		float proc;
		int SelInd;
	};
...
pliki_s* files = new pliki_s[ile_plikow];
...
}
void Func2()
{
//odwolanie do ww. "files"
files[x].sciezka... //i tutaj wywala wiadomo blad, ze nie wie co to "files"
}

Wrzuciłem więc deklarację struktury jako globalna, ale to mi nic nie daje, bo "files" jest tworzone dopiero w Func1 więc wiadomo, ze "files" i tak nie będzie widoczne w Func2... Więc pomyślałem, ze spróbuje zainicjować "files" tuż za definicją struktury, ale bez info o liczbie obiektó "ile_plików":

struct pliki_s
	{	CString sciezka;
		float proc;
		int SelInd;
	};
pliki_s* files = new pliki_s;

Program kompiluje się bez błędów, ale w trakcie działania wywala się :/ Tak więc jak zrobić żebym miał łatwy dostęp w Func2 do danych ze struktury z Func1?

0

wyrzuc z

void Func1()
{

}

struct
i wsadz go wyzej ponad te dwa void func1 i func2

po co zagniezdzasz tam struktury zamiast je normalnie w naglowku h wsadzic

0

A nie uczą was na studiach jak pisać czytelnykod, który można użyć wielokrotnie w różnym kontekście?
Fakt można struct definiować wewnątrz funkcji, ale w 99.99% przypadków jest to niewskazane.
Jedyny przypadek jaki mi przychodzi do głowy, kiedy jest sens takiej definicji, to definiowanie predykatu dla jakiegoś algorytmu.

0

@MarekR22, e tam, czasem strukturę definiuje się jedynie dla czytelności, jeżeli jest ona wybitnie jednokrotnego użytku to nawet lepiej jeżeli jest lokalna, z mojego LDE:

Byte LDE::handleModRM()
{
     union {
	  Byte byte;
	  struct {
	       Byte rm  : 3;
	       Byte reg : 3;
	       Byte mod : 2;
	  } fields;
     } modRM;

     modRM.byte = getByte();

     if (modRM.fields.mod == 0 && modRM.fields.rm == 5)
	  skipBytes(4);
     else if (modRM.fields.mod == 1)
	  skipBytes(1);
     else if (modRM.fields.mod == 2)
	  skipBytes(4);

     if (modRM.fields.mod != 3 && modRM.fields.rm == 4)
	  skipBytes(1);

     return modRM.fields.reg;
}

ModRM to pewien pojedynczy bajt instrukcji x86, zaś zadaniem LDE (mój jest czymś w rodzaju iteratora po kodzie maszynowym) jest jedynie określanie długości instrukcji - jedyną metodą, która powinna mieć pojęcie o formacie tego bajtu jest właśnie handleModRM.

Czy nie przyznasz, że to drugi przypadek, kiedy lokalna struktura/unia ma sens?

0
Nick87 napisał(a)

wyrzuc z

void Func1()
{

}

struct
i wsadz go wyzej ponad te dwa void func1 i func2

po co zagniezdzasz tam struktury zamiast je normalnie w naglowku h wsadzic

tak jak napisalem:

Wrzuciłem więc deklarację struktury jako globalna (ponad Func1 i Func2), ale to mi nic nie daje, bo "files" jest tworzone dopiero w Func1 więc wiadomo, ze "files" i tak nie będzie widoczne w Func2... Więc pomyślałem, ze spróbuje zainicjować "files" tuż za definicją struktury, ale bez info o liczbie obiektó "ile_plików":

struct pliki_s
{ CString sciezka;
float proc;
int SelInd;
};
pliki_s* files = new pliki_s[ile_plikow];

Program kompiluje się bez błędów, ale w trakcie działania wywala się :/ Tak więc jak zrobić żebym miał łatwy dostęp w Func2 do danych ze struktury z Func1?

czyli deklaracje robie powyzej Func1 i Func2, ale potem jest problem chyba z utworzeniem obietku "files" typu tejze struktury. dzialalo to wczesniej i mniemam ze problem w tym ze jak tworze ten obiekt to nie moge zadeklarowac ile ma elementow, bo to dopiero wynika w dzialaniu Func1...
jak w Func2 odniesc sie do danych ze struktury utworzonych w Func1?
moze to troche zagmatwane, wybaczcie :/

0

Strukturę masz globalną to najprościej będzie ten wskaźnik też uczynić globalnym. Nie inicjalizuj go niczym, bo po co. Jeżeli jest globalny to jak zaalokujesz pamięć w Func1, będziesz mógł się do niej dostać również w Func2. Jedyny problem to wiedza na temat wielkości utworzonej tablicy. ;) Ale myślę, że możesz przerzucić się na jakiś kontener: wektor, lista, kolejka(w zależności od potrzeb) i nie będziesz musiał się tym przejmować, ponieważ mają one funkcje zwracające ich wielkość.

Pewnie są inne sposoby rozwiązania tego problemu. Może coś źle zaprojektowałeś.

0

No to jako student informatyki włącz debuggera i zobacz gdzie następuje crush, przejrzyj call stack i w ten sposób zlokalizuj źródło problemu. My nie mamy całego twojego kodu ani kryształowej kuli by wiedzieć dlaczego masz tego crush-a.

0

wszystko dziala, gdy tutaj:
pliki_s* files = new pliki_s[ile_plikow];

zamiast ile_plikow wrzuce jakas stala liczbe WIEKSZA lub ROWNA liczbie elementow z ktorych bedzie sie potem skladala ta struktura... a tak nie moze byc, bo w trakcie dzialania programu okazuje sie z ilu elementow bedzie skladala sie struktura...

0
tobix10 napisał(a)

Strukturę masz globalną to najprościej będzie ten wskaźnik też uczynić globalnym. Nie inicjalizuj go niczym, bo po co. Jeżeli jest globalny to jak zaalokujesz pamięć w Func1, będziesz mógł się do niej dostać również w Func2. Jedyny problem to wiedza na temat wielkości utworzonej tablicy. ;) Ale myślę, że możesz przerzucić się na jakiś kontener: wektor, lista, kolejka(w zależności od potrzeb) i nie będziesz musiał się tym przejmować, ponieważ mają one funkcje zwracające ich wielkość.

Pewnie są inne sposoby rozwiązania tego problemu. Może coś źle zaprojektowałeś.

no i wlasnie o to caly czas mi chodzi... o wielkosc tablicy...

wektor, lista, kolejka(w zależności od potrzeb)

no to chyba wymiekne :/

ps. jestem studentem informatyki, ale na specjalnosci Multimedia, dlatego programowanie nie jest moja mocna strona, wiec prosze o wyrozumialosc ;)

0
rafipl napisał(a)

wektor, lista, kolejka(w zależności od potrzeb)

no to chyba wymiekne :/

ps. jestem studentem informatyki, ale na specjalnosci Multimedia, dlatego programowanie nie jest moja mocna strona, wiec prosze o wyrozumialosc ;)
No nie w tym momencie to ja wymiękam. A co to ma za znaczenie "specjalnosci Multimedia"? To są prawie podstawy programowania (zaraz po poznaniu składni języka).

Ponawiam też radę, debugger i przegląd call stack.

0
MarekR22 napisał(a)
rafipl napisał(a)

wektor, lista, kolejka(w zależności od potrzeb)

no to chyba wymiekne :/

ps. jestem studentem informatyki, ale na specjalnosci Multimedia, dlatego programowanie nie jest moja mocna strona, wiec prosze o wyrozumialosc ;)
No nie w tym momencie to ja wymiękam. A co to ma za znaczenie "specjalnosci Multimedia"? To są prawie podstawy programowania (zaraz po poznaniu składni języka).

Ponawiam też radę, debugger i przegląd call stack.

wrrr, tak jak napisalem, problem lezy w wielkosci struktury przy inicjowaniu! wielkosc struktury jest wiadoma dopiero podczas dzialania Func1, wiec teraz jedynie wszystko dziala poprawnie gdy zainicjuje strukture "files" w wielkosci rownej lub wiekszej niz potrzeba w Func1...

program wywala sie na:

	int GetLength() const throw()
	{
		return( GetData()->nDataLength );
	}

z atlsimpstr.h

0

problem rozwiazany... ;) alez to bylo banalne...
jako globalne:

struct pliki_s
	{	CString sciezka;
		float proc;
		int SelInd;
	};
pliki_s *files;
int ile_plikow;

potem w Func1:

...
files = new pliki_s[ile_plikow];

lece dalej z programem...

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