Как се пассва мултиизмерен масив през таск?

Ако имате затруднения при изработката/преработката на даден плъгин - пишете тук, ще се опитаме да ви помогнем!
Аватар
hellmoss
Извън линия
AMXX Скриптър
AMXX Скриптър
Мнения: 80
Регистриран на: 15 Окт 2016, 20:24
Се отблагодари: 10 пъти
Получена благодарност: 14 пъти
Обратна връзка:

Как се пассва мултиизмерен масив през таск?

Мнение от hellmoss » 30 Дек 2019, 06:10

Код за потвърждение: Избери целия код

	new Float:pass_gr[2][3]
        pass_gr[0][0]=grav
        pass_gr[1][0]=aimvec[0]
        pass_gr[1][1]=aimvec[1]
        pass_gr[1][2]=aimvec[2]

	set_task(0.1, "x", id+55123, pass_gr, len, "b")
Пробвах където е len да сложа sizeof(pass_gr), не става. Имам 6 клетки, пробвах да сложа директно стойност 6, пробвах също със 4, но:
error 048: array dimensions do not match...
xLd Zombie Plague -- 46.4.77.125
https://discord.gg/kbjN5JRxWb

Аватар
Autumn Shade
Извън линия
Потребител
Потребител
Мнения: 269
Регистриран на: 14 Мар 2019, 13:20
Се отблагодари: 48 пъти
Получена благодарност: 150 пъти

Как се пассва мултиизмерен масив през таск?

Мнение от Autumn Shade » 30 Дек 2019, 09:45

Можеш всичко да подадеш като масив към функция, стига да запазиш организацията на данните, за да може функцията да ги обработи. Най-лесно ще ти е да си създадеш някакъв "псевдо" enum. Също така, дори и да не го направиш, а решиш да си го използваш както в момента, проблемът идва от параметрите във функцията.

Код за потвърждение: Избери целия код

enum _:TaskData {
    iAimGrav,
    iAimVec[3]
};

public cmdTask(id) {

    /*! Some Example Code Above */
    new iArray[TaskData];

    iArray[iAimGrav] = grav;

    iArray[iAimVec][0] = aimvec[0];
    iArray[iAimVec][1] = aimvec[1];
    iArray[iAimVec][2] = aimvec[2];

    
    set_task(1.0, "fwTask", 34753, iArray, sizeof(iArray));
}

public fwTask(iArray[TaskData], iTaskId) {
    // do your stuff
}
Не съм сигурен дали слагането на бонус скоби за многомерен масив би проработило. Горният пример, според мен, е най-оптималният вариант след Array модула.

Аватар
hellmoss
Извън линия
AMXX Скриптър
AMXX Скриптър
Мнения: 80
Регистриран на: 15 Окт 2016, 20:24
Се отблагодари: 10 пъти
Получена благодарност: 14 пъти
Обратна връзка:

Как се пассва мултиизмерен масив през таск?

Мнение от hellmoss » 30 Дек 2019, 14:28

Това работи, благодаря!

Може би трябваше да напиша друго заглавие, защото мен ми е любопитно как се изчислява размера на масива локално, без помощ на глобални променливи.
xLd Zombie Plague -- 46.4.77.125
https://discord.gg/kbjN5JRxWb

Аватар
OciXCrom
Извън линия
Администратор
Администратор
Мнения: 7206
Регистриран на: 06 Окт 2016, 19:20
Местоположение: /resetscore
Се отблагодари: 117 пъти
Получена благодарност: 1295 пъти
Обратна връзка:

Как се пассва мултиизмерен масив през таск?

Мнение от OciXCrom » 30 Дек 2019, 21:39

Проблемът е, че изобщо не можеш да подадеш мултиизмерен масив, тъй като аргументът в самата функция е дефиниран със само 1 измерение.

https://amxx-bg.info/forum/api/amxmodx/set_task

Код за потвърждение: Избери целия код

const any:parameter[] = ""
Не е проблем да ползваш глобална променлива в случая. За момента не се сещам за директен начин, ако изобщо е възможен такъв.

Аватар
Autumn Shade
Извън линия
Потребител
Потребител
Мнения: 269
Регистриран на: 14 Мар 2019, 13:20
Се отблагодари: 48 пъти
Получена благодарност: 150 пъти

Как се пассва мултиизмерен масив през таск?

Мнение от Autumn Shade » 31 Дек 2019, 08:45

Тотално изтрещяло решение би било

Код за потвърждение: Избери целия код

#include <amxmodx>

