lasotaa Temat założony przez niniejszego użytkownika |
[C#] Implementacja stosu(dynamicznych struktur danych) » 2013-07-20 19:40:00 Witam, otóż mój problem to jak zaimplementować klase, albo strukturę odpowiedzialną za działanie stosu w c sharp. W c++ wygląda to tak, nie chcę używać żadnych bibliotek. struct STOS { int zmienna; STOS * next; }; void dodaj( STOS *& glowa, int x ) { STOS * pom = new STOS; pom->zmienna = x; pom->next = glowa; glowa = pom; } void usuwanie( STOS *& glowa ) { STOS * pom = glowa; glowa = glowa->next; delete pom; } natomiast w C-sharp gdy próbowałem wdrążyć: using System; struct Dodaj { int a; Dodaj * next; }; taki kod to wyskakiwał mi błąd, lini: |
|
m4tx |
» 2013-07-20 19:50:15 |
|
lasotaa Temat założony przez niniejszego użytkownika |
» 2013-07-20 19:52:25 Error1 Pointers and fixed size buffers may only be used in an unsafe context nie, ale z c++ przyzwyczajenie. |
|
lasotaa Temat założony przez niniejszego użytkownika |
» 2013-07-20 20:09:14 trochę twoje linki pomogły, ale dalej ciężko mi wymyślić jak zrobić , żeby stworzyć strukturę w której wewnątrz będzie (zmienna)wskaźnik która będzie przechowywała adres kolejnej struktury. Tutaj znalazłem i właśnie go analizuję http://www.algorytm.org/klasyczne/stos/stos-1-cs.htmlale prosiłbym kogoś, o pomoc w prostszej implementacji, oraz żeby pomógł mi zrobić to za pomocą struktury. |
|
m4tx |
» 2013-07-20 22:22:42 nie, ale z c++ przyzwyczajenie. |
Jak Ci niepotrzebne wskaźniki to je wywal. Powinno być ok bez nich. |
|
Mrovqa |
» 2013-07-20 22:41:20 W C# nie ma wskaźników, są referencje. using System; class Dodaj { int a; Dodaj next; };
Dodaj a = new Dodaj(); a.a = 1; a.next = new Dodaj(); Dodaj b = a.next;
Tutaj jednakże trzeba uważać - wprawdzie klasy są przekazywane przez referencję i znajdują się na stercie, jednakże struktury są traktowane inaczej - są przekazywane przez wartość i znajdują się na stosie. Kwestia tego, że gdybyś w powyższym kodzie zastosował strukturę, odpowiadałoby to czemuś takiemu w C++: class A { int a; A next; };
Edycja: @down mój błąd. Nie pamiętam gdzie znalazłem te błędne informacje, ale wszystko na co się dotychczas natknąłem (a natknąłem się na wiele) negowało tudzież milczało o istnieniu wskaźników. Z resztą na MSDNie jest umieszczony razem z niebezpiecznym kodem w jednej kategorii, co oznacza, iż nawet MS niezbyt zaleca ich stosowanie. Referencja moim zdaniem jest wystarczająca - to w końcu też wskaźnik (choć może zdarzą się wyjątki optymalizacyjne), tyle, że zamaskowany. |
|
m4tx |
» 2013-07-20 22:58:43 Przeczytaj jeszcze raz to, co napisałeś, a jeśli dalej nie będziesz wiedział o co chodzi, to zobacz sobie to: http://msdn.microsoft.com/en-us/library/y31yhkeb.aspxReferencja moim zdaniem jest wystarczająca - to w końcu też wskaźnik (choć może zdarzą się wyjątki optymalizacyjne), tyle, że zamaskowany. |
No nie wiem. void foo( int a ) { }
void bar() { int a = 5; foo( a ); System.Console.WriteLine( a ); } Zmodyfikuj ciało funkcji foo() tak, aby na standardowe wyjście wypisane zostało nie 5, a 10. Tak, nie da się. Rzecz jasna tutaj nie używamy referencji - przykład miał za zadanie jednak pokazać, że czasami bez wskaźnika będzie ciężko. |
|
Mrovqa |
» 2013-07-20 23:21:18 @m4tx Typy elementarne są przekazywane przez wartość, chyba, że zastosujesz słowo kluczowe ref tudzież out. |
|
« 1 » 2 |