Форум Игромании

Форум Игромании (http://forum.igromania.ru/index.php)
-   Программирование (http://forum.igromania.ru/forumdisplay.php?f=243)
-   -   C# (http://forum.igromania.ru/showthread.php?t=114386)

OverDoser 31.12.2011 17:57

Тема:маркировка бинарного изображения(массива из 0 и 1)
Использовал рекурсивный алгоритм.Программа вылетает и ругается на переполнение стека. Помогите найти решение проблемы:
Скрытый текст:
Цитата:

class Search
{
//Метод получения координат соседних пикселей
public int[,] neighbors(int l, int p)
{
int[,] nset1 = new int[2, 8];//РУГАЕТСЯ НА ОШИБКУ ЗДЕСЬ
nset1[0, 0] = l - 1; nset1[0, 1] = l - 1; nset1[0, 2] = l - 1;
nset1[0, 3] = l; nset1[0, 4] = l; nset1[0, 5] = l + 1;
nset1[0, 6] = l + 1; nset1[0, 7] = l + 1;
nset1[1, 0] = p - 1; nset1[1, 1] = p; nset1[1, 2] = p + 1;
nset1[1, 3] = p - 1; nset1[1, 4] = p + 1;
nset1[1, 5] = p - 1; nset1[1, 6] = p; nset1[1, 7] = p + 1;
return nset1;
}
//Собственно, сам метод поиска связанных пикселей и присваивание им индекса kk.l и p-
//координаты первого пикселя, получившего индекс kk
public int[,] search(int[,] y, int kk, int l, int p)
{
y[l, p] = kk; Search ko = new Search();
int[,] nset = new int[2, 8];
//Координаты соседей
nset = ko.neighbors(l, p);
for (int qq = 0; qq < 8; qq++)

{ if (y[nset[0, qq], nset[1, qq]] == -1)
{//рекурсия
search(y, kk, nset[0, qq], nset[1, qq]); } }

return y;
}
/*Здесь идет получение самого массива из 0 и 1,
единицы меняем на -1, дабы избежать путаницы с индексом 1*/
int k=0;
for (int i=1;i<=300;i++)
for(int z=1;z<=300;z++)
{if (op[i,z]==-1){k++;op=dlo.search(op,k,i,z);}}]



Можно как-нибудь увеличить размер самого стека?Пишу в Visual Studio 2010

Hast 20.07.2012 21:03

Играюсь тут с разработкой под Windows Phone, пытаюсь сделать простенький клиент для API вконтакта. Суть в том, что при первичной авторизации клиент получает токен, который далее необходимо отправлять с каждым новым запросом к API. Так вот, где и как лучше хранить этот токен, дабы он не терялся после перезапуска приложения?

И еще, silverlight совсем никак не поддерживает синхронные http запросы?

Digimortal 24.07.2012 00:11

При попытке установить MS Visual Studio 2010...вылезает вот это...каждый раз.
http://i.pixs.ru/thumbs/4/8/1/govnoj...31_5342481.jpg
Чем победить?

P.S.
Всё, проблема решена.

$finX 20.08.2012 22:32

ребятушки. я парюсь с xna. с 3d. проблема - программа тормозит. УЖАСНО тормозит. я, в общем-то, сам виноват. но проблема от этого не исчезает.

что вам надобно знать. представьте себе майнкрафт. если не знаете и лень гуглить, то пояснение - визуально это выглядит как стотыщмильон кубиков. и ничего, кроме них. дак вот, у меня майнкрафт. и каждый кубик - это отдельная моделька из 3ds max. и загружаю я несколько тысяч таких моделек. и визуализирую. и тормозит.

а вот теперь - самый интересный момент. когда я визуализирую не куб о двенадцати полигонах, а teapot о нескольких тысячах таковых - производительность падает в жалкие два раза. когда я пытаюсь визуализировать в сто раз больше тех же кубиков - падает.. ну, вы поняли. нереально. соразмерно, то есть. раз в сто.

но полигонов-то столько-же получается! то есть критично количество моделей, а не полигональность. ибо сто моделек по десять полигонов на порядок медленнее, чем десять моделей по сто полигонов.

дак вот. каждую модель я визуализирую отдельным вызовом
Цитата:

BasicEffect effect.EnableDefaultLighting();
вопрос - как делать по-другому? то есть чтоб набрать, например, много одинаковых моделек и все их скопом отрисовать? или полигонами в массив какой запихать и оттуда рисовать (правда, тут с текстурами будет неслабый геморрой). или ещё как. как подскажите?

вопрос глобальный - как сделать так, чтоб не тормозило?

pokibor 21.08.2012 11:04

$finX, с XNA я дела не имел, последний раз занимался 3D-графикой довольно давно, но позволю себе дать несколько общих советов.
Первый - при компиляции в Debug-режиме 3d-графика тормозит намного существеннее, нежели в Release. По крайней мере, при написании на C++ с Irrlicht так.
Второй - естественно, тысячи кубиков тормозят, поскольку компьютер вынужден рассчитывать видимость для каждого из них. Например, когда кубик окружён со всех сторон шестью другими кубиками, ежу понятно, что он не может быть видимым. Ежу, но не компьютеру. Он сообразит это только когда просчитает видимость всех граней с того места, где находится камера.
Поэтому выход один - оптимизировать код так, чтобы гарантированно невидимые кубики даже не подавались на рендеринг. А в идеале - не подавались не только кубики, а отдельно невидимые грани (т.е. кубик как отдельная моделька из 3dmax'а - это очень плохая идея). Как это сделать? Лезть в глубины XNA и математики, никак иначе. И писать шейдеры.
Ну и наконец, XNA и .NET сами по себе добавляют тормозов, чисто исходя из своей сути и архитектуры. За удобство нужно платить.

$finX 21.08.2012 16:25

Цитата:

Сообщение от pokibor (Сообщение 10422446)
Первый - при компиляции в Debug-режиме 3d-графика тормозит намного существеннее, нежели в Release

знаю. делал в релизе - качественных изменений нет. может, делал как-то неправильно, но всё же.
Цитата:

Сообщение от pokibor (Сообщение 10422446)
А в идеале - не подавались не только кубики, а отдельно невидимые грани

дадада! я тоже так хочу. мне только бы код. как создать полигон в xna? не могу найти.

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

лан, я вроде нашёл что-то про примитивы вчера. буду через них думать. спасибо, но вопрос не снят.

Arantar 18.09.2012 12:03

Подскажите, пожалуйста.
Как получить кол-во строк в DataGridView не в методе, а в классе, чтобы потом можно было использовать это число в качестве размера массива. Если я делаю так, как в коде ниже, он выдаёт ошибку: "Инициализатор поля не может обращаться к нестатическому полю, методу или свойству "*.Form1.dataGridView1""
Код:

public partial class Form1 : Form
{
  private void button1_Click(object sender, EventArgs e)
  {
    здесь создается таблица нужного размера.
  }

  int r = dataGridView1.RowCount;
  double[,] a = new double[r, r];

  private void button2_Click(object sender, EventArgs e)
  {
    здесь должны производиться операции над массивом a.
  }
  ...
}


$finX 18.09.2012 13:35

Цитата:

Сообщение от Arantar (Сообщение 10537104)
Как получить кол-во строк в DataGridView не в методе, а в классе

ась? оО
странная ошибка - код верен и логичен. разве что - а ты дейтагридвью создаёшь динамически в коде?
ну и вообще, на какой строчке-то хоть ошибка?

Arantar 18.09.2012 13:45

Собственно сам код. Выделенное у меня в коде, он считает ошибкой.
Извиняюсь, там немного другой текст ошибки, такой: "Инициализатор поля не может обращаться к нестатическому полю, методу или свойству "*.Form1.r""
Скрытый текст:
Код:

public partial class Form1 : Form
    {
    ...
  public void Form1_Load(object sender, EventArgs e)
        {
            comboBox1.Text = "4x4";
            for (int i = 0; i < 8; i++)
            {
                comboBox1.Items.Add((i + 2) + "x" + (i + 2));
            }
            for (int i = 0; i < 4; i++)
            {
                dataGridView1.Columns.Add("", "X" + Convert.ToString(i + 1));
                dataGridView1.Rows.Add("");
            }
            dataGridView1.Columns.Add("", "B");
        }
  private void button1_Click(object sender, EventArgs e)
        {
            dataGridView1.Rows.Clear();
            dataGridView1.Columns.Clear();
            textBox1.Clear();
            textBox2.Clear();
            string b = comboBox1.Text;
            sbyte v = Convert.ToSByte(Convert.ToString(b[0]));
            dataGridView1.Size = new System.Drawing.Size(100 * v + 135, v * 22 + 26);
            if (v > 4)
                ClientSize = new System.Drawing.Size(368 + (v - 2) * 100, 250 + (v - 2) * 22);
            else ClientSize = new System.Drawing.Size(600, 286);
            for (int i = 0; i < v; i++)
            {
                dataGridView1.Columns.Add("", "X" + Convert.ToString(i + 1));
                dataGridView1.Rows.Add("");
            }
            dataGridView1.Columns.Add("", "B");
        }

        int r = dataGridView1.RowCount;
        double[,] a = new double[r, r];

 private void button2_Click(object sender, EventArgs e)
        {
          операции с массивом a[r, r].
        }
        ...
    }


Pharaon 18.09.2012 14:02

Получить никак).
Это значит ты можешь создать переменную вне функции (то бишь в классе), присвоить её значение внутри функции, а пом создать массив используя переменную в классе.

Это все от того что клоичество столбцов может динамически меняться и значит что вне функции узнать значения не получится. Делай какое нибудь поле аля
Скрытый текст:
Код:

int r
{
get { return dataGridView1.RowCount;}
}

Но создавать массив вне функций а прямо в классе, используя переменную нельзя


Arantar 20.09.2012 17:58

Собственно с этим понятно теперь, но возникла другая проблема.
У меня есть два класса: в одном описываются методы для решения СЛАУ, другой Form1, в котором я их вызываю. Но возникает проблема, нужно передать значение dataGridView1.RowCount в первый класс, в котором это значение есть размер динамических массивов.

Pharaon 20.09.2012 20:02

Что мешает обратиться к гриду или массиву из другого класса?)
Передача данных между классами дело элементарное.
самое просто передавай ксласс форм в конструктор первого класса и обращайся к нему через переменную)

Arantar 20.09.2012 20:18

Продемонстрируйте, пожалуйста.

Pharaon 21.09.2012 07:16

Скрытый текст:
Код:

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication5
{
    public partial class Form1 : Form
    {
     
        SomeClass something;

        public Form1()
        {
            InitializeComponent();
            dataGridView1.Rows.Clear();
            dataGridView1.Columns.Clear();
            for (int i = 0; i < 10; i++)
            {
                dataGridView1.Columns.Add("", "X" + Convert.ToString(i + 1));
                dataGridView1.Rows.Add("");
            }
            dataGridView1.Columns.Add("", "B");

            something = new SomeClass(this);
        }


        private void button1_Click(object sender, System.EventArgs e)
        {
            something.SomeAction();
        }
    }


    public class SomeClass
    {
        Form1 parent;
        public double[,] array;

        public SomeClass(Form1 form)
        {
            parent = form;
            int n = parent.dataGridView1.RowCount;
            array = new double[n, n];
        }

        public void SomeAction()
        {
            MessageBox.Show(array.Length.ToString());
        }
    }
}


Как я понимаю нужно что-то такое. Есть класс Форм1, в котором есть датаГрид, есть какой-то другой класс, в котором есть двумерный массив. При создании второго класса передаем ему данные из первого и обращаемся к ним через переменную.
Датагрид, нужно пометить модификатором public вместо private в функции инициализации компонентов.
Если что-то не так, прошу более подробно объяснить суть, возможно даже с кодом

