[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

pl.comp.programming

funkcja z C w C++

Slawek Tajnert

5/28/2007 12:16:00 PM

Witam.

Mam problem z dodaniem funkcji napisanej w C do kodu w C++. Otó?, robie
projekt z wykrywaniem emocji na podstawie zdjea ust. Wykorzystuje
symulator sieci neuronowych SNNS. Po nauczeniu sieci generuje programem
snns2c dwa pliki:

- emocje.h
extern int emocje(float *in, float *out, int init);

static struct {
int NoOfInput; /* Number of Input Units */
int NoOfOutput; /* Number of Output Units */
int(* propFunc)(float *, float*, int);
} emocjeREC = {10,2,emocje};


- emocje.c
/*********************************************************
emocje.c
--------------------------------------------------------
generated at Thu May 24 15:22:59 2007
by snns2c ( Bernward Kett 1995 )
*********************************************************/

#include <math.h>

#define Act_Logistic(sum, bias) ( (sum+bias<10000.0) ? ( 1.0/(1.0 +
exp(-sum-bias) ) ) : 0.0 )
#ifndef NULL
#define NULL (void *)0
#endif

typedef struct UT {
float act; /* Activation */
float Bias; /* Bias of the Unit */
int NoOfSources; /* Number of predecessor units */
struct UT **sources; /* predecessor units */
float *weights; /* weights from predecessor units */
} UnitType, *pUnit;

/* Forward Declaration for all unit types */
static UnitType Units[18];

/* Sources definition section */
static pUnit Sources[] = {
Units + 1, Units + 2, Units + 3, Units + 4, Units + 5, Units + 6, Units
+ 7, Units + 8, Units + 9, Units + 10,

Units + 1, Units + 2, Units + 3, Units + 4, Units + 5, Units + 6, Units
+ 7, Units + 8, Units + 9, Units + 10,

Units + 1, Units + 2, Units + 3, Units + 4, Units + 5, Units + 6, Units
+ 7, Units + 8, Units + 9, Units + 10,

Units + 1, Units + 2, Units + 3, Units + 4, Units + 5, Units + 6, Units
+ 7, Units + 8, Units + 9, Units + 10,

Units + 1, Units + 2, Units + 3, Units + 4, Units + 5, Units + 6, Units
+ 7, Units + 8, Units + 9, Units + 10,

Units + 11, Units + 12, Units + 13, Units + 14, Units + 15,
Units + 11, Units + 12, Units + 13, Units + 14, Units + 15,

};

/* Weigths definition section */
static float Weights[] = {
9.888870, -2.209920, -2.139630, 0.634080, 3.348530, -12.600170,
-1.217220, 0.079510, 15.213780, 10.708130,

15.226140, -1.183220, -3.153110, 0.266690, 0.520140, 2.480400, 6.945020,
0.695290, 15.829990, 16.931850,

14.590910, -3.775820, 0.117690, 0.230650, -2.176640, 7.371670, 9.442880,
-1.915540, 14.002770, 16.404301,

15.019070, -1.290780, -4.441600, 0.293980, -0.645350, 4.382700,
6.934660, 0.554830, 14.879510, 16.850611,

14.085470, 5.345510, -12.129450, 0.507580, 3.062340, -4.056810,
2.457100, 7.250320, 15.397990, 15.686710,

12.503120, 9.661680, 9.316230, 9.441750, 10.546040,
-12.503120, -9.661660, -9.316200, -9.441810, -10.546030,

};

/* unit definition section (see also UnitType) */
static UnitType Units[18] =
{
{ 0.0, 0.0, 0, NULL , NULL },
{ /* unit 1 (Old: 1) */
0.0, 1.000000, 0,
&Sources[0] ,
&Weights[0] ,
},
{ /* unit 2 (Old: 2) */
0.0, 0.999980, 0,
&Sources[0] ,
&Weights[0] ,
},
{ /* unit 3 (Old: 3) */
0.0, 0.999990, 0,
&Sources[0] ,
&Weights[0] ,
},
{ /* unit 4 (Old: 4) */
0.0, 0.999980, 0,
&Sources[0] ,
&Weights[0] ,
},
{ /* unit 5 (Old: 5) */
0.0, 0.999980, 0,
&Sources[0] ,
&Weights[0] ,
},
{ /* unit 6 (Old: 6) */
0.0, 0.999990, 0,
&Sources[0] ,
&Weights[0] ,
},
{ /* unit 7 (Old: 7) */
0.0, 0.999990, 0,
&Sources[0] ,
&Weights[0] ,
},
{ /* unit 8 (Old: 8) */
0.0, 0.999970, 0,
&Sources[0] ,
&Weights[0] ,
},
{ /* unit 9 (Old: 9) */
0.0, 0.999970, 0,
&Sources[0] ,
&Weights[0] ,
},
{ /* unit 10 (Old: 10) */
0.0, 0.999980, 0,
&Sources[0] ,
&Weights[0] ,
},
{ /* unit 11 (Old: 11) */
0.0, 3.061640, 10,
&Sources[0] ,
&Weights[0] ,
},
{ /* unit 12 (Old: 12) */
0.0, -5.441660, 10,
&Sources[10] ,
&Weights[10] ,
},
{ /* unit 13 (Old: 13) */
0.0, -4.108320, 10,
&Sources[20] ,
&Weights[20] ,
},
{ /* unit 14 (Old: 14) */
0.0, -4.975150, 10,
&Sources[30] ,
&Weights[30] ,
},
{ /* unit 15 (Old: 15) */
0.0, -3.668400, 10,
&Sources[40] ,
&Weights[40] ,
},
{ /* unit 16 (Old: 16) */
0.0, -21.453300, 5,
&Sources[50] ,
&Weights[50] ,
},
{ /* unit 17 (Old: 17) */
0.0, 21.453291, 5,
&Sources[55] ,
&Weights[55] ,
}

};



int emocje(float *in, float *out, int init)
{
int member, source;
float sum;
enum{OK, Error, Not_Valid};
pUnit unit;


/* layer definition section (names & member units) */

static pUnit Input[10] = {Units + 1, Units + 2, Units + 3, Units + 4,
Units + 5, Units + 6, Units + 7, Units + 8, Units + 9, Units + 10}; /*
members */

static pUnit Hidden1[5] = {Units + 11, Units + 12, Units + 13, Units
+ 14, Units + 15}; /* members */

static pUnit Output1[2] = {Units + 16, Units + 17}; /* members */

static int Output[2] = {16, 17};

for(member = 0; member < 10; member++) {
Input[member]->act = in[member];
}

for (member = 0; member < 5; member++) {
unit = Hidden1[member];
sum = 0.0;
for (source = 0; source < unit->NoOfSources; source++) {
sum += unit->sources[source]->act
* unit->weights[source];
}
unit->act = Act_Logistic(sum, unit->Bias);
};

for (member = 0; member < 2; member++) {
unit = Output1[member];
sum = 0.0;
for (source = 0; source < unit->NoOfSources; source++) {
sum += unit->sources[source]->act
* unit->weights[source];
}
unit->act = Act_Logistic(sum, unit->Bias);
};

for(member = 0; member < 2; member++) {
out[member] = Units[Output[member]].act;
}

return(OK);
}


w jaki sposób mam dodaa t? funkcje do kodu w C++ ?? Próbowa3em m. in.
dodaa:

extern "C" {
int emocje(float *in, float *out, int init);
#include "emocje.h"
}


ale otrzymuje nastepuj?ce b3edy:
61 C:\emocje\emocje.c redefinition of `UnitType Units[18]'
24 C:\emocje\emocje.c `UnitType Units[18]' previously declared here

