Avatar billede mollmannj Nybegynder
28. oktober 2002 - 12:58 Der 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!!!
Avatar billede mickni33 Nybegynder
28. oktober 2002 - 13:31 #1
kan du ikke vise lidt kode der hvor du gemmer og henter data ind.
Og måske dine klasse erklæringer
Avatar billede mollmannj Nybegynder
28. oktober 2002 - 13:45 #2
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...
Avatar billede mickni33 Nybegynder
28. oktober 2002 - 15:37 #3
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
}
Avatar billede mollmannj Nybegynder
28. oktober 2002 - 15:44 #4
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?????
Avatar billede mickni33 Nybegynder
28. oktober 2002 - 15:51 #5
ååårhhh tror jeg har den
du skal lave den 'formel' her
værdi=værdi+nypris;

eller i dit program
lager[r].pris=lager[r].pris+nypris;

så behøver du ikke det der temp, men bruger bare lager[r].pris
som nu har den opdateret pris
prøv lige det som er skrevet herunder

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;

}
Avatar billede mollmannj Nybegynder
28. oktober 2002 - 16:04 #6
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???????????????????
Avatar billede mickni33 Nybegynder
28. oktober 2002 - 17:08 #7
prøv at sætte et & tegn i din funktion så den ændrer i adressen

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;

}
Avatar billede mickni33 Nybegynder
28. oktober 2002 - 17:12 #8
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
Avatar billede mollmannj Nybegynder
28. oktober 2002 - 17:19 #9
funktions kaldet skiftpris(int& nypris) kan ikke lade sig gøre i Linux C.

Så jeg er stadig lidt i vildrede!!!!
Avatar billede mickni33 Nybegynder
28. oktober 2002 - 17:21 #10
hvorfor det ??
Avatar billede mollmannj Nybegynder
28. oktober 2002 - 17:27 #11
man kan ikke bare skrive int& nypris(eller hvad man nu har løst til at skrive), da compileren ikke vil acceptere det, og komme med en parse error.
Avatar billede mickni33 Nybegynder
28. oktober 2002 - 17:56 #12
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
Avatar billede mickni33 Nybegynder
28. oktober 2002 - 18:03 #13
en lille fejl der skal være en int retur

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);
}
Avatar billede segmose Nybegynder
29. oktober 2002 - 08:59 #14
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.
Avatar billede soepro Nybegynder
07. november 2002 - 13:33 #15
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.)
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester