Пятница, 26 Апреля 2024, 23:43

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 2 из 4
  • «
  • 1
  • 2
  • 3
  • 4
  • »
Форум игроделов » Программирование » C/C++ » #if
#if
GECKДата: Понедельник, 10 Января 2011, 18:16 | Сообщение # 21
заслуженный участник
Сейчас нет на сайте
У тебя прототип -
Code
int initGame(bool map[]);

И заголовок функции -
Code
int initGame(bool map[15][20])
Они одинаковыми должны быть, если что. Компилятор ругается, что ты ему двумерный массив вместо объявленного одномерного суешь.


Всё гениальное просто. И хреново работает.

Сообщение отредактировал GECK - Понедельник, 10 Января 2011, 18:17
KornivalДата: Понедельник, 10 Января 2011, 18:18 | Сообщение # 22
The Witcher
Сейчас нет на сайте
Quote
Что у меня не так?

Все не так smile
Quote (Hagrael)
int initGame(bool map[]);

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

Quote (Hagrael)
bool map[20][15];

Quote (Hagrael)
int initGame(bool map[15][20])

Функция обрабатывает массив размером [15][20], а ты пихаешь туда массив размером [20][15].
Code

int main() {   
       return 0;   
       bool map[20][15];   
       initGame(map);   
}

оператор return должен стоять в конце фунцкии main.
Короче держи правильный вариант
Code

int initGame(bool map[][20]);   
int main() {   
         
       bool map[15][20];   
       initGame(map);   
       return 0;   
}   
int initGame(bool map[15][20]) {   
    for (int i=0; i<20; i++) {   
     for (int j=0; j<15; j++) {   
      map[i][j]=false;   
     }   
    }   
    map[0][0]=true;   
    return 0;   
}


Сообщение отредактировал Kornival - Понедельник, 10 Января 2011, 18:25
evilCodeДата: Понедельник, 10 Января 2011, 20:03 | Сообщение # 23
The Metal
Сейчас нет на сайте
Quote (Kornival)
Короче держи правильный вариант

И не всё исправил. dry
Quote (Kornival)

for (int i=0; i<20; i++)
{
for (int j=0; j<15; j++)
map[i][j]=false;
}  

i<15;
j<20;


evilCode aka sanyok31



Сообщение отредактировал evilCode - Понедельник, 10 Января 2011, 20:03
ezhickovichДата: Понедельник, 10 Января 2011, 20:09 | Сообщение # 24
[Великий и могучий хозяинъ]
Сейчас нет на сайте
Quote (Kornival)
Функция обрабатывает массив размером [15][20], а ты пихаешь туда массив размером [20][15].

Kornival, Зачем вообще указывать размер массива??? killed
И зачем так нагло тыкать *магические* числа??? killed
Зачем заполнять массив нулями вручную, если это можно сделать при его создании??? killed

1. В прототипе и описании функции вовсе не обязательно указывать его размер...
2. Если размер поля неизменен, то сделаем стороны константными... (в данном случае с помощью макросов)
3. Мы не будет тратить лишнее время на заполнение массива нулями, а сделаем это сразу при его создании...

Code

#define GRID_WIDTH 20 // Определяем размер поля
#define GRID_HEIGHT 15
int initGame(bool **map); // Указывать размер массива вовсе не обязательно
int main() {    
           
        bool map[GRID_HEIGHT ][GRID_WIDTH ] = {0}; // Указываем, что массив должен быть создан "нулевым"
        initGame(map);  // Вызываем инициализирующий код
        return 0;    
}    
int initGame(bool **map) { // Указывать размер массива вовсе не обязательно
     map[0][0]=true;   // Инициализируем
     return 0;    
}

Добавлено (10.01.2011, 20:09)
---------------------------------------------
П.С. А автору я советую уже всётаки начать учить C++... angry



Я: О великий повелитель этой ничтожной вселенной - сокращённо ЁЖ!
KornivalДата: Понедельник, 10 Января 2011, 20:18 | Сообщение # 25
The Witcher
Сейчас нет на сайте
Quote (evilCode)
И не всё исправил.

Внутрь этой функции я даже не посмотрел biggrin
У меня код скомпилировался.
Quote (ezhickovich)
Зачем вообще указывать размер массива???

Quote (ezhickovich)
**map

А про такую фичу я действительно не знал!
Quote (ezhickovich)
ачем заполнять массив нулями вручную, если это можно сделать при его создании???

Тоже вопрос ко мне?
ezhickovichДата: Понедельник, 10 Января 2011, 20:23 | Сообщение # 26
[Великий и могучий хозяинъ]
Сейчас нет на сайте
Quote (Kornival)
Тоже вопрос ко мне?

Все три вопроса были к ТС, просто твой ник случайно попался... smile
И да, если хочешь, то этот вопрос тоже к тебе! wink



Я: О великий повелитель этой ничтожной вселенной - сокращённо ЁЖ!
KornivalДата: Понедельник, 10 Января 2011, 20:27 | Сообщение # 27
The Witcher
Сейчас нет на сайте
Quote (ezhickovich)
И да, если хочешь, то этот вопрос тоже к тебе!

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


Сообщение отредактировал Kornival - Понедельник, 10 Января 2011, 20:29
froexДата: Понедельник, 10 Января 2011, 21:10 | Сообщение # 28
Руководитель Froexilize team
Сейчас нет на сайте
В main() объявляется [20][15], а в функции [15][20] - попробуйте исправить.

Добавлено (10.01.2011, 21:10)
---------------------------------------------
медленно пишу sad


Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее.
Алгоритмы, программирование, оптимизация, тестирование, ведение проектов.
Ищу художника, дизайнера, тестера, программистов С и С++
Обучаю процессам разработки и программированию.
MatouДата: Понедельник, 10 Января 2011, 21:54 | Сообщение # 29
Исходный коТ
Сейчас нет на сайте
Quote (Hagrael)
А вот ещё вопрос - в каком порядке инициализируются функции? То есть у меня 3 функции, first, main, second (расположены в том же порядке, в котором написаны), как действует программа? То есть она ведь вначале инициализирует все функции, а лишь после выполняет функцию main или нет? Если да, то зачем прототипы?

Quote (Kornival)
функции инициализируются в порядке расположения в коде.

Функции инициализируются? wacko



GECKДата: Понедельник, 10 Января 2011, 21:57 | Сообщение # 30
заслуженный участник
Сейчас нет на сайте
Matou, грубо говоря функция может использовать только функции, определенные в коде до нее.

Всё гениальное просто. И хреново работает.
MatouДата: Понедельник, 10 Января 2011, 22:00 | Сообщение # 31
Исходный коТ
Сейчас нет на сайте
GECK, Спасибо за ликбез конечно smile но может ты лучше обьяснишь как функции инициализируются biggrin


GECKДата: Понедельник, 10 Января 2011, 22:04 | Сообщение # 32
заслуженный участник
Сейчас нет на сайте
Если честно хз) Как бы смысл понятен, но объяснить не смогу)

Всё гениальное просто. И хреново работает.
MatouДата: Понедельник, 10 Января 2011, 22:14 | Сообщение # 33
Исходный коТ
Сейчас нет на сайте
Ладно, тогда я обьясню) Инициализация - это присваивание обьектам в памяти начальных значений, а функция это никакой не обьект, это просто набор инструкций вызываемый для совершения какой-либо операции, поэтому проинициализировать ее ну никак нельзя. Конечно в функциях могут быть локальные обьекты инициализируемые при вызове функции и глобальные статические инициализируемые до начала выполнения программы, но это опять таки ни какая не инициализация функции.

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



GECKДата: Понедельник, 10 Января 2011, 22:18 | Сообщение # 34
заслуженный участник
Сейчас нет на сайте
Quote (Matou)
функция это никакой не обьект, это просто набор инструкций вызываемый для совершения какой-либо операции, поэтому проинициализировать ее ну никак нельзя.
Да, но можно проинициализировать указатель на функцию)
Я так понял, что под инициализацией подразумевался порядок объявления.


Всё гениальное просто. И хреново работает.
HagraelДата: Вторник, 11 Января 2011, 13:49 | Сообщение # 35
почетный гость
Сейчас нет на сайте
Quote (GECK)
Я так понял, что под инициализацией подразумевался порядок объявления.

Именно так =) А в коде я ступил - написал всё не совсем в том порядке, извините (это касается return). Я думал, что всё так:
Вначале все функции и классы заносятся в память, затем уже вызывается функция main и далее выполняется программа. Дело в том, что ранее я работал с JS, а в нём таких проблем нет, там хоть в конце кода напиши функцию, она будет а) инициализирована сразу б) если это функция a, и она вызывается из функции b, то если в момент её вызова из b она будет инициализирована, то всё будет good. А в C++ мне непонятно, почему функции, определённые раньше других не могут видеть эти "поздние" функции. И каким образом влияют прототипы не понял. Если объявишь прототип, то функция будет знать, что после неё объявлена другая, не объявишь - нет. о_О

Добавлено (11.01.2011, 13:48)
---------------------------------------------
Вот весь код:

Code
#include <iostream>
#include <stdlib.h>
#include <conio.h>

using namespace std;

void initGame(bool **map);

int main() {
  char act;
  int char_code, x=0, y=0;
  bool game_continues=true, map[20][15];

  initGame(map);

  while (game_continues) {
   for (int i=0; i<20; i++) {
    for (int j=0; j<15; j++) {
     if (map[i][j]==true) {cout << "P";} else {cout << " ";}
    }
    cout << "\n";
   }
   act=_getch();
   system("CLS");
   char_code=static_cast<int>(act);
   switch(char_code) {
    case 27:
     game_continues=false;
     break;
    case 75:
     if (x>0) {
      map[y][x]=false;
      x-=1;
      map[y][x]=true;
     }
     break;
    case 77:
     if (x<14) {
      map[y][x]=false;
      x+=1;
      map[y][x]=true;
     }
     break;
    case 72:
     if (y>0) {
      map[y][x]=false;
      y-=1;
      map[y][x]=true;
     }
     break;
    case 80:
     if (y<19) {
      map[y][x]=false;
      y+=1;
      map[y][x]=true;
     }
     break;
   }
  }

     return 0;
}

void initGame(bool **map) {
  for (int i=0; i<20; i++) {
   for (int j=0; j<15; j++) {
    map[i][j]=false;
   }
  }
  map[0][0]=true;
}

Говорит вот что:
\Code Blocks\game\main.cpp||In function `int main()':|
\Code Blocks\game\main.cpp|14|error: cannot convert `bool (*)[15]' to `bool**' for argument `1' to `void initGame(bool**)'

Добавлено (11.01.2011, 13:49)
---------------------------------------------
Я понял, что можно сразу flase'ами заполнить, но всё же, почему не работает данный код?


KornivalДата: Вторник, 11 Января 2011, 18:09 | Сообщение # 36
The Witcher
Сейчас нет на сайте
Quote (Hagrael)
void initGame(bool **map);

По идее это должно рабоать только если создавать двухмерный массив динамически happy

Добавлено (11.01.2011, 18:09)
---------------------------------------------

Quote (Matou)
Функции инициализируются?

Написал так, чтобы бло ему понятно dry
HagraelДата: Вторник, 11 Января 2011, 18:12 | Сообщение # 37
почетный гость
Сейчас нет на сайте
Kornival, не понял, что значит динамически? surprised

KornivalДата: Вторник, 11 Января 2011, 18:15 | Сообщение # 38
The Witcher
Сейчас нет на сайте
В приципе надо только немного подправить код:
Code

#include <iostream>    
#include <stdlib.h>    
#include <conio.h>    

using namespace std;    

void initGame(bool **map);    

int main() {    
     char act;    
     int char_code, x=0, y=0;    
     bool game_continues=true;
     bool **map = new bool*[20];
     for (int i = 0; i < 20; i++) map[i] = new bool[15];

     initGame(map);    

     while (game_continues) {    
      for (int i=0; i<20; i++) {    
       for (int j=0; j<15; j++) {    
        if (map[i][j]==true) {cout << "P";} else {cout << " ";}    
       }    
       cout << "\n";    
      }    
      act=_getch();    
      system("CLS");    
      char_code=static_cast<int>(act);    
      switch(char_code) {    
       case 27:    
        game_continues=false;    
        break;    
       case 75:    
        if (x>0) {    
         map[y][x]=false;    
         x-=1;    
         map[y][x]=true;    
        }    
        break;    
       case 77:    
        if (x<14) {    
         map[y][x]=false;    
         x+=1;    
         map[y][x]=true;    
        }    
        break;    
       case 72:    
        if (y>0) {    
         map[y][x]=false;    
         y-=1;    
         map[y][x]=true;    
        }    
        break;    
       case 80:    
        if (y<19) {    
         map[y][x]=false;    
         y+=1;    
         map[y][x]=true;    
        }    
        break;    
      }    
     }    
       for (int i = 0; i < 20; i++) delete[]map[i];
       delete[]map;
        return 0;    
}    

void initGame(bool **map) {    
     for (int i=0; i<20; i++) {    
      for (int j=0; j<15; j++) {    
       map[i][j]=false;    
      }    
     }    
     map[0][0]=true;    
}

Главное не забыть потом удалить массив.

Добавлено (11.01.2011, 18:15)
---------------------------------------------

Quote (Hagrael)
не понял, что значит динамически?

Если с операторами new и delete незнаком-забудь. biggrin


Сообщение отредактировал Kornival - Вторник, 11 Января 2011, 18:16
HagraelДата: Вторник, 11 Января 2011, 18:34 | Сообщение # 39
почетный гость
Сейчас нет на сайте
Kornival, а что вообще значит ** ? Сколько уровней у массива?

KornivalДата: Вторник, 11 Января 2011, 18:37 | Сообщение # 40
The Witcher
Сейчас нет на сайте
Quote (Hagrael)
а что вообще значит ** ? Сколько уровней у массива?

** значит указатель на указатель.
ВНИМАНИЕ! Хоть одномерный массив и является указателем, двумерный массив не является указателем на указатель. Поэтому надо создавать двумерный динамический массив(а это уже указатель на указатель). Решил обратить на это внимание так как сам наступал на эти грабли.
Форум игроделов » Программирование » C/C++ » #if
  • Страница 2 из 4
  • «
  • 1
  • 2
  • 3
  • 4
  • »
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг