Toon posts:

[C++] "illegal use" bij wchar_t

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben eventjes de putty-source aan het aanpassen om die te kunnen laten printen (jobke voor't werk).

Dit is de functieheader die ik heb bijgemaakt:

C++:
1
(regel 264)   void copy_rect_to_buffer(Terminal* term, pos top, pos bottom, int rect, int desel, wchar_t* &workbuf, int &buflen, int &wblen);


Wanneer ik dan compile zegt ie:
code:
1
2
3
4
c:\sources\tmp\putty\terminal.h(264) : error C2143: syntax error : missing ')' before '&'
c:\sources\tmp\putty\terminal.h(264) : error C2143: syntax error : missing '{' before '&'
c:\sources\tmp\putty\terminal.h(264) : error C2059: syntax error : '&'
c:\sources\tmp\putty\terminal.h(264) : error C2059: syntax error : ')'


Dit is zeer vreemd en ik heb hier geen enkele oplossing voor. (Daar die syntax toch , denk ik, C-syntaxtisch correct is).


Kan er mij iemand licht verschaffen?


**EDIT** dom van de topic name :S
Ik krijg ook een error als:

code:
1
warning C4013: 'copy_rect_to_buffer' undefined; assuming extern returning int

Alhoewel de functie juist boven de functie waar ik dit in oproep gedefinieerd is...

Verder ook die wchar_t...
Die WAS bekend voorheen, maar dan doe ik mijn aanpassingen en plots kent ie dat niet meer?

[ Voor 23% gewijzigd door Verwijderd op 03-11-2004 13:24 ]


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Klopt die reference naar een pointer bij de wchar? Wat heb je precies veranderd?

  • BoAC
  • Registratie: Februari 2003
  • Laatst online: 22:27

BoAC

Memento mori

Laat me raden dit doe je niet in een C++ file maar in een C file?
Die kent namelijk geen pointer references ;)

Verwijderd

Topicstarter
Zoijar: Die referentie klopt inderdaad. Die workbuf MOET aangepast worden in mijn functie.


BoAC: inderdaad in .c-file... Nu doe ik dit in MSVC6. En die is daar iets guller in als andere IDE/Compilers... (dacht ik toch).

Dus had ik alles veranderd door wchar_t**... etc, maar daar krijg ik ook vele foutmeldingen in.


**EDIT**
C++:
1
2
3
4
5
6
7
8
9
10
11
void copy_rect_to_buffer(Terminal *term, pos top, pos bottom, int rect, int desel, wchar_t**workbuf, int *buflen, int *wblen)
{
  if ( !(*workbuf) || !buflen || !wblen )
    return;

    wchar_t *wbptr;            /* where next char goes within workbuf */
    int old_top_x;
    *wblen = 0;            /* workbuf len */

    *buflen = 5120;            /* Default size */
    *workbuf = snewn(buflen, wchar_t);


Dit is de top van de code, nu met werken met pointers.

Compile ik dit krijg ik volgende errors:
code:
1
2
3
4
5
6
terminal.c
C:\Sources\tmp\putty\terminal.c(4788) : error C2275: 'wchar_t' : illegal use of this type as an expression
        c:\program files\coding\microsoft visual studio\vc98\include\stdio.h(77) : see declaration of 'wchar_t'
C:\Sources\tmp\putty\terminal.c(4788) : error C2065: 'wbptr' : undeclared identifier
C:\Sources\tmp\putty\terminal.c(4789) : error C2143: syntax error : missing ';' before 'type'
C:\Sources\tmp\putty\terminal.c(4794) : warning C4047: '=' : 'int ' differs in levels of indirection from 'unsigned short *'


lijn 4788 = "wchar_t *wbptr;"

[ Voor 69% gewijzigd door Verwijderd op 03-11-2004 13:32 ]


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Je past niet workbuf aan, maar de pointer naar workbuf

  • BoAC
  • Registratie: Februari 2003
  • Laatst online: 22:27

BoAC

Memento mori

Zoijar schreef op 03 november 2004 @ 13:29:
Je past niet workbuf aan, maar de pointer naar workbuf
Ja bijv:
C:
1
2
3
4
5
void func(char **ch)
{
  *ch=malloc(sizeof(char)*10);
  sprintf(*ch, "hoi");
}

;)

Verwijderd

Topicstarter
Zoijar: dit is inderdaad correct. de pointer moet veranderd kunnen worden (maw: "malloc" moet eraan toegekend kunnen worden).

Verwijderd

Topicstarter
BoAC: ja ;-) I know...

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

En je compiled niet per ongeluk als ansi C? Want dan is die declaratie, na een statement niet geldig.

Verwijderd

Topicstarter
Zoijar:
wat bedoel je?

Dit zijn mijn "project options":
code:
1
/nologo /MLd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /Fp"Debug/putty.pch" /YX /Fo"Debug/" /Fd"Debug/" /FD /GZ /c


Als ik de MSDN docs goed gelezen heb is de ANSI-C switch "/Za". Maar die zie ik hierin niet staan (en alle andere switchs staan goed, dit heb ik reeds gechecked).

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

En dit?

