Dziękuję za podpowiedzi. Sizeof + dodatkowy argument wydają się rozwiązywać mój problem.
Co do rozwiązania RafPe:
http://pl.wikibooks.org/wiki/C/Tablice_-_wi%C4%99cej "Definicja rozmiaru tablicy"
"
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Powyżej sizeof tab zwraca cały rozmiar pamięciowy tablicy, natomiast sizeof *tab poda nam jaki jest rozmiar typu int (ponieważ takiego typu jest element tablicy, *tab). Dzieląc rozmiar pamięciowy tablicy przez rozmiar pojedynczego elementu uzyskujemy ilość elementów. (Np. przy rozmiarze 44B oraz rozmiarze sizeof(int) równym 4 otrzymujemy, że tablica zawiera 11 elementów.)
Należy pamiętać, że sposób działa tylko dla tablic, a nie wskaźników (mimo że wskaźniki traktujemy w pewnym stopniu podobnie jak tablice)."
Coś takiego jak poniżej wydaje się najlepsze i nie trzeba nic zmieniać w kodzie w przypadku większego "stringa".
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Jednego jednak nie rozumiem. Zawsze myślałem, że wskaźnik to po prostu numer/adres pamięci, w takim razie jakim cudem "sizeOf(tablica)" dla różnych tablic zwróci różne jej wielkości? Przecież czy tablica będzie miała 10 czy 100 komórek to jej adres/wskaźnik początku tej tablicy będzie miał tą samą wielkość (w przypadku systemów 32bit powinno to być zawsze 32bity i nic więcej nic mniej). Gdzie źle rozumuję?
Co do mojego drugiego pytania. Czy jeśli stringi do tabeli będę podstawiał za pomocą funkcji strcpy rozwiąże to mój drugi problem, z dziwnym wyświetlaniem/cięciem stringów? Na wielu przykładach na forach definicje tabeli struktur widziałem podaną właśnie w ten sposób jaki ja zastosowałem.
EDIT:
Niestety rozwiązanie z sizeof nie działa, kod testowy:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Obydwie wartości zawsze wychodzą 2.
Czy jednak będzie trzeba wielkość tabeli zawsze podawać "ręcznie"/przez definicje?
Co do drugiego problemu nijak użycie funkcji strcpy nie chce zadziałać. Jedyne co działa to przypisanie wartości razem z definicją niestety są one wypisywane błędnie na wyświetlaczu jak opisałem w pierwszym poście.
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Kod:
||=== Build: Release in test (compiler: GNU GCC Compiler for AVR) ===|
main.c|12|error: expected declaration specifiers or '...' before 'main_menu'|
main.c|12|error: expected declaration specifiers or '...' before string constant|
main.c|13|error: expected declaration specifiers or '...' before 'main_menu'|
main.c|13|error: expected declaration specifiers or '...' before string constant|
main.c|11|warning: array 'main_menu' assumed to have one element|
||=== Build failed: 4 error(s), 1 warning(s) (0 minute(s), 0 second(s)) ===|
Probowałem również tak:
t_menu_item main_menu[] = {{.i = 1,.m_name = "test"},{.i = 2,.m_name = "tes2"}};
efekt ten sam.
Także pytanie drugie caly czas pozostaje aktualne. W jaki sposób wyświetlić prawidłowo stringi? Co robię źle. Wygląda na to, że pierwszy jest prawidłowo wyświetlany a w drugiej pętli są wyświetlane tylko jego dwa ostatnie znaki zamiast drugiego stringa.
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
EDIT2:
Drugi problem rozwiązany
w strukturze musi być zdefiniowana wielkość tablicy char (dlugość stringa + 1 na null) aby wskaźnik++ przesuwał się o odpowiednią ilość pól. Myślałem, że kompilator sam dobierze wielkości na podstawie wprowadzonych danych.