Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.05.2009, 20:31   #1
Natok
Пользователь
 
Аватар для Natok
 
Регистрация: 17.05.2009
Сообщений: 85
Вопрос цыкл не работает...

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


Код:
bool flag3;
                //int asame, bsame;       //< --- в каком месте нужно огласить ети две переменные, чтоб етот цыкл работал?
               
                for (int i = 0; i < size; i++) 
                    for (int j = 0; j < size; j++)
                    {
                        
                        flag3 = false;
                        for (int a = -1; a <= 1; a++)
                            for (int b = -1; b <= 1; b++)
                            {
                                if (i + a < 0 || i + a >= size || j + b < 0 || j + b >= size) continue;
                                if (!(a == 0 && b == 0) && (Field[i + a, j + b] == 2 || Field[i + a, j + b] == 1))
                                {
                                    flag3 = true;
                                    asame = a;
                                    bsame = b;
                                }

                            }
                        if (flag3)
                        {
                           Field[i + asame, j + bsame]= Field[i, j] ;
                            
                        }
Natok вне форума Ответить с цитированием
Старый 28.05.2009, 09:31   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Не вижу криминала...
А на какой конкретно строке ошибку выдает?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.05.2009, 09:37   #3
Natok
Пользователь
 
Аватар для Natok
 
Регистрация: 17.05.2009
Сообщений: 85
Печаль

вказывает на ту строку, где оглашены ети 2 переменные. но они-то оглашены не в цыкле! почему ето они локальные.если важно, то все ето делается в обработчике событий кнопки...но ето не важно.
а в принцыпе нужно сделать, чтоб елементы матрицы перемещались на 1 клетку вправо, влево, вниз і т.д., если в них кто-то есть (1-ето заец, 2 - волк).

нет-нет! не на ту строку вказывает, где оглашены, а

Код:
private void button2_Click(object sender, EventArgs e)//кнопка наступного кроку
        {
            int asame, bsame;
            if (NumberClick == 1)
            {
                bool flag3;
                //int asame, bsame;
               
                for (int i = 0; i < size; i++)//рухаються не випадковим чином (перебираєм по черзі сусідів)
                    for (int j = 0; j < size; j++)
                    {
                        
                        flag3 = false;
                        for (int a = -1; a <= 1; a++)
                            for (int b = -1; b <= 1; b++)
                            {
                                if (i + a < 0 || i + a >= size || j + b < 0 || j + b >= size) continue;
                                if (!(a == 0 && b == 0) && (Field[i + a, j + b] == 2 || Field[i + a, j + b] == 1))
                                {
                                    flag3 = true;
                                    asame = a;
                                    bsame = b;
                                }

                            }
                        if (flag3)
                        
                           Field[i + asame, j + bsame]= Field[i, j] ;//<--------------вот здесь ошыбка(((  //use of unassigned local variable 'asame'
                            
                        
                    }

                int zajci=0;
                for (int i = 0; i < size; i++)
                    for (int j = 0; j < size; j++)
                        if(Field[i,j]==1)
                            zajci++;
                textBox4.Text=zajci.ToString();//підрахували і вивели зайців чи всі є)))

                int vovky=0;
                for (int i = 0; i < size; i++)
                    for (int j = 0; j < size; j++)
                        if(Field[i,j]==2)
                            vovky++;
                textBox5.Text=vovky.ToString();//підрахували і вивели вовків чи всі є)))





            }
        }

Последний раз редактировалось Stilet; 28.05.2009 в 10:02.
Natok вне форума Ответить с цитированием
Старый 28.05.2009, 10:04   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А попробуй эту строку перенеси:
Код:
 flag3 = false;
                        for (int a = -1; a <= 1; a++)
                            for (int b = -1; b <= 1; b++)
                            {
                                if (i + a < 0 || i + a >= size || j + b < 0 || j + b >= size) continue;
                                if (!(a == 0 && b == 0) && (Field[i + a, j + b] == 2 || Field[i + a, j + b] == 1))
                                {
                                    flag3 = true;
                                    asame = a;
                                    bsame = b;
                           if (flag3)  Field[i + asame, j + bsame]= Field[i, j] ;
  }

                            }
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.05.2009, 10:23   #5
Natok
Пользователь
 
Аватар для Natok
 
Регистрация: 17.05.2009
Сообщений: 85
По умолчанию

ошыбок не выдает. ето уже очень хорошо! спасибо большое!
Код:
int asame, bsame;
                bool flag3;
                for (int i = 0; i < size; i++)//рухаються не випадковим чином (перебираєм по черзі сусідів)
                    for (int j = 0; j < size; j++)
                    {
                        
                        flag3 = false;
                        for (int a = -1; a <= 1; a++)
                            for (int b = -1; b <= 1; b++)
                            {
                                if (i + a < 0 || i + a >= size || j + b < 0 || j + b >= size) continue;
                                if (!(a == 0 && b == 0) && (Field[i + a, j + b] == 0) && (Field[i , j ] == 1 || Field[i , j ] == 2))
                                {
                                    flag3 = true;
                                    asame = a;
                                    bsame = b;
                                    if (flag3) Field[i + asame, j + bsame] = Field[i, j];
                                    
                                }
                            }

                                

                        
                            
                        
                    }
но здесь не все нормально...оно записывает ету клетку у ВСЕ соседние. шас подумаем...:rol leyes:
Natok вне форума Ответить с цитированием
Старый 28.05.2009, 10:32   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Тогда верни старый код, но проверяй asame на undefined. Я не знаю Сишки, так что покопайся в хелпе на предмет того как такие проверять...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.05.2009, 10:38   #7
Natok
Пользователь
 
Аватар для Natok
 
Регистрация: 17.05.2009
Сообщений: 85
По умолчанию

хорошо, попробую! спасибо)))

