Esecuzione file

di il
4 risposte

Esecuzione file

Salve a tutti ragazzi sono nuovo, vorrei esporre alcuni dubbi in merito all'esecuzione di diversi file, con anche richiami a file header, senza un makefile. espongo brevemente quello che ho fatto io:

ho creato prima di tutto 2 file header,
uno denominato f.h, in cui ho scritto questo:
#pragma once 
#include <stdio.h>

int *creaArray(int d);
//funzione che crea un array


int *copiaInversa(int v[],int n);
//funzione che crea una copia inversa di un array passato come parametro

struct persona{
        char *nome,*cognome;
        short int giorno,mese,anno;
        };
        typedef struct persona Persona;
    
/*definito un "Tipo" Persona, con l'inserimento dell'ultima riga, il modulo chiamante.c potrà
definire nuove variabili semplicemente immettendo prima il "Tipo" Persona e poi <nome variabile>*/

void c_Persona(Persona *p,char *filename);

//funzione che, definito un parametro persona, il campo "nome" verrà completato"
il secondo file header denominato f_1.h ha questa struttura:
#pragma once 
#include "f.h"
#include <stdio.h>

typedef struct{
    Persona p;
    int *voti;
}EsperienzaScolastica;
successivamente ho creato un file.c denominato f.c in cui ho creato il corpo delle funzioni:
#include <stdio.h>
#include <stdlib.h>
#include "f.h"
#include "f1.h"


int *creaArray(int d){
        return (int*)malloc(sizeof(int)*d);
    }
    
    
    
int *copiaInversa(int v[],int n){
        int *risultato=(int*)calloc(n,sizeof(int));
        for (int i=0;i<n;i++){
            risultato[n-1-i]=v[i];
        }
        return risultato;
    }
    
void c_Persona(Persona *p,char *filename){
    FILE *f=fopen(filename,"r");
    if (f==NULL){
        printf("errore nell'apertura del filename\n");
        exit(1);
    }
    char nome[256];
    fscanf(f,"%s",&nome);
    p->nome=nome;
    int ok=fclose(f);
    if (ok!=0){
	printf("errore nella chiusura del file\n");
	exit(1);
	}

}
il programma che deve eseguire ciò che io voglio è chiamato esecuzione.c ed ha questa struttura:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "f.h"
#include "f1.h"

int main(){
    Persona p;
    EsperienzaScolastica p_e;
    char *filename="filename.txt",*filesurname="filesurname.txt";
    c_Persona(p,filename);
    //nel parametro p è stato fissato il nome
    printf("Nome fissato\n");
    
    FILE *f=fopen(filesurname,"r");
    if (f==NULL){
        printf("errore nell'apertura del filesurname\n");
        exit(1);
    }
    char cognome[256];
    fscanf(f,"%s",&cognome);
    p->cognome=cognome;

   
    
    //nel parametro p è stato fissato il cognome
    
    printf("Cognome fissato\n");
    
    short int giorno,mese,anno;
    fscanf(f,"%hd",giorno);
    fscanf(f,"%hd",mese);
    fscanf(f,"%hd",anno);
    p->giorno=giorno;
    p->mese=mese;
    p->anno=anno;
    
    //giorno, mese e anno fissati
    
    printf("giorno, mese e anno fissati\n");
    int d;
    p_e->p=p;
    //immesso nel tipo Esperienze scolastiche, alla prima voce, la p definita fino a questo punto
    
    fscanf(f,"%d",&d);
    int *v=creaArray(d);
    for (int j=0;j<d;j++){
        fscanf(f,"%d",&v[j]);
    }
    
    p_e->voti=copiaInversa(v,d);
    
    //adesso nel p_e ci stanno sia i dati della persona che i voti presi durante l'anno scolastico
    
    printf("Nome: %s\nCognome: %s\nGiorno di nascita: %hd\nMese di nascita: %hd\nAnno di nascita: %hd\nVoti scolastici:\n",p_e.p.nome,p_e.p.cognome,p_e.p.giorno,p_e.p.mese,p_e.p.anno);
    for (int k=0;k<d;k++){
        printf("%d\n",p_e.voti[k]);
    }
    
    int ok=fclose(f);
    if (ok!=0){
        printf("errore nella chiusura del file\n");
        exit(1);
    }
    return 0;
}
dove i file di testo "filename" e "filesurname" sono rispettivamente:
Mario
e
Rossi
7 3 1996
8 6 9 5 4
il compito di esecuzione.c è quello di prendere dai file "filename.txt" e "filesurname.txt", il nome, cognome, giorno mese anno di nascita e voti scolastici scritti dall'ultimo al primo durante 5 anni di attività scolastica e stamparli.

ora premettendo che è la prima volta che mi cimento nello scrivere delle struct e anche file header, può darsi che abbia sbagliato diverse cose, senza un makefile ho voluto creare prima di tutti il file oggetto f.o, tuttavia mi da un errore che non riesco a comprendere:
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 0 has invalid symbol index 11
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 1 has invalid symbol index 12
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 2 has invalid symbol index 2
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 3 has invalid symbol index 2
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 4 has invalid symbol index 11
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 5 has invalid symbol index 13
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 6 has invalid symbol index 13
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 7 has invalid symbol index 13
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 8 has invalid symbol index 12
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 9 has invalid symbol index 13
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 10 has invalid symbol index 13
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 11 has invalid symbol index 13
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 12 has invalid symbol index 13
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 13 has invalid symbol index 13
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 14 has invalid symbol index 13
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 15 has invalid symbol index 13
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 16 has invalid symbol index 13
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 17 has invalid symbol index 13
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 18 has invalid symbol index 13
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 19 has invalid symbol index 21
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_line): relocation 0 has invalid symbol index 2
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status
sinceramente non so come devo agire o cosa fare, se qualcuno può darmi delle dritte sarei molto grato.

4 Risposte

  • Re: Esecuzione file

    Non si tratta di un errore di esecuzione ma di compilazione.

    Quale linea di comando hai usato per compilare?
  • Re: Esecuzione file

    g++ f.c -o f
  • Re: Esecuzione file

    Ma non puoi ottenere un eseguibile se non c'è il main

    Devi compilare tutti i file .c compreso quello del main
  • Re: Esecuzione file

    Hai ragione stupido io... comunque grazie per il tempo, gentilissimo.
Devi accedere o registrarti per scrivere nel forum
4 risposte