Просмотр полной версии : [Вопрос] 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);
}
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);
}
Ошибка заключалась в том, что вы используете оператор 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);
}
Ошибка заключалась в том, что вы используете оператор 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);
}
Не прокатит, размер массива должен быть константой
Не прокатит, размер массива должен быть константой
Спасибо.
Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot