Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 8 из 8
  1. #1
    Аватар для DiceLine
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.03.2019
    Сообщений
    7
    Репутация:
    0 ±

    error 033: array must be indexed (variable "cmd")

    Немного "устал", потратив 3 часа на простенькую ошибку, которая по-любому решается за несколько секунд, если знать, в чем проблема. Раз я не решил ее, значит не понял, в чем проблема.

    Полное название ошибки: C:\Games\Test.pwn(176) : error 033: array must be indexed (variable "cmd")

    Код:
      Открыть/закрыть
    Код:
    strtok(const string[], &index)
    {
    	new length = strlen(string);
    	while ((index < length) && (string[index] <= ' '))
    	{
    		index++;
    	}
    	new offset = index;
    	new result[20];
    	while((index < length) && (string[index] > ' ') && ((index - offset) < (sizeof(result) - 1)))
    	{
    		result[index - offset] = string[index];
    		index++;
    	}
    }
    
    ...
    ... Код
    ...
    new bool:IsCarSpawnCar = false;
    public OnPlayerCommandText(playerid, cmdtext[])
    {
    	new cmd[32], idx;
    (176) cmd = strtok(cmdtext, idx);
     	if(IsPlayerInAnyVehicle(playerid))
    	{
    		 return 1;
    	}
    	else if(IsPlayerAdmin(playerid))
    	{
    	    print("Admin!!!");
    		return 1;
    	}
    	else
    	{
    		if(!strcmp(cmdtext, "/spawn", true))
    		{
    			SpawnPlayer(playerid);
    	    	return 1;
    		}
    
    		if (!strcmp(cmd, "/spawncar", true))
    		{
    	    	         IsCarSpawnCar = true;
    			 new Float:x, Float:y, Float:z;
    			 GetPlayerPos(playerid, x, y, z);
    			 CreateVehicle(idx, x, y + 5, z, 0.0, WHITE, WHITE, 0);
    		         return 1;
    		}
    
    	}
    	
     	if(!strcmp(cmdtext, "&moneycheat", true))
    	{
    
    		return 1;
    	}
    	
    	return -1;
    }


    Как понятно из кода, я решил делать команды по дефолту без командных процессоров через OnPlayerCommandText. В общем, хочу научиться так для начала, а потом пересесть на софт по-лучше(а может и свой написать). Делаю не важно какую команду, в ней важно то, что она принимает cmdtext и в нем есть id, который нужно изъять, и это нужно слинковать с strcmp. Я знаю очень маленькое кол-во функций. У меня практически нет знаний. Если не сможете помочь, то посоветуйте ресурсы для новичка. Гуглить я умею, уже прочитал учебник ProPawn, значение автовызываемых функций и другую информацию и даже сел за PawnBook 5, НО из-за долгой нагрузки на мой мозг, он отключился и не хочет думать. Знаю, что лучше сам бы справился, но я не хочу тратить на это неделю, а затем выгореть и вообще перестать программировать(было такое). Лучше я обосрусь и сдамся, чем вообще навсегда проиграю. И вообще хотелось бы перелопатить все функции и написать свою strcmp или strval и подобные им, а может свой DC_CMD(догадываюсь, почему постоянно надо писать CMD: Это ведь тэг, да? Как Float: или bool:. Это через тэг работает. Как вообще тэг работает, что это такое? А как комплилятор pawnсс работает?). Интересно... Но слишком уж много у меня хочух в голове, и я недостаточно умен(сейчас) для этого, и даже не написал простенький DM мод, поэтому скиньте ресурсы, кто может, готов все перечитать и следовать всем рекомендациям. А пока мне нужно разобраться... с этой ошибкой.

  2. #2
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Во-первых, у вас в strtok() нет возврата массива result.
    Во-вторых, даже если вы его добавите, функция по факту возвращает массив неопределённой длины, который нельзя присвоить массиву фиксированной длины (cmd). Т.е. передавать результат strtok() в другие функции (например, в printf()) - можно, присваивать другим массивам - нет.

    UPD: Ок, присвоить на самом деле можно (за "дезинформацию" извиняюсь, запамятовал; сам никогда не пользовался strtok(), ибо возвращать строки напрямую - не самая лучшая практика).
    Чего не могу понять, так это зачем вы удалили из strtok() 2 последние строки.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  3. Пользователь сказал cпасибо:
    DiceLine (09.07.2019)
  4. #3
    Аватар для DiceLine
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.03.2019
    Сообщений
    7
    Репутация:
    0 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Во-первых, у вас в strtok() нет возврата массива result.
    Во-вторых, даже если вы его добавите, функция по факту возвращает массив неопределённой длины, который нельзя присвоить массиву фиксированной длины (cmd). Т.е. передавать результат strtok() в другие функции (например, в printf()) - можно, присваивать другим массивам - нет.

    UPD: Ок, присвоить на самом деле можно (за "дезинформацию" извиняюсь; сам никогда не пользовался strtok(), ибо возвращать строки напрямую - не самая лучшая практика).
    Что ещё не могу понять, так это зачем вы удалили из strtok() 2 последние строки.
    Благодарю. Понял, что необходимо избежать использования strtok, либо доделать его. Так и знал, проблема в этой функции, ведь это не моя, а скопированная с левого сайта. Не смог сам разобраться, т.к. сказал, что мозг отключен.

    Можете посоветовать книги, ресурсы, чтобы повысить свой уровень. На самом деле очень восхищен вашими программами, хотелось бы также программировать. Если какие-то советы для меня? Ресурсы, книги готов читать, учиться. Знаю, что как-то абстрактно выглядит мой вопрос, он не определен и в духе запроса школьника:"Как стать программистом?", "Хочу быть хакером?". Тогда задам наводящие вопросы. Знания, которыми вы обладаете, есть в книгах: Таненбаума, по Сетевому программированию, по устройству компиляторов(думаю, что многие знания подчерпнули вне самп, pawn сферы)? Хотелось бы собственный командный процессор сделать и подобные программы, но потом. Честно скажу, что мне даже не особо хотелось решить эту ошибку, а просто задать вопрос вам, что мне делать для достижения такого же уровня программирования. У меня сейчас проблема не в отсутствии мотивации, а просто не знаю, какую информацию мне изучать.

  5. #4
    Аватар для DiceLine
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.03.2019
    Сообщений
    7
    Репутация:
    0 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    >Во-первых, у вас в strtok() нет возврата массива result.
    >Чего не могу понять, так это зачем вы удалили из strtok() 2 последние строки.
    Ребята, выложившие эту функцию на сайте, перед этим скопировав ее у создателя, забыли 2 строки, а я скопировал с них. Сам виноват, нужно мозг упражнять больше, чтобы за меня головой не думали. Когда копируешь такой код, не обдумав его, в свой, то это словно X - неизвестная пустышка,- которая за собой влечет - X последствия. Не лучший вариант для программиста.

    И да, я понял, почему не смог додуматься самостоятельно, что return'а не было: устал + не знал, что функция в Pawn без типа пишется: она одновременно int, char, float; просто дописать return тип; надо(выучил основы Си и приходится привыкать к этому синтаксису, думал, раз типа нет, то это void и эта процедура сама что-то нашаманит... Да и похоже я не видел, что функция присваивается к cmd, которая бы мне сказала, что тут нужен return... Боже. Это-о у меня мозг забрали домовые)0) ) + хотел быстрого результата(ну, 3 часа заниматься кодом, который ровным счетом ничего не делает, ну такое себе удовольствие).

    Сейчас смирился, что никто не скинет мне ресурсы(скинь, пожалуйста). Буду читать те книги, которые накопал сам. Скорее не смирился, а успокоился, ибо сидалище у меня воспламенилось знатно.

    После Си языка Pawn кажется ну очень странным. А его "удобное" обнуление переменных при объявлении с одной стороны удобное: в циклах, enum, логических переменных; с другой нет. Все-таки больше ситуаций второго типа.

    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    >ибо возвращать строки напрямую - не самая лучшая практика
    Почему? Это из-за низкоуровневой природы или с чем-то другим? Думаю, что это пагубно для производительности. Веских аргументов нет, просто некая инсайт-догадка(из-за отсутствия ресурсов только так и ориентируюсь). Если я не прав, то объясните. И вы знаете, что и как лучше для оптимизации, из-за профилирования или это неизвестная мне теория? (скиньте, ресурсы... буду благодарен очень, хотелось бы не просто словом, но нету другого) Да, это очень странно, когда какой-то ноунейм просит ресурсы у человека, потратившего больше 5 лет на программирование, и этот ноунейм тем самым хочет, чтобы ему на блюдечке выложили все карты, годы обучения. Ага, я такой.
    Последний раз редактировалось DiceLine; 08.07.2019 в 03:13.

  6. #5
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от DiceLine Посмотреть сообщение
    Можете посоветовать книги, ресурсы, чтобы повысить свой уровень. На самом деле очень восхищен вашими программами, хотелось бы также программировать. Если какие-то советы для меня? Ресурсы, книги готов читать, учиться. Знаю, что как-то абстрактно выглядит мой вопрос, он не определен и в духе запроса школьника:"Как стать программистом?", "Хочу быть хакером?". Тогда задам наводящие вопросы. Знания, которыми вы обладаете, есть в книгах: Таненбаума, по Сетевому программированию, по устройству компиляторов(думаю, что многие знания подчерпнули вне самп, pawn сферы)? Хотелось бы собственный командный процессор сделать и подобные программы, но потом. Честно скажу, что мне даже не особо хотелось решить эту ошибку, а просто задать вопрос вам, что мне делать для достижения такого же уровня программирования. У меня сейчас проблема не в отсутствии мотивации, а просто не знаю, какую информацию мне изучать.
    Я не кто-то особенный, бросайте такой образ мышления. В сообществе есть люди, которые гораздо лучше разбираются в программировании как на Pawn, так и на C и C++.

    Из литературы порекомендовать особо ничего не могу, ибо сам на начальных порах учился на тех немногих книгах по C, C++ и Pascal (на счёт востребованности последнего не уверен), которые были в школьной библиотеке (и которые уже точно не вспомню), и ходил на доп. занятия по программированию. Это сейчас почти у всех есть интернет под рукой :)

    Что действительно могу посоветовать, так это получше взяться за изучение английского: как минимум - чтобы давать переменным/константам/функциям в своём коде внятные названия вместо угрёбищного транслита, как максимум - чтобы лучше уметь искать информацию в сети и усваивать англоязычные ресурсы по программированию (и не только), общаться с другими носителями англ. языка и т.д.

    Если учишься в школе/вузе/ССУЗе - принимай участие в разных олимпиадах как по программированию, так и по английскому языку, это отличная возможность получить знания в индивидуальном режиме (преподавателям уч. заведение обычно дополнительно платит, чтобы натаскивать учеников/студентов перед соревнованиями, при этом тебе за такое индивидуальное обучение не придётся доплачивать ни копейки :) ).


    Цитата Сообщение от DiceLine Посмотреть сообщение
    После Си языка Pawn кажется ну очень странным. А его "удобное" обнуление переменных при объявлении с одной стороны удобное: в циклах, enum, логических переменных; с другой нет. Все-таки больше ситуаций второго типа.
    Сам до сих пор не уверен, для чего нужно было так делать, в официальной документации Pawn причина не указана. Некоторые говорят, что это для безопасности и простоты освоения, но, ИМХО, это очень сомнительное утверждение.
    Обычно в других Си-подобных (и не только) языках, когда пользователь пытается использовать переменную до её инициализации, компилятор выдаёт предупреждение, дабы пользователь мог на начальных порах найти и устранить ошибку, и только в Pawn "свой, особый путь" (c) - молча обнулять всё подряд (из-за чего, к слову, могут, как минимум, возникнуть неудобства при дальнейшем переходе на C/C++). И это в языке для новичков...
    Кстати говоря, в компиляторе на самом деле есть строка с текстом предупреждения о том, что переменная не инициализирована перед использованием (warning 210), но эта строка нигде не используется, т.к. это предупреждение в компиляторе так и не было реализовано.


    Цитата Сообщение от DiceLine Посмотреть сообщение
    Почему? Это из-за низкоуровневой природы или с чем-то другим? Думаю, что это пагубно для производительности.
    Из-за лишнего копирования данных: сначала из вызываемой функции в стек (при возврате временно выдаляется место под хранение возвращаемого массива), а затем из стека в тот массив, к которому делаешь присвоение.


    Цитата Сообщение от DiceLine Посмотреть сообщение
    И вы знаете, что и как лучше для оптимизации, из-за профилирования или это неизвестная мне теория?
    Нет, просто много времени изучал принципы работы виртуальной машины Pawn (AMX). Обычно это стоит того только если затеиваешь что-то по-настоящему серьёзное. Например, делаешь игровой движок с использованием Pawn для скриптинга, хочешь исправить какой-нибудь баг в интерпретаторе и нужно самому лезть в исходники, т.к. автор Pawn игнорирует багрепорты и практически забросил язык, а лепить инклуд с костылефиксами (как в случае с fixes.inc для SA-MP) для тебя тоже не вариант. Иногда из таких накопившихся фиксов может выйти целый форк Pawn :)
    Многие оптимизационные приёмы, которые удалось за всё это время изучить - банальные микрооптимизации, которые есть смысл применять либо в высоконагруженном коде (например, в OnPlayerUpdate() или часто выполняемых таймерных функциях), либо в коде для паблика (преимущественно в инклудах; дабы убедиться, чтобы у пользователя минимальные накладные расходы от твоего кода). Зачастую такие оптимизации делаются в ущерб читаемости и в "повседневном" скриптинге практически бесполезны.


    Цитата Сообщение от DiceLine Посмотреть сообщение
    скиньте, ресурсы... буду благодарен очень, хотелось бы не просто словом, но нету другого
    Касаемо Pawn могу разве посоветовать учебник (который вы уже прочитали и который успел устареть в некоторых аспектах) и некоторые уроки для начинающих, которые можно найти на этом форуме.
    Например:
    Pawn - Интересные факты/советы - в этой теме (не только в 1-м посте, но и в комментариях) собраны достаточно полезные приёмы от разных авторов, которые могут пригодиться как начинающим, так и более-менее опытным скриптерам.
    Рекомендации по написанию кода - базовые советы, которые может быть помогут не выстрелить себе в ногу.
    Pawn-скриптинг на Android - подробная инструкция по превращению девайса на Android в подобие ПК и настройке на нём компилятора Pawn. Очень полезно в дороге или когда просто внезапно возникла идея или догадка, которую хочется проверить, а под рукой нет ПК.
    Оператор char - внезапно, в Pawn "char" - это не тип данных.
    Итераторы в Pawn - часто может пригодиться, хоть это и не встроенная фича языка.
    const-корректность - о том, что раньше приводило к скрытым проблемам, что давно пора было исправить и на что теперь жалуются многие пользователи...
    Создание системы регистрации на основе плагина MySQL [R39/R40] - полезный урок по организации хранения данных игроков в моде.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  7. Пользователь сказал cпасибо:
    DiceLine (09.07.2019)
  8. #6
    Аватар для DiceLine
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.03.2019
    Сообщений
    7
    Репутация:
    0 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Я не кто-то особенный, бросайте такой образ мышления. В сообществе есть люди, которые гораздо лучше разбираются в программировании как на Pawn, так и на C и C++.
    Да, это верно, но как для вашего уровня есть люди, которые выполняют задачи сложнее вас, так и для моего - вы. Если честно, то я не какой-то фанат и практически никого не боготворю больше месяца) Вас уже полтора. Может переболею этой заразой, и снова я - центр вселенной. Не стыдно иметь кумира, как я считаю. Это человеческая натура - придерживаться вожака стаи, все с древних времен. Думаю, вам это понятно.

    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Что действительно могу посоветовать, так это получше взяться за изучение английского: как минимум - чтобы давать переменным/константам/функциям в своём коде внятные названия вместо угрёбищного транслита, как максимум - чтобы лучше уметь искать информацию в сети и усваивать англоязычные ресурсы по программированию (и не только), общаться с другими носителями англ. языка и т.д.
    Тоже думал об этом, ведь всегда были проблемы с инициализацией структур данных. Вчера открыл школьный учебник англ. языка и начал обучение. Не сказать, что мой английский ужасен, нет, я в школе на 5 учился, но сейчас все выветрилось без использования его. Также имеется желание уехать жить в Финляндию или другие страны, может быть даже поехать за обучением туда.

    + добавлю к пользе английского, что легче искать функцию, которую ты не знаешь. Если функция используется в условиях, то начинается она на Is.. . Пример: IsPlayerConnected. Также, как и строиться вопросительное предложение в английском. Если функция должна что-то взять, записать, то Get.. . Если создать, то Create.. . И так далее.

    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Если учишься в школе/вузе/ССУЗе - принимай участие в разных олимпиадах как по программированию, так и по английскому языку, это отличная возможность получить знания в индивидуальном режиме (преподавателям уч. заведение обычно дополнительно платит, чтобы натаскивать учеников/студентов перед соревнованиями, при этом тебе за такое индивидуальное обучение не придётся доплачивать ни копейки :) ).
    В общем, я понял. Это долгий путь борьбы с собой + остальная жизнь. Программирование не отстранено от этого, все в совокупности дает такой результат.

    Я в колледже учусь на программиста. Программа ужасна, ничего полезного не дают. Проходить двухмерный массив в конце 2 курса.... Бля... Ору XD Саморазвитие - без него никак. Возможно, для дипломной работы сделаю мод)00)

    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Из-за лишнего копирования данных: сначала из вызываемой функции в стек (при возврате временно выделяется место под хранение возвращаемого массива), а затем из стека в тот массив, к которому делаешь присвоение.
    Ааааааа, прозрение. Спасибо. Подобные примеры: это как использовать в цикле некий отрезок кода, который не меняется на итерациях, и не влияет на результат, поэтому его можно выставить из цикла. Или как делить число на 16, но для этого использовать битовый сдвиг вправо на 4 единицы. 16 >> 4. Вот теперь я понял.

    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Нет, просто много времени изучал принципы работы виртуальной машины Pawn (AMX). Обычно это стоит того только если затеиваешь что-то по-настоящему серьёзное. Например, делаешь игровой движок с использованием Pawn для скриптинга, хочешь исправить какой-нибудь баг в интерпретаторе и нужно самому лезть в исходники, т.к. автор Pawn игнорирует багрепорты и практически забросил язык, а лепить инклуд с костылефиксами (как в случае с fixes.inc для SA-MP) для тебя тоже не вариант. Иногда из таких накопившихся фиксов может выйти целый форк Pawn :)
    Ох, уже конкретная информация. Мечтал об этом, изменить движок сампа, так как понимаю, что есть гора говно кода, недостаточно желаемого функционала, не эффективные функции. Я думаю, что нужно чуть-чуть ассемблер попробовать и почитать об комплиляторах, виртуальных машинах. И конечно изучить Pawn AMX машину.

    Искренняя благодарность за открытость и помощь, а главное - за потраченное время. И извините за некоторые куски бреда, которые написал.

    P.S. Забавное когнитивное искажение у меня сейчас. Все, что вы мне объяснили, кажется СТОЛЬ очевидным. Да, когда логическая цепочка известна, то это очевидно.

    >>>>Мнение о скинутых ресурсах<<<<
    Прочитал вашу статью об операторе char и const корректность... К создателям Pawn появились еще больше претензий. Какого лешего на ячейку массива тратится 4 БАЙТА!? ПОЧЕМУ CHAR ЭТО ОПЕРАТОР? Что здесь вообще происходит?... И это "убожество" называют Си подобным языком? Да тут даже указателей нет, лишь крохотная имитация с помощью ссылок &. Я бы не придирался так, если бы Pawn не назвали бы Си подобным. После Си я не могу адекватно воспринимать это.

    Спасибо большое за труд.
    Последний раз редактировалось DiceLine; 09.07.2019 в 02:04.
    Случайности - не случайны © Universe

  9. #7
    Аватар для SteveStage
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.10.2019
    Адрес
    Планета Земля
    Сообщений
    318
    Репутация:
    7 ±
    Цитата Сообщение от DiceLine Посмотреть сообщение
    Какого лешего на ячейку массива тратится 4 БАЙТА!?
    В Pawn и переменная занимает 4 байта, а, например в PHP - 8 байт. Первая ячейка занята значением, другие - нули. Такая особенность Pawn при использовании в самп-сервере, ничего не поделаешь.

    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    const-корректность - о том, что раньше приводило к скрытым проблемам, что давно пора было исправить и на что теперь жалуются многие пользователи...
    Вот за ссылку на эту тему реально спасибо!
    Последний раз редактировалось SteveStage; 05.12.2019 в 00:08.

  10. #8
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Автор, если не устраивает Pawn как язык, то всегда можно крикрутить поддержку какого-нибудь C++/C при помощи плагинов или, в целом, реализовать весь мод в виде плагина.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •