GetValue(data); -
Radius - 15.12.2010
Не могу решить небольшую проблему. Имеется одна функция для считывания данных с массива, что стоят после знака
= (взята из gf):
Код:
stock GetValue(line[])
{
new valRes[128];
valRes[0] = 0;
if(strfind(line, "=", true) == -1) return valRes;
strmid(valRes, line, strfind(line, "=", true) +1, strlen(line), sizeof(valRes));
return valRes;
}
Мне понадобилось её немного усовершенствовать
(может быть в этом и есть моя ошибка):
Код:
stock GetValue(line[], size)
{
new valRes[size];
valRes[0] = 0;
if(strfind(line, "=", true) == -1) return valRes;
strmid(valRes, line, strfind(line, "=", true) +1, strlen(line), sizeof(valRes));
return valRes;
}
(то есть добавил параметр size, который указывает размер разбираемого массива)
Вот код для примера, в котором была использована эта функция:
Код:
new test1[128], test2[128], test3[128];
new File:file = fopen("test.cfg", io_read), data[128];
while(fread(file, data, sizeof(data)))
{
StripNewLine(GetValue(data, sizeof(data))); // строка 1
if(strcmp(GetKey(data), "test1", true) == 0) { test1 = GetValue(data, sizeof(data)); } // строка 2
if(strcmp(GetKey(data), "test2", true) == 0) { test2 = GetValue(data, sizeof(data)); } // строка 3
if(strcmp(GetKey(data), "test3", true) == 0) { test3 = GetValue(data, sizeof(data)); } // строка 4
}
fclose(file);
(GetKey(data) тоже взята из gf)
Ну и в результате выходит вот такая ошибка:
Код:
error 035: argument type mismatch (argument 1) <- строка 1
error 033: array must be indexed (variable "test1") <- строка 2
error 033: array must be indexed (variable "test2") <- строка 3
error 033: array must be indexed (variable "test3") <- строка 4
Re: GetValue(data); -
Johnny_Xayc - 15.12.2010
pawn Код:
stock GetValue(line[], size=25)
{
new valRes[size];
valRes[0] = 0;
if(strfind(line, "=", true) == -1) return valRes;
strmid(valRes, line, strfind(line, "=", true) +1, strlen(line), sizeof(valRes));
return valRes;
}
Re: GetValue(data); -
Radius - 15.12.2010
Это не выход.. это всё одно, что первоначальный вариант, но вместо 128 ты ставишь 25. А почему именно 25 тогда ?
Re: GetValue(data); -
Stepashka - 15.12.2010
Ну в pawn насколько я помню один массив приравнят к другому можно только если ихние размеры равны.
1 ошибка смею скорее всего ругается на StripNewLine
а дргуие говорять что нельзя так приравнивать массивы.
Re: GetValue(data); -
Radius - 15.12.2010
обе ошибки и так понятны.
ну вот на счет второй, могу предположить, что из-за обработки массива через StripNewLine размер GetValue(data, sizeof(data)), а именно 128 может укоротиться на 2, то есть станет 126 и поэтому test1/2/3 размером 128 нельзя приравнять к 126. Возможно предположение ошибочное..
Использовал вот эту функцию (
для заметки) :
Код:
stock StripNewLine(string[])
{
new len = strlen(string);
if (string[0]==0) return ;
if ((string[len - 1] == '\n') || (string[len - 1] == '\r')) {
string[len - 1] = 0;
if (string[0]==0) return ;
if ((string[len - 2] == '\n') || (string[len - 2] == '\r')) string[len - 2] = 0;
}
}
А вот на счет первой ошибки - я даже не знаю в чём проблема
Re: GetValue(data); -
Fro1sha - 16.12.2010
stock GetValue(line[], size=25)
{
new valRes[size];
valRes[0] = 0;
if(strfind(line, "=", true) == -1) return valRes;
strmid(valRes, line, strfind(line, "=", true) +1, strlen(line), sizeof(valRes));
return valRes;
}
Массив не может быть динамичный, он должен быть уже определен.
pawn Код:
stock GetValue(line[])
{
new valRes[25];
valRes[0] = 0;
if(strfind(line, "=", true) == -1) return valRes;
strmid(valRes, line, strfind(line, "=", true) +1, strlen(line), sizeof(valRes));
return valRes;
}
Re: GetValue(data); -
Romanius - 16.12.2010
В павн нет динамических массивов. Размер массива должен являться константой.
Re: GetValue(data); -
Radius - 16.12.2010
жаль.. то есть единственный выход и самый примитивный - создать несколько
GetValue(data); в виде
GetValue24(data); ,
GetValue128(data); ,
GetValue256(data); ,
GetValue512(data); и ими пользоваться ? А может быть есть выход, чтобы можно было использовать одну функцию, с указанием в ней размера массива ?
Re: GetValue(data); -
Maccer - 16.12.2010
pawn Код:
stock GetValue(line[], value[], size = sizeof value)
{
new del = strfind(line, "=", true) ;
if(del == -1) return;
strmid(value, line, del +1, strlen(line), size);
}
Re: GetValue(data); -
Radius - 16.12.2010
Спасибо, работает. Еще один вопрос:
Как сделать, чтобы value не только мог быть массивом (
value[] ), но из целым числом (
value ) и числом с плавающей точкой (
Float:value ), так как некоторые значения мне надо брать из строки и превращать либо в цифру, либо в цифру с точкой, а способ
GetValue(data, floatstr(posx)); не катит.
Есть способ что-то наподобие этого:
pawn Код:
if(strcmp(GetKey(data), "Test", true) == 0) { GetValue(data, test); test = strval(test); }
(в то время как
new test;)
Но это тоже не подходит, т.к если мне надо взять оттуда число 987, то возьмётся только 9. Еще один способ пробовал, но тот некорректно работает, и хотелось бы узнать действительно нормальный способ.