Torna indietro   Hardware Upgrade Forum > Software > Programmazione

HP Imagine 2026: abbiamo visto HP IQ all’opera, ecco cosa può (e non può) fare
HP Imagine 2026: abbiamo visto HP IQ all’opera, ecco cosa può (e non può) fare
A New York HP ha messo al centro della scena HP IQ, la piattaforma di IA locale da 20 miliardi di parametri. L’abbiamo vista in funzione: è uno strumento che funziona, pensato per un target specifico, con vantaggi reali e limiti altrettanto evidenti
PNY RTX 5080 Slim OC, sembra una Founders Edition ma non lo è
PNY RTX 5080 Slim OC, sembra una Founders Edition ma non lo è
La PNY GeForce RTX 5080 Slim OC si distingue nel panorama delle GPU di fascia alta per il design compatto a due slot, ispirato alla NVIDIA GeForce RTX 5080 Founders Edition. In questo test analizziamo comportamento termico e prestazioni in gioco, valutando se il formato ridotto comprometta o meno l'esperienza complessiva rispetto alle soluzioni più ingombranti presenti sul mercato.
Wi-Fi 7 con il design di una vetta innevata: ecco il nuovo sistema mesh di Huawei
Wi-Fi 7 con il design di una vetta innevata: ecco il nuovo sistema mesh di Huawei
HUAWEI WiFi Mesh X3 Pro Suite è probabilmente il router mesh più fotogenico che si possa acquistare oggi in Italia, ma dietro il guscio in acrilico trasparente e le luci LED dinamiche c'è una macchina tecnica costruita attorno allo standard Wi-Fi 7, con velocità teoriche Dual-Band fino a 3,6 Gbps e una copertura fino a 120 m² una volta abbinato il router principale all'extender incluso nel kit
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 28-09-2007, 14:02   #1
sonique
Senior Member
 
Iscritto dal: Jun 2003
Messaggi: 893
[Dev c++] Link error: non capisco il motivo

Ciao a tutti,
ho creato questi file di libreria: (struttra.h e struttura.c), di cui posto qui il codice:


Codice:
//Header file contenente la definizione delle strutture dati per
//rappresentare e gestire una rete neurale feed-forward, e le
//operazioni utili ai fini della lettura da file e della inizializzazione
//di tali strutture.
//La lettura di una rete neurale avviene da file .net, compatibile
//con lo standard Stuttgart JNNS. 

#ifndef _STRUTTURA_H_
#define _STRUTTURA_H_
#include <stdio.h>

struct node{
int funzione_act;   //Tipo di funzione di attivazione
int funzione_out;   //Tipo di funzione di output
float valore_in;   //Valore di input
float valore;      //Valore di output
float soglia;      //Valore del bias 
};
typedef struct node info_nodo;

typedef struct {
char nome[30];
int N;         //Numero totale dei nodi della rete
float *w;     //Vettore dei pesi  
int nodi_input;//Numero nodi di input
int nodi_out;  //Numero nodi di output
info_nodo *nodo;
} rete_neurale;

//////////////////////////////////////////////////////



//Data una stringa ne estrae un numero convertendolo in float
float estract_float(char *, int);


//Restituisce il prossimo carattere speciale |
int next_only_tab(char *, int);



//Restituisce il prossimo carattere speciale '|' ':' o ','
int next_tab(char *, int);


//Estrae il prossimo carattere valido
void estract_str(char *, int , char *);



//Lagge dal file .net il tipo di algoritmo di apprendimento
void read_learning(FILE *, char *);

//Lagge dal file .net il tipo di algoritmo di aggiornamento
void read_update(FILE *, char *);


//Legge dal file .net il nome della rete
void read_nome(FILE *, char *);

//Legge la configurazione della rete
void read_unit(FILE *, rete_neurale, int *, int *, int *);

//Inizializza la struttura ai valori di default
void init(rete_neurale ,int ,int,int,char *,char *);

//Legge i pesi e le connessioni presenti nella rete
void read_weigth(FILE *, rete_neurale , int , int , int );

//Legge dal file .net i parametri di default della rete
void read_def(FILE *, float *, float *, char *, char *, char *);


rete_neurale leggiretefile (char *);

//Lagge dal file .net il numero di nodi della rete
int read_units(FILE *);


//Legge dal file .net il numero di connessioni della rete
int read_conness(FILE *);

//Controlla la fine di un rigo non delimitato da alcun carattere speciale
int contr_fine(char *, int);

//Calcola i valori di uscita dei nodi, dati gli ingressi
rete_neurale calcola_feed_forward (rete_neurale);

#endif


Codice:
#include "struttura.h"
#include <string.h>
#include <stdlib.h>

float estract_float(char *buf, int index)
//Data una stringa ne estrae un numero convertendolo in float
{
       int i, j=0;
       float num;
       char stringa[15];
       
       i=index+1;
       while ((buf[i]!='|')&&(buf[i]!=':') && (buf[i]!=','))
       {
             if (buf[i]!=' ')
             {
                stringa[j]=buf[i];
                j++;
             }
             i++;
       }
       stringa[j]='\0';
       num=atof(stringa);
       return num;
}

int next_only_tab(char *buf, int index)
//Restituisce il prossimo carattere speciale |
{
       index++;       
       while (buf[index]!='|')
             index++;
       return index;       
}

int next_tab(char *buf, int index)
//Restituisce il prossimo carattere speciale '|' ':' o ','
{
       index++;       
       while ((buf[index]!='|') && (buf[index]!=':') && (buf[index]!=','))
             index++;
       return index;       
}

char estract_c(char *buf, int index)
//Estrae il prossimo carattere valido
{
       char car;
       int i;
       
       i=index+1;
       while (buf[i]!='|')
       {
             if (buf[i]!=' ')
             {
                car=buf[i];
                break;
             }
             i++;
       }
       return car;
}

void read_learning(FILE *fd, char *learning)
//Lagge dal file .net il tipo di algoritmo di apprendimento
{
        char stringa[25];
        
        fscanf(fd,"%s",stringa);
        while (1)
        {
              if (strcmp(stringa,"learning")==0)
              {
                 fscanf(fd,"%s",stringa);
                 if (strcmp(stringa,"function")==0)
                 {
                    fscanf(fd,"%s",stringa);
                    fscanf(fd,"%s",stringa);  
                    strcpy(learning,stringa); 
                    break;
                 }
              }
              fscanf(fd,"%s",stringa);
        }            
}

void read_update(FILE *fd, char *update)
//Lagge dal file .net il tipo di algoritmo di aggiornamento
{
        char stringa[25];
        
        fscanf(fd,"%s",stringa);
        while (1)
        {
              if (strcmp(stringa,"update")==0)
              {
                 fscanf(fd,"%s",stringa);
                 if (strcmp(stringa,"function")==0)
                 {
                    fscanf(fd,"%s",stringa);
                    fscanf(fd,"%s",stringa);  
                    strcpy(update,stringa);  
                    break;
                 }
              }
              fscanf(fd,"%s",stringa);
        }            
}

//Legge dal file .net il nome della rete
void read_nome(FILE *fd, char *nome)

{
        char stringa[25];
        
        fscanf(fd,"%s",stringa);
        while (1)
        {
              if (strcmp(stringa,"network")==0)
              {
                 fscanf(fd,"%s",stringa);
                 if (strcmp(stringa,"name")==0)
                 {
                    fscanf(fd,"%s",stringa);
                    fscanf(fd,"%s",stringa);  
                    strcpy(nome,stringa);  
                    break;
                 }
              }
              fscanf(fd,"%s",stringa);
        }            
}

void read_unit(FILE *fd, rete_neurale rete, int *in, int *hi, int *out)
//Legge la configurazione della rete
{
        char *res, buf[200];
        int index, num_input=0, num_hidden=0, num_output=0;
        int i, act_d=0, out_d=0, actv_d=0, outv_d=0, type_d=0;
        char nome[20], act_str[20], out_str[20], type;
        float act, bias;
        
        
        fscanf(fd,"%s",buf);
        while (strcmp(buf,"sites")!=0)
              fscanf(fd,"%s\n",buf);        
        fscanf(fd,"%s\n",buf);//Legge il rigo dei tab
        for (index=1; index<=rete.N;index++)
        {
            act_d=0;
            out_d=0;
            actv_d=0;
            outv_d=0;
            type_d=0;            
            res=fgets(buf,200,fd);//Legge un rigo intero
            if( res==NULL )
                exit(1);           
            i=next_tab(buf,0);//Salta di due tab in avanti
            i=next_tab(buf,i);
            estract_str(buf,i,nome);//Estrae il nome del nodo            
            i=next_tab(buf,i);
            if (buf[i+1]=='|')
               actv_d=1;             //Caso funzione di default
            else{
                rete.nodo[index].valore_in=estract_float(buf,i);//Estrae il valore di attivazione
                rete.nodo[index].valore=rete.nodo[index].valore_in;
                }
            i=next_tab(buf,i);
            if (buf[i+1]=='|')
               outv_d=1;             //Caso funzione di default
            else
                rete.nodo[index].soglia=estract_float(buf,i);//Estrae il valore del bias            
            i=next_tab(buf,i);
            if (buf[i+1]=='|')
               type_d=1;             //Caso funzione di default
            else
                type=estract_c(buf,i);//Estrae il tipo del nodo            
            i=next_tab(buf,i);//Salta di due tab in avanti
            i=next_only_tab(buf,i);
            if (buf[i+1]=='|')
               act_d=1;        //Caso funzione di default
            else            
                estract_str(buf,i,act_str);//Estrae la funzione di attiv.            
            i=next_tab(buf,i);
            if (buf[i+1]=='|')
               out_d=1;        //Caso funzione di default
            else
                estract_str(buf,i,out_str);//Estrae la funzione di output        
            if (type=='i')            
               num_input++;
            if (type=='h')
               num_hidden++;
            if (type=='o')            
               num_output++;
            if (act_d==0)                
                  rete.nodo[index].funzione_act=str2int(act_str);
            if (out_d==0)
                  rete.nodo[index].funzione_out=str2int(out_str);            
        }                
        *in= num_input;
        *hi= num_hidden;
        *out= num_output;
}


void init(rete_neurale rete,int act_d,int bias_d,int tipo_d,char *act_fun_d,char *out_fun_d)
//Inizializza la struttura ai valori di default
{
        int i, j, d, act, out, N;
        
        N=rete.N+1; 
        act=str2int(act_fun_d);
        out=str2int(out_fun_d); 
        for (i=1; i<=rete.N; i++)
        {
            rete.nodo[i].soglia=bias_d;
            rete.nodo[i].valore_in=act_d;
            rete.nodo[i].valore=act_d;
            rete.nodo[i].funzione_act=act;
            rete.nodo[i].funzione_out=out;
        }
        //Inizializzazione vettore dei pesi
        for(j=0;j<=rete.N;j++)
        {
            for(d=0;d<=rete.N;d++)         
              rete.w[j*N+d]=-bias_d;
        }             
}

void read_weigth(FILE *fd, rete_neurale rete, int in, int hi, int out)
//Legge i pesi e le connessioni presenti nella rete
{
     char buf[200], *res;
     int N, num, index, i=0, j=0, numero_nodi=0 ,max, flag=0;
     float peso;
     
     max=in; 
     N=rete.N+1;
     fscanf(fd,"%s",buf);
     while (strcmp(buf,"source:weight")!=0)
           fscanf(fd,"%s\n",buf);   
     fscanf(fd,"%s\n",buf);//Legge il rigo dei tab
     res=fgets(buf,200,fd);//Legge un rigo intero
     if( res==NULL )
         exit(1);            
     //Per tutti i nodi non di input 
     for (j=in+1;j<=in+hi+out;j++){             
         index=(int)estract_float(buf,-1);//Estrae l'indice del nodo ricevente
         i=next_tab(buf,0);//Salta due tab
         i=next_tab(buf,i);
         numero_nodi=0;//Inizializzazione
         flag=0;
         if (j==in+hi+1)
            max=hi;        
         while (flag==0){
               while ((buf[i+2]!='\0')&& (flag==0))
               {
                     num=(int)estract_float(buf,i);//Estrae l'indice del nodo collegato                     
                     numero_nodi++;                     
                     i=next_tab(buf,i);//Salta i due punti
                     peso=estract_float(buf,i);                    
                     if (numero_nodi<max)
                        i=next_tab(buf,i);//Salta la virgola    
                     else
                         flag=1;
                     //Inserisce l'indice del nodo afferente ed il peso                     
                     rete.w[index*N+num]=peso;     
               }
               i=0;
               res=fgets(buf,200,fd);//Legge un rigo intero
               if( res==NULL )
                   break;   
               //printf("%s\n",buf);      
         }
     }
}

void read_def(FILE *fd, float *act_d, float *bias_d, char *tipo_d, char *act_fun_d, char *out_fun_d)
//Legge dal file .net i parametri di default della rete
{
        char stringa[25], *res, buf[200];
        char car;
        float layer, subnet;
        int index;
        
        fscanf(fd,"%s",stringa);
        while (strcmp(stringa,"out")!=0)
              fscanf(fd,"%s",stringa);
        fscanf(fd,"%s\n",stringa);
        if (strcmp(stringa,"func")==0)
           fscanf(fd,"%s\n",buf);//Legge una riga intera   
        res=fgets(buf,200,fd);
        if( res==NULL )
            exit(1);          
        *act_d=estract_float(buf,-1);
        index=next_tab(buf,0);//aggiorna il nuovo indice di tabulazione
        *bias_d=estract_float(buf,index);
        index=next_tab(buf,index); 
        *tipo_d=estract_c(buf,index);
        index=next_tab(buf,index);
        subnet=estract_float(buf,index);
        index=next_tab(buf,index);
        layer=estract_float(buf,index);
        index=next_tab(buf,index);
        estract_str(buf,index,act_fun_d);
        index=next_tab(buf,index);
        estract_str(buf,index,out_fun_d);       
}

rete_neurale leggiretefile (char *nomefile)
{
     char nome[30];
     char *delim;
     char *last;
     char check[30];
     int N, conness, in, hi, out;
     int i, j, d;     
     float act_d, bias_d;
     char tipo_d, act_fun_d[25], out_fun_d[25], learning[25], update[25];
     FILE *fd;
     int conta=0;
     int num_afferenti=0;     
     rete_neurale rete;
     
     // Controlla che l'estensione del file sia .net
     strcpy(check, nomefile);
     delim = strtok(check, ".");
     while (delim != NULL){
         last = delim;
         delim = strtok(NULL, ".");
         }
     if(strcmp(last, "net") != 0){
       printf("\nWarning: Stai aprendo un file con estensione diversa da .net\n");
       getch(); 
      }
     //---------------------------------------------- END CHECK
     
     
     fd=fopen(nomefile,"r");
     if(fd == NULL){
            printf("\nImpossibile aprire il file %s \n\n",nomefile);
            system("pause");
            exit(0);
     }
     //Lettura del nome della rete
     read_nome(fd,nome); 
     strcpy(rete.nome,nome);
     //Lettura del numero totale di nodi
     rete.N=read_units(fd);
     N=rete.N+1;
     //Lettura del numero di connessioni
     conness=read_conness(fd); 
     //Lettura del tipo di apprendimento e dell'ordine di aggiornamento
     read_learning(fd,learning);     
     read_update(fd,update);     
     //Lettura dei valori di default
     read_def(fd,&act_d,&bias_d,&tipo_d,act_fun_d,out_fun_d);           
     //Inizializzazione alla dimensione letta
     rete.w=(float *)malloc(N*N*sizeof(float));
     rete.nodo=(info_nodo *)malloc(N*sizeof(info_nodo));
     //Inizializzazione delle strutture
     init(rete,act_d,bias_d,tipo_d,act_fun_d,out_fun_d);   
     //Per tutti i nodi di input
     read_unit(fd,rete,&in,&hi,&out);
     //Aggiornamento del numero di nodi input e output nella rete
     rete.nodi_input=in;
     rete.nodi_out=out;    
     //Aggiorna i valori dei pesi ai bias
     for(i=1;i<=rete.N;i++)  
        rete.w[i*N]=-rete.nodo[i].soglia;        
     //Inserisce il valore dei pesi nelle connessioni
     read_weigth(fd,rete,in,hi,out);   
     fclose(fd);
     return(rete);
}

