Creare e usare propria libreria C

PatrickJane

Nuovo Utente
54
1
Salve seguendo delle spiegazioni e esercizi di una specie di manuale del C mi fa fare una cosa del genere:
1c.JPG 2c.JPG 3c.JPG

Mi da un esempio di libreria creata da me con delle funzioni che poi userò normalmente nei "programmi c" per fare velocemente i calcoli (solo un esercizio), il problema è che i file li ho messi tutti dentro la stessa cartella ma quando faccio partira il programma che utilizza la libreria facendo un calcolo, mi da scritte strano e in pratica penso dica che non trova la libreria, o almeno sembra che dice nel percorso temp (qualcosa del genere) non trova la libreria ma io non capisco dove devo metterle.
 

signore del tempo

Utente Èlite
3,228
491
CPU
Intel Core i5 4670K
Scheda Madre
Asus Z87-Plus
HDD
WD Caviar Green 500GB
RAM
G.Skill Ares 2x4GB 1600MHz
GPU
Sapphire 7850 1GB @ 1050MHz
Audio
Integrata
Monitor
Acer V193w
PSU
XFX ProSeries 550W Core Edition
Case
CM HAF 912 plus
OS
ArchLinux + KDE - Windows 10
int calcProdotto(int a, b) è sbagliato, dovrebbe essere
Codice:
(int a, int b)
Le inclusioni con ifndef dovrebbero essere in maiuscolo per convenzione.
Codice:
ifndef FUNZIONIMATEMATICHE_H
define ...
In caso ci siano altri problemi, porta un esempio di i/o. Comunque come esempio è alquanto inefficiente, anche se si definissero come inline.
Infine puoi semplificare nella main()
Codice:
printf("Risultato addizione: %i\n", calcSomma(..., ...);
 

PatrickJane

Nuovo Utente
54
1
grazie non avevo visto quei piccoli errori, solo che non funziona lo stesso, dal terminale mi arriva questo codice:
Cattura.JPG

il problema che non capisco è dove devo salvare i file della libreria.c e .h io li ho messi nella stessa cartella del file c dove sto lavorando ma non cambia, avevo visto su un sito che diceva che dovevo compilare la libreria.c farla diventare .o e poi eseguirla come .a solo che se lo faccio non so dov'è il file .o
 

signore del tempo

Utente Èlite
3,228
491
CPU
Intel Core i5 4670K
Scheda Madre
Asus Z87-Plus
HDD
WD Caviar Green 500GB
RAM
G.Skill Ares 2x4GB 1600MHz
GPU
Sapphire 7850 1GB @ 1050MHz
Audio
Integrata
Monitor
Acer V193w
PSU
XFX ProSeries 550W Core Edition
Case
CM HAF 912 plus
OS
ArchLinux + KDE - Windows 10
È un errore del linker, prova con l'opzione -L e cercando su google.
 

PatrickJane

Nuovo Utente
54
1
Non so ho provato di tutto non cambia niente, ho provato ad usare dev-c++ (prima usavo solo notepad++) e mi compila tutte le librerie perfettamente (e' un altro esercizio però, non è quello che ho messo sopra) e mi fa uscire questo:

i:\gw\lib\crt2.o(.text+0x8) In function `_mingw_CRTStartup':
[Linker error] undefined reference to `__dyn_tls_init_callback'
[Linker error] undefined reference to `__cpu_features_init'

i:\gw\lib\crt2.o(.text+0x8) ld returned 1 exit status

C:\Users\*******\Desktop\BattNav\Makefile.win [Build Error] ["Battaglia] Error 1

Non capisco cosa voglia dire, ho capito che il problema non è il file creato da me ma è nel mingw (quello che legge le librerie e i file c in windows)

ho provato a farlo compilare da dev-c++, da me con terminale ho cercato su internet ma niente.

Se il problema è il linker, l'opzione -L non ho capito come si usa cio'è dovrei tipo scrivere gcc DatiGlobali.h -L ..\Desktop\BattMav è così?
IL fatto è che tutti gli altri file con libreria .h funzionano ma questo (datiglobali non deve avere il file.c c'è solo il file.h solo che non compila o non so cosa devo fare, non posso mettere il file DatiGlobali.c perchè sarebbe un foglio bianco inutile)

Se non avete capito niente ditemelo che vi metto tutto il programma che sto cercando di fare (una battaglia navale, con l'aiuto ovviamente di un programmatore che mi spiega passo passo cosa devo fare e mi insegna).
 

signore del tempo

Utente Èlite
3,228
491
CPU
Intel Core i5 4670K
Scheda Madre
Asus Z87-Plus
HDD
WD Caviar Green 500GB
RAM
G.Skill Ares 2x4GB 1600MHz
GPU
Sapphire 7850 1GB @ 1050MHz
Audio
Integrata
Monitor
Acer V193w
PSU
XFX ProSeries 550W Core Edition
Case
CM HAF 912 plus
OS
ArchLinux + KDE - Windows 10
Hai un insegnante e non chiedi a lui? :rolleyes:
Posta il sorgente, provo a compilarlo.
 

PatrickJane

Nuovo Utente
54
1
No, la cosa è più complica di quello che sembra e non posso chiederli questa cosa (anche perché adesso non è in italia e non posso contattarlo).
I file sono questi:
1.JPG 2.JPG Cattura.JPG

Il problema sta nel primo (quello datiglobali.h) che non c'è il file .c perché non ne ho bisogno dato che li devi dichiarare e non ci sono funzioni da scrivere in un file .c, solo che tutti gli altri file funzionano ma solo quel DatiGlobali.h da' problemi ho visto che (nel video di dimostrazione) funziona (però utilizza un mac io invece ho un windows, forse le procedure sono un pochino diverse ma non riesco a capire quale sia il problema) cioè alla fine deve fare una cosa semplicissima scrivere su schermo quel menu, ma perché da' problemi?
 

signore del tempo

Utente Èlite
3,228
491
CPU
Intel Core i5 4670K
Scheda Madre
Asus Z87-Plus
HDD
WD Caviar Green 500GB
RAM
G.Skill Ares 2x4GB 1600MHz
GPU
Sapphire 7850 1GB @ 1050MHz
Audio
Integrata
Monitor
Acer V193w
PSU
XFX ProSeries 550W Core Edition
Case
CM HAF 912 plus
OS
ArchLinux + KDE - Windows 10
Io intendevo i sorgenti come testo semplice, non come screenshot. Li selezioni, copi ed incolli nei tag
Codice:
 col simbolo # nell'editor avanzato.
 

PatrickJane

Nuovo Utente
54
1
File main.c:

#include "main.h"
#include <stdio.h>


int main()
{

leggiMenu();


return 0;
}


void leggiMenu(){


printf("%s", mess_intro);
printf("%s", mess_menu);
}

file main.h:

#ifndef MAIN_H_
#define MAIN_H_


#include "DatiGlobali.h"


//PROTOTIPI FUNZIONI PUBBLICHE
void leggiMenu(void);


//PROTOTIPI FUNZIONI PRIVATE


#endif

file datiglobali.h:

#ifndef DATIGLOBALI_H_
#define DATIGLOBALI_H_


const char *const mess_menu = " 1) Umano vs Computer\n\n"
" 2) Umano vs Umano\n\n"
" 3) Umano vs UMano (Online)\n\n"
" 4) Credits\n\n"
" 0) Esci\n\n\n\n";


const char *const mess_intro = "BATTAGLIA NAVALE - MENU DI GIOCO\n\n";


#endif

Una domanda: Sto impazzando, voi che ide usate? ho provato dev-c++, adesso visual studio, voi quale mi consigliate? o faccio con un semplice editor e poi compilo io(usando notepad++)?
 

signore del tempo

Utente Èlite
3,228
491
CPU
Intel Core i5 4670K
Scheda Madre
Asus Z87-Plus
HDD
WD Caviar Green 500GB
RAM
G.Skill Ares 2x4GB 1600MHz
GPU
Sapphire 7850 1GB @ 1050MHz
Audio
Integrata
Monitor
Acer V193w
PSU
XFX ProSeries 550W Core Edition
Case
CM HAF 912 plus
OS
ArchLinux + KDE - Windows 10
Per favore usa il tag
Codice:
 

PatrickJane

Nuovo Utente
54
1
file main.c
Codice:
#include "main.h"
#include <stdio.h>


int main()
{
	
	leggiMenu();


	return 0;
}


void leggiMenu(){


	printf("%s", mess_intro);
	printf("%s", mess_menu);
}

file main.h
Codice:
#ifndef MAIN_H_
	#define MAIN_H_


#include "DatiGlobali.h"


//PROTOTIPI FUNZIONI PUBBLICHE
void leggiMenu(void);


//PROTOTIPI FUNZIONI PRIVATE


#endif

file datiglobali.h
Codice:
#ifndef DATIGLOBALI_H_
	#define DATIGLOBALI_H_


const char *const mess_menu = " 1) Umano vs Computer\n\n"
							  " 2) Umano vs Umano\n\n"
							  " 3) Umano vs UMano (Online)\n\n"
							  " 4) Credits\n\n"
							  " 0) Esci\n\n\n\n";


const char *const mess_intro = "BATTAGLIA NAVALE - MENU DI GIOCO\n\n";


#endif

quale ide usate per il c? o usate un semplice editor(tipo notepad++)?
 

signore del tempo

Utente Èlite
3,228
491
CPU
Intel Core i5 4670K
Scheda Madre
Asus Z87-Plus
HDD
WD Caviar Green 500GB
RAM
G.Skill Ares 2x4GB 1600MHz
GPU
Sapphire 7850 1GB @ 1050MHz
Audio
Integrata
Monitor
Acer V193w
PSU
XFX ProSeries 550W Core Edition
Case
CM HAF 912 plus
OS
ArchLinux + KDE - Windows 10
main.c
Codice:
#include "datiglobali.h"
#include <stdio.h>


void leggiMenu(void);


int main (void)
{
  
  leggiMenu();
  
  return 0;
}




void leggiMenu(void)
{
  printf("%s\n%s", mess_intro, mess_menu);
  
  
  
}

datiglobali.h
Codice:
#ifndef DATIGLOBALI_H
#define DATIGLOBALI_H


const char *mess_menu="1) Umano vs Computer\n\n2) Umano vs Umano\n\n3) Umano vs UMano (Online)\n\n4) Credits\n\n0) Esci\n";
const char *mess_intro="BATTAGLIA NAVALE - MENU DI GIOCO\n\n";


#endif
Confronta e vedi dove hai sbagliato. Ho fatto molte correzioni/ottimizzazioni, te ne elenco solo qualcuna:
-È inutile usare due printf contigue;
-È inutile usare main.h per un solo prototipo di funzione;
-È inutile usare const char * quando puoi far stampare direttamente (conosci il contenuto, sarebbe uno ""spreco"" di memoria). Puoi invece usarlo quando devi stampare più volte il risultato da diverse parti del programma (te l'ho lasciato comunque)
-È inutile usare una funzione per stampare due valori. In caso parlassimo di classi e dunque diritti d'accesso sarebbe un altro discorso.
...
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili