Вопросы

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;"

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

Поделиться сообщением


Ссылка на сообщение

1 ответ на этот вопрос

  • 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 - это класс, внутри которого реализована перегрузка операции присвоения. В общем-то он тоже основан на работе с байтами - о ней я писал выше - просто в красивой обертке.

Поделиться сообщением


Ссылка на сообщение
Гость
Эта тема закрыта для публикации ответов.
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Похожий контент

    • watson
      От watson
      Уважаемые участники форума,

      Предлагаю вашему вниманию полностью готовый игровой проект San Andreas Multiplayer, основанный под мобильные устройства. Проект закрытого типа, в 2020 году открывался но затем потерпел крах, продаю из за того что нету времени заниматься его разработкой, личные проблемы в жизни так сказать. Проект имеет свою некую ауру и уникальность, готов отдать в хорошие руки!

      — Приватный мод для RP и бонусного сервера — два варианта под разные стили игры.
      — Полный набор интерфейсов и лаунчер с оформлением (Figma + PSD).
      — Чистая структура проекта, без багов и сторонних зависимостей.
      — Документация и структура мода понятны для доработок.

      В наличии: оформления, интерфейсы с дизайном лаунчера, различные модели + определённые текстуры и скины для мобильной игры + мод под разные стили проекта

      P.S:
      Отвечу на любые вопросы в личных сообщениях. По запросу предоставлю скриншоты.

      Цена обсуждается индивидуально, в пределах разумного — в зависимости от ваших потребностей и формата использования.
      Писать: https://vk.com/rosetta

      Жду ваших предложений!
    • king98
      От king98
      Продам мод Arizona Rp | Ultra + плагин на люкс машины
      Мод оптимизирован под 100+ онлайна
      Добавил новые машины+новые скины(в папке с модом есть ID)
      Исправлены баги
      Сделан худ(+работоспособность бензина)

       
    • king98
      От king98


      Скачать файл Мод Arizona Rp | Ariant(Old Ultra) + плагин на машины
      Продам мод Arizona Rp | Ultra + плагин на люкс машины
      Мод оптимизирован под 100+ онлайна
      Добавил новые машины+новые скины(в папке с модом есть ID)
      Исправлены баги
      Сделан худ(+работоспособность бензина)

       
      Добавил king98 Добавлено 15.05.2021 Категория Моды Автор NoName  
    • king98
      От king98
      Продается мод проекта Arizona Role Play | Ariant
      Мод держал онлайн 50+
      Исправлено много багов и ошибок Mysql
      Во вторник выйдет обновление данного Мода