Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: [C] Miksi ei käänny?

DrDeath [22.09.2009 16:56:36]

#

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.

Metabolix [22.09.2009 17:16:38]

#

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ä.

DrDeath [22.09.2009 17:21:30]

#

Se on uusin MS:n kääntäjä..
Jööh, tosiaan siitähän ne virheet tulikin.

Metabolix [22.09.2009 21:37:42]

#

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};

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta