将struct复制到函数C中的struct

时间:2015-12-12 11:19:45

标签: c function struct

我有一个小问题,我有一个名为RechercheRH的函数,它接受一个结构的地址并给它一个在文件中找到的值。搜索是正确的,函数传递正确的数据但是当我尝试使用函数外部的数据时,所以在ser.c中例如它没有数据。

所以这是代码:

data.h(结构)

#ifndef DATA
#define DATA

struct Record { 
    int Reference ;
    char Produit[60] ;
    char Stockage[40];
    int  Quantite ;
} ; 

struct Facture
{
    int NumeroFacturation ;
    char NomClient[60] ;
    int DateFacturation ;
    int DateLivraison ;
    int Quantite ;
    int Reference ;
} ;     

#endif

structure.h(包含函数中传递的结构)

#ifndef STRUCTURE
#define STRUCTURE

#include "data.h"

enum TypeRequete {
Question = 1 ,
Achat = 2 ,
Livraison= 3 ,
OK = 4,
Fail = 5
};

struct Requete
{
enum TypeRequete Type ;
char Message[80];
struct Record UnRecord;
};

#endif

ser.c(致电RechercheRH)

/*--------------------------------------
  Herman Vanstapel

  ex02\ser.c 

  Un serveur recevant une structure 
----------------------------------------*/

#include <stdio.h>
#include <string.h>
#include "../udplib/udplib.h"
#include "structure.h"
#include "data.h"
#include "lib.c"

void die(char *s)
{
    perror(s);
    exit(1);
}

int main(int argc,char *argv[])
{
 int rc , res;
 int Desc ;
 char buff[80];
 struct sockaddr_in sthis ; /* this ce programme */
 struct sockaddr_in sos ; /* s = serveur */
 struct sockaddr_in sor ; /* r = remote */

 u_long  IpSocket ;
 u_short PortSocket ;

 int tm ;
 struct Requete UneRequete ;

 memset(&sthis,0,sizeof(struct sockaddr_in)) ;
 memset(&sos,0,sizeof(struct sockaddr_in)) ; 
 memset(&sor,0,sizeof(struct sockaddr_in)) ; 

 printf("Ceci est le serveur\n") ;
 if ( argc!=3)
 {
  printf("ser ser port cli\n") ;
  exit(1) ;
 }

 /* Récupération IP & port   */
 IpSocket= inet_addr(argv[1]);
 PortSocket = atoi(argv[2]);
 // Desc = CreateSockets(&psoo,&psos,,atoi(argv[2]),argv[3],atoi(argv[4])) ;
 Desc=creer_socket(SOCK_DGRAM,&IpSocket,PortSocket,&sthis);

 if ( Desc == -1 )
    die("CreateSockets:") ;
 else
    fprintf(stderr,"CreateSockets %d\n",Desc) ;

 tm = sizeof(struct Requete) ;
 rc = ReceiveDatagram( Desc,&UneRequete ,tm, &sor ) ;
 if ( rc == -1 )
    die("ReceiveDatagram") ;
 else
   fprintf(stderr,"bytes recus:%d Reference:%d\n",rc,UneRequete.UnRecord.Reference ) ;

 printf("Type recu %d\n", UneRequete.Type) ;
 /* attention l'enum peut être codé en short */
 /* reponse avec psos */

**res=RechercheRH("Stock", UneRequete.UnRecord.Reference, &(UneRequete.UnRecord));**

 if(res==0)
 {
     UneRequete.Type = Fail ; 
    strcpy(UneRequete.Message,"Aucune donne correspondante");
    printf("Fail");
 }
 else
 {
     UneRequete.Type = OK ;
     sprintf(buff, "\nRef: %d \nProduit: %s \nStockage: %s", UneRequete.UnRecord.Reference, UneRequete.UnRecord.Produit, UneRequete.UnRecord.Stockage);
    strcpy(UneRequete.Message, buff);
    printf("res: %s",buff);
 }

rc = SendDatagram(Desc,&UneRequete,sizeof(struct Requete) ,&sor ) ;

 if ( rc == -1 )
    die("SendDatagram:") ;
 else
   fprintf(stderr,"bytes envoyes:%d\n",rc ) ;

 close(Desc) ;
}

lib.c(包含RechercheRH)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>


int InitFichierRH (char*);
int RechercheRH(char* ,int  ,struct Record*);
void AfficheRecord(struct Record *);

int InitFichierRH (char* NomFichier)
{
    int err;

    if(access(NomFichier, F_OK)== -1)
    {
        printf("Creation fichier");
        if((err=open(NomFichier, O_CREAT))==-1)
        {
            printf("\nIl y a un probleme: creation fichier");
            return(1);
        }

        if(close(err)==-1)
        {
            printf("\nIl y a un probleme: fermeture fichier");
            return(1);
        }
    }
    return(0);
}


int RechercheRH(char* NomFichier,int Reference ,struct Record *UnRecord)
{   
    int err=0, retour=1;
    struct Record RecCurr;

    if(InitFichierRH(NomFichier)==1) exit(-1);

    if((err=open(NomFichier, O_RDONLY))==-1)
    {
        printf("\nIl y a un probleme: ouverture fichier");
        exit(-1);
    }   

    while(retour>0 && (RecCurr.Reference!=Reference))
                retour=read(err, &RecCurr, sizeof(struct Record));

    if(close(err)==-1)
    {
        printf("\nIl y a un probleme: fermeture fichier");
        exit(-1);
    }

    if(retour==0)
        return 0;

    UnRecord=&RecCurr;

    return 1;
}

1 个答案:

答案 0 :(得分:1)

您必须使用memcpy或逐字段复制struct值。

memcpy(UnRecord,ReCurr,sizeof(* UnRecord));

本声明:

UnRecord=&RecCurr;

仅指定指针,当您离开该函数时,结构ReCurr不再可用。