Вопросы от Bercut - Страница 11 - Форум Game Maker. Разработка игр.
Здравствуй Гость | Перейти на сайт

Главная | Форум | Регистрация | Войти
gmaker.net ;) [ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 11 из 11«1291011
Форум Game Maker. Разработка игр. » Разработка игр на Game Maker (Simple Mode) » Проблема - решение. GML и прочее. » Вопросы от Bercut (все адекватно...)
Вопросы от Bercut
Ang3L Дата: Суббота, 07.05.2011, 22:32 | Сообщение # 201
Каждый 5й пост мой
Группа: Админы
Сообщений: 2741
Статус: Offline
Bercut, перед этой структурой попробуй написать:
struct Line;

потом typedef, а в структуре уже pline next;

но для списка обычно делаюь внешний класс, допустим:
stl::list

Добавлено (07.05.2011, 22:32)
---------------------------------------------
ругается потому что к этому моменту он не знает этот тип, а только строит его. для этого его надо объявить для начала. если объект объявлен, но не описан тогда будет ошибка на этапе линковки. самые отвратные и тяжелые ошибки с трудными именами.



Blogpost
 
Bercut Дата: Суббота, 07.05.2011, 22:46 | Сообщение # 202
Болтун
Группа: Проверенные
Сообщений: 197
Статус: Offline
Попробывал Написать так:
Code
struct Line;
typedef Line *PLine; // тип данных: указатель на узел
struct Line {
  double x1; // координаты линии
  double y1; // координаты линии
  double x2; // координаты линии
  double y2; // координаты линии
  PLine *next; // ссылка на следующую линию
};

Всё равно ругается.
А библиотеку пишу на простом Си. -_-


Fast, like fire!
 
Ang3L Дата: Суббота, 07.05.2011, 22:53 | Сообщение # 203
Каждый 5й пост мой
Группа: Админы
Сообщений: 2741
Статус: Offline
Bercut, pline *next; это указатель на указатель. я же написал:
pline next;

в силу специфики с++ я стараюсь писать точно. короче, тебе нужно почитать тему где учат использовать себя же.

Добавлено (07.05.2011, 22:53)
---------------------------------------------
и вместо x и y использовать вектора. проще с рсчётами будет и тригонометрия уберётся на второй план, а выпловет линейная алгебра (вроде wink )



Blogpost
 
Bercut Дата: Суббота, 07.05.2011, 22:55 | Сообщение # 204
Болтун
Группа: Проверенные
Сообщений: 197
Статус: Offline
Так же ошибка -_-
Хорошо, поищу, но пока ничего дельного не нашёл -_-


Fast, like fire!
 
Ang3L Дата: Суббота, 07.05.2011, 22:57 | Сообщение # 205
Каждый 5й пост мой
Группа: Админы
Сообщений: 2741
Статус: Offline
Bercut, в гугле забей Страуструп
вторая ссылка будет его учебник. а первая ссылка будет на вики, возможно там будет тоже ссылка на его учебник.


Blogpost
 
Bercut Дата: Пятница, 01.07.2011, 12:21 | Сообщение # 206
Болтун
Группа: Проверенные
Сообщений: 197
Статус: Offline
Проблема решена:
Code
struct line {
    double x1; // координаты линии
    double y1; // координаты линии
    double x2; // координаты линии
    double y2; // координаты линии
    struct line *next;
};

Источник: http://www.netlib.narod.ru/library/book0003/ch06_05.htm

Добавлено (08.05.2011, 00:40)
---------------------------------------------
Теперь проблема с выделением памяти под структуру с получением ссылки:
пишу как глобал:
pline head = (struct line *)malloc(sizeof(struct line));
..\game with dll\e\e\fuck.cpp(15) : warning C4013: malloc: нет определения; предполагается 'extern' с возвратом типа 'int'
..\game with dll\e\e\fuck.cpp(15) : error C2099: инициализатор не является константой
В функциях такого не выдает.
Короче мне надо единожды создать связный список и иметь ссылку на первый элемент списка(глобальную ссылку, чтобы все функции к ней обращались).
Это надо для того, чтобы гм вызывал нужные функции.

Добавлено (08.05.2011, 02:20)
---------------------------------------------
Проблема решена созданием указателя на пустое место.
После этого в нужной функции выделяется память под струкруту с помощью malloc, и туда ссылается глобальный указатель.
Неочень хороший код, но зато правильный:
Code
#include <stdio.h>
#include <string.h>
#include <conio.h>

#define export __declspec (dllexport)

struct line {
    double x1; // координаты линии
    double y1; // координаты линии
    double x2; // координаты линии
    double y2; // координаты линии
    struct line *next;
};
typedef struct line *pline; // тип данных: указатель на узел
int global_a = sizeof(struct line); // получаем размер структуры, только зачем =-)
pline global_p =  NULL; // создаем указатель и ссылаем на пустое место
extern malloc(a); // прототип функции выделния памяти
extern free (global_p); // прототит функции осовобождения памяти

export double init()
{
    pline first = (struct line *) malloc(global_a); // выделяем память под структуру
    global_p = first; // наконец-то отдаем ссылку глобальному указателю
    first->x1 = 10;
    first->y1 = 20;
    first->x2 = 30;
    first->y2 = 40;
    first->next = NULL;
    return 1;
}
export double ret()
{
    return (global_p->x1+global_p->y1+global_p->x2+global_p->y2);
}
export double del()
{
    free (global_p);
    return 1;
}


Добавлено (01.07.2011, 06:10)
---------------------------------------------
Вот, забыл спрашивал или нет:
а можно изменить значение входящего параметра?
Например мне нужна функции swap (два параметра меняются значениями, имена их неизвестны).
например (i = 7; j = 3; swap(i, j); На выходе: i = 3; j = 7;)
Возможная реализация:
Code
var
      a, b;
        
      a = argument0
      b = argument1
      b = a + b
      a = b - a
      b = b - a
      return 1

Но гм почему-то не изменяет значения, хотя адрес передал =-(

Добавлено (01.07.2011, 06:13)
---------------------------------------------
Со списками почему-то такой приём проходит, а с переменными нет -_-

Добавлено (01.07.2011, 11:53)
---------------------------------------------
Ладно, раз такового способа нет, то придётся передавать строки =-(

Добавлено (01.07.2011, 12:10)
---------------------------------------------
Рабочая реализация (функция swap):

Code
var
     a, b, str;
      
a = argument0
b = argument1
str = b + " = " + a + " + " + b
execute_string(str, a, b)
str = a + " = " + b + " - " + a
execute_string(str, a, b)
str = b + " = " + b + " - " + a
execute_string(str, a, b)
return 1

Вызов:
swap ("x", "y")

Добавлено (01.07.2011, 12:21)
---------------------------------------------
Вообщем лажа всё равно, точную ссылку всё равно не даёт, не передаёт локальные переменные скрипта -_-



Fast, like fire!

Сообщение отредактировал Bercut - Пятница, 01.07.2011, 06:10
 
Йакуд Дата: Пятница, 01.07.2011, 12:41 | Сообщение # 207
Хоть палкой гони
Группа: Проверенные
Сообщений: 503
Статус: Offline
Code
var  
       a, b;  
          
       a = argument0  
       b = argument1  
       b = a + b  
       a = b - a  
       b = b - a  
       return 1


Убери
Code
var  
       a, b;

И будет тебе счастье.


Второе рождение .blanco
 
Ang3L Дата: Пятница, 01.07.2011, 13:08 | Сообщение # 208
Каждый 5й пост мой
Группа: Админы
Сообщений: 2741
Статус: Offline
Quote (Bercut)
Но гм почему-то не изменяет значения, хотя адрес передал =-(

В ГМ нельзя передать адрес, только передача по значению. Это и огромный плюс и такой же минус. Плюс в том что не надо заморачиваться с указателями, а с ними много возьни. Минус в том что убирается очень большой пласт возможностей.

Quote (Bercut)
Со списками почему-то такой приём проходит, а с переменными нет -_-

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

И используй Xor в замене местами, гораздо быстрее и не требует лишних переменных.
Code
a = a ^ b;  
b = b ^ a;  
a = a ^ b;

Добавлено (01.07.2011, 13:08)
---------------------------------------------
Йакуд, ага, а a и b как потом обратно в нужные мне переменные запихнуть? smile Допустим,

Code
swap(max_health1, max_health2);
//а на выходе a и b, оба max_health'а остаются при своём


Blogpost
 
Bercut Дата: Пятница, 01.07.2011, 13:21 | Сообщение # 209
Болтун
Группа: Проверенные
Сообщений: 197
Статус: Offline
Quote (Ang3L)
оэтому ты можешь сделать 2 глобальных переменных, которые будут меняться. Те значения которые тебе нужно поменять пихаешь их в эти глобальные, глобалы меняешь, а потом переписываешь из глобалов в локальные. Но всё равно больно сложно получается.

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


Fast, like fire!
 
Ang3L Дата: Пятница, 01.07.2011, 15:06 | Сообщение # 210
Каждый 5й пост мой
Группа: Админы
Сообщений: 2741
Статус: Offline
Quote (Bercut)
На счёт выделения глобальных переменных под эти нужды, можно, но пока что я не знаю, сколько мне их понадобиться =-)

Тебе их понадобится ровно 2. Ни больше, ни меньше.

1) Ты записываешь свои переменные, которые нужно поменять в global.a и в global.b. Не важно куда именно, важен порядок.
2) Меняем местами global.a и в global.b.
3) Записываем обратно. Если первая переменная была в a, то записываем из a в первую переменную. Тоже самое с b.

Но помоему, получается какая-то чушь и слишком много кода. Лучше вставь сразу размен местами и всё, не геморройся так.

Добавлено (01.07.2011, 15:06)
---------------------------------------------

Quote (Bercut)
Не знал, что списки глобальные, ну теперь это всё объясняет.

Ну скажем так. Списки все нумеруются под цифрами от 0 и до ... Хз каких. Ну саму цифру хранить не сложно. Когда осуществляется доступ к спискам, то передается этот порядковый номер и производится нужная операция. Можно сказать что список списков глобален. А списков как таковых не существует. Пример:
ds_list_find_value(0, 0); //и что тут глобального? 2 нуля и все. Если есть хоть один список и в первом есть хотя бы 1 элемент этот код на 100% рабочий.


Blogpost
 
Форум Game Maker. Разработка игр. » Разработка игр на Game Maker (Simple Mode) » Проблема - решение. GML и прочее. » Вопросы от Bercut (все адекватно...)
Страница 11 из 11«1291011
Поиск:



Сообщество Gmaker.SU 2005-2012
Используются технологии uCoz
Простой вход