Newsgroup: it.comp.lang.c
Titolo: problema

sto programmando un microcontrollore SH7045f della renesas.
nel programma ho inserito una funzione che dovrebbe costruire una
tabella con dei valori dei seni, per non doverlo calcolare durante
l'esecuzione del main:
    void tab_seno (void)
       {
       int a;
       double y;     /*riga 88*/
             for(a=-max;a=max;a++)
                 {
                 y=a/max*pi;              /*riga 90*/
                 sen[a]=sin(y);                    /*accede alla
funzione sin di math*/
                 }
        }
compilando mi da' i seguenti errori:
C:\Documents and Settings\sandro\prove
2006\pmm\pmmbeta\pmmbeta\pmmbeta.c 88: 2500 (E) Illegal token ";"
C:\Documents and Settings\sandro\prove
2006\pmm\pmmbeta\pmmbeta\pmmbeta.c 88: 2500 (E) Illegal token ")"
C:\Documents and Settings\sandro\prove
2006\pmm\pmmbeta\pmmbeta\pmmbeta.c 90: 2208 (E) Pointer required for
"*"
dove sbaglio?
grazie

scusate la riga 88 è quella dove inizia il ciclo for


Da un pezzetto di codice non e' detto che si
capisca tutto, perche' gli errori possono
anche essere prima, ma essere riconosciuti come tali
solo nelle linee indicate.
intanto max e pi sono definiti ?
sen e' definito e allocato ?
math.h e' stato incluso ?
Esistono le operazioni matematiche e i double sul compilatore
per il SH7045f ?
(non mi intendo assolutamente di microcontrollori).
Di sicuro un errore apparente e' usare un valore negativo
come indice del vettore: sen[a]
quando a va da -max a max assume dei valori negativi.
In C gli indici partono sempre da 0, quindi non puo
avere qualcosa tipo sen[-a] a meno che sen non
sia un puntatore definito molto opportunamente.
ciao,
g.

inserisco il codice fino alla chiamata tab_seno (per non allungare
troppo).
#ifdef _cplusplus
#include <ios>
#int ios_base::Init::init_cont;
#endif
#ifdef _cplusplus
extern "C" {
       #endif
       void abort (void);
       #ifdef _cplusplus
       }
       #endif
       #include "iodefine.h"
       #include <MATH.h>
       #include <stdio.h>
       #include "stdlib.h"
       #include <machine.h>
       #pragma interrupt(INT_ADI0)  /*interrupt dell'A/D*/
            #define max 1122;                          /*1122/2*/
            #define C 0.0015;
            #define pi   3,141592654;
       float Iap, Ibp, Icp, un_terzo, due_terzi, sen[1122];
       int vrif, S, kp, ki, E;
       void set_PE (void) {
            PFC.PEIOR.BIT.B9=1;
            PFC.PEIOR.BIT.B11=1;
            PFC.PEIOR.BIT.B12=1;
            PFC.PEIOR.BIT.B14=1;
            PFC.PEIOR.BIT.B13=1;
            PFC.PEIOR.BIT.B15=1;
            PFC.PECR1.BIT.MD9=1;
            PFC.PECR1.BIT.MD11=1;
            PFC.PECR1.BIT.MD12=1;
            PFC.PECR1.BIT.MD13=1;
            PFC.PECR1.BIT.MD14=1;
            PFC.PECR1.BIT.MD15=1;
            }
       void set_adc (void){
            AD.CSR0.BIT.ADST=0;
            AD.CSR0.BIT.ADF=0;
            AD.CSR0.BIT.ADIE=0;
            AD.CSR0.BIT.SCAN=1;
            AD.CSR0.BIT.CKS=0;
 
AD.CSR0.BIT.CH
=1;
            }
       void sincro (void)
       {
            unsigned int zero;
            zero=(AD.DRA0.WORD/64);       /*SINCRO*/
            while (1){
            while (zero>1||CMT0.CMCNT<1122)              /*QUANDO L'AD
RILEVA UN MIN (0) SULLA FASE RILEVATA VIENE RIAVVIATO IL CONTATORE*/
            {}                                          /*OPPURE QUANDO
è ARRIVATO A UN VALORE SUP AL PERIODO (PER SICUREZZA). IL VALORE MI
SEMBRA TROPPPO ELEVATO, MA è QUELLO CHE MI VIENE(?):0 FORSE BISOGNA
ABBASSARE IL CLOCK*/
            CMT.CMSTR.BIT.STR0=0;
            CMT0.CMCNT=0;
            CMT.CMSTR.BIT.STR0=1;
            AD.CSR0.BIT.ADIE=1;                         /*abilito solo
ora l'interrupt dell'ad perchè sarebbe intervenuto prima senza aver
det i seni*/
            }
         }
       void tab_seno (void)
       {
       int a;
       float y;
             for(a=0;a=1122;a++)
                 {
                 y=((2*pi)/max)*a;
                 sen[a]=sin(y);                    /*accede alla
funzione sin di math*/
                 }
        }
       void main (void){
            set_imask(1); /*viene servito un interrupt con priorità
1*/
            set_PE();
            set_adc();
            tab_seno();   /*fa la tabella dei seni*/
set_pe mi abilita i pin di uscita della porta e
set adc setta l'ad converter
sincro accende e spegne un contatore. proprio il valore letto su questo
contatore viene inserito nella tabella sen["valore letto"] e mi
dovrebbe dare il valore del seno.
ps. ho cmq cambiato double con float e ho tolto il -max (anche perchè
era sbagliato concettualmente) e ho risolto gli errori sul for ma non
sull' operazione successiva riga 90
C:\Documents and Settings\sandro\prove
2006\pmm\pmmbeta\pmmbeta\pmmbeta.c 90: 2500 (E) Illegal token ";"
C:\Documents and Settings\sandro\prove
2006\pmm\pmmbeta\pmmbeta\pmmbeta.c 90: 2500 (E) Illegal token ")"
C:\Documents and Settings\sandro\prove
2006\pmm\pmmbeta\pmmbeta\pmmbeta.c 90: 2500 (E) Illegal token ")"
C:\Documents and Settings\sandro\prove
2006\pmm\pmmbeta\pmmbeta\pmmbeta.c 90: 2208 (E) Pointer required for
"*"
GRAZIE a entrambi
ciao 
Sandro

             #define pi   3,141592654;
Qui ci sono 4 errori in 3 linee...
il ; non ci va nella  #define, a meno che non ti serva proprio.
Qui sicuramente e' un errore perche' poi se scrivi una cosa tipo
x= max+44;
lui la traduce in x = 1122;+44;
poi la riga dove definisci pi e' doppiamente sbagliata
perche' oltre il punto e virgola stai usando anche
la virgola per separare i decimali invece del punto 3.1415926.....
ciao,
g.

tutto risolto!!!!!! :)
GRAZIE MILLE.
ciao

 
Ciao


