PDA

Просмотр полной версии : [Вопрос] warning 224: indeterminate array size in "sizeof" expression (symbol "")



TheMallard
05.04.2016, 11:59
source\themallards\utils.inc(23) : warning 224: indeterminate array size in "sizeof" expression (symbol "")

Собственно, ошибка заключается в функции логгирования.



stock Log(const filename[], const message[])
{
static const fmt_str[] =
"\r\n[%02d/%02d/%02d %02d:%02d:%02d] %s %s";
new File:filehandle,
string[sizeof(fmt_str) + sizeof(message)], // строка 23
year,
month,
day,
hour,
minute,
second;
if(!(filehandle = fopen(filename, io_append)))
return -1;
getdate(year, month, day);
gettime(hour, minute, second);
format(string, sizeof(string), fmt_str,
year, month, day, hour, minute, second, message);
for(new idx = 0, length = strlen(string); idx < length; idx++)
fputchar(filehandle, string[idx], false);
return fclose(filehandle);
}

L0ndl3m
05.04.2016, 15:25
stock Log(const filename[], const message[])
{
static const fmt_str[] =
"\r\n[%02d/%02d/%02d %02d:%02d:%02d] %s";
new File:filehandle,
string[sizeof(fmt_str) + (-4 * 6) + (-2 + 127)],
// 127 - максимальная длина ввода текста
year,
month,
day,
hour,
minute,
second;

if(!(filehandle = fopen(filename, io_append)))
return -1;
getdate(year, month, day);
gettime(hour, minute, second);
format(string, sizeof(string), fmt_str,
year, month, day, hour, minute, second, message);
for(new idx = 0, length = strlen(string); idx < length; idx++)
fputchar(filehandle, string[idx], false);
return fclose(filehandle);
}

VVWVV
05.04.2016, 16:01
Ошибка заключалась в том, что вы используете оператор sizeof для аргумента функции.

Можно было сделать так:

stock Log(const filename[], const message[128])
{
static const fmt_str[] = "\r\n[%02d/%02d/%02d %02d:%02d:%02d] %s";
new File:filehandle,
string[sizeof fmt_str + (-4 * 6) + (-2 + sizeof message)],
year,
month,
day,
hour,
minute,
second;

if(!(filehandle = fopen(filename, io_append)))
return -1;
getdate(year, month, day);
gettime(hour, minute, second);
format(string, sizeof(string), fmt_str,
year, month, day, hour, minute, second, message);
for(new idx = 0, length = strlen(string); idx < length; idx++)
fputchar(filehandle, string[idx], false);
return fclose(filehandle);
}

Но если вам непринципиален размер строки, т.е. нет никаких ограничений, то можно сделать так:

stock Log(const filename[], const message[], size = sizeof message)
{
static const fmt_str[] = "\r\n[%02d/%02d/%02d %02d:%02d:%02d] %s";
new File:filehandle,
string[sizeof fmt_str + (-4 * 6) + (-2 + size)],
year,
month,
day,
hour,
minute,
second;

if(!(filehandle = fopen(filename, io_append)))
return -1;
getdate(year, month, day);
gettime(hour, minute, second);
format(string, sizeof(string), fmt_str,
year, month, day, hour, minute, second, message);
for(new idx = 0, length = strlen(string); idx < length; idx++)
fputchar(filehandle, string[idx], false);
return fclose(filehandle);
}

L0ndl3m
05.04.2016, 16:51
Ошибка заключалась в том, что вы используете оператор sizeof для аргумента функции.

Можно было сделать так:


// ...



В таком случае следует выделять 128 символов, т.к. 127 я выделял по причине того, что sizeof автоматически добавляет единицу к конечному размеру строки.

Daniel_Cortez
05.04.2016, 19:46
Но если вам непринципиален размер строки, т.е. нет никаких ограничений, то можно сделать так:

stock Log(const filename[], const message[], size = sizeof message)
{
static const fmt_str[] = "\r\n[%02d/%02d/%02d %02d:%02d:%02d] %s";
new File:filehandle,
string[sizeof fmt_str + (-4 * 6) + (-2 + size)],
year,
month,
day,
hour,
minute,
second;

if(!(filehandle = fopen(filename, io_append)))
return -1;
getdate(year, month, day);
gettime(hour, minute, second);
format(string, sizeof(string), fmt_str,
year, month, day, hour, minute, second, message);
for(new idx = 0, length = strlen(string); idx < length; idx++)
fputchar(filehandle, string[idx], false);
return fclose(filehandle);
}
Не прокатит, размер массива должен быть константой

VVWVV
05.04.2016, 20:20
Не прокатит, размер массива должен быть константой

Спасибо.