Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
2 / 2 / 4
Регистрация: 26.05.2013
Сообщений: 126

Стек на указателях

04.11.2013, 18:00. Показов 1297. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;
 
namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        Stack stack = new Stack(0);
        Queue queue = new Queue();
        public Form1()
        {
            InitializeComponent();
            label1.Text = " ";
            //Stack stack;
        }
 
//---------------------------------------Stack ----------------------------------------------
        
        public class Stack
        {
            IntPtr ptr;
            int count = 0;
            int opacity = 10;
 
            public Stack()
            {
                ptr = Marshal.AllocHGlobal(sizeof(int) * opacity);
            }
 
            public Stack(int Opacity)
            {
                this.opacity = Opacity;
                ptr = Marshal.AllocHGlobal(sizeof(int) * this.opacity);
            }
            ~Stack()
            {
                Marshal.FreeHGlobal(ptr);
            }
            public void Push(int elem)
            {
                if (count == opacity)
                {
                    opacity += 10;
                    ptr = Marshal.ReAllocHGlobal(ptr, (IntPtr)(sizeof(int) * (opacity)));
                }
                Marshal.WriteInt32(ptr, sizeof(int) * count++, elem);
            }
            public int Pop()
            {
                if (count != 0)
                {
                    int val = Marshal.ReadInt32(ptr, sizeof(int) * (count - 1));
                    count--;
                    opacity--;
                    ptr = Marshal.ReAllocHGlobal(ptr, (IntPtr)(sizeof(int) * (opacity)));
                    return val;
                }
                else
                    MessageBox.Show("Невозможно удалить элемент из стека. Стек уже пуст ", "Ошибка удаления элемента", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                return 0;
            }
 
            public string Show() 
            {
                string s = "";
                for (int i = 0; i < count; i++)
                {
                    int val = Marshal.ReadInt32(ptr, sizeof(int) * (i));
                    s += " " + val.ToString();
                }
                return s;
            }
            public int Peek()
            {
                //string s = "";
                int val = Marshal.ReadInt32(ptr, sizeof(int) * (count - 1));
                //s = val.ToString();
                return val;
            }
 
            public bool Empty()
            {
                return count > 0;
            }
 
            public void Destruction()
            {
                count = 0;
            }
 
            public int Opacity
            {
                get
                {
                    return opacity;
                }
            }
 
            public int Count
            {
                get
                {
                    return count;
                }
            }
 
            public IntPtr ToIntPtr()
            {
                return ptr;
            }
        }
 
//---------------------------------------StackButtons --------------------------------------------
 
        private void PushStack_Click_1(object sender, EventArgs e)
        {
            int el = (int)numericUpDown1.Value;
            stack.Push(el);
            //label1.Text = (stack.Pop()).ToString();
        }
 
        private void PopStack_Click(object sender, EventArgs e)
        {
            //int el = (int)numericUpDown1.Value;
            //stack.Pop();
            label1.Text = (stack.Pop()).ToString();
        }
 
        private void DestructionStack_Click(object sender, EventArgs e)
        {
            stack.Destruction();
        }
 
        private void PeekStack_Click(object sender, EventArgs e)
        {
            stack.Peek();
        }
 
        private void EmptyStack_Click(object sender, EventArgs e)
        {
            
            if (stack.count == 0)
            {
                label1.Text = "Стек не пустой";
            }
            else
                label1.Text = "Стек пустой";
            
        }
 
        private void CountStack_Click(object sender, EventArgs e)
        {
            label2.Text = "Размерность стека: " + stack.Count;
        }
 
        private void ShowStack_Click(object sender, EventArgs e)
        {
            label2.Text = "Содержимое стека: " + stack.Show();
        }
 
        private void AboutStack_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Push - операция вставки элемента в стек\nPop - операция удаление элемента из вершины стека\nPeek - операция вывода элемента вершины стека\nDestruction - операция уничтожение стека\nShow - операция вывода элементов стека\nCount - операция определения количества элементов в стеке\n Is empty? - операция определения пуст ли стек", "Описание кнопок", MessageBoxButtons.OK);
        }
 
        private void Close_Click(object sender, EventArgs e)
        {
            Environment.Exit(0);
        }
 
 
}
В этом методе:
C#
1
2
3
4
5
6
7
8
9
10
11
private void EmptyStack_Click(object sender, EventArgs e)
        {
            
            if (stack.count == 0)
            {
                label1.Text = "Стек не пустой";
            }
            else
                label1.Text = "Стек пустой";
            
        }
