dynamiczna tablica C#

0

Witam
czytam sobie właśnie "Programowanie C#" Jesse Liberty, książka trochę już leciwa, ale pożyczyłem od kumpla w celu szybkiej migracji z c++ do c# i doszedłem do roździału o listach. I napotkałem taką informacje: problem z tablicami polegał na ich stałym rozmiarze
Znany mi problem z c++ gdzie dynamiczną tablice trzeba było tworzyć za pomocą wskaźników. Ja ostatnio jednak pisałem swój pierwszy program w c# i w momencie gdzie potrzebuję stworzyć macierz (tablice dwuwymiarową) zrobiłem tak:

 

public class Macierz
{
    public float[,] tab;
    public int w;
    public int k;
    public double[,] d2;

    public Macierz(int wiersz, int kolumna)
    {
        this.w = wiersz;
        this.k = kolumna;
        this.tab = new float[w, k];
    }
...
}

static void Main(string[] args)
        {
           Console.WriteLine("Podaj liczbe kolumn w macierzach:"); 
           string kolumna = System.Console.ReadLine();
           Console.WriteLine("Podaj liczbe wierszy w TRN:");
           string wierszTrn = System.Console.ReadLine();
           Console.WriteLine("Podaj liczbe wierszy w TST:");
           string wierszTsn = System.Console.ReadLine();
           
           int k = int.Parse(kolumna);
           int w1 = int.Parse(wierszTrn);
           int w2 = int.Parse(wierszTsn);

           
           Macierz trn = new Macierz(w1,k);
           trn.Macierz1(w1,k);
           trn.wyswietl("TRN");

           Macierz tst = new Macierz(w2,k);
           tst.Macierz2(w2, k);
           tst.wyswietl("TST");

I o dziwo działa! Zaskoczył mnie fakt że jako wartość określającą wielkość tablicy w C# można podać zmienną.
Czy w C# zawsze tak było, czy może zostało to wprowadzone w ostatniej wersji?? (ja pisze w VS 2010 - framework 4)

0

Oo, C# jeszcze Cie nie raz zaskoczy. Nie jestem programista c++, ale mi sie wydaje, że nawet dla tego języka nie jest to nic nadzwyczajnego...

0

niestety w C++ aby utworzyć tablice dwuwymiarową: tablica[][x], musi być podana druga wartość która musi być stała (const).

0

Bo C++ jest mocno ograniczony w porównaniu z C#.

0

ale interesuje mnie czemu w książce jest napisana nieprawda ;p

1
wierzbiks napisał(a)

ale interesuje mnie czemu w książce jest napisana nieprawda ;p

Niby w którym miejscu?

Tablice mają stały rozmiar, po utworzeniu nie można go zmienić. Tego ograniczenia listy nie mają, można do nich dodawać i usuwać elementy w dowolnej chwili.
A to, co Ty zrobiłeś, to po prostu inicjalizacja tablicy, całkiem odmienny temat.

0

chodziło mi o ten stały rozmiar w porównaniu do c++ gdzie już przy deklaracji tablicy trzeba podać jej rozmiar

0

Ale to są różne rzeczy. :) Lista to po prostu inna kolekcja danych niż tablica. A to, że w C# możesz zdefiniować wymiary tablicy w dowolnym momencie, a w C++ nie, to tylko szczegóły implementacji tablicy.

0

szczegół ale jakże upraszczający życie :)

0

Język powinien być od tego, żeby w nim programować, a nie żeby kombinować jak obchodzić jego ograniczenia. ;)

0

Lista to po prostu inna kolekcja danych niż tablica.

Hmm, nie sądzisz że takie stwierdzenie wprowadza trochę autora w błąd?

Oczywiście, wszystkie książki na siły pchają tą List<T> jako coś, co jest "lepszą tablicą", podczas gdy to tylko tablica powinna interesować autora. Tablica to element języka. Natomiast Lista, jak i inne kolekcje zaimplementowane w .NET (Stack, Queue, Dictionary, Hashset) są tylko obiektami, które i tak pod maską używają tablic jako wewnętrzny storage.

0

Tak, masz rację, za bardzo skróciłem swoją myśl. Chciałem się odnieść tylko do wątpliwości autora, który chyba pomylił strukturę danych o dynamicznie zmienianym rozmiarze z dynamiczną alokacją tablicy.

0

I o dziwo działa! Zaskoczył mnie fakt że jako wartość określającą wielkość tablicy w C# można podać zmienną.
Zaskoczę cię: nawet w C można:

// to jest C (nie C++). kompilować czymś co spełnia standardy, np. gcc
#include <stdio.h>
int main()
{
  printf("podaj rozmiar tablicy: ");
  int n;
  scanf("%i",&n);
  int tablica[n];
}

Czy w C# zawsze tak było, czy może zostało to wprowadzone w ostatniej wersji??
Było od początku.

0
Azarien napisał(a)

I o dziwo działa! Zaskoczył mnie fakt że jako wartość określającą wielkość tablicy w C# można podać zmienną.
Zaskoczę cię: nawet w C można:

// to jest C (nie C++). kompilować czymś co spełnia standardy, np. gcc
#include <stdio.h>
int main()
{
  printf("podaj rozmiar tablicy: ");
  int n;
  scanf("%i",&n);
  int tablica[n];
}

I

spróbuj zrobić tak z tablicą dwuwymiarową ;P (tab[][]);

0

spróbuj zrobić tak z tablicą dwuwymiarową ;P (tab[][]);

?
robiłem coś takiego

int tab[x][y]

i (chyba) działało.

0

raczej nie ;p
chyba ze:
const y; to wtedy się zgodze ;p

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