tablice struktur/tworzenie, analizowanie, modyfikowanie/

0

Witam minęło 17 godzin od próby napisania pierwszego programu w życiu w języku C#, i tak oto moja przygoda zagięła mnie na starcie, niestety po 4ro godzinnych poszukiwaniach i przeglądaniach stron i kursów nie znalazłem odpowiedzi.

w programie chciałem stworzyć strukturę danych odnoszącą się do wartości przedmiotu, jego modyfikacji po uplywie czasu mnie więcej tak

 public struct A {
int wartość = 0;
int zmiana = 0;
int czas = 0;
}

chciałem stworzyć wirtualny czas który zgrany były z menu na Console.KeyInfo = Key.Key(value); 
Menu składa się z 3 opcji:
1. Stwórz nową strukturę.
2. Sprawdź te co posiadasz.
3. Klepsydra << zmniejsz czas o 1.

Tylko że całość chciałem zawrzeć w tablicy structur więc inicjalizuje ją bez problemu:
A NewA = new NewA[i]; // dlaczego dałem i? bo jak ustawie na i=0; na poczatku to podobno jest metoda Array.Resize której niestety nie potrafie spożytkować.

Teraz najważniejsze jak zrobić tablice struktur i móc do niej dodawać elementy bo nie ma to być statyczna tablica z  ustaloną z góry pamięcią tylko pamięć stworzonych elementów struktury zapisanych w tablicy.
Czy Array.Resize(ref a[], int); wystarczy?
Czy może trzeba stworzyć tablice obiektów ArrayList.
Może specjaliści pomogą a dla mastah zostawiam lekką prośbę o wytłumaczenie jak się tworzy takie tablice struktur, jakie funkcje dają do nich dostęp i jak można je modyfikować a najważniejsze jak wyświetlić zawartość.
Pozdrawiam jeszcze jako laik ;] hiro
1

Tylko że całość chciałem zawrzeć w tablicy structur więc inicjalizuje ją bez problemu:
A NewA = new NewA[i]; // dlaczego dałem i? bo jak ustawie na i=0; na poczatku to podobno jest metoda Array.Resize której niestety nie potrafie spożytkować.

Zakładam że jest literówka i chodzi o A newA = new A[i];
Nie wiem co to niby ma robić, ale wiem co robi (jeśi i = 0) - tworzy tablicę obiektów typu A o rozmiarze zero (null, void, 0). Nic w niej nie umieścisz, bo jej rozmiar wynosi zero. Array.Resize() nie działa tak jak myślisz, zresztą wykorzystanie jej do tego byłoby masochizmem.

Chcesz dodawać elementy - nie twórz tablicy. Stwórz listę. W twoim przypadku: List<A> list = new List<A>(); (ArrayList sobie odpuść, to już mocno przestarzała klasa, niezalecana od C# wersji 2.0 czyli całych wieków w .NET)

Troche większy sample

List<A> list = new List<A>();
list.Add(new A());
list[0].ZróbCośtam();
A a = new A();
a.ZróbCośInnego();
list.Add(a);

Itd...

I jeśli chcesz się odwoływać bezpośrednio do pól struktury (nieładne, ale nie musisz się tym przejmować na razie) musisz je ustawić na public - czyli

public struct A {
public int wartość = 0;
public int zmiana = 0;
public int czas = 0;
}
0

Myślałem że oszukam .NET i uda mi się stworzyć tablicę o zmiennej wielkości... hihi

a co do list to cos nie zbyt mi to wychodzi. Otóż zastosowałem to w ten sposób:

Tu stworzyłem strukture:
public struct akcje
{
public int wartosc;
public int procenty;
public int czas;
}

Tu ją zainicjowałem w mainie tuż na początku.

List<akcje> a1 = new List<akcje>();

W pętli użyta akcja jest wyciągana we wcześniejszej funkcji co pobiera ile akcji użytkownik chce zakupić;

for (j = 0; j < akcja; j++)
{
a1.Add(new akcje.a1());
a1[j].czas = czas;
a1[j].wartosc = wartosc;
a1[j].procenty = procent;
}

Debugger zwraca mi że nie ma takiej struktury. Ogólnie udało mi się już stworzyć podstawe programu tylko brakuje mi funkcji żeby zapisywać to wszystko i odczytywać a dalej połączyć z weirtualnym czasem ale bez tych pierwszych nie rusze nigdzie.
Główny moduł programu:

static void Main(string[] args)
{

        int act_s = 0, j, akcja, czas, procent, cena, new_s, d;
        gracz p1 = new gracz();/* inicjowanie struktur */
        List<akcje> a1 = new List<akcje>(); /*Tworzenie listy akcji*/


        Console.WriteLine("podaj swoje imie: ");
        p1.imie = Console.ReadLine(); /*pobranie imienia*/

        Console.WriteLine("podaj swój kapitał: ");
        p1.kapital = Convert.ToDouble(Console.ReadLine()); /*pobranie kapitału*/

        ConsoleKeyInfo Key;
        do
        { /*rozpoczyna interfejs menu*/
        menu();
        Key = Console.ReadKey(true);
            switch (Key.KeyChar)
            {
                case '1':
                    Console.WriteLine("Zacznij inwestycje: :)\n");

                    akcja = papiery(); /*pobiera ilość kupowanych akcji*/
                    if (akcja > 0 )
                    {
                    wartosc = war(); /* pobiera wartosc kupowanych akcji*/
                    procent = procenty_p(); /* pobiera oprocentwanie akcji */
                    cena = akcja * new_s; /* cena całości zakupu */
                    Console.WriteLine("Posiadasz - " + p1.kapital + " zl \n\n" );
                    Console.WriteLine("Całość będzie Cię kosztowała - " + cena + " zl \n");

                    if (cena < p1.kapital)
                    {
                        d = CheckD();
                        if (d == 1)
                            p1.kapital -= cena;
                    }
                    else
                    {
                        Console.WriteLine("Nie stać Cię na to... ");
                        akcja = 0; new_s = 0; procent = 0; cena = 0;
                    }
                    czas = czas_p();
                    for (j = 0; j < akcja; j++)
                    {
                        a1.Add(new akcje.a1());
                        a1[j].czas = czas;
                        a1[j].wartosc = wartosc;
                        a1[j].procenty = procent;
                    }
                    }
                    Console.WriteLine("posiadasz  " + Length + " akcji. ");
                    break;
                case '2':
                    Console.WriteLine("Siemka "+ p1.imie+" Posiadasz - " + p1.kapital +" zlotówek/n");
                    break;
                case '3':
                    Console.WriteLine("Sprawdzam akcje");
                    break;
                case '4':
                    Console.WriteLine("Mija miesiąc");
                    break;
                case 'A':
                    Console.WriteLine(" Komunikaty: ");
                    break;

                default:
                    Console.WriteLine("hmm?");
                    Console.Clear();
                    break;
            }
        } while (Key.Key != ConsoleKey.Escape);
        Console.WriteLine("Do widzenia");
        Console.ReadLine();
    }
0

Zamień struct na class w definicji. Nie możesz operować na strukturach tak, jak chcesz to robić.

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