zatem to nie dzia3a. Jak powinienem to zrobia ??
9 Answers

Marcin 'Qrczak' Kowalczyk

5/28/2007 12:35:00 PM

0

Dnia 28-05-2007, Pn o godzinie 14:16 +0200, Slawek Tajnert napisal(a):

> /* Forward Declaration for all unit types */
> static UnitType Units[18];

Zapowiedz zmiennej statycznej jest poprawna w C, ale nie w C++.
Najprosciej kompiluj ten plik jako C, a nie C++.

> extern "C" {
> int emocje(float *in, float *out, int init);
> #include "emocje.h"
> }

Skoro emocje.h zawiera juz te deklaracje funkcji, to nie ma po co
powtarzac jej wczesniej.

--
__("< Marcin Kowalczyk
\__/ qrczak@knm.org.pl
^^ http://qrnik.knm.org.p...

Slawek Tajnert

5/28/2007 12:41:00 PM

0

Marcin 'Qrczak' Kowalczyk wrote:
> Dnia 28-05-2007, Pn o godzinie 14:16 +0200, S3awek Tajnert napisa3(a):
>
>> /* Forward Declaration for all unit types */
>> static UnitType Units[18];
>
> Zapowied? zmiennej statycznej jest poprawna w C, ale nie w C++.
> Najpro?ciej kompiluj ten plik jako C, a nie C++.
>
>> extern "C" {
>> int emocje(float *in, float *out, int init);
>> #include "emocje.h"
>> }
>
> Skoro emocje.h zawiera ju? te deklaracje funkcji, to nie ma po co
> powtarzaa jej wcze?niej.
>


emocje.h i emocje.c zosta3y wygenerowane za pomoc? symulatora sieci
neuronowej. Te pliki chce wykorzystaa w programie który napisa3em, ale w
C++. Czyli to extern "C" ... jest poprawne, czy nie ??

Slawek Tajnert

5/28/2007 12:56:00 PM

0

Marcin 'Qrczak' Kowalczyk wrote:
> Dnia 28-05-2007, Pn o godzinie 14:16 +0200, S3awek Tajnert napisa3(a):
>
>> /* Forward Declaration for all unit types */
>> static UnitType Units[18];
>
> Zapowied? zmiennej statycznej jest poprawna w C, ale nie w C++.
> Najpro?ciej kompiluj ten plik jako C, a nie C++.
>
>> extern "C" {
>> int emocje(float *in, float *out, int init);
>> #include "emocje.h"
>> }
>
> Skoro emocje.h zawiera ju? te deklaracje funkcji, to nie ma po co
> powtarzaa jej wcze?niej.
>

zostawi3em extern "C" {
#include "emocje.h"
}

ale nadal nic.

Jacek Czerwinski

5/28/2007 1:03:00 PM

0

Dnia Mon, 28 May 2007 14:56:22 +0200, S3awek Tajnert napisa3(a):

> Marcin 'Qrczak' Kowalczyk wrote:
>> Dnia 28-05-2007, Pn o godzinie 14:16 +0200, S3awek Tajnert napisa3(a):
>>
>>> /* Forward Declaration for all unit types */
>>> static UnitType Units[18];
>>
>> Zapowied? zmiennej statycznej jest poprawna w C, ale nie w C++.
>> Najpro?ciej kompiluj ten plik jako C, a nie C++.
>>
>>> extern "C" {
>>> int emocje(float *in, float *out, int init);
>>> #include "emocje.h"
>>> }
>>
>> Skoro emocje.h zawiera ju? te deklaracje funkcji, to nie ma po co
>> powtarzaa jej wcze?niej.
>>
>
> zostawi3em extern "C" {
> #include "emocje.h"
> }
>
> ale nadal nic.

Je?li rozumiem, utrzymujesz, ?e nawet komunikat o b3edach sie nie zmieni3?

Mam pomys3: zrobia siea neuronow?, która bedzie czyta3a komunikaty o
b3edach kompilacji. S?dz?c po tej grupie, 'towar' sie przyda.

Marcin 'Qrczak' Kowalczyk

5/28/2007 1:03:00 PM

0

Dnia 28-05-2007, Pn o godzinie 14:56 +0200, Slawek Tajnert napisal(a):

> ale nadal nic.

Napisalem, ze emocje.c musi byc kompilowany jako C, a nie C++.
Trzeci raz tego samego nie bede pisal.

--
__("< Marcin Kowalczyk
\__/ qrczak@knm.org.pl
^^ http://qrnik.knm.org.p...

Slawek Tajnert

5/28/2007 1:10:00 PM

0

Marcin 'Qrczak' Kowalczyk wrote:
> Dnia 28-05-2007, Pn o godzinie 14:56 +0200, S3awek Tajnert napisa3(a):
>
>> ale nadal nic.
>
> Napisa3em, ?e emocje.c musi bya kompilowany jako C, a nie C++.
> Trzeci raz tego samego nie bede pisa3.
>

Wybacz, ale nie jestem na informatyce i z takim problemem spotykam sie
po raz pierwszy. U?ywam dev-C++, w jaki sposób mam skompilowaa emocje.c
jako C, a reszte plików programu w C++ ?? Mo?e to g3upie pytanie, ale
nie wiem tego.

Slawek Tajnert

5/28/2007 1:11:00 PM

0

Jacek Czerwinski wrote:
> Dnia Mon, 28 May 2007 14:56:22 +0200, S3awek Tajnert napisa3(a):
>
>> Marcin 'Qrczak' Kowalczyk wrote:
>>> Dnia 28-05-2007, Pn o godzinie 14:16 +0200, S3awek Tajnert napisa3(a):
>>>
>>>> /* Forward Declaration for all unit types */
>>>> static UnitType Units[18];
>>> Zapowied? zmiennej statycznej jest poprawna w C, ale nie w C++.
>>> Najpro?ciej kompiluj ten plik jako C, a nie C++.
>>>
>>>> extern "C" {
>>>> int emocje(float *in, float *out, int init);
>>>> #include "emocje.h"
>>>> }
>>> Skoro emocje.h zawiera ju? te deklaracje funkcji, to nie ma po co
>>> powtarzaa jej wcze?niej.
>>>
>> zostawi3em extern "C" {
>> #include "emocje.h"
>> }
>>
>> ale nadal nic.
>
> Je?li rozumiem, utrzymujesz, ?e nawet komunikat o b3edach sie nie zmieni3?
>
> Mam pomys3: zrobia siea neuronow?, która bedzie czyta3a komunikaty o
> b3edach kompilacji. S?dz?c po tej grupie, 'towar' sie przyda.

Tak, utrzymuje, ?e nawet komunikat o b3edach sie nie zmieni3

Slawek Tajnert

5/28/2007 2:22:00 PM

0

Ok, ju? rozwi?za3em problem. Zmieni3em kompilator na Visuala, pod
Dev-C++ nie chcia3o dzia3aa. Zostawi3em tak jak mia3em czyli
extern "C" {
#include "emocje.h"
}
:)

Wiktor S.

5/29/2007 10:33:00 PM

0

>>> ale nadal nic.
>>
>> Napisa3em, ?e emocje.c musi bya kompilowany jako C, a nie C++.
>> Trzeci raz tego samego nie bede pisa3.
>>
>
> Wybacz, ale nie jestem na informatyce i z takim problemem spotykam sie
> po raz pierwszy. U?ywam dev-C++, w jaki sposób mam skompilowaa
> emocje.c jako C, a reszte plików programu w C++ ?? Mo?e to g3upie
> pytanie, ale nie wiem tego.

Huh. Z regu3y pliki .c s? traktowane jako C, a .cpp jako C++. Z jakimi
parametrami to kompilujesz?


--
Azarien