"Krzaczki" przy wyświetlaniu tablicy

0

Witam!
Natknąłem się na problem tytułowych "krzaczków" wyświetlanych w stworzonej tablicy. Jest to tablica dwuwymiarowa docelowo mająca być wypełnioną samymi spacjami.
Środowisko w jakim piszę to Visual C++ 2012, na 64-bitowym Windowsie.
Tablica jest polem struktury poniżej:

/*Structures defining and containing needed data*/
typedef struct GameTable_Data
{
	char Table[TABLESIZE_Y][TABLESIZE_X];
	unsigned int NumberOfWalls, NumberOfZombies;
} Datas;
 

Funkcja jaką wypełniam tablicę prezentuje się następująco:

 void CreateEmptyTable(Datas Table)
{
	int CounterX = 0, CounterY = 0;
	
	for(CounterY = 0; CounterY < TABLESIZE_Y; CounterY++)
		for(CounterX = 0; CounterX < TABLESIZE_X; CounterX++)
			Table.Table[CounterY][CounterX] = ' ';
}

Zamieszczam też funkcję, która ją wyświetla:

void DisplayTable(Datas GameTable)
{
	int CounterX = 0, CounterY = 0;

	for(CounterY = 0; CounterY < TABLESIZE_Y; CounterY++)
	{
		for(CounterX = 0; CounterX < TABLESIZE_X; CounterX++)
			printf("%c", GameTable.Table[CounterY][CounterX]);
		printf("\n");
	}
}
 

Tablica wyświetla się prawidłowo, jednak zamiast znaku spacji dostaję stale ten sam "krzaczek". W innych programach, w których już coś takiego robiłem wszystko działa ok, jednak tutaj pojawia się ten właśnie błąd. Wiem, że nie jest to problem z inicjalizacją tablicy, ani raczej w sposobie jej wyświetlania, więc podejrzewam, że jest to błąd w dobieraniu się do pola struktury. Jednak nie wiem co mogłoby być źle w tym co robię... Dlatego liczę na to, że ktoś mi wskaże błąd i wytłumaczy ;)

Dzięki i pozdrawiam :)

1

Jak przekazujesz zmienną przez wartość to tworzona jest jej kopia, i to ją funkcja CreateEmptyTable czyści. Musisz przekazać tablicę referencję albo wskaźnik. Zamień deklarację na

void CreateEmptyTable(Datas& Table)

dodanie znacznika <code class="c"> - @furious programming

1

W C nie ma referencji. Użyj wskaźnika.

0

@gość_hdufgkdgnKSYVGH Pomogło, ale nie bardzo rozumiem w którym miejscu przekazuję zmienną przez wartość... Gdzie i czemu ją przekazuję? Przez jaką wartość?

1

W C wszystkie argumenty są zawsze przekazywane przez wartość. Przez wartość, czyli że funkcja pracuje na kopiach zmiennych podanych jako argumenty. Zmiana wartości argumentu wewnątrz funkcji nie będzie miała wpływu na zmienną podaną jako argument przy wywołaniu.

0

Tak na prawdę to funkcja nie powinna zwracać void a Datas:

Datas CreateEmptyTable(void) // tak się chyba oznacza bezparametrową funkcję w c?
{
    Datas Table;
    int CounterX = 0, CounterY = 0;
 
    for(CounterY = 0; CounterY < TABLESIZE_Y; CounterY++)
        for(CounterX = 0; CounterX < TABLESIZE_X; CounterX++)
            Table.Table[CounterY][CounterX] = ' ';
    return Table;
}

i wtedy:

Datas myTable = CreateEmptyTable();

PS: Nigdy nie pisałem w c. Opieram się na wiedzy z c++ i mogłem coś pomieszać.

0

@Sarrus Masz rację, takie rozwiązanie w C jest jak najbardziej poprawne, jednak można też zrobić tak, jak rozwiązanie podane powyżej przez gościa. Podajemy funkcji całą strukturę, nie musimy więc zwracać elementu który ona w sobie zawiera. Wydaje mi się, że zwracanie tablicy przez funkcję byłoby dobre wtedy, gdybyśmy tworzyli nową tablicę w samej funkcji, lub ewentualnie podawali jako argument samą funkcję nie będącą polem struktury.
Pozdrawiam :)

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