GetValue(data);
#1

Не могу решить небольшую проблему. Имеется одна функция для считывания данных с массива, что стоят после знака = (взята из 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
Reply
#2

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;
}
Reply
#3

Это не выход.. это всё одно, что первоначальный вариант, но вместо 128 ты ставишь 25. А почему именно 25 тогда ?
Reply
#4

Ну в pawn насколько я помню один массив приравнят к другому можно только если ихние размеры равны.
1 ошибка смею скорее всего ругается на StripNewLine
а дргуие говорять что нельзя так приравнивать массивы.
Reply
#5

обе ошибки и так понятны.
ну вот на счет второй, могу предположить, что из-за обработки массива через 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;
	}
}
А вот на счет первой ошибки - я даже не знаю в чём проблема
Reply
#6

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;
}
Reply
#7

В павн нет динамических массивов. Размер массива должен являться константой.
Reply
#8

жаль.. то есть единственный выход и самый примитивный - создать несколько GetValue(data); в виде GetValue24(data); , GetValue128(data); , GetValue256(data); , GetValue512(data); и ими пользоваться ? А может быть есть выход, чтобы можно было использовать одну функцию, с указанием в ней размера массива ?
Reply
#9

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);
}
Reply
#10

Спасибо, работает. Еще один вопрос:
Как сделать, чтобы 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. Еще один способ пробовал, но тот некорректно работает, и хотелось бы узнать действительно нормальный способ.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)