expertenaustausch > microsoft.* > microsoft.vc

Jörg Meier (24.07.2006, 09:22)
Hallo NG,

eins vorweg: C++ ist für mich Neuland. Also habt bitte Nachsicht.

Ich möchte auf der Basis einer "Vorlage für C++" (genauer ist es nicht
angegeben) eine sogenannte "User Subroutine" für ein FEM Programm schreiben.
Die Vorlage - eine *.c-Datei - liefert der Hersteller des FEM-Programms mit.
Er fordert, diese in ein "Object-File" zu kompilieren. Mein erster Schritt
soll darim bestehen, die Vorlage zum laufen zu bringen:

Ich habe mir Microsoft Visual C++ 2005 Express Edition heruntergeladen,
installiert, ein neues Projekt erstellt und die C-Datei geladen. Im Projekt
habe ich folgende Dinge eingestellt:
1- die /clr - Option abgeschaltet (auf "kein Support" gestellt)
2. die "Precompiled Headers" abgeschaltet
3. "Configuration Type" auf DLL gestellt
4. "Compile as" auf "C++" gestellt

Kompliliere ich nun das Projekt, bekomme ich folgenden Fehler:
error C2059: syntax error : 'string' (Line 109, unten im Quelltext markiert)

Ich habe bereits Hilfe gewälzt und im Netz gesucht - leider finde ich keine
Lösung...

Vielen Dank schon mal für jeden Hinweis!
Jörg

Und hier noch mein Code:
#ifndef FOR_C_H

#define FOR_C_H

/************************************************** ****************************

* Common definitions for FORTRAN-to-C language extension facility. *

* *

* Functions callable for FORTRAN must be declared as follows: *

* ... FOR_NAME(subnam,SUBNAM)(...) *

* The FOR_NAME macro allows system-dependent handling of function names to *

* be implemented entirely through this header file. *

* *

* The FOR_TRAIL compilation option should be invoked on systems which *

* require an underscore to be appended to FORTRAN entry point symbols. *

* This is common among UNIX systems. *

************************************************** ****************************/

#if defined FOR_TRAIL

#define FOR_NAME(lc_name,uc_name) lc_name ## _

#define CALL_NAME(lc_name,uc_name) lc_name ## _

#elif defined _CRAY

#define FOR_NAME(lc_name,uc_name) uc_name

#define CALL_NAME(lc_name,uc_name) uc_name

#elif defined VMS

#define FOR_NAME(lc_name,uc_name) uc_name

#define CALL_NAME(lc_name,uc_name) uc_name

#elif defined HKS_NT

#define FOR_NAME(lc_name,uc_name) _stdcall uc_name

#define CALL_NAME(lc_name,uc_name) uc_name

#else

#define FOR_NAME(lc_name,uc_name) lc_name

#define CALL_NAME(lc_name,uc_name) lc_name

#endif

/************************************************** ****************************

* The rules for passing type CHARACTER from FORTRAN to C are as follows: *

* 1) All type CHARACTER arguments must appear before any other arguments *

* in the list. The parameter should be declared as type "Character". *

* 2) A Length parameter for each Character parameter must be appended to *

* the C parameter list. The name of the Length parameter should be *

* constructed by adding "_len" to the Character parameter name. *

* 3) The CHARACTER data must be accessed via the PTR(cname) macro, which *

* defines a pointer to cname. *

* 4) The length of the CHARACTER string may be obtained via the *

* LEN(cname,cnname_len) macro, which defines the length of cname. *

* This allows capture of the ancilliary length arguments generated by UNIX *

* and C/370 systems. The VMS implementation ignores these extra parameters.
*

************************************************** ****************************/

#if defined VMS

#pragma nostandard

#include descrip

typedef struct dsc$descriptor *Character;

typedef int Length;

#define PTR(id) id->dsc$a_pointer

#define LEN(id,len) id->dsc$w_length

#define GETLEN(id) id->dsc$w_length

#define CHNAME(id) Character id

#define CHLEN(id)

#pragma standard

#elif defined _CRAY

#include <fortran.h>

typedef _fcd Character;

typedef int Length;

#define PTR(id) _fcdtocp(id)

#define LEN(id,len) _fcdlen(id)

#define GETLEN(id) _fcdlen(id)

#define CHNAME(id) Character id

#define CHLEN(id)

#elif defined HKS_NT

typedef char *Character;

typedef unsigned int Length;

#define PTR(id) id

#define LEN(id,len) len

#define GETLEN(id) id ## _len

#define CHNAME(id) Character id, const Length id ## _len

#define CHLEN(id)

#else

typedef char *Character;

typedef int Length;

#define PTR(id) id

#define LEN(id,len) len

#define GETLEN(id) id ## _len

#define CHNAME(id) Character id

#define CHLEN(id) , const Length id ## _len

#endif

/* FOR_C_H */

#endif

/************************************************** ***************************/

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#include <math.h>

char *

FtoCString (int pCharArrayWidth, const char * pString);

extern "C" void // ########## Hier kommt mein Fehler

FOR_NAME(dload, DLOAD)(double* pF, int* pKstep, int* pKinc, double* pTime,

int* pNoel, int* pNpt, int* pLayer, int* pKspt,

double* pCoords, int* pJltyp, CHNAME(pSname)

CHLEN(pSname)){

const double TEN=10.;

const double ONE=1.;

const double myConst=-23.03;

//*pF=TEN*(ONE-(exp(myConst*(pTime[0]))));

char* SnameInC;

SnameInC = FtoCString(pSname_len,pSname);

if (*pNpt==1) {

printf(" LOAD APPLIED %16.4f AT TIME=%16.4f\n",*pF,pTime[0]);

printf(" Surface name : %s\n",SnameInC);

};

delete [] SnameInC;

}

char *

FtoCString (int pCharArrayWidth, const char * pString)

/*

* this function converts a fortran-string to C-string

* the returned pointer is expected to be deleted by

* the client function

*/

{

int pStringLen = pCharArrayWidth;

int k1;

for (k1 = pCharArrayWidth-1 ; k1>=0 ; k1--)

{

if (pString[k1] != ' ') break;

pStringLen = k1;

};

char* cString;

cString = new char [pStringLen+1];

memcpy (cString, pString, pStringLen);

cString[pStringLen] = '\0';

return cString;

}
Jochen Kalmbach [MVP] (24.07.2006, 09:35)
Hallo Jörg!

> Kompliliere ich nun das Projekt, bekomme ich folgenden Fehler:
> error C2059: syntax error : 'string' (Line 109, unten im Quelltext markiert)


WO ist diese Zeile? Ich sehe keine Zeilennummern...

Am einfachsten ist es, wenn Du den Quellcode auf ein Minimum reduzierst
und dann ein "einfaches" Beispiel postest...
Es ist sehr unübersichtlich mit den vielen Defines...

Greetings
Jochen
Jörg Meier (24.07.2006, 10:00)
Hallo Jochen,

> WO ist diese Zeile? Ich sehe keine Zeilennummern... ich hatte die Zeile im Quelltext auch nochmal markiert:


extern "C" void // ########## Genau hier kommt mein Fehler
FOR_NAME(dload, DLOAD)(double* pF, int* pKstep, int* pKinc, double* pTime,
int* pNoel, int* pNpt, int* pLayer, int* pKspt,
double* pCoords, int* pJltyp, CHNAME(pSname)
CHLEN(pSname)){...}

> Am einfachsten ist es, wenn Du den Quellcode auf ein Minimum reduzierst
> und dann ein "einfaches" Beispiel postest...
> Es ist sehr unübersichtlich mit den vielen Defines...

Die Defines usw. hatte ich mit gepostet, da ich nicht wusste, ob diese einen
Einfluss auf meinen Fehler haben. Außerdem hatte ich in der Hilfe den
Hinweis gefunden, bei diesem Fehler auch mal die Quelltextzeilen über der
angegebenen Meldung durchzuschauen. Oben habe ich jetzt nur den Befehl, der
als Fehlerquelle angezeigt wird.

Jörg
Eberhard Schefold (24.07.2006, 10:16)
Jörg Meier schrieb:

> extern "C" void // ########## Hier kommt mein Fehler


> 4. "Compile as" auf "C++" gestellt


Ich würde mir die Einstellung für diese Datei nochmal ganz genau
ansehen. Ich kann einen solchen Fehler reproduzieren, wenn ich auf
"Compile as C" gestellt habe.
Jörg Meier (24.07.2006, 11:11)
Hallo Eberhard,

> Ich würde mir die Einstellung für diese Datei nochmal ganz genau ansehen.
> Ich kann einen solchen Fehler reproduzieren, wenn ich auf "Compile as C"
> gestellt habe.

vielen Dank! Das war's. Ich hatte zwar das Projekt auf C++ gestellt, die
Datei stand aber noch auf C. Kaum macht man's richt gehts... ;o)

Jörg
Ulrich Eckhardt (24.07.2006, 11:56)
Jörg Meier wrote:
>> Ich würde mir die Einstellung für diese Datei nochmal ganz genau ansehen.
>> Ich kann einen solchen Fehler reproduzieren, wenn ich auf "Compile as C"
>> gestellt habe.

> vielen Dank! Das war's. Ich hatte zwar das Projekt auf C++ gestellt, die
> Datei stand aber noch auf C. Kaum macht man's richt gehts... ;o)


Info dazu: MS Windows ist bekannt dafuer dass es unheimlich viel auf die
Erweiterung eines Dateinamens gibt, genau so auch Visual Studio bzw dessen
Compiler. Wenn Du die Datei foo.cpp genannt haettest, dann waere sie
automatisch als C++ Code angesehen worden und Du haettest Dir die
Umstellerei in den Projekteinstellungen gespart.

Uli
Ähnliche Themen