int read_units(FILE *fd)
//Lagge dal file .net il numero di nodi della rete
{
        char stringa[25];
        int units=0;
        
        fscanf(fd,"%s",stringa);
        while (1)
        {
              if (strcmp(stringa,"no.")==0)
              {             
                  fscanf(fd,"%s",stringa);
                  if (strcmp(stringa,"of")==0)
                  {
                     fscanf(fd,"%s",stringa);
                     if (strcmp(stringa,"units")==0)
                     {
                        fscanf(fd,"%s",stringa);
                        fscanf(fd,"%d",&units);                         
                        break;              
                     }
                  }
              }  
              fscanf(fd,"%s",stringa);
        }
        return units;            
}

int read_conness(FILE *fd)
//Legge dal file .net il numero di connessioni della rete
{
        char stringa[25];
        int conness=0;
        
        fscanf(fd,"%s",stringa);
        while (1)
        {
              if (strcmp(stringa,"no.")==0)
              {
                 fscanf(fd,"%s",stringa);
                 if (strcmp(stringa,"of")==0)
                 {
                    fscanf(fd,"%s",stringa);
                    if (strcmp(stringa,"connections")==0)
                    {
                       fscanf(fd,"%s",stringa);
                       fscanf(fd,"%d",&conness);
                       break;
                    }
                 }
              }
              fscanf(fd,"%s",stringa);
        }
        return conness;            
}

int contr_fine(char *buf, int index)
//Controlla la fine di un rigo non delimitato da alcun carattere speciale
{
     int i;
     
     i=index;
     while (buf[i]!='\0')
           i++;
     if (buf[i-1]==',')
        return 1;
     else
         return 0;
}

rete_neurale calcola_feed_forward (rete_neurale rete)
//Calcola i valori di uscita dei nodi, dati gli ingressi
{
       int N=rete.N+1;
       int i,j,s,k; 
      
       //Per tutti i nodi di input Calcola il valore di uscita
       //tramite la funzione teta di attivazione
       for (j=1; j<=rete.nodi_input; j++)
       {                         
          // rete.nodo[j].valore_in=rete.nodo[j].valore_in-rete.nodo[j].soglia;
           rete.nodo[j].valore=teta(rete.nodo[j].valore_in,rete.nodo[j].funzione_out);           
       }       
       //Per tutti i nodi Hidden
       for(k=rete.nodi_input+1;k<=rete.N-rete.nodi_out;k++) 
       {
           rete.nodo[k].valore_in=rete.nodo[k].soglia; 
           //Per tutti i nodi di input
           for (i=1;i<=rete.nodi_input;i++)
               rete.nodo[k].valore_in+=rete.nodo[i].valore*rete.w[k*N+i];
           rete.nodo[k].valore=teta(rete.nodo[k].valore_in,rete.nodo[k].funzione_act);
       }
       //Per tutti i nodi di output
       for(k=rete.N-rete.nodi_out+1;k<=rete.N;k++)
       {
           rete.nodo[k].valore_in=rete.nodo[k].soglia;
           //Per tutti i nodi Hidden
           for (i=rete.nodi_input+1;i<=rete.N-rete.nodi_out;i++)
               rete.nodo[k].valore_in+=rete.nodo[i].valore*rete.w[k*N+i];
           rete.nodo[k].valore=teta(rete.nodo[k].valore_in,rete.nodo[k].funzione_act);
       }       
       return rete;
}
Ora il problema è il seguente:

Ho scritto questo banale codice main cercado di richiamare una funzione di struttura.c, ma all'atto della compilazione, il compilatore mi da il seguente errore:

LINKER ERROR: undefinied reference to next_tab

Dove sbaglio????

Questo è il codice main:

Codice:
#include "struttura.h"
#include <stdio.h>
#include <stdlib.h>



main()

{
      
char buf[] = "ciao pirla;";
int ind;

printf("\n\nProva utilizzo libreria:\n\n");

ind = next_tab(buf, 0);
getch();
return 0;
}
Tengo a precisare che: Ho provato sia a creare un progetto che non, ma nulla di fatto. Tutti i file .h e .c stanno nella stessa cartella.

Ultima modifica di sonique : 28-09-2007 alle 14:05.
sonique è offline   Rispondi citando il messaggio o parte di esso
Old 28-09-2007, 19:05   #2
Torav
Senior Member
 
Iscritto dal: Dec 2005
Messaggi: 558
nelle opzioni del progetto devi linkare la libreria .c precompilata oppure aggiungere struttura.c nel progetto. ora sto su linux e non posso dirti esattamente come fare, non mi ricordo
Torav è offline   Rispondi citando il messaggio o parte di esso
Old 28-09-2007, 20:52   #3
sonique
Senior Member
 
Iscritto dal: Jun 2003
Messaggi: 893
Grazie un milione TORAV..
appena hai finito mi dici con Dev come linkare la libreria .c?

Grazie ancoea
sonique è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


HP Imagine 2026: abbiamo visto HP IQ all’opera, ecco cosa può (e non può) fare HP Imagine 2026: abbiamo visto HP IQ all’opera, ...
PNY RTX 5080 Slim OC, sembra una Founders Edition ma non lo è PNY RTX 5080 Slim OC, sembra una Founders Editio...
Wi-Fi 7 con il design di una vetta innevata: ecco il nuovo sistema mesh di Huawei Wi-Fi 7 con il design di una vetta innevata: ecc...
Core Ultra 7 270K Plus e Core Ultra 7 250K Plus: Intel cerca il riscatto ma ci riesce in parte Core Ultra 7 270K Plus e Core Ultra 7 250K Plus:...
PC Specialist Lafité 14 AI AMD: assemblato come vuoi tu PC Specialist Lafité 14 AI AMD: assemblat...
L'industria statunitense non è co...
La NASA cambia strategia per le missioni...
Mike Fincke, l'astronauta che ha avuto u...
I Meta Ray-Ban Display potrebbero non ar...
La serie di God of War ha trovato l'attr...
Il nuovo iPhone Fold si farà atte...
Ex CEO di Intel furioso verso Wall Stree...
Un foglietto di rame e le prestazioni di...
100 agenti AI per dipendente: quello che...
Le 10 migliori offerte del weekend Amazo...
75'' e 85'' QD-Mini LED: 2 TV interessan...
Offerte Amazon sui componenti hardware P...
iOS 27 porterà tante novità...
Tutte le migliori offerte sui robot aspi...
Attenti ai Samsung 990 Pro contraffatti,...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 01:23.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v