enum
{
SUCCEED = 0,
ERROR
};
typedef unsigned long xnumber;
typedef char xchar;
typedef struct
{
xchar * text;
xnumber len;
} xstring;
int xFindS(xstring * buf, xstring * needle, xnumber * pos)
{
xnumber tpos = *pos;
for(xnumber n = 0; tpos < buf->len; tpos++)
{
if(buf->text[tpos] == *needle->text)
{
for(; n < needle->len; n++)
{
if(buf->text[tpos+n] != needle->text[n])
break;
if(n == needle->len-1)
{
*pos = tpos;
return SUCCEED;
}
}
tpos = n+1;
}
}
return ERROR;
}
int main()
{
return 0;
}1>------ Build started: Project: cml, Configuration: Debug Win32 ------
1>Compiling...
1>main.cpp
1>c:\users\wille\documents\visual studio 2008\projects\cml\cml\main.cpp(20) : error C2143: syntax error : missing ';' before 'type'
1>c:\users\wille\documents\visual studio 2008\projects\cml\cml\main.cpp(20) : error C2143: syntax error : missing ';' before 'type'
1>c:\users\wille\documents\visual studio 2008\projects\cml\cml\main.cpp(20) : error C2143: syntax error : missing ')' before 'type'
1>c:\users\wille\documents\visual studio 2008\projects\cml\cml\main.cpp(20) : error C2143: syntax error : missing ';' before 'type'
1>c:\users\wille\documents\visual studio 2008\projects\cml\cml\main.cpp(20) : warning C4552: '<' : operator has no effect; expected operator with side-effect
1>c:\users\wille\documents\visual studio 2008\projects\cml\cml\main.cpp(20) : error C2059: syntax error : ')'
1>c:\users\wille\documents\visual studio 2008\projects\cml\cml\main.cpp(21) : error C2143: syntax error : missing ';' before '{'
1>c:\users\wille\documents\visual studio 2008\projects\cml\cml\main.cpp(24) : error C2065: 'n' : undeclared identifier
1>c:\users\wille\documents\visual studio 2008\projects\cml\cml\main.cpp(24) : warning C4018: '<' : signed/unsigned mismatch
1>c:\users\wille\documents\visual studio 2008\projects\cml\cml\main.cpp(24) : error C2065: 'n' : undeclared identifier
1>c:\users\wille\documents\visual studio 2008\projects\cml\cml\main.cpp(26) : error C2065: 'n' : undeclared identifier
1>c:\users\wille\documents\visual studio 2008\projects\cml\cml\main.cpp(26) : error C2065: 'n' : undeclared identifier
1>c:\users\wille\documents\visual studio 2008\projects\cml\cml\main.cpp(29) : error C2065: 'n' : undeclared identifier
1>c:\users\wille\documents\visual studio 2008\projects\cml\cml\main.cpp(36) : error C2065: 'n' : undeclared identifier
1>Build log was saved at "file://c:\Users\Wille\Documents\Visual Studio 2008\Projects\cml\cml\Debug\BuildLog.htm"
1>cml - 12 error(s), 2 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Miksi yllä oleva koodi kääntyy c++:na, mutta ei c:nä? Miten tuo korjataan?
Olen ohjelmoinut nyt monta vuotta c++:lla, mutta kun vähääkään sörkkii ceetä niin mikään ei toimi.
Luultavasti kääntäjäsi ei tue C99-standardia. (Useimmat eivät jostain syystä sitä käytäkään.) Vanhemmassa C:ssä ei saa esimerkiksi määritellä muuttujia kesken koodin, vaan kaikki määrittelyt pitää laittaa funktion alkuun. Varsinainen virhe tulee siis kohdasta xnumber n, loput taitavat johtua tästä.
Se on uusin MS:n kääntäjä..
Jööh, tosiaan siitähän ne virheet tulikin.
Luultavasti C99-tila pitäisi erikseen laittaa päälle; useimmat kääntäjät käyttävät oletuksena vanhempaa standardia (C89/C90). Toisaalta C99:n käytöstä saa kummasti vielä näin kymmenen vuotta myöhemminkin sontaa niskaansa ("miksi käytät tuollaista, mikset koodaa oikealla C:llä, n00b"), joten kannattaa pitää varansa, jos aikoo julkaista koodia. ;) Sinänsä tuollaiset paikallisesti (esim. juuri yhtä silmukkaa varten) määritellyt muuttujat ovat hyvä asia koodin luettavuuden, optimoinnin ja virheiden ehkäisyn kannalta, ja itse pidän kovasti mm. näistä C99:n syntaksillisista parannuksista (erityisesti ensimmäisestä):
struct S {
int a, b, c;
};
struct S koe = {
.a = 10,
// .b = 0, // tulee itsestään, kun muita asetetaan mutta tätä ei
.c = 12
};
int t[10] = {[0] = 0, [4] = 4, 5, 6};Aihe on jo aika vanha, joten et voi enää vastata siihen.