ho sostituito    for(a=0;a=1122;a++) con    for(a=0;a<=1122;a++).
va bene?
inoltre quando compilo ottengo
Building All - pmmbeta - Debug
Phase SH C/C++ Compiler starting
C:\Documents and Settings\sandro\prove
2006\pmm\pmmbeta\pmmbeta\initsct.c
C:\Documents and Settings\sandro\prove
2006\pmm\pmmbeta\pmmbeta\lowsrc.c
C:\Documents and Settings\sandro\prove 2006\pmm\pmmbeta\pmmbeta\sbrk.c
C:\Documents and Settings\sandro\prove
2006\pmm\pmmbeta\pmmbeta\pmmbeta.c
Phase SH C/C++ Compiler finished
Phase SH Assembler starting
C:\Documents and Settings\sandro\prove
2006\pmm\pmmbeta\pmmbeta\dbsct.src
C:\Documents and Settings\sandro\prove
2006\pmm\pmmbeta\pmmbeta\lowlvl.src
C:\Documents and Settings\sandro\prove
2006\pmm\pmmbeta\pmmbeta\intprg.src
C:\Documents and Settings\sandro\prove
2006\pmm\pmmbeta\pmmbeta\vecttbl.src
C:\Documents and Settings\sandro\prove
2006\pmm\pmmbeta\pmmbeta\resetprg.src
C:\Documents and Settings\sandro\prove
2006\pmm\pmmbeta\pmmbeta\stacksct.src
Phase SH Assembler finished
Phase SH IM OptLinker starting
 :3080 SECTION ADDRESS OVERFLOW(B)
 :INTER-MODULE OPTIMIZER ABORT
Build Finished
1 Error, 0 Warnings
quindi la compilazione del c++ non da errori (almeno formali), ma mi
esce quest'errore di overflow(?).
se ci clicco sopra mi appare una finestra con scritto
an unnamed file contains an invalid path.
non penso che sia un problema del c ma sarà legato alla scheda.
 cmq se ci capite qualcosa...
grazie e ciao
sandro

 va bene?
chiaramente no. Hai dimensionato seq[1122] che
vuol dire che puoi usare le 1122 posizioni che
vanno da seq[0] fino a seq[1121].
quando a vale 1122 vai a scrivere fuori dall'array...
ciao,
g.

quindi definisco sen[1123]. giusto?
però il problema di overflow mi rimane.
ciao 
sandro