| Вопросы от 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 использовать вектора. проще с рсчётами будет и тригонометрия уберётся на второй план, а выпловет линейная алгебра (вроде )
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 Убери И будет тебе счастье.
Второе рождение .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 как потом обратно в нужные мне переменные запихнуть? Допустим, 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
|
| |
| |
|
|