Newsgroup: it.comp.os.linux.development
Titolo: problema compilazione sorgente C++

Principiante (sia in Linux che in C) chiede aiuto.
se serve vi mando il pacchetto picprog-1.0.tar.gz (43K)
Devo installare il seguente prog. picprog-1.0.tar.gz (non esiste l'rpm)
Da root scompattato in /tmp
Secondo le istruzioni bisogna dare make e dopo make install
nella dir /usr/local o copiare manualmente i file ?
Col comando make ottengo questo:
[root@localhost picprog-1.0]# make
g++ -O2 -Wall -Wmissing-prototypes   -c -o main.o main.cc
In file included from main.cc:36:
hexfile.h:51: ISO C++ forbids initialization of member `size'
hexfile.h:51: making `size' static
make: *** [main.o] Error 1
[root@localhost picprog-1.0]#
Nel file main.cc alla riga 36 c'e' # include"hexfile.h",
mentre nel file hexfile.h alla riga 51 c'e' const int size = 0x4000;
(l'inizio del file hexfile.h sono commenti x il freesoftware)
E' per caso errato il file hexfile.h ???
a make install devo aggiungere il percorso ???
se si in che modo ???
allego sotto hexfile.h
************************************************************************
*/
/*
  Hexfile follows the Microchip hex file format for pic16c84:
  - program memory at locations 0-0x3ff
  - id at locations 0x2000-0x2003
  - fuses at location 0x2007
  - data memory at locations 0x2100-0x213f
 */
#ifndef H_HEXFILE
#define H_HEXFILE
#include <fstream.h>
#include "picport.h"
class hexfile {
  const int size = 0x4000;    <--- linea 51
  short pgm [size];
  int program_location (picport& pic, int addr, bool data) const;
public:
  enum formats { unknown = 0, ihx8m, ihx16 };
private:
  void save_line (ofstream& f, int begin, int len, enum formats format) 
const;
  void save_region (ofstream& f, int addr, int end, enum formats format, 
bool skip_ones) const;
public:
  hexfile () {
    int i;
    for (i = 0; i < size; i++)
      pgm [i] = -1;
  }
  int load (const char *name);
  int save (const char *name, enum formats format, bool skip_ones) const;
  int program (const char *port, bool erase) const;
  int read (const char *port);
  void set (int addr, int value) {
    if (addr >= 0 && addr < size)
      pgm [addr] = value & 0x3fff;
  }
  int get (int addr) {
    if (addr < 0 || addr >= size)
      return -1;
    return pgm [addr];
  }
};
#endif // H_HEXFILE
-- 
ciao
Angelo

 E' per caso errato il file hexfile.h ???
Mi sa di si'. Cambia il nome "size" in qualcos'altro, che so', "sze".
Dovrai fare la stessa operazione sugli altri sorgenti.
Ciao,
// Umberto Salsi
//
// 
http://digilander.iol.it/salsi
 <-- GnuPG key available here!
// Key fingerprint = B957 FB00 10F5 A770 4A26  2D80 BE2C F6CD 77E9 29AE

 
Sostituisci la riga interessata con una delle due seguenti:
1)
   static int size = 0x4000;  // nota lo 'static'
2)
   enum constants  { size = 0x4000 };
Max

 Mi sa di si'. Cambia il nome "size" in qualcos'altro, che so', "sze".
No, 'size' non è una parola riservata in C++ (se è questo che intendevi
dire).
Max

 dire).
Pensavo che "size" fosse definita da altre parti, non avevo letto bene
il messaggio di errore (cha dava anche la soluzione!).


Modificato hexfile.h alla linea 51
 da
const int size = 0x4000;
 in
  enum constants  { size = 0x4000 };
come suggeritomi da Max
ora compare:
[root@localhost picprog1.0]# make
g++ -O2 -Wall -Wmissing-prototypes   -c -o main.o main.cc
g++ -O2 -Wall -Wmissing-prototypes   -c -o picport.o picport.cc
picport.cc: In method `picport::picport (const char *)':
picport.cc:51: `exit' undeclared (first use this function)
picport.cc:51: (Each undeclared identifier is reported only once for
each function it appears in.)
make: *** [picport.o] Error 1
[root@localhost picprog1.0]#
NON CONOSCENDO IL C HO ELEMINATO LE RIGHE DOVE AVVENIVANO GLI ERRORI.
Potreste darmi un altro aiutino ?
Modificato picport.cc le linee con
    exit (EX_IOERR);
  in
  //  exit (EX_IOERR);
  file picport.cc
#include <iostream.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <errno.h>
#include <time.h>
#include <unistd.h>
#include <sysexits.h>
#include <string.h>
#include "picport.h"
const int picport::dtr_bit = TIOCM_DTR;
const int picport::rts_bit = TIOCM_RTS;
picport::picport (const char *tty)
  : addr (0), debug_on (0)
{
  if (0 > (fd = open (tty, O_RDWR))) {
    int e = errno;
    cerr << "Unable to open tty " << tty << ":" << strerror (e) << "\n";
  //  exit (EX_IOERR);
  }
*************************************************************************
Modificato program.cc le linee con
    exit (EX_USAGE);
  in
//  exit (EX_USAGE);
  ultime righe del file program.cc
  }
  if (charops.length ()) {
    wrapif (column, w.ws_col, 4 + charops.length () + 2);
    cerr << " [ -" << charops << " ]";
  }
  cerr << endl;
//  exit (EX_USAGE);
}
************************************************************************
MI SONO FERMATO QUI, VISTO CHE HO ELIMINATO exit
NON HO ESEGUITO MAKE INSTALL
-- 
ciao
Angelo

 
Aggiungi 
  #include <stdlib.h>  
in picport.cc.
Max


MS Outlook : (noun) A newsreader with support for RAID 0.
MS Works   : (noun) An oxymoron.

   #include <stdlib.h>
PERFETTO ERA QUELLO CHE MANCAVA.
La compilazione e l'installazione sono andate a buon fine.
Ora quando lancio il programma 
[as@localhost as]$ picprog --burn --input /home/as/rwpic/led.hex
ho questo messaggio:
Unable to open tty /dev/ttyS0:Permission denied
sia su ttyS0 e ttyS1. 
Ho cambiato i permessi a ttyS0,ttys0 & ttyS1,ttys1 , selezionate tutte le 
voci:
           lettura    scrittura     esecuzione
utente     x             x             x
gruppo    x             x             x
altri         x             x             x
Posso tenerle cosi' o e' meglio non permettere a tutti di usarle.
GRAZIE ANCORA PER IL TUO PREZIOSISSIMO AIUTO
-- 
ciao
Angelo