Arantar 21.09.2012 21:25

Pharaon, спасибо, но я решил проблему с помощью метода Array.GetLength.
Но у меня есть вопросы, например можете пояснить кое-какие строчки в коде. Вот эти к примеру.
Скрытый текст:

Код:

Form1 parent;
public SomeClass(Form1 form)
{
    parent = form;
    ...
}


SomeClass something;
public Form1()
{
    something = new SomeClass(this);
}



Тут не совсем получается ещё, размер таблицы у меня же меняется, и он должен каждый раз при её создании в button1_Click передавать её размер в другой класс.

Pharaon 22.09.2012 06:14

Тут дело в чем. Теперь все данные из класса форм доступны в классе SomeClass и наоборот.
Если ты меняешь размер то его данные изменятся и уже изменнные данные ты можешь получить с помощью переменных кооторые есть в твоей цитате.

Arantar 22.09.2012 18:27

Поясните, пожалуйста, что конкретно здесь делается, а то работать работает, а как, не совсем понятно.
Скрытый текст:

Код:

Form1 parent;
public SomeClass(Form1 form)
{
    parent = form;
    ...
}


SomeClass something;
public Form1()
{
    something = new SomeClass(this);
}


Pharaon 22.09.2012 18:51

Скрытый текст:
Цитата:

Сообщение от Arantar (Сообщение 10543512)
Код:

Определяем объект Класса Форм1, для использование внутри класса SomeClass
Form1 parent;

// Конструктор класса. Когда мы пишем new SomeClass() вызывается эта функция
//Параметром функции служит класс нашей формы
public SomeClass(Form1 form)
{
// Чтобы сохранить переданный объект в переменной и обращаться в нему из любого места класса, присваиваем переменной  parent переданный аргумент.
    parent = form;
    ...
}

// Определяем объект класса SomeClass, чтобы использовать его возможности в любом месте данного класса.
SomeClass something;
public Form1()
{
// Создаем объект класса SomeClass, передав в качестве аргумента(this) текущий, класс, в данном случае Form1
    something = new SomeClass(this);
}



Комментарии.
Если все это непонятно, то вам надо по возможности чуть лучше изучить ООП, так как шарп на принципах ооп построен.ООП (объектно-ориентированное программирование)

Arantar 04.11.2012 14:45

Скажите, пожалуйста, есть ли у элемента управления NumericUpDown свойство или метод, который определяет было ли увеличено или уменьшено значение этого элемента управления?

CMETAHA 04.11.2012 20:16

Arantar, Нет, но у него есть евент ValueChanged.


Часовой пояс GMT +4, время: 10:27.

Powered by vBulletin® Version 3.8.0
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.