Код:
int asame, bsame;
                bool flag3;
                for (int i = 0; i < size; i++)//рухаються не випадковим чином (перебираєм по черзі сусідів)
                    for (int j = 0; j < size; j++)
                    {
                        int koko=0;
                       
                        

                            flag3 = false;
                            for (int a = -1; a <= 1; a++)
                                for (int b = -1; b <= 1; b++)
                                {
                                    if (i + a < 0 || i + a >= size || j + b < 0 || j + b >= size) continue;
                                    if (!(a == 0 && b == 0) && (Field[i + a, j + b] == 0) && (Field[i, j] == 1 || Field[i, j] == 2))
                                    {
                                        flag3 = true;
                                        asame = a;
                                        bsame = b;
                                        if (flag3) Field[i + asame, j + bsame] = Field[i, j];
                                        koko++;


                                    }
                                    if (koko == 1)
                                        break;
                                    break;
                                }
                        
                        

                                

                        
                            
                        
                    }
теперь когда оказался свободный сосед, только 1 раз перезаписывается.но потом проверяется еще и етот сосед, и ее перезаписываем, а потом соседа соседа. да, смешно получается


вопрос: что делает undefined?
Natok вне форума Ответить с цитированием
Старый 28.05.2009, 11:37   #8
Natok
Пользователь
 
Аватар для Natok
 
Регистрация: 17.05.2009
Сообщений: 85
По умолчанию

Вот. так работает. если создать еще одну матрицу и в нее копировать елементи на места их соседей.

Код:
  Field1 = new int[size, size];
                for (int i = 0; i < size; i++)
                    for (int j = 0; j < size; j++)
                        Field1[i, j] = 0;//занулили матрицю в яку будем копіювати
                int asame, bsame;
                bool flag3;
                for (int i = 0; i < size; i++)//рухаються не випадковим чином (перебираєм по черзі сусідів)
                    for (int j = 0; j < size; j++)
                    {
                        int koko=0;
                       
                        

                            flag3 = false;
                            for (int a = -1; a <= 1; a++)
                                for (int b = -1; b <= 1; b++)
                                {
                                    if (i + a < 0 || i + a >= size || j + b < 0 || j + b >= size) continue;
                                    if (!(a == 0 && b == 0) && (Field1[i + a, j + b] == 0) && (Field[i, j] == 1 || Field[i, j] == 2))
                                    {
                                        flag3 = true;
                                        asame = a;
                                        bsame = b;
                                        if (flag3)
                                        {
                                            int temp1;
                                            temp1 = Field[i, j];
                                            Field1[i + asame, j + bsame] = temp1;
                                            
                                            Field[i, j] = 0;
                                        }

                                        koko++;


                                    }
                                    if (koko == 1)
                                        break;
                                    break;
                                }
                    }
но потом же мне надо еще не раз ето делать - то есть нужно освободить ету запасную матрицу - скопировать снова елементы в превую, а запасную освободить.

Код:
for (int i = 0; i < size; i++)
                    for (int j = 0; j < size; j++)
                    {
                        int temp; 
                        temp=Field1[i, j];
                       Field[i, j]=temp;
                     Field1[i, j] = 0;
                        
                    }
я что-то неправильно делаю?
потому что выводит матрицу, в которой только 0-лики

Последний раз редактировалось Natok; 28.05.2009 в 11:41.
Natok вне форума Ответить с цитированием
Старый 28.05.2009, 11:41   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я тут подумал... Вроде твоему коду некритично будет если ты инициализируешь те злополучные переменные типа :
Код:
  int asame=0, bsame=0;
Тогда undefined не должен выползать для твоего первого кода...
попробуй по крайней мере...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.05.2009, 11:54   #10
Natok
Пользователь
 
Аватар для Natok
 
Регистрация: 17.05.2009
Сообщений: 85
Смех

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

но что касается перемещения елементов етой матрицы (то, что делает етот код - те елементы, сто равны 1 или 2 при каждом следующем шаге (то есть при нажатии кнопки)) перемещаются на 1 клетку вправо, влево , вниз или вверх(короче, на место одного из 8 соседей). Но! ето должно было делатся случайным способом. Я так не делала, времени не хватает))). и тепер получается, что рано или поздно все елементы оказываются в верхнем левом углу и там толпятся...
так как первый if проверяет именно етого соседа верхнего левого...
Natok вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Библиотека НЕ работает с 2008, но работает с 2000 SQL namenike Общие вопросы C/C++ 0 26.05.2009 11:04
Не работает TP -HunteR- Паскаль, Turbo Pascal, PascalABC.NET 2 11.02.2009 19:16
Почему не работает тег align=right?valign работает а align нет! aviv HTML и CSS 5 21.01.2009 17:46
Проблема с UserForm. То работает, то НЕ работает Maxx Microsoft Office Excel 6 19.11.2008 14:51