我有一个小问题,我有一个名为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;
}
答案 0 :(得分:1)
您必须使用memcpy或逐字段复制struct值。
memcpy(UnRecord,ReCurr,sizeof(* UnRecord));
本声明:
UnRecord=&RecCurr;
仅指定指针,当您离开该函数时,结构ReCurr不再可用。