SA-MP Forums Archive
GetValue(data); - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: Non-English (https://sampforum.blast.hk/forumdisplay.php?fid=9)
+--- Forum: Languages (https://sampforum.blast.hk/forumdisplay.php?fid=33)
+---- Forum: Русский/Russian (https://sampforum.blast.hk/forumdisplay.php?fid=32)
+---- Thread: GetValue(data); (/showthread.php?tid=199512)



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