public plugin_init() {
    register_plugin("Test", "1.0", "asd");

    new iArray[2][3];

    iArray[0][0] = 1;
    iArray[0][1] = 2;
    iArray[0][2] = 3;
    iArray[1][0] = 4;
    iArray[1][1] = 5;
    iArray[1][2] = 6;

    for(new iSubArray = 0; iSubArray < sizeof(iArray); iSubArray = iSubArray)
        if(!task_exists(34765)) {
            set_task(1.0, "fwTask", 34765, iArray[iSubArray], sizeof(iArray[]));
            iSubArray++;
        }
}

public fwTask(iArray[], iTaskId) {
    
    /*! Doing stuff */

    remove_task(iTaskId);
}
Реално ще работи, но не го препоръчвам ама изобщо.

Аватар
mi0
Извън линия
AMXX Скриптър
AMXX Скриптър
Мнения: 534
Регистриран на: 09 Дек 2016, 22:02
Се отблагодари: 97 пъти
Получена благодарност: 120 пъти
Обратна връзка:

Как се пассва мултиизмерен масив през таск?

Мнение от mi0 » 31 Дек 2019, 11:40

Може и просто да направиш масива глобален, така нямада ти трябва да го пасваш, но разбира се, първото решение е много по-добро.
aka kurdokoleno
Catch Mod - 87.121.112.232:27021

Аватар
hellmoss
Извън линия
AMXX Скриптър
AMXX Скриптър
Мнения: 80
Регистриран на: 15 Окт 2016, 20:24
Се отблагодари: 10 пъти
Получена благодарност: 14 пъти
Обратна връзка:

Как се пассва мултиизмерен масив през таск?

Мнение от hellmoss » 31 Дек 2019, 15:57

mi0 написа: 31 Дек 2019, 11:40 Може и просто да направиш масива глобален, така нямада ти трябва да го пасваш, но разбира се, първото решение е много по-добро.
Аз ако исках да го направя с глобални, дори нямаше да пиша тук.
Нали точно това подчертах, че ми е любопитно как се изчислява размера на масива, защо при мен sizeof не работеше вътре във функцията ми, но може би хрома е прав, че параметъра е дефиниран като моноизмерен.
xLd Zombie Plague -- 46.4.77.125
https://discord.gg/kbjN5JRxWb

Аватар
mi0
Извън линия
AMXX Скриптър
AMXX Скриптър
Мнения: 534
Регистриран на: 09 Дек 2016, 22:02
Се отблагодари: 97 пъти
Получена благодарност: 120 пъти
Обратна връзка:

Как се пассва мултиизмерен масив през таск?

Мнение от mi0 » 31 Дек 2019, 20:04

sizeof е Preprocessor macro, изчислява се при компилирането.
Example -

Код за потвърждение: Избери целия код

new array[128] // декларираме масив със 128 елемента.
sizeof(array) // връща броя на елементите(128)
Би трябвало да работи навсякъде.
aka kurdokoleno
Catch Mod - 87.121.112.232:27021

Аватар
hellmoss
Извън линия
AMXX Скриптър
AMXX Скриптър
Мнения: 80
Регистриран на: 15 Окт 2016, 20:24
Се отблагодари: 10 пъти
Получена благодарност: 14 пъти
Обратна връзка:

Как се пассва мултиизмерен масив през таск?

Мнение от hellmoss » 03 Яну 2020, 20:11

mi0 написа: 31 Дек 2019, 20:04 sizeof е Preprocessor macro, изчислява се при компилирането.
Example -

Код за потвърждение: Избери целия код

new array[128] // декларираме масив със 128 елемента.
sizeof(array) // връща броя на елементите(128)
Би трябвало да работи навсякъде.
Нали това съм написал, че не работи в моя случай..
xLd Zombie Plague -- 46.4.77.125
https://discord.gg/kbjN5JRxWb

Аватар
mi0
Извън линия
AMXX Скриптър
AMXX Скриптър
Мнения: 534
Регистриран на: 09 Дек 2016, 22:02
Се отблагодари: 97 пъти
Получена благодарност: 120 пъти
Обратна връзка:

Как се пассва мултиизмерен масив през таск?

Мнение от mi0 » 04 Яну 2020, 06:28

Ето ти мултиизмерен пример

Код за потвърждение: Избери целия код

new array[3][128] // декларираме масив с 3 елемента, които са масиви и имат по 128 елемента.
sizeof(array) // връща броя на елементите(3)
sizeof(array[]) // връща броя на елементите на елементите(128)
От твоя пример

Код за потвърждение: Избери целия код

sizeof(pass_gr) // 2
sizeof(pass_gr[]) // 3
sizeof(pass_gr) * sizeof(pass_gr[]) // 6
aka kurdokoleno
Catch Mod - 87.121.112.232:27021

Публикувай отговор
  • Подобни теми
    Отговори
    Преглеждания
     Последно мнение

Обратно към “Помощ в скриптирането”

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 8 госта