ругается на count (151 строка): if (stack.count == 0), подскажите, пожалуйста, как исправить ошибку
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.11.2013, 18:00
Ответы с готовыми решениями:

Очередь на указателях
Нужно написать свой класс Очередь, используя не массив, а указатели.... попробовал начать писать программу using System; using...

Как создать двумерный динамический массив на указателях?
Имеется вот такой код, но если поставить **b выбивает ошибку; unsafe public static void smejn() { int kol...

Написать стек на указателях
хочю знать как написать стёк на указателях мне нужно чтобы можно было добавлять новые елемнты сколько угодно а уберать не обязтельно ...

16
 Аватар для lpvoid
324 / 307 / 59
Регистрация: 06.03.2013
Сообщений: 869
04.11.2013, 18:01
xVIKx, а как именно, простите, ругается?
вангую что count не определен.
0
192 / 192 / 29
Регистрация: 03.12.2009
Сообщений: 853
04.11.2013, 18:02
C# чувствителен к регистру
0
 Аватар для lpvoid
324 / 307 / 59
Регистрация: 06.03.2013
Сообщений: 869
04.11.2013, 18:02
Цитата Сообщение от xVIKx Посмотреть сообщение
~Stack()
деструкторов в шарпе в таком виде нет. пишите так:
C#
1
2
3
4
protected override void Finalize()
{
  // ... код
}
0
 Аватар для buntar
543 / 544 / 181
Регистрация: 16.03.2012
Сообщений: 1,160
Записей в блоге: 2
04.11.2013, 18:06
Цитата Сообщение от lpvoid Посмотреть сообщение
деструкторов в шарпе в таком виде нет.
Деструкторы как раз и есть, только автоматом их запускает сборщик мусора, на работу которого мы напрямую влиять не можем.
0
 Аватар для lpvoid
324 / 307 / 59
Регистрация: 06.03.2013
Сообщений: 869
04.11.2013, 18:09
buntar, есть в виде Finalize, деструктор у ТС всего лишь неявно вызовет метод Finalize. Например,
C#
1
2
3
4
5
6
7
class MyClass
{
  ~MyClass()
  {
    // операции очистки
  }
}
будет преобразовано в:
C#
1
2
3
4
5
6
7
8
9
10
11
protected override void Finalize()
{
  try
  {
    // операции очистки
  }
  finally
  {
    base.Finalize();
  }
}
http://msdn.microsoft.com/ru-r... 5fx1b.aspx
1
2 / 2 / 4
Регистрация: 26.05.2013
Сообщений: 126
04.11.2013, 18:22  [ТС]
Добавлено через 1 минуту
Цитата Сообщение от lpvoid Посмотреть сообщение
xVIKx, а как именно, простите, ругается?
вангую что count не определен.
"недоступен из-за его уровня защиты"
0
 Аватар для lpvoid
324 / 307 / 59
Регистрация: 06.03.2013
Сообщений: 869
04.11.2013, 18:27
xVIKx, исправьте на
C#
1
public int count = 0;
1
 Аватар для pincet
1655 / 1154 / 173
Регистрация: 23.07.2010
Сообщений: 6,910
04.11.2013, 18:28
Цитата Сообщение от xVIKx Посмотреть сообщение
public class Stack { IntPtr ptr; int count = 0; int opacity = 10;
и
Цитата Сообщение от da1z Посмотреть сообщение
C# чувствителен к регистру
и
Цитата Сообщение от xVIKx Посмотреть сообщение
public int Count { get { return count; } }
разницу чуем?
1
2 / 2 / 4
Регистрация: 26.05.2013
Сообщений: 126
04.11.2013, 18:31  [ТС]
Цитата Сообщение от lpvoid Посмотреть сообщение
xVIKx, исправьте на
C#
1
public int count = 0;
Спасибо, работает
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
04.11.2013, 22:20
Цитата Сообщение от lpvoid Посмотреть сообщение
деструкторов в шарпе в таком виде нет
0
 Аватар для lpvoid
324 / 307 / 59
Регистрация: 06.03.2013
Сообщений: 869
04.11.2013, 22:21
kolorotur, ?)
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
04.11.2013, 22:22
lpvoid, что деструкторов в их сишном понимании в шарпе нет — согласен.
А вот аналогичная сишному деструктору запись финализатора — еще как есть.
0
 Аватар для lpvoid
324 / 307 / 59
Регистрация: 06.03.2013
Сообщений: 869
04.11.2013, 22:24
не понимаю, в чем я там неправ. на msdn утверждают, что деструктор, написанный как у тс будет все равно неявно преобразован в метод Finalize. это я и говорю.

Добавлено через 43 секунды
Цитата Сообщение от kolorotur Посмотреть сообщение
А вот аналогичная сишному деструктору запись финализатора — еще как есть.
я не говорил, что такой записи нет. я как раз имел в виду что деструкторов в понимании си++ в шарпе не имеется.

Добавлено через 31 секунду
Цитата Сообщение от lpvoid Посмотреть сообщение
деструкторов в шарпе в таком виде нет.
хотя соглашусь, слишком размытое получилось утверждение.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
04.11.2013, 22:32
Цитата Сообщение от lpvoid Посмотреть сообщение
это я и говорю.
Ну я вот об этом сообщении:
Цитата Сообщение от lpvoid Посмотреть сообщение
Цитата Сообщение от xVIKx Посмотреть сообщение
C#
1
~Stack()
деструкторов в шарпе в таком виде нет. пишите так:
C#
1
2
3
4
protected override void Finalize()
{
  // ... код
}
Выглядит вполне однозначно: такая запись в шарпе является синтаксически неверной. Хотя именно ваш вариант выдаст ошибку компиляции.
1
 Аватар для lpvoid
324 / 307 / 59
Регистрация: 06.03.2013
Сообщений: 869
04.11.2013, 22:35
да, действительно. следовало попробовать переопределить Finalize перед тем как писать. я был абсолютно уверено что следует писать именно переопределением, выходит, зря. приношу извинения).

Добавлено через 48 секунд

Не по теме:

однако теперь все же интересно, отчего они сделали именно так и не дают нам переопределять Finalize?

0
 Аватар для pincet
1655 / 1154 / 173
Регистрация: 23.07.2010
Сообщений: 6,910
05.11.2013, 10:00
Цитата Сообщение от lpvoid Посмотреть сообщение
public int count = 0;
и зарадидля тогда
Цитата Сообщение от xVIKx Посмотреть сообщение
public int Count { get { return count; } }
а?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.11.2013, 10:00
Помогаю со студенческими работами здесь

Стек на указателях не компилируется
#include &lt;iostream&gt; using std:: cin; using std:: cout; using std:: endl; struct NodePtr { char Value; NodePtr* Next; ...

передать в функцию стек на указателях
Всем привет. Есть стек, реализованный через указатели. Необходимо его отправить в две функции не по значению. Проблема в том,...

Об указателях
В чем разница между этими двумя строчками? int* x; int *x;

Запутался в указателях
Поиск элемента, равного figure void remove_helper(std::shared_ptr&lt;BTreeItem&gt; *item,const std::shared_ptr&lt;Figure&gt;&amp; figure) { ...

немного об указателях
есть код: #include &lt;iostream&gt; #include &lt;windows.h&gt; using namespace std; int main() { int inta=1234; int...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru