Question

Dworkin
Новичок

Привет. Мне тяжело дается понимание строк в pawn из за не динамических массивов.

#include enum pInfo
{ 
	pRangName[25]
}

new players[MAX_PLAYERS][pInfo];
new string[20];
main() 
{ 
  format(string, sizeof(string), "Салага");
  printf(string);
  players[0][pRangName] = string; 
}

выдает ошибку "error 047: array sizes do not match, or destination array is too small" на строку "players[0][pRangName] = string;"

Я понимаю что в ошибке говорится что размер не совпадает, но не могу понять как это сделать в павне

Share this post


Link to post

1 answer to this question

  • 0
Cawfee
Великий Гуру

@Dworkin, такое присвоение не допускается. Используйте функции для работы со строками. Обычно с этой целью используют функцию strcat. Только сначала следует записать нулевой байт в начало целевой строки, иначе, если в players[0][pRangName] был какой-то текст, строки попросту склеятся.

players[0][pRangName][0] = '\0'; // даем процессору считать, что строка пустая (и запись пойдет с нулевого байта)
strcat(players[0][pRangName], string);

 

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

new size = sizeof(string);
for (new i = size - 1; i >= 0; --i) {
	players[0][pRangName[i]] = string[i];
}

players[0][pRangName[size]] = '\0';

Далее вспомните о существовании строковых команд (команд для работы со строками: strcmp, strcat, ...), которые берут на себя работу по организации, грубо говоря, подобных циклов. Тогда все ваша работа сведется лишь к тому, чтобы использовать такие строковые команды, указывая необходимые массивы байтов (они же строки) в качестве операндов. 

 

Также уточню, что за последним байтом вашей информацией должен располагаться нулевой байт (\0), который является для процессора сигналом конца строки. То есть, дойдя до указанного символа, процессор понимает, что на этом строка строка закончилась и дальше в памяти располагается уже следующая строка. Помещая нулевой байт в нулевую ячейку, процессор считает, что в строка пустая.

 

И немного не понял, почему вы упомянули динамическую память. Если вы под этим имели в виду возможность присвоения строк, например, в C++, то следует отметить следующий факт: в C++ string - это класс, внутри которого реализована перегрузка операции присвоения. В общем-то он тоже основан на работе с байтами - о ней я писал выше - просто в красивой обертке.

Share this post


Link to post
Guest
This topic is now closed to further replies.
Sign in to follow this  
Followers 0
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • снайк
      By снайк
      Всех приветствую! Наша команда сейчас вовсю разрабатывает проект Meridian Project, и нам нужны лишние руки (и глаза), чтобы проверить, как всё работает. Проект еще не открылся, поэтому работы хватает: нужно бегать по серверу, проверять системы, искать баги и говорить нам, если что-то идет не так. Нам не важны ваши «дипломы» или стаж работы в IT — главное, чтобы ты понимал, как устроено CR:MP, и хотел помочь сделать сервер лучше.
       
      Сейчас мы на стадии активной разработки и формируем основную команду. На данном этапе прямых денежных выплат нет, так как все средства уходят на техническую часть и оборудование.
       
      Мы ищем надежных людей, готовых включиться в процесс сейчас. Взамен на старте вы получите максимальный уровень поддержки: это касается как игрового капитала и имущества, так и уникальных преимуществ, которые технически невозможно будет получить позже.
      Те, кто проявит себя в деле, в дальнейшем смогут напрямую влиять на развитие проекта и принимать ключевые решения. Мы ищем тех, кто готов работать на результат в долгосрочной перспективе.
       
      Готовы присоединиться? Пишите нам:
      Telegram: https://t.me/escape_log
      ВКонтакте: https://vk.com/oskar_novicc
    • Maxwell
      By Maxwell
      Как добавить поворотники на Q E? На мод Радмира? Можно кодик плиз?)