28. oktober 2002 - 12:58Der er
13 kommentarer og 2 løsninger
problemer med ændring i array i linux C(client/server)
Jeg har tre filer, en hvor mine funktioner, en client fil og en server fil. server filen og funktionsfilen er forbundet med en headerfil. Meningen med mit program er, at det starter op med at læse nogle værdier ind i et struct array, og man skal så kunne ændre disse værdier mens programet kører.
Hvis man ændrer værdierne i arrayet fra en main metode i funktionsfilen går det helt fint men hvis man gør det fra serverfilen "glemmer" den ændringerne!!! et lille eks: variable: varenr: 1 pris: 500 ændring.......+50 varenr: 1 ny pris 550 ændring......-50 varenr: 1 ny pris: 450 Jeg forstår ikke det her, da det hele virker fint, så længe man kører det med en main i funktionsfilen, men ovenstående problem opstår altså hvis man kører det fra serverfilen!!!! hjælp!!!
i funktioner.c struct vare {int varenr; int pris; } struct vare lager[100]; læs() { int n; n=0; FILE *fid fid=fopen("lager.txt","rt"); while(!feof(fid)) { fscanf(fid,"%d\n",lager[n].varenr); fscanf(fid,"%d\n",lager[n].pris); n++ } alle værdier er nu i arrayet jeg vil så gerne ændre på prisen i vare nr 1 det gør jeg med min funktion skiftpris. har først en funktion der søger arrayet igennem og retunerer pladsen på det søgte varenr, og den virker fint, så den undlader jeg at skrive
skiftpris(int nypris) int r,temp1; r=soegarray(varenr); //r bliver pladsen for det valgte varenummer i arrayet temp1=lager[r].pris+nypris; lager[r].pris=temp1; } ovenstående funktion virker fint nok, hvis man kalder den fra main i selve filen funktioner.c men hvis man klader den fra filen server.c, bliver prisen ændret, men hvis man prøver at ændre den igen, er prisen det som den var til at starte med. spørg endelig hvis det jeg skriver ikke helt giver mening, men det er lidt svært at forklare...
prøv at lave nogle printf for at se om det er de rigtige tal der bliver lagt sammen. på den måde kan man måske udelukke nogle fejl og måske find frem til hvornår variablen skifter værdi. bruger meget selv denne metode når jeg har fejl.
skiftpris(int nypris) int r,temp1; r=soegarray(varenr); //r bliver pladsen for det valgte varenummer i arrayet lav en printf af r her lav en printf af nypris her lav en printf af lager[r].pris her og en af temp; temp1=lager[r].pris+nypris; lager[r].pris=temp1; lav en printf af lager[r].pris }
Jeg har testet videre på den, og problemet ligge i server filen, hvor man har følgende. Server filen står og kører nonstop med en "while(running)", og man kan så ved at sende int værdier til den fra client filen, for den til at f.eks ændre en værdi. besked.type bliver sendt fra clienten if(besked.type==1) { skiftpris(besked.pris); } hvis man taster "1" i clinten, og indtaster en pris f,eks 50, og derefter for udskrevet array'et så er prisen ganske rigtigt, blevet 50 større, men hvis man så taster "1" igen i clienten, og f.eks vælger 50 igen, såer prisen stadigvæk kun "50" større end den pris vi havde til at starte med, og den burde jo være 100 større?????
Det hjalp ikke når jeg tester på det, og kører første gang altså besked.type=1 nypris=50 først for jeg den til at skrive ud hvilket varenr den har fundet: og hvilken ny pris varen har Fundet: varenr 1: pris=50 nypris=100 derefter for jeg den til at skrive hele arrayet ud, og den nye pris er ganske rigtig den gamle pris +50. derfetr laver jeg en ny besked.type=1: nypris=50. nu skriver den følgende ud, og det er her det går galt fundet: varenr 1 pris:50!!!!!!!!!!!!!!!!!!!!???????????????????????? nypris:100 det er som om den bliver ved med at kigge på det "gamle" array, selvom den fint nok skriver arrayet ud efter første ændring, med den nye pris???????????????????
når du forlader denne funktion så eksisterer lager[r].pris variablen ikke mere dvs at du skal ændre den på dens adresse, bruge pointer, så du kan bruge ændringerne i hele programmet
Så prøv med der hvor du kalder skiftpris(int nypris)
int nyværdi=skiftpris(en variable);
og så i din funktioner.c
skiftpris(int nypris) int r,temp1; r=soegarray(varenr); //r bliver pladsen for det valgte varenummer i arrayet lager[r].pris=lager[r].pris+nypris; return (lager[r].pris); }
på den måde bliver den nyeværdi sendt tilbage til det sted hvor der bliver kaldt. Herfra kan du så arbejde videre med den eventuelt sende den til en funktion som udskriver beløbet
int skiftpris(int nypris) int r,temp1; r=soegarray(varenr); //r bliver pladsen for det valgte varenummer i arrayet lager[r].pris=lager[r].pris+nypris; return (lager[r].pris); }
Du overføre nypris (ændringen hvis jer forstår dig rigtigt) som parameter men ikke varenr, er varenr en global variable? Umiddlebart kunne jeg tænke på følgende der kunne være galt: Uinitialiserede variable (varenr) Genindlæsning af prisfilen mellem hvert gennemløb (lager) Overskrivning af gemte værdier, hvis du har to processer der begge skriver til samme fil kan den ene overskrive med gamle data.
mollmanj >> Mangler vi ikke noget information her ? Kører dit client o dit server program samtidigt ? Starter de hver for sig op med at læse filen, og så arbejde på det ?
Hvis det er tilfældet, så er det jo derfor at de ikke fungere ! Problemet er jo så at klienten ikke opdager serverens ændringer og omvendt. (Normalt er det det man bruger IPC - InterProcess Communication til.)
Du kan løse problemet på en af to måder:
A) Begge processer læser filen, laver ændringerne og skriver filen igen. Hver gang der laves en ændring, startes med at læse filen ! Du kan evt. lægge et "revisionsnummer" i starten af filen, som processrne kan checke - så kan de se om filen er blevet ændret siden sidst de læste den. (Idet du så tæller revisionstælleren op hver gang du opdaterer filen.)
B) Lav klient og server som tråde i samme program. Tråde kan dele fælles global hukommelse - dog skal du bruge f.eks. Synchronize() metoden til at sikre at de to tråde ikke piller ved dataene på samme tid. (Det er i den situation man også kunne bruge semaforer - prøv at checke de svar omkring semaforer der har været den sidste uges tid.)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.