C:
1
2
3
4
5
6
7
8
9
10
11
12
void copy_rect_to_buffer(Terminal *term, pos top, pos bottom, int rect, int desel, wchar_t**workbuf, int *buflen, int *wblen) 
{ 
    wchar_t *wbptr;               /* where next char goes within workbuf */ 
    int old_top_x; 

  if ( !(*workbuf) || !buflen || !wblen ) 
    return; 

    *wblen = 0;               /* workbuf len */ 

    *buflen = 5120;               /* Default size */ 
    *workbuf = snewn(buflen, wchar_t);

Verwijderd

Topicstarter
Dat werkt "like a charm"... Dus in ANSI-C moet je EERST declaraties doen, en dan kan je de rest doen?

Maar in C++ kan je overal declaraties doen (ik bedoel die wchar_t ... en int's en ... )

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Precies :)

Verwijderd

Topicstarter
Thanks mate :D :+

[ Voor 16% gewijzigd door Verwijderd op 03-11-2004 14:28 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:13

.oisyn

Moderator Devschuur®

Demotivational Speaker

Wat wil je nou precies, C of C++? In je titel staat C++, maar je bent dus met C bezig :?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Elijan9
  • Registratie: Februari 2004
  • Laatst online: 20-05 13:00
Zoijar schreef op 03 november 2004 @ 13:45:
En je compiled niet per ongeluk als ansi C? Want dan is die declaratie, na een statement niet geldig.
Niet voor ANSI-C89, maar wel voor ANSI-C99 hoor :)

War is when the young and stupid are tricked by the old and bitter into killing each other. - Niko Bellic


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Ja dat wilde ik er niet helemaal bij zeggen. Dat wordt trouwens meestal C99 genoemd, ansi-c is meestal gewoon het oude vertrouwde.

Verwijderd

Verwijderd schreef op 03 november 2004 @ 14:14:
Dat werkt "like a charm"... Dus in ANSI-C moet je EERST declaraties doen, en dan kan je de rest doen?
Niet helemaal, declaraties mogen alleen aan het begin van een block. Voor nieuwe declaraties midden in een functie kan je overwegen een nieuw block te openen. Voorbeeldje...

code:
1
2
3
4
5
6
7
8
9
10
void f( void )
{
    int x = 1;
    x++;
    /* hier mogen geen declaraties meer */
    {
        /* hier wel weer */
        int y = 2;
    }
}

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Ja het probleem is dan dat die binnen een andere scope vallen...

code:
1
2
3
4
5
6
void f(void) {
   int x = 1;
  x++;
   {int y = 2; y++;}
   y++; // error
}

Maar verder klopt het ja.

Verwijderd

Probleem? Die haak sluiten kan gewoon verder omlaag hoor. En // error vervangen door /* error */ natuurlijk ;) (dat de microsoft compiler dat pikt bij het compileren van C betekent nog niet dat het goed is)

  • BoAC
  • Registratie: Februari 2003
  • Laatst online: 22:27

BoAC

Memento mori

Verwijderd schreef op 03 november 2004 @ 21:00:
Probleem? Die haak sluiten kan gewoon verder omlaag hoor. En // error vervangen door /* error */ natuurlijk ;) (dat de microsoft compiler dat pikt bij het compileren van C betekent nog niet dat het goed is)
Wat maakt die layout nou uit 8)7 Voor mijn part alles op een regen :P
En welke compiler zou // niet pikken :?

Verwijderd

BoAC schreef op 03 november 2004 @ 21:04:
En welke compiler zou // niet pikken :?
Goed dat je dat even opbrengt. Ik ging bijna roepen: "een compiler die de code als 'good old plain C' moet compileren misschien?" omdat ik om de een of andere reden dacht dat // de C++ manier van commentariëren was en in 'goold old plain C' enkel /* ... */ toegelaten was (wat in C++ ook kan natuurlijk). Toen toch even m'n ISO/IEC 9899 bovengehaald, en bij comments vond ik
1. Except within a character constant, a string literal, or a comment, the characters /*introduce a comment. The contents of such a comment are examined only to identify multibyte characters and to find the characters */ that terminate it.

2. Except within a character constant, a string literal, or a comment, the characters // introduce a comment that includes all multibyte characters up to, but not including, the next new-line character. The contents of such a comment are examined only to identify multibyte characters and to find the terminating new-line character.
Ik begin nu te twijfelen eerlijk gezegd. Was /* ... */ niet ooit de enige manier om in C commentaar te schrijven?

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Volgens mij ook, ansi-c staat dacht ik geen // toe. Anders moet je even proberen met GCC en de flags -ansi -pedantic

Verwijderd

Zoijar schreef op 03 november 2004 @ 21:33:
Volgens mij ook, ansi-c staat dacht ik geen // toe. Anders moet je even proberen met GCC en de flags -ansi -pedantic
Good thinking, daar had ik zelf aan kunnen denken :P En dat idee van ons lijkt nog te kloppen ook. Even een minimale testfile aangemaakt met een '// commentaar' lijn erin:
[piranha@archon gcctest]$ gcc -ansi -pedantic test.c
test.c: In function `main':
test.c:3: error: parse error before '/' token
[piranha@archon gcctest]$

[ Voor 4% gewijzigd door Verwijderd op 03-11-2004 21:46 ]


Verwijderd

Ja ik heb het net ook even getest. -pedantic is niet eens nodig, met alleen -ansi wordt de fout ook al gegeven. Maar in de nieuwe standaard is // dus gewoon opgenomen.

Dat wist ik dus niet :o.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Nee, C99 heeft heel erg weinig teruggeport van C++, maar // en vrije plaatsing van declaraties nou net wel.

Overigens, snewn(buflen, wchar_t) ? 't Is geen functiecall, want wchar_t is geen expressie. Het is ook geen functie-declaratie, want buflen is geen type. Beetje vreemde regel dus.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1