есть такая функция:char* strget(char *par,const char *find,WORD maxl,char end,bool argparsing)
{
char* par;
const char* find;
WORD maxl;
char end;
bool argparsing;
bool bZend = false;
char *res, *rres;
char *s, *x;
char a, b;
if(par == NULL) return NULL;
if(find == NULL) return NULL;
if((s = strstr(par, find)) == NULL) return NULL;
if(bZend = ((x = strchr(s, end)) == NULL))
x = strchr(s, 0);
else
*x = 0; // temporary change '&' to '\0'
rres = res = (char *)malloc(maxl + 1);
s = s + strlen(find);
if(argparsing) {
while(*s != '\0' && res - rres < maxl) {
if(*s == '%' && x > s + 2) {
if((a = parsesym(*(s + 1))) == 20) {
s++; continue; // ignore invalid %
}
if((b = parsesym(*(s + 2))) == 20) {
s++; continue; // ignore invalid %
}
*res = (char)(a*16 + b);
s+=2;
}
else if(*s == '+') *res = ' ';
else *res = *s;
res++;
s++;
}
*res = 0;
rres = (char*)realloc(rres, strlen(rres) + 1);
}
else {
strncpy(rres, s, maxl);
rres[maxl] = 0; // fix for any string
}
if(!bZend)
x = end;
return rres;
}она разбирает строку ввода в CGI приложении.
Но она не хочет компилироваться в Linux. Причем в приложении, откуда выдрана функция ошибок никаких не выдается, а когда вставляю ее в свою программу сыпятся непонятные ошибки:estet@qa-debian:~/traintimetable/t41$ make
g++ -O2 -fno-exceptions -DUSE_LIB=0 -Wcomment -c -o t3.o t3.c
In file included from t3.c:8:
cgi.h:108:7: warning: no newline at end of file
In file included from t3.c:10:
design.h:62:141: warning: no newline at end of file
t3.c:138: error: type specifier omitted for parameter `WORD'
t3.c:138: error: parse error before `,' token
t3.c: In function `char* strget(...)':
t3.c:142: error: `WORD' undeclared (first use this function)
t3.c:142: error: (Each undeclared identifier is reported only once for each
function it appears in.)
t3.c:142: error: parse error before `;' token
t3.c:156: error: `maxl' undeclared (first use this function)
t3.c:183: error: invalid conversion from `char' to `char*'
t3.c: In function `CTime* GetCurrentTime()':
t3.c:280: warning: address of local variable `current_time' returned
t3.c: In function `int LastModificationOf(const char*)':
t3.c:298: error: 'struct stat' has no member named 'st_mtimespec'
make: *** [t3.o] Ошибка 1Помогите понять в чем дело!
>char* strget(char *par,const char *find,WORD maxl,char end,bool argparsing)
>{
> char* par;
Корявая функция... Смотри: параметр и сразу переменная с таким же именем объявлена... WORD на int замени...
>>char* strget(char *par,const char *find,WORD maxl,char end,bool argparsing)
>>{
>> char* par;
>Корявая функция... Смотри: параметр и сразу переменная с таким же именем объявлена...
>WORD на int замени...это я потом уже дописал объявление переменных в функции, потому что компилятор ругался, что переменные-параметры необъявлены. Если написать так:
char* strget(char *par,const char *find,WORD maxl,char end,bool argparsing)
{
bool bZend = false;
char *res, *rres;
char *s, *x;
char a, b;
if(par == NULL) return NULL;
if(find == NULL) return NULL;
if((s = strstr(par, find)) == NULL) return NULL;
if(bZend = ((x = strchr(s, end)) == NULL))
x = strchr(s, 0);
else
*x = 0; // temporary change '&' to '\0'
rres = res = (char *)malloc(maxl + 1);
s = s + strlen(find);
if(argparsing) {
while(*s != '\0' && res - rres < maxl) {
if(*s == '%' && x > s + 2) {
if((a = parsesym(*(s + 1))) == 20) {
s++; continue; // ignore invalid %
}
if((b = parsesym(*(s + 2))) == 20) {
s++; continue; // ignore invalid %
}
*res = (char)(a*16 + b);
s+=2;
}
else if(*s == '+') *res = ' ';
else *res = *s;
res++;
s++;
}
*res = 0;
rres = (char*)realloc(rres, strlen(rres) + 1);
}
else {
strncpy(rres, s, maxl);
rres[maxl] = 0; // fix for any string
}
if(!bZend)
x = end;
return rres;
}То все равно не компилируется.
>estet@qa-debian:~/traintimetable/t41$ make
>g++ -O2 -fno-exceptions -DUSE_LIB=0 -Wcomment -c -o t3.o t3.c
>In file included from t3.c:8:
>cgi.h:108:7: warning: no newline at end of file
>In file included from t3.c:10:
>design.h:62:141: warning: no newline at end of file
>t3.c:138: error: type specifier omitted for parameter `WORD'
>t3.c:138: error: parse error before `,' token
>t3.c: In function `char* strget(...)':
>t3.c:142: error: `WORD' undeclared (first use this function)
>t3.c:142: error: (Each undeclared identifier is reported only once for each
> function it appears in.)Проблема в том, что у тебя не объявлен тип WORD. Определи его #define WORD unsigned int или unsigned short int, как тебе нужно.
>t3.c:142: error: parse error before `;' token
>t3.c:156: error: `maxl' undeclared (first use this function)
>t3.c:183: error: invalid conversion from `char' to `char*'
>t3.c: In function `CTime* GetCurrentTime()':
>t3.c:280: warning: address of local variable `current_time' returned
>t3.c: In function `int LastModificationOf(const char*)':
>t3.c:298: error: 'struct stat' has no member named 'st_mtimespec'
>make: *** [t3.o] Ошибка 1
>
>Помогите понять в чем дело!Что-то выдергивать и других приложений нужно внимательно.
>Проблема в том, что у тебя не объявлен тип WORD. Определи его
>#define WORD unsigned int или unsigned short int, как тебе нужно.
>>Помогите понять в чем дело!
>
>Что-то выдергивать и других приложений нужно внимательно.Серег, спасибо тебе большое! Помогло!
Вот я такое скомпилил командой g++ -c <filename>:Вот на эту строку ругался, что не может преобразовать char к char*:
if(!bZend)
x = end;Смотри типы лучше.
#include <stdlib.h>
#include <string.h>#define WORD unsigned int
char parsesym(char ch)
{
return ch;
}char* strget(char *par,const char *find,WORD maxl,char end,bool argparsing)
{
bool bZend = false;
char *res, *rres;
char *s, *x;
char a, b;
if(par == NULL) return NULL;
if(find == NULL) return NULL;
if((s = strstr(par, find)) == NULL) return NULL;
if(bZend = ((x = strchr(s, end)) == NULL))
x = strchr(s, 0);
else
*x = 0; // temporary change '&' to '\0'
rres = res = (char *)malloc(maxl + 1);
s = s + strlen(find);
if(argparsing) {
while(*s != '\0' && res - rres < maxl) {
if(*s == '%' && x > s + 2) {
if((a = parsesym(*(s + 1))) == 20) {
s++; continue; // ignore invalid %
}
if((b = parsesym(*(s + 2))) == 20) {
s++; continue; // ignore invalid %
}
*res = (char)(a*16 + b);
s+=2;
}
else if(*s == '+') *res = ' ';
else *res = *s;
res++;
s++;
}
*res = 0;
rres = (char*)realloc(rres, strlen(rres) + 1);
}
else {
strncpy(rres, s, maxl);
rres[maxl] = 0; // fix for any string
}
if(!bZend)
x = &end;
return rres;
}int main()
{
return 0;
}