//header file
#ifndef STRUCT_H_INCLUDED
#define STRUCT_H_INCLUDED
typedef struct curs_valutar
{
    char nume[50];
    float cursul;
    struct curs_valutar* next;
    struct curs_valutar* next2;
}curs_val;

curs_val *head=NULL;

int sc=0;
int n;

int creare(int n);
void introducere_date();
int citire_date_fisier(char nume_fisier[100]);
void afisare_date();
void eliberare_memorie();
int adaugare_date(char c_nume[100],float cursul);
void cautare_date(char sir[100]);
void cautare_date_in(int val1, int val2);
void interschimbare(curs_val *a, curs_val *b);
void sortare(int n);
void modificare_date(char c_nume[100]);
int salvare_date(char nume_fisier[100]);
#endif // STRUCT_H_INCLUDED




//function.


#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include "struct.h"


int creare(int n)
{ curs_val *valuta,*valuta2;
  int i; float aux; char numele[100];
  for(i=0; i<n; i++)
    {valuta=(curs_val*)malloc(sizeof(curs_val));
     if (valuta==NULL)
     return 0;
     if(i==0)
     head=valuta;
     else valuta2->next=valuta;
     valuta2=valuta;}
     valuta->next=NULL;}

void introducere_date()
{curs_val *c;
 int i=0;
 c=head;
 while(c)
{printf("\nIntroduceti datele pentru valuta %d:\n", i+1);
 printf("Nume:"); scanf("%s", &c->nume);
 scanf("%f", &c->cursul);
 printf("\n");
 c=c->next;
 if(c==head)
 break;
 i++;}
getch();
return;
}
// introducerea datelor

//functia de citire a datelor din fisier
int citire_date_fisier(char nume_fisier[100])
{curs_val*c;
 FILE *fisier;
 fisier=fopen(nume_fisier,"r");
 if(fisier==NULL)
{printf("\nEroare la deschiderea fisierului!!!");
 getch();
 return 0;}
else
 {c=head;
  fscanf(fisier,"%i", &n);
  if(n==0)
  {printf("!!! Structura nu contine elemente.\n");
   getch();}
else
  {for(int i=0;i<n;i++)
    {fscanf(fisier,"%s", &c->nume);
     fscanf(fisier,"%f", &c->cursul);
     c=c->next;
     if(c==head)
     break;}
fclose(fisier);
printf("\n\n                Datele au fost citite cu succes.");}}
getch();
return 1;}
//functia de citire a datelor din fisier
void afisare_date()
{
curs_val *c;
int i=1;
c=head;
printf("\n\n\n\t ***** Baza initiala este *****\n\n");
printf("\t----------------------------------\n");
printf("\t|  Numele Valutei| Cursul Valutei|\n\n");

while(c)
{printf("\t%12s", c->nume);
 printf("  %14f", c->cursul);
 printf("\n");
 c=c->next;  i++;
 if(c==head)
  break;}
printf("\t|--------------------------------|");
getch();
return;}
// afisarea datelor
//eliberare memorie
void eliberare_memorie()
{curs_val *c, *p;
c=head;
while(c)
{p=c;
 c=c->next;
 free(p);
 if(c==head)
  break;}
head=NULL;
n=0;
printf("\n\nEliberarea memoriei a fost executata cu succes.");
}
//eliberare memorie
//adaugare date
int adaugare_date(char c_nume[100],float cursul)
{curs_val *a, *c;
a=(curs_val*)malloc(sizeof(*a));
if(c==NULL)
return 0;
else
{c=head;
 while(c->next!=NULL)
 c=c->next;
 c->next=a;}
strcpy(a->nume,c_nume);
a->cursul=cursul;
a->next=NULL;
n++;
return 1;}
//adaugare date
//cautare date
void cautare_date(char sir[100])
{curs_val *c;
c=head;
while(c)
{
 if(strcmp(c->nume,sir)==0)
 {
  printf(" %s", c->nume); printf(" ");
  printf("%f", c->cursul);printf("\t\n");}
 c=c->next;
 if(c==head)
  break;}}
//cautare date
void cautare_date_in(int val1, int val2)
{curs_val *c;
 c=head;
 while(c)
{if(val1==3 && c->cursul==val2)
 {
  printf("%s", c->nume); printf(" ");
  printf("%f", c->cursul);printf("\t\n");}
 c=c->next;
 if(c==head)
 break;}}
//cautare date
// interschimbare
void interschimbare(curs_val *a, curs_val *b)
{
curs_val *na, *nb;
curs_val t;
na=a->next;
nb=b->next;

t=*a;
*a=*b;
*b=t;
a->next=na;
b->next=nb;
}
// interschimbare


//sortare date
void sortare(int n)
{int i,k;
curs_val *a,*b;
if(!head)
{puts("Nu este corect, incercati din nou!"); getch();
return;}
else
{if (sc==0)
        {
            for(i=0;i<n;i++)
            {
                a=head;
                b=a->next;
                for(k=0;k<n-1-i;k++)
                {
                    if(strcmp(a->nume, b->nume)>0)
                    {
                        interschimbare(a,b);
                    }
                    a=a->next;
                    b=b->next;
                }
            }
        }
        else
        {
            for(i=0;i<n;i++)
            {
                a=head;
                b=a->next;
                for(k=0;k<n-1-i;k++)
                {
                    if(strcmp(a->nume, b->nume)>0)
                    {
                        interschimbare(a,b);
                    }
                    a=a->next;
                    b=b->next;
                }
            }
        }
    }
    puts("Sortarea a avut loc cu succes!");getch();
}
//sortare date
//modificare date
void modificare_date(char c_nume[100])
{
curs_val *c; c=head;
int den_k=0;
char optiune[2];
int confirmare;
printf("Doriti sa modificati numele unei valute?(1/0)?:");
scanf("%i",&confirmare);
if(confirmare==1)
{
 while(c)
 { if(strcmp(c->nume,c_nume)==0)
  {
     den_k=1;
  printf("\n\nDoriti sa modificati numele valutei (da/nu)?:");
  scanf("%s", &optiune);
  if(strcmp(optiune,"da")==0)
  {
   printf("\nIntroduceti denumirea noua a valutei:");
   scanf("%s", &c->nume);
   printf("\nModificarea numelui valutei a avut loc cu succes.");}
  goto iesire;
  }
  c=c->next;
  if(c==head)
   break;
 }
}
iesire:
getch();
}

//modificare date
//functia de salvare a datelor din structura
int salvare_date(char nume_fisier[100])
{ curs_val *c;
 FILE *fisier;
 if((fisier=fopen("baza.txt","w+b"))==NULL)
  printf("\nEroare la deschiderea fisierului!!!");
 else
 {c=head;
  fprintf(fisier,"%i", n);      fprintf(fisier,"\n");
  while(c)
  {
   fprintf(fisier,"%s", c->nume); fprintf(fisier," ");
   fprintf(fisier,"%f", c->cursul); fprintf(fisier," ");
   fprintf(fisier,"\n");
   c=c->next;
   if(c==head)
    break;}
  fclose(fisier);
  printf("\n\n          Datele au fost salvate su succes.");}
getch();
return 1;
}

//main

#include "coduri functie.c"

void main()

{ curs_val *cautat;
  int i,n,lista,q;

do{
//afisam meniul
  m0: system("cls");
      printf("\n\t\t***MENIU***\n\n");
      printf("\t1: Comletarea bazei de date.\n");
      printf("\t11: Citirea bazei de date din fisier\n");
      printf("\t2: Afisarea bazei de date\n");
      printf("\t22: Eliberearea memorie\n");
      printf("\t3: Introducerea unoi no inscrieri\n");
      printf ("\t4: Cautarea cursului dupa denumirea valutei\n");
      printf("\t5: Cautare valutei dupa curs\n");
      printf("\t6: Sortare dupa nume\n");
      printf("\t7: Sortare dupa curs\n");
      printf("\t8: MOdificare valutei\n");
      printf("\t9 Salvarea informatiei");
      printf("\t10: Iesire\t\t");
      scanf("%d",&q);
          switch(q)
      {
          case 1:{
                     printf("Culegem nr de valute: ");
                     scanf("%d",&n);
                     lista=creare(n);
                     introducere_date();
                     printf("Pentru iesire tastati Enter");
                     getch();
                     break;}
         case 11:{  system("cls");
                    char nume_fisier[100];
                    printf("\n\nIntroduceti denumirea fisierului de unde vor fi citite datele:");
                    scanf("%s",&nume_fisier);
                    FILE *fisier;
                    fisier=fopen("baza.txt","r+b");
                    fscanf(fisier,"%i", &n);
                    lista=creare(n);
                    fclose(fisier);
                    citire_date_fisier(nume_fisier);
                    getch();
                    break;}
          case 2:{  system("cls");
                    afisare_date();
                    getch();break;}

          case 22:{ system("cls");
                    eliberare_memorie();
                    getch();
                    break;}

          case 3:  {system("cls");
                    int adaug;
                    char nume[100];
                    float cursul;
                    printf("\n\nAdaugarea unei valute noi:\n");
                    printf("Nume:"); scanf("%s", &nume);
                    scanf("%f", &cursul);
                    adaug=adaugare_date(nume,cursul);
                    getch();break;}
           case 4: {
                      system("cls");
                      char nume[100];
                      printf("\n\nCautare valuta dupa nume:\nNumele valutei ce va fi cautat: ");
                      scanf("%s",&nume);
                      cautare_date(nume);
                      getch();
                      break;}

           case 5:  {
                     system("cls");
                     float curs;
                     printf("\n\nCautare valutei dupa curs:\nIntroduceti cursul:");
                     scanf("%f",&curs);
                     cautare_date_in(2,curs);
                     getch();
                     break;}

           case 6: { system("cls");
                     sortare(n);
                     getch();
                     break;}


           case 8:{   system("cls");
                      char nume[100];
                      printf("\n\nModificare valuta dupa nume:\nNumele valutei ce va fi modificat:");
                      scanf("%s",&nume);
                      modificare_date(nume);
                      getch();

                      break;}
           case 9: {system("cls");
                    char nume_fisier[100];
                    printf("\nSalvarea datelor...\nIntroduceti denumirea fisierului unde vor fi salvate datele:");
                    scanf("%s",&nume_fisier);
                    salvare_date(nume_fisier);
                    getch();

                    break;}

              case 10: goto iesire;  }


          } while(q!=0);
          iesire: getch();}

Dani AI

Generated

Short diagnosis for : the linker "multiple definition" errors almost always come from two things seen in the thread — a .c file being #included into another source file, and global variables being defined in a header. is correct: do not #include a .c file. The preprocessor will paste the entire source into the including file, so when you compile/link the real .c file as well you end up with the same functions and globals defined twice.

Practical fixes (concrete, minimal changes):

  • Remove the #include "coduri functie.c" from main; include only headers.
  • Keep typedefs and prototypes in the header, but change any globals into extern declarations in the header and put their single definition in one .c file.

Example pattern (header):

/* struct.h */
#ifndef STRUCT_H_INCLUDED
#define STRUCT_H_INCLUDED

typedef struct curs_valutar { /* fields */ } curs_val;

/* prototypes */
int creare(int n);
/* ... other prototypes ... */

/* declare globals only */
extern curs_val *head;
extern int sc;
extern int n;

#endif

And in one source file (coduri_functie.c):

#include "struct.h"

curs_val *head = NULL;
int sc = 0;
int n = 0;

/* function implementations here */

Build workflow and tips: compile each .c and link, or let GCC compile and link in one step:

  • gcc -Wall -Wextra -c coduri_functie.c
  • gcc -Wall -Wextra -c main.c
  • gcc coduri_functie.o main.o -o program
    or simply: gcc -Wall -Wextra main.c coduri_functie.c -o program

Other checks: use int main(void) (return 0), avoid defining globals in headers, use static for functions/variables that must be private to one .c, and fix unsafe scanf usages (use width limits and pass arrays without &). The linker's error text names the duplicate symbol and which object files define it — that output tells exactly where to remove the extra definition.

Recommended Answers

All 2 Replies

Ok, which functions and line numbers are you talking about?

include "coduri functie.c"

Never, ever, for any reason include one *.c file in another. If your program uses more than one *.c file then compile each one separately and link them both together along with any libraries to create the final executable file. How to do that depends on the compiler you are using.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.