Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> указатель на масив 
:(
    Опции темы
odys
Дата 21.11.2008, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 9.11.2008

Репутация: нет
Всего: нет



Должна быть программа, моделирующая движение черепахи по доске (table [size][size])
В ней есть функция bool m_a_c( int *array, int direction, int step, int *z, int *f, int size )
Функция принимает, и имеет возможность изменять массив, также принимает текущее направление движения, шаг перехода, текущую координату черепахи по оси z и f а также размер поля
Функция должна изменять массив array в случае если по какой-то клетки прошла черепаха со значения 0 на 1, также у нее есть ряд других заданий, но вопрос не в этом.

Как правильно объявить указатель на двухмерный массив в шаблоне функции (что бы функция могла изменять данные)? Пытался сделать это по аналогии с учебным вариантом, но там одномерный массив (выглядело так void bubbleSort (int *, const int))
И еще можно ли с указателем на массив работать точно так же, как с массивом следующая строка хода
Код

 array[i][*f]={1};

Вот код самой программы (она работает, закоментарена та часть, по которой у меня вопросы)
касательно функций (__int64 _func_num_(const string & value);
__int64 _function_(const string & value, bool *);)
 - кратко, они проверяют является ли введеное число формата 5.12 и вытягивает оттуда 12, либо это просто 3, тогда 3 - остается. Подробнее здесь http://forum.vingrad.ru/forum/topic-236585...tification.html

Вот сам код.
Код

#include <iostream>
#include <string>
#include <stdlib.h>
#include <time.h>
#include <algorithm>
using namespace std;
 int put  (int);
int pick (int);
__int64 _func_num_(const string & value);
__int64 _function_(const string & value, bool *);
//bool m_a_c( int *, int direction, int step, int *z, int *f, const int size );


int nalevo (int);
int napravo (int);

main()
{
bool indicator=0;

int x, z, t, f;
f = 0;
z = 0;

bool IndMove = 0;
__int64 komanda;
int int_komanda;
 int ind;
 ind = 0;
int f_perehod, z_perehod;
const int size = 20;
int direction = 1;
int table[size][size]= {1};
 cout<<"Input 1 - pero vverh"<<endl;
 cout<<"Input 2 - pero vniz"<<endl;
 cout<<"Input 3 -  nalevo"<<endl;
 cout<<"Input 4 -  napravo"<<endl;
 cout<<"Input 5.x - pereiti vpered na 'x' shagow"<<endl;
 cout<<"Input 6 - print track"<<endl;
 cout<<"Input 9 - End of date"<<endl;
 //cout<<"Nachalnie koordinati cherepahi [0; 0]"<<endl;
 cout<<"napravlenie - "<<direction<<" pero = "<<ind<<endl;
 cout<<"Nachalnoe polozhenie x = "<<z<<" y = "<<f<<endl;
 cout<<"Vvedite comandy ";
 string y;


 cin>>y;
 //cout<<"Vvedite nachalnoe polozenie cherepahi";
 //cin>>z>>t;
    while ( y != string("9") )
    {
       komanda =_function_(y, &indicator); //индикатор проверяет дробное ли было введено число
       if (indicator == 0)
          {
          int_komanda = int(komanda);
                 if (int_komanda == 1)
                 {
                  ind = put (ind);
                 }
                  else if (int_komanda == 2)
                 {
                     ind = pick (ind);
                  }
                     else if (int_komanda == 3)
                     {
                     direction = nalevo(direction);       //
                     }
                         else if (int_komanda == 4)
                         {
                          direction = napravo(direction);
                         }

           }
      /* else
      {
       cout<<"Here must be a function to move a turtle for "<<komanda<<
       " steps at direciton "<<direction<<endl;
       IndMove = m_a_c( table,direction, komanda,  &z, &f, size );
       if (IndMove == 1)
       {
        cout<<" Cherepashka mozhet ypast so stola, vozmozhno vam stoet vvesti drugoi shag "<<endl;
       }
      } */
     cout<<direction<<endl<<" Polozhenia pera "<<ind<<endl;
     cout<<" Coordinaty cherepashki po y = "<<f<<" po x = "<<z<<endl;
     cout<<" Napravlenie "<<direction<<endl;
     //cout<<" Indicator celogo chisla : "<<indicator<<endl;
     cout<< "Enter your value: ";
     cin>>y;
    }
//cin>>x;
return 0;
}
int put (int ind)
 {
 ind = 0;
 return ind;
 }

 int pick (int ind)
 {
 ind = 1;
 return ind;
 }
 int nalevo (int z)
 {
  if (z == 1) { z = 4;}
  else if
     (z == 2) { z = 1;}
     else if
     (z == 3) { z = 2;}
        else if
        (z == 4) { z = 3;}
  return z;
  }
  int napravo (int z)
 {
  if (z == 1) { z = 2;}
  else if
     (z == 2) { z = 3;}
     else if
     (z == 3) { z = 4;}
        else if
        (z == 4) { z = 1;}
  return z;
  }
__int64 _function_(const string & value, bool *indicator)
{
    // сюда неплохо вставить функцию, проверяющую на допустимые символы и на неповторение
    // точки _some_function_(const string & value);
    __int64 result;
    int _dot = -1;
    *indicator = 0;
    for(int i = 0; i < int(value.size()); i++)
        if(value[i] == '.')
        {
            _dot = i + 1;
            *indicator = 1;
        }
        else

    if(_dot != -1) {
        string temp;
        copy(value.begin() + _dot,value.end(),insert_iterator<string>(temp,temp.begin()));
        result = _func_num_(temp); }
    else
        result = _func_num_(value);
    return result;
}

__int64 _func_num_(const string & value)
{
    bool bOne = false;
    char * temp;
    if(value.size() > 19) {
        temp = new char[20];
        temp[19] = '\0';
        copy(value.begin(),value.begin()+19,temp);
        if(value[19] > 4)
            bOne = true;  }
    else {
        temp = new char[value.size()+1];
        temp[value.size()] = '\0';
        copy(value.begin(),value.end(),temp); }
    __int64 result = _atoi64(temp);
    if(bOne)
        result++;
    return result;
}
/*bool m_a_c( int *array, int direction, int step, int *z, int *f, const int size )
{
 bool b;
 if (direction ==1)

    {
   // int z0 = *z;
  //  int f0 = *f;
     if (direction == 1)

    {
    int z0 = *z;
     if ( (z0 + step)<size )
        {
         *z+=step;
         for (int i = z0; i<= *z; i++)
         {
         array[i][*f]={1};
         }
         else
         b = 1;
        }
    }
 if (direction ==3)

    {
    int z0 = *z;
     if ( (z0 - step)>= 0 )
        {
         *z-=step;
         for (int i = z0; i>= *z; i--)
         {
         array[i][*f]={3};
         }
         else
         b = 1;
        }
 if (direction == 2)

    {
    int f0 = *f;
     if ( (f0 + step)<size )
        {
         *f+=step;
         for (int i = f0; i<= *f; i++)
         {
         array[*z][i]={2};
         }
         else
         b = 1;
        }
    }
 if (direction ==4)

    {
    int f0 = *f;
     if ( (f0 - step)>= 0 )
        {
         *f-=step;
         for (int i = z0; i>= *z; i--)
         {
         array[*z][i]={4};
         }
         else
         b = 1;
        }
    }




 return b;
} */




Ошибки выдает следующие
[C++ Error] Maybe_last.cpp(81): E2034 Cannot convert 'int ( *)[20]' to 'int *'
[C++ Error] Maybe_last.cpp(81): E2340 Type mismatch in parameter 1 (wanted 'int *', got 'int ( *)[20]')
Хотя вероятно появятся еще.
Можно не указывать на логические недочеты, типа 5.12 и 3..12 как команды восприймуться одинаково, а также, то что если в массиве часто перемещать черепаху, он заполниться еденицами и траектория не будет понятной).... Сейчас хочется, что бы оно хотя бы работало если правильно использовать. Хотя если будут советы по оптимизации того, что уже работает- буду рад услышать)
PM MAIL   Вверх
kurtis
Дата 21.11.2008, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 10.8.2007

Репутация: нет
Всего: нет



Прошу прощения за злой оффтоп, но у вас в коде куча потенциальных ошибок.
1. Зачем нужны эти функции ?
Код

int put (int ind)
{
    ind = 0;
    return ind;
}

int pick (int ind)
{
    ind = 1;
    return ind;
}
  В чем смысл передачи туда КОПИИ объекта? Эти функции у вас чудестно будут работать даже если вы не будете туда передавать копию переменной ind. например
Код

int put()
{
    return 0;
}

int pick ()
{
    return 1;
}


2.Применяйте форматирование текста, ваш код сложно читать, человек который хочет вам помочь, не привык к вашей записи кода, и возможно ему в этом стоит помочь. Что лучше читается?
Код

// Ваша запись
__int64 _function_(const string & value, bool *indicator)
{
    // сюда неплохо вставить функцию, проверяющую на допустимые символы и на неповторение
    // точки _some_function_(const string & value);
    __int64 result;
    int _dot = -1;
    *indicator = 0;
    for(int i = 0; i < int(value.size()); i++)
        if(value[i] == '.')
        {
            _dot = i + 1;
            *indicator = 1;
        } //Я сначало подумал что цикл for закончился тут, но меня несколько смутило стоящее дальше else
        else
    if(_dot != -1) { // А это вообще выглядит как конструкцию не имеющая никакого отношения к циклу for
        string temp;
        copy(value.begin() + _dot,value.end(),insert_iterator<string>(temp,temp.begin()));
        result = _func_num_(temp); }
    else
        result = _func_num_(value);
    return result;
}

//Отформатированная запись
__int64 _function_( const string & value, bool * indicator )
{
    // сюда неплохо вставить функцию, проверяющую на допустимые символы и на неповторение
    // точки _some_function_(const string & value);
    __int64 result;
    int _dot = -1;
    *indicator = 0;
    for(int i = 0; i < int(value.size()); i++) {
        if(value[i] == '.') {
            _dot = i + 1;
            *indicator = 1;
        } else {
            if(_dot != -1) {
                string temp;
                copy(value.begin() + _dot,value.end(),insert_iterator<string>(temp,temp.begin()));
                result = _func_num_(temp); 
            } else {
                result = _func_num_(value);
            }
        }
    }

    return result;
}

3. Что такое __int64 ? Я конечно догадуюсь что это 64-х битная челочисленая переменная, но мой компилятор не обладает такой интуицией. Возможно стоит использовать стандартные типа, которые не привязаны к конкретной реализации компилятора? Мне например лень искать и заменять __int64 на что-то, перевариваемое моим компилятором.
4. В функции m_a_c () у вас потерялась одна скобка, т.е. самый первый цикл if() оказался открытым. 
5. Как понимать вот такую вот запись?
Код

if ( (z0 + step)<size ) {
    *z+=step;
    for (int i = z0; i<= *z; i++) {
        array[i][*f]={1};
    }
else
    b = 1;
}

К чему относится else, к for или таки к if ?
7. У вас героически совмещается передача параметра по ссылке и по указателю, причем я не вижу закономерности.
8. Щас попробую высказатся по теме =)
Зачем вам передавать ПОЛЕ? Сделайте его глобальным, и не мучайтесь. Все-равно у вас вся программа будет плясать вокруг этого поля. Вынесите его из main() и все ваши функции автоматически получат к нему доступ (т.е. table[][] будет в их поле видимости (scope))
9. В вашем коде ОЧЕНЬ трудно разобраться. Попробуйте написать программу заново, тщательно ее переосмыслив.

Прошу прощение у читателя за много букв!  smile 
PM MAIL   Вверх
sQu1rr
Дата 21.11.2008, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: 3
Всего: 13



Цитата(kurtis @ 21.11.2008,  20:15)
Что такое __int64 ? Я конечно догадуюсь что это 64-х битная челочисленая переменная, но мой компилятор не обладает такой интуицией. Возможно стоит использовать стандартные типа, которые не привязаны к конкретной реализации компилятора? Мне например лень искать и заменять __int64 на что-то, перевариваемое моим компилятором.

Это стандартный тип в компиляторе от мелкософта. Как вы и скахали 64х битный - а следовательно 20 цифр в числе... получается очень даже не плохо ;)
Если у вас он не поддерживается, попробуйте поискать нужные библиотеки либо использовать (long long) - что одно и тоже впринципе.

Все ваши замечания верные (особенно насчет читабельности кода)

2odys

Хочу добавить от себя (разумеется у всех свои вкусы, но всетаки)
Разумнее в main() писать как можно меньше, делая это за счет функций. Так код становиться еще более удобным к прочтению и ориентации в нем.
И опять вы main() пишите без типа. Ну так нельзя! Как вас компилятор не обзывает нехорошими словами, не пойму.

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

Я тоже советую вам ПОЛНОСТЬ написать программу с нуля, осмысляя каждый свой шаг, и каждый раз ДУМАТЬ ПРЕЖДЕ ЧЕМ ПОДУМАТЬ!
PM MAIL Skype GTalk   Вверх
odys
Дата 22.11.2008, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 9.11.2008

Репутация: нет
Всего: нет



Спасибо. касательно переделывания и отладки - я думал этим заняться в конце, когда будет все работать. Но пожалуй вы правы... пока учусь лучше сразу нормально писать...
ДУМАТЬ ПРЕЖДЕ ЧЕМ ПОДУМАТЬ
К сожалению... большинство очевидных советов, кажутся бесполезными, до того, как не попадеш в такую ситуациию сам... В общем вчера кучу раз переделвывал типы из string в int и обратно, по указанной вам причине. И эти слова обрели новый смысл). как сказал один мой хороший знакомый "Пословица, что умные учаться на чужих ошибках, а дураки на своих " - полный бред. "по настоящему учаться только на своих ошибках... ну а дураки... они вообще не учаться".
касательно совета насчет краткости main - спасибо, обязательно воспользуюсь.

2kurtis
Много букв меня не смущают, если они по делу. В общем спасибо за совет... 
Поскольку уже два человека советую начать с нуля - лучше все же последвать совету... Хотя на данный момент мне это не совсем понятно, и есть не малый соблазн, попытаться просто модифицировать)...
PM MAIL   Вверх
mes
Дата 22.11.2008, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(odys @  22.11.2008,  12:52 Найти цитируемый пост)
Хотя на данный момент мне это не совсем понятно, и есть не малый соблазн, попытаться просто модифицировать)... 

Лучше с нуля, при том забыв весь код, который писали и представляя то поведение, которое хотите получить в итоге.
Вначале можно весь код написать из "пустых" функций ( функций не имеющих реализации) и  модифицировать его до тех пор, пока код не станет логически понятным. 
Такой подход поможет Вам определить ключевые места вашей проги и набросать ее каркас, не тратя время на продумавание работы функции, которая впоследствии может и не пригодится.
И только после этого этапа  приступайте к написанию реализации функций.





Это сообщение отредактировал(а) mes - 22.11.2008, 16:41


--------------------
PM MAIL WWW   Вверх
odys
Дата 22.11.2008, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 9.11.2008

Репутация: нет
Всего: нет



http://forum.vingrad.ru/forum/topic-237286...и-недочеты.html
С нуля сделал... в общем спасибо... похоже вы были правы.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0516 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.