/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
newbie: lvalue
Fra : Martin Fæster


Dato : 06-12-03 15:33

Hej jeg henter en tekststreng fra disken og gemmer i variablen navn. Turbo
c++.
når jeg vil lave en if sætning til at skrive noget efter om der står dk
eller usa i navn, så siger den lvalue required.
Det kan udskrive indholdet på skærmen men hvad skal der laves for at det
vil?

/* udpluk af programmet */
fscanf(plad_fil, "%s", &navn );
gotoxy(1,30);
printf("Tegnsæt %s", navn);
fclose(plad_fil);
/* begynd tegnsæt */
if (navn=(dk))
gotoxy(50,17);
printf("hej");

--


Mvh.
Martin Fæster



 
 
Mads Sejersen (06-12-2003)
Kommentar
Fra : Mads Sejersen


Dato : 06-12-03 15:49

In article <OMlAb.10461$7j4.7834@news.get2net.dk>, Martin Fæster wrote:
> Hej jeg henter en tekststreng fra disken og gemmer i variablen navn. Turbo
> c++.
> når jeg vil lave en if sætning til at skrive noget efter om der står dk
> eller usa i navn, så siger den lvalue required.
> Det kan udskrive indholdet på skærmen men hvad skal der laves for at det
> vil?
>
> /* udpluk af programmet */
> fscanf(plad_fil, "%s", &navn );
> gotoxy(1,30);
> printf("Tegnsæt %s", navn);
> fclose(plad_fil);
> /* begynd tegnsæt */
> if (navn=(dk))
^^^^^^^^^

Prøv at kigge på strcmp og tilsvarende funktioner. Eller brug std::string,
når nu du alligevel bruger C++

Mvh. Mads Sejersen

Bertel Brander (06-12-2003)
Kommentar
Fra : Bertel Brander


Dato : 06-12-03 16:48

Mads Sejersen wrote:
> In article <OMlAb.10461$7j4.7834@news.get2net.dk>, Martin Fæster wrote:
>
>>Hej jeg henter en tekststreng fra disken og gemmer i variablen navn. Turbo
>>c++.
>>når jeg vil lave en if sætning til at skrive noget efter om der står dk
>>eller usa i navn, så siger den lvalue required.
>>Det kan udskrive indholdet på skærmen men hvad skal der laves for at det
>>vil?
>>
>>/* udpluk af programmet */
>>fscanf(plad_fil, "%s", &navn );
>> gotoxy(1,30);
>> printf("Tegnsæt %s", navn);
>> fclose(plad_fil);
>>/* begynd tegnsæt */
>> if (navn=(dk))
>
> ^^^^^^^^^
>
> Prøv at kigge på strcmp og tilsvarende funktioner. Eller brug std::string,
> når nu du alligevel bruger C++

Nu er det ca. 8 år siden jeg lavede programmer med TurboC++, men så vidt
jeg husker har Turbo C++ ingen std::

Jeg tror at Martin skal bruge:

if(!strcmp(navn, "(dk)"))

Hvis han vil checke om navn er (dk), inklusive ().

/b


Martin Fæster (06-12-2003)
Kommentar
Fra : Martin Fæster


Dato : 06-12-03 17:09

> Nu er det ca. 8 år siden jeg lavede programmer med TurboC++, men så vidt
> jeg husker har Turbo C++ ingen std::
>
> Jeg tror at Martin skal bruge:
>
> if(!strcmp(navn, "(dk)"))
>
> Hvis han vil checke om navn er (dk), inklusive ().
>
> /b

Tak til alle, Bertel har ret, den compiler og kan udføre hvis navn er dk.

Mvh.
Martin Fæster



Martin Fæster (06-12-2003)
Kommentar
Fra : Martin Fæster


Dato : 06-12-03 17:32

Jeg tror at Martin skal bruge:
>
> if(!strcmp(navn, "(dk)"))
>
> Hvis han vil checke om navn er (dk), inklusive ().
>
> /b


ok men kan du fortælle hvorfor den skriver et 2-tal på skærmen med en alm.
printf-sætning efter brug af strcmp?
se linien med den længste kommentar:
Det er linierne:
if(!strcmp(navn,"(dk)")) /* hvis strengen indeholder dk */
gotoxy(48,14);
cprintf("ûP*R"); denne linie udskriver det med et 2-tal foran det
skrevne og flytter om på x og y placeret på skærmen. (U'et er et
kvadratrodstegn.)

(jeg har snippet i det)

/* Ohm's lov calculator af Martin F‘ster TEC Ballerup Hold 21D */
#include<graphics.h>
#include<stdlib.h>
#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<process.h>
#include<dos.h>
#include<string.h>
#define q 17
#define w 0
#define e 17
#define s 0
#define t 17
#define u 13


float f1,f2,f3,f4,f5,f6,f7,z,result;
char x=5,y=1,h=70,v=25,i,ch,opera,dk,usa,navn[4],navn1,navn2,navn3,navn4;
char *fname[] = { "",
"OHM'S LOV"
};
int main(void)

{
do
{


/* Hent info om landekode (charset) */

FILE *plad_fil;
//char navn;

if((plad_fil = fopen("c:\\ohmslov.lng", "rb+")) == NULL)
{
gotoxy(18,20);
printf("Filen ohmslov.lng blev ikke indl‘st.");
delay(2500);
gotoxy(18,22);
printf("Genererer tegns‘tfil. ");
delay(1000);
/* Opretter en ny tegns‘tfil */
if((plad_fil = fopen("c:\\ohmslov.lng", "wb+")) == NULL)
delay(500);
gotoxy(18,24);
printf("Indtast karakters‘t (dk/usa) : ");
scanf("%s", &navn);
fprintf(plad_fil, "%s", navn); /* skriver strengen til filen */
fclose(plad_fil);
//return 0;
}
fscanf(plad_fil, "%s", &navn );
gotoxy(1,30);
printf("Tegns‘t %s", navn);
fclose(plad_fil);
gotoxy(18,20);
printf(" "); /* ryd op p† sk‘rmen*/
gotoxy(18,22);
printf(" "); /* -||- */
gotoxy(18,24);
printf(" "); /* -||- */

/* Slut p† landekode og luk l‘s og skriv til fil */


/* oms‘t variabel og begynd tegns‘t */
if(!strcmp(navn,"(dk)")) /* hvis strengen indeholder dk */
gotoxy(48,14);
cprintf("ûP*R"); denne linie udskriver det med et 2-tal foran det
skrevne og flytter om på x og y placeret på skærmen. (U'et er et
kvadratrodstegn.)
gotoxy(56,14);
printf("3");
line(380,208,408,208); /* ekstra tegnet linie til kvadratrod */

gotoxy(37,11); //Placering af menu for udregning af P
printf("Iý*R");
gotoxy(35,8);
printf("c");
gotoxy(32,12);
printf("Uý/R");
gotoxy(27,10);
printf("b");
gotoxy(31,14);
printf("U*I");
gotoxy(24,14);
printf("a");
if((plad_fil = fopen("c:\\ohmslov.lng", "rb+")) == NULL)
{
printf("\nFilen ohmslov.lng kan ikke †bnes.");
printf("\nTryk en tast");
getch();
exit(1);
}




Martin Fæster (06-12-2003)
Kommentar
Fra : Martin Fæster


Dato : 06-12-03 17:53

Undskyld, min egen fejl med 2-tallet, noget der landede ved siden af et
menu-tal.

Martin Fæster



"Martin Fæster" <martinf@no_spam_kabelnettet.dk> skrev i en meddelelse
news:5wnAb.18971$Wa7.179@news.get2net.dk...
> Jeg tror at Martin skal bruge:
> >
> > if(!strcmp(navn, "(dk)"))
> >
> > Hvis han vil checke om navn er (dk), inklusive ().
> >
> > /b
>
>
> ok men kan du fortælle hvorfor den skriver et 2-tal på skærmen med en
alm.
> printf-sætning efter brug af strcmp?
> se linien med den længste kommentar:
> Det er linierne:
> if(!strcmp(navn,"(dk)")) /* hvis strengen indeholder dk */
> gotoxy(48,14);
> cprintf("ûP*R"); denne linie udskriver det med et 2-tal foran det
> skrevne og flytter om på x og y placeret på skærmen. (U'et er et
> kvadratrodstegn.)
>
> (jeg har snippet i det)
>
> /* Ohm's lov calculator af Martin F'ster TEC Ballerup Hold 21D */
> #include<graphics.h>
> #include<stdlib.h>
> #include<stdio.h>
> #include<conio.h>
> #include<math.h>
> #include<process.h>
> #include<dos.h>
> #include<string.h>
> #define q 17
> #define w 0
> #define e 17
> #define s 0
> #define t 17
> #define u 13
>
>
> float f1,f2,f3,f4,f5,f6,f7,z,result;
> char x=5,y=1,h=70,v=25,i,ch,opera,dk,usa,navn[4],navn1,navn2,navn3,navn4;
> char *fname[] = { "",
> "OHM'S LOV"
> };
> int main(void)
>
> {
> do
> {
>
>
> /* Hent info om landekode (charset) */
>
> FILE *plad_fil;
> //char navn;
>
> if((plad_fil = fopen("c:\\ohmslov.lng", "rb+")) == NULL)
> {
> gotoxy(18,20);
> printf("Filen ohmslov.lng blev ikke indl'st.");
> delay(2500);
> gotoxy(18,22);
> printf("Genererer tegns'tfil. ");
> delay(1000);
> /* Opretter en ny tegns'tfil */
> if((plad_fil = fopen("c:\\ohmslov.lng", "wb+")) == NULL)
> delay(500);
> gotoxy(18,24);
> printf("Indtast karakters't (dk/usa) : ");
> scanf("%s", &navn);
> fprintf(plad_fil, "%s", navn); /* skriver strengen til filen */
> fclose(plad_fil);
> //return 0;
> }
> fscanf(plad_fil, "%s", &navn );
> gotoxy(1,30);
> printf("Tegns't %s", navn);
> fclose(plad_fil);
> gotoxy(18,20);
> printf(" "); /* ryd op p? sk'rmen*/
> gotoxy(18,22);
> printf(" "); /* -||- */
> gotoxy(18,24);
> printf(" "); /* -||- */
>
> /* Slut p? landekode og luk l's og skriv til fil */
>
>
> /* oms't variabel og begynd tegns't */
> if(!strcmp(navn,"(dk)")) /* hvis strengen indeholder dk */
> gotoxy(48,14);
> cprintf("ûP*R"); denne linie udskriver det med et 2-tal foran det
> skrevne og flytter om på x og y placeret på skærmen. (U'et er et
> kvadratrodstegn.)
> gotoxy(56,14);
> printf("3");
> line(380,208,408,208); /* ekstra tegnet linie til kvadratrod */
>
> gotoxy(37,11); //Placering af menu for udregning af P
> printf("Iý*R");
> gotoxy(35,8);
> printf("c");
> gotoxy(32,12);
> printf("Uý/R");
> gotoxy(27,10);
> printf("b");
> gotoxy(31,14);
> printf("U*I");
> gotoxy(24,14);
> printf("a");
> if((plad_fil = fopen("c:\\ohmslov.lng", "rb+")) == NULL)
> {
> printf("\nFilen ohmslov.lng kan ikke ?bnes.");
> printf("\nTryk en tast");
> getch();
> exit(1);
> }
>
>
>



Byrial Jensen (07-12-2003)
Kommentar
Fra : Byrial Jensen


Dato : 07-12-03 04:30

Martin Fæster wrote:

> /* Ohm's lov calculator af Martin F‘ster TEC Ballerup Hold 21D */

Programmet som du poster her, ser ikke komplet ud, og jeg har svært ved
at overskue og forstå det. Tillad mig at komme med et par kommentarer
til hvordan kvaliteten af det kan øges:

- Der er mange variabler og makroer med kryptiske/intetsigende navne.
Det vil forøge læseligheden med bedre navne.

- Der er utrolig mange konstanter rundt omkring, og det er ikke
umiddelbart til at se hvilke relationer de har til hindanden, og
hvilke andre der også skal ændres som konsekvens hvis nogle ændres.
Det ville hjælpe meget på overskueligheden og muligheden for at lave
rettelser/vedligeholde programmet hvis de mange konstanter erstattes
af makroer (eller evt. konstant-erklærede variabler) og regneudtyk
med makroer.

- Beregninger, læsning af tastatur, skrivning til skærm og brug af
filer er altsammen mere eller mindre rodet sammen i samme funktion.
Det ville hjælpe meget på overskueligheden hvis de forskellige
ting skete i specialiserede funktionerne, så vidt muligt med klare
grænseflader imellem sig. Det ville også gøre programmet mere
portabelt idet brugen af ikke-standard funktioner (bl.a. grafik)
dermed vil ske mere samlet.

- Den måde du bruger scanf() på, er farlig idet der kan komme
bufferoverløbsfejl. Angiv bufferstørrelsen i formatstrengen,
eller brug for eksempel fgets() i stedet. (Men aldrig gets()!).
Tjek også altid for fejl efter filoperationer og andre funktionskald
som kan fejle.

- Lav en konsekvent indrykning hver gang du starter en ny blok eller
sætning inden i en anden sætning.



Martin Fæster (07-12-2003)
Kommentar
Fra : Martin Fæster


Dato : 07-12-03 21:06

Det program fylder 65 kb så jeg ville ikke poste en masse unødigt stuff.
Programmet er som sagt et led i et projekt jeg får en karakter for. Som
newbie har jeg haft under 10 lektioner i Turbo c++. Dine råd vil hjælpe mig
til at lave det bedre.
Når det er afleveret som færdig, kan jeg offentliggøre skriptet i fuld
længde, men vil du have det nu kan du få det mailet.

Martin

"Byrial Jensen" <bjensen@nospam.dk> skrev i en meddelelse
news:3FD29EAB.4040100@nospam.dk...
> Martin Fæster wrote:
>
> > /* Ohm's lov calculator af Martin F‘ster TEC Ballerup Hold 21D */
>
> Programmet som du poster her, ser ikke komplet ud, og jeg har svært ved
> at overskue og forstå det. Tillad mig at komme med et par kommentarer
> til hvordan kvaliteten af det kan øges:
>
> - Der er mange variabler og makroer med kryptiske/intetsigende navne.
> Det vil forøge læseligheden med bedre navne.
>
> - Der er utrolig mange konstanter rundt omkring, og det er ikke
> umiddelbart til at se hvilke relationer de har til hindanden, og
> hvilke andre der også skal ændres som konsekvens hvis nogle ændres.
> Det ville hjælpe meget på overskueligheden og muligheden for at lave
> rettelser/vedligeholde programmet hvis de mange konstanter erstattes
> af makroer (eller evt. konstant-erklærede variabler) og regneudtyk
> med makroer.
>
> - Beregninger, læsning af tastatur, skrivning til skærm og brug af
> filer er altsammen mere eller mindre rodet sammen i samme funktion.
> Det ville hjælpe meget på overskueligheden hvis de forskellige
> ting skete i specialiserede funktionerne, så vidt muligt med klare
> grænseflader imellem sig. Det ville også gøre programmet mere
> portabelt idet brugen af ikke-standard funktioner (bl.a. grafik)
> dermed vil ske mere samlet.
>
> - Den måde du bruger scanf() på, er farlig idet der kan komme
> bufferoverløbsfejl. Angiv bufferstørrelsen i formatstrengen,
> eller brug for eksempel fgets() i stedet. (Men aldrig gets()!).
> Tjek også altid for fejl efter filoperationer og andre funktionskald
> som kan fejle.
>
> - Lav en konsekvent indrykning hver gang du starter en ny blok eller
> sætning inden i en anden sætning.
>
>



Byrial Jensen (08-12-2003)
Kommentar
Fra : Byrial Jensen


Dato : 08-12-03 22:31

Martin Fæster wrote:
> Det program fylder 65 kb så jeg ville ikke poste en masse unødigt stuff.

O.k., så forstår jeg bedre at det jeg så, ikke så helt sammenhængende ud.

> Programmet er som sagt et led i et projekt jeg får en karakter for. Som
> newbie har jeg haft under 10 lektioner i Turbo c++.

Held og lykke med det. Lige en bemærkning til. Jeg ved ikke hvor meget
du har lært om forskellen på C og C++, men det du har vist her, ligner
overhovedet ikke et C++-program, men derimod et (uddrag af et) C-program.


Bertel Lund Hansen (06-12-2003)
Kommentar
Fra : Bertel Lund Hansen


Dato : 06-12-03 15:51

Martin Fæster skrev:

>når jeg vil lave en if sætning til at skrive noget efter om der står dk
>eller usa i navn, så siger den lvalue required.

Jeg har glemt hvorfor det hedder "lvalue", men der menes en
variabel (der kan ændre værdi).

> if (navn=(dk))

Imidlerttid rammer copmpileren nok forkert med sit gæt. Du har
sikkert lavet en meget almindelig og ret farlig fejl. Ovenstående
linje tildeler "navn" en ny værdi" og tester bagefter om denne er
tom. Du mente formodentlig

if (navn==(dk))

Jeg kender to måder at undgå problemet på:

1)
Min compiler (BC++ 5.5 - gratis) advarer som standard når man
skriver sådan.

2)
Man kan vende om på udtrykkene. Det fanger ikke alle fejl, men
næsten. Det ville vist nok ikke have fanget din.

Lovligt (men ofte forkert):   if (value=7) return 5;
Ulovligt:   if (7=value) return 5;

Når man får rapporten om at 'testen' er ulovlig, kommer man i
tanker om at der skal stå if (7==value) return 5;

--
Bertel
http://bertel.lundhansen.dk/   FIDUSO: http://fiduso.dk/

Martin Fæster (06-12-2003)
Kommentar
Fra : Martin Fæster


Dato : 06-12-03 16:02


Med den her:
> if (navn==(dk))
får jeg cannot convert char to char *

Mvh.
Martin


hvad
"Bertel Lund Hansen" <nospamius@lundhansen.dk> skrev i en meddelelse
news:ksq3tvkfq47iq8dtri2h9uev6niu9sotfa@news.stofanet.dk...
> Martin Fæster skrev:
>
> >når jeg vil lave en if sætning til at skrive noget efter om der står dk
> >eller usa i navn, så siger den lvalue required.
>
> Jeg har glemt hvorfor det hedder "lvalue", men der menes en
> variabel (der kan ændre værdi).
>
> > if (navn=(dk))
>
> Imidlerttid rammer copmpileren nok forkert med sit gæt. Du har
> sikkert lavet en meget almindelig og ret farlig fejl. Ovenstående
> linje tildeler "navn" en ny værdi" og tester bagefter om denne er
> tom. Du mente formodentlig
>
> if (navn==(dk))
>
> Jeg kender to måder at undgå problemet på:
>
> 1)
> Min compiler (BC++ 5.5 - gratis) advarer som standard når man
> skriver sådan.
>
> 2)
> Man kan vende om på udtrykkene. Det fanger ikke alle fejl, men
> næsten. Det ville vist nok ikke have fanget din.
>
> Lovligt (men ofte forkert): if (value=7) return 5;
> Ulovligt: if (7=value) return 5;
>
> Når man får rapporten om at 'testen' er ulovlig, kommer man i
> tanker om at der skal stå if (7==value) return 5;
>
> --
> Bertel
> http://bertel.lundhansen.dk/ FIDUSO: http://fiduso.dk/



Bertel Lund Hansen (06-12-2003)
Kommentar
Fra : Bertel Lund Hansen


Dato : 06-12-03 17:10

Martin Fæster skrev:

>Med den her:
>> if (navn==(dk))
>får jeg cannot convert char to char *

Ja, jeg var fokuseret på lighedstegnet.

Navn er en char-pointer og kan kun sammenlignes med sådan en. Der
er endnu en fare. Men det er ikke pointerværdien du ønsker at
sammenligne; det er indholdet. Derfor kan du ikke bruge
lighedstegn (hverken ét eller to).

Du skal bruge strcmp() som andre også har skrevet. Ydermere skal
(dk) i anførselstegn da det ellers vil blive forsøgt tolket som
en varabel. Strcmp() returnerer 0 ved identitet.

if (strcmp(navn,"(dk)"==0) ... // navn er præcis lig "(dk)".

Hvis du vil undersøge om der forekommer bogstaverne "dk" ved
siden af hinanden et eller andet sted i en lang streng, må du
gøre noget lidt andet:

char *pos;

pos=navn;
while (*pos) {
   if (*pos=='d' && *(pos+1)=='k') {
      gør noget smart;
      break;
   }
   ++pos;
}

--
Bertel
http://bertel.lundhansen.dk/   FIDUSO: http://fiduso.dk/

Byrial Jensen (07-12-2003)
Kommentar
Fra : Byrial Jensen


Dato : 07-12-03 03:44

Bertel Lund Hansen wrote:
> Hvis du vil undersøge om der forekommer bogstaverne "dk" ved
> siden af hinanden et eller andet sted i en lang streng, må du
> gøre noget lidt andet:
>
> char *pos;
>
> pos=navn;
> while (*pos) {
>    if (*pos=='d' && *(pos+1)=='k') {
>       gør noget smart;
>       break;
>    }
>    ++pos;
> }

Jeg vil foreslå at bruge standard-funktionen strstr() til dette:

#include <string.h>
if (strstr (navn, "dk"))
{
// Gør noget smart
}

strstr() returnerer en pointer til den første forekomst af det andet
argument i det første argument, eller NULL hvis der ingen forekomster
er. I eksemplet udnytter jeg at pointere automatisk kan konverteres til
sandhedsværdier. Hvis man foretrækker det, kan man også eksplicit skrive:

if (strstr (navn, "dk") != NULL) ...


Bertel Brander (06-12-2003)
Kommentar
Fra : Bertel Brander


Dato : 06-12-03 16:49

Bertel Lund Hansen wrote:

> Martin Fæster skrev:
>
>
>>når jeg vil lave en if sætning til at skrive noget efter om der står dk
>>eller usa i navn, så siger den lvalue required.
>
>
> Jeg har glemt hvorfor det hedder "lvalue", men der menes en
> variabel (der kan ændre værdi).
>
>
Det hedder vist lvalue fordi det er en værdi der kan stå på
venstre (Left) side af et udtryk.

/b


Bertel Lund Hansen (06-12-2003)
Kommentar
Fra : Bertel Lund Hansen


Dato : 06-12-03 17:01

Bertel Brander skrev:

>Det hedder vist lvalue fordi det er en værdi der kan stå på
>venstre (Left) side af et udtryk.

Åh ja.

--
Bertel
http://bertel.lundhansen.dk/   FIDUSO: http://fiduso.dk/

Martin Fæster (06-12-2003)
Kommentar
Fra : Martin Fæster


Dato : 06-12-03 18:27

Hvorfor flytter den de definerede x og y koordinater når jeg har brugt
strcmp ?
Hvis nogen skal se hele skriptet, vil jeg maile det , ikke poste det her.
Programmet er et led i et projekt.

Martin Fæster
www.htmltips.dk


"Bertel Lund Hansen" <nospamius@lundhansen.dk> skrev i en meddelelse
news:n8v3tvkt4kpdqna59th98m08dqimilk70v@news.stofanet.dk...
> Bertel Brander skrev:
>
> >Det hedder vist lvalue fordi det er en værdi der kan stå på
> >venstre (Left) side af et udtryk.
>
> Åh ja.
>
> --
> Bertel
> http://bertel.lundhansen.dk/ FIDUSO: http://fiduso.dk/



Bertel Lund Hansen (06-12-2003)
Kommentar
Fra : Bertel Lund Hansen


Dato : 06-12-03 20:29

Martin Fæster skrev:

>Hvorfor flytter den de definerede x og y koordinater når jeg har brugt
>strcmp ?

Dert har jeg ikke det ringeste begreb om. C har ikke indbygget
noget med koordinater overhovedet.

Men det første gæt er pointerfejl. De kan bevirke næsten hvad som
helst.

--
Bertel
http://bertel.lundhansen.dk/   FIDUSO: http://fiduso.dk/

Martin Fæster (06-12-2003)
Kommentar
Fra : Martin Fæster


Dato : 06-12-03 20:57

Den kører if sætningen med strcmp som om den er sand, alt der står efter
bliver bare udført, så den kan vel ikke skelne alligevel.

Martin

"Bertel Lund Hansen" <nospamius@lundhansen.dk> skrev i en meddelelse
news:mdb4tvkt8iulio6ki59t1q4rtq5r8hdpp2@news.stofanet.dk...
> Martin Fæster skrev:
>
> >Hvorfor flytter den de definerede x og y koordinater når jeg har brugt
> >strcmp ?
>
> Dert har jeg ikke det ringeste begreb om. C har ikke indbygget
> noget med koordinater overhovedet.
>
> Men det første gæt er pointerfejl. De kan bevirke næsten hvad som
> helst.
>
> --
> Bertel
> http://bertel.lundhansen.dk/ FIDUSO: http://fiduso.dk/



Bertel Lund Hansen (06-12-2003)
Kommentar
Fra : Bertel Lund Hansen


Dato : 06-12-03 21:01

Martin Fæster skrev:

>Den kører if sætningen med strcmp som om den er sand, alt der står efter
>bliver bare udført, så den kan vel ikke skelne alligevel.

Strcmp() returnerer negativt tal, 0 eller positivt tal. Den
returnerer kun 0 ved identitet, og det virker lidy bagvendt.

   strcmp(a, b);

hvis a er lig b:   0
hvis a<b   -x
hvis a>b   +y

Man kan ikke regne med hvilken talstørrelse x og y er, blot at de
ikke er 0.

--
Bertel
http://bertel.lundhansen.dk/   FIDUSO: http://fiduso.dk/

Martin Fæster (06-12-2003)
Kommentar
Fra : Martin Fæster


Dato : 06-12-03 21:18

jamen jeg bruger x,y koordinater til at skrive bestemte steder på en
grafikskærm, så er det derfor det er messed up når jeg bruger den.
men altså, jeg har sagt hvis dk er 0 gør bla bla, og uanset hvad, 0 eller 1
og + eller -, udføres den næste, som kun skulle udføres hvis sand.
hvis jeg udfører strcmp, kan jeg kun skrive i den linie jeg har været i
sidst.

mvh
martin
"Bertel Lund Hansen" <nospamius@lundhansen.dk> skrev i en meddelelse
news:r6d4tv0v072edge2es1mf90v8knrfhbp8i@news.stofanet.dk...
> Martin Fæster skrev:
>
> >Den kører if sætningen med strcmp som om den er sand, alt der står efter
> >bliver bare udført, så den kan vel ikke skelne alligevel.
>
> Strcmp() returnerer negativt tal, 0 eller positivt tal. Den
> returnerer kun 0 ved identitet, og det virker lidy bagvendt.
>
> strcmp(a, b);
>
> hvis a er lig b: 0
> hvis a<b -x
> hvis a>b +y
>
> Man kan ikke regne med hvilken talstørrelse x og y er, blot at de
> ikke er 0.
>
> --
> Bertel
> http://bertel.lundhansen.dk/ FIDUSO: http://fiduso.dk/



Martin Fæster (06-12-2003)
Kommentar
Fra : Martin Fæster


Dato : 06-12-03 21:24

Undskyld, det var lidt tricky det her.
Den meldte ikke fejl, men hvis det var skrevet forkert røg styring af
koordinater. jeg tror det vil nu.

Martin

"Bertel Lund Hansen" <nospamius@lundhansen.dk> skrev i en meddelelse
news:r6d4tv0v072edge2es1mf90v8knrfhbp8i@news.stofanet.dk...
> Martin Fæster skrev:
>
> >Den kører if sætningen med strcmp som om den er sand, alt der står efter
> >bliver bare udført, så den kan vel ikke skelne alligevel.
>
> Strcmp() returnerer negativt tal, 0 eller positivt tal. Den
> returnerer kun 0 ved identitet, og det virker lidy bagvendt.
>
> strcmp(a, b);
>
> hvis a er lig b: 0
> hvis a<b -x
> hvis a>b +y
>
> Man kan ikke regne med hvilken talstørrelse x og y er, blot at de
> ikke er 0.
>
> --
> Bertel
> http://bertel.lundhansen.dk/ FIDUSO: http://fiduso.dk/



Martin Fæster (06-12-2003)
Kommentar
Fra : Martin Fæster


Dato : 06-12-03 21:30

ok jeg troede det virkede, jeg kan ikke finde ud af hvad tal jeg skal skrive
for at få sand.
gotoxy(1,30);
if(!strcmp(navn,"(usa)")=0)
printf("hej");
eller

gotoxy(1,30);
if(!strcmp(navn,"(usa)"))
printf("hej");
i begge kan jeg få det udskrevet , og jeg har kørt med strengen dk som navn
hele tiden. Den er ligeglad med om jeg skriver usa eller dk.

Mvh
Martin


"Bertel Lund Hansen" <nospamius@lundhansen.dk> skrev i en meddelelse
news:r6d4tv0v072edge2es1mf90v8knrfhbp8i@news.stofanet.dk...
> Martin Fæster skrev:
>
> >Den kører if sætningen med strcmp som om den er sand, alt der står efter
> >bliver bare udført, så den kan vel ikke skelne alligevel.
>
> Strcmp() returnerer negativt tal, 0 eller positivt tal. Den
> returnerer kun 0 ved identitet, og det virker lidy bagvendt.
>
> strcmp(a, b);
>
> hvis a er lig b: 0
> hvis a<b -x
> hvis a>b +y
>
> Man kan ikke regne med hvilken talstørrelse x og y er, blot at de
> ikke er 0.
>
> --
> Bertel
> http://bertel.lundhansen.dk/ FIDUSO: http://fiduso.dk/



Bertel Brander (06-12-2003)
Kommentar
Fra : Bertel Brander


Dato : 06-12-03 23:19

Martin Fæster wrote:

> ok jeg troede det virkede, jeg kan ikke finde ud af hvad tal jeg skal skrive
> for at få sand.
> gotoxy(1,30);
> if(!strcmp(navn,"(usa)")=0)
> printf("hej");
> eller
>

Du kan bruge:

if(!strcmp(navn, "(usa)"))
printf("Navn er (usa)\n");

if(strcmp(navn, "(dk)") == 0)
printf("Navn er (dk)\n");

Som er det samme.


Men ikke:

if(!strcmp(navn,"(usa)")=0)
printf("Sludder og vrøvl\n");

/b


Martin Fæster (06-12-2003)
Kommentar
Fra : Martin Fæster


Dato : 06-12-03 23:32

Du kan bruge:

if(!strcmp(navn, "(usa)"))
printf("Navn er (usa)\n");
=der udføres ikke noget, også selv om "scanf %s , navn" udskriver dk.


if(strcmp(navn, "(dk)") == 0)
printf("Navn er (dk)\n");
=den udfører bare fordi den finder 0.


mvh
Martin
"Bertel Brander" <bertel@post4.tele.dk> skrev i en meddelelse
news:3fd25459$0$27410$edfadb0f@dread16.news.tele.dk...
> Martin Fæster wrote:
>
> > ok jeg troede det virkede, jeg kan ikke finde ud af hvad tal jeg skal
skrive
> > for at få sand.
> > gotoxy(1,30);
> > if(!strcmp(navn,"(usa)")=0)
> > printf("hej");
> > eller
> >
>
> Du kan bruge:
>
> if(!strcmp(navn, "(usa)"))
> printf("Navn er (usa)\n");
>
> if(strcmp(navn, "(dk)") == 0)
> printf("Navn er (dk)\n");
>
> Som er det samme.
>
>
> Men ikke:
>
> if(!strcmp(navn,"(usa)")=0)
> printf("Sludder og vrøvl\n");
>
> /b
>



Bertel Brander (06-12-2003)
Kommentar
Fra : Bertel Brander


Dato : 06-12-03 23:53

Martin Fæster wrote:

> Du kan bruge:
>
> if(!strcmp(navn, "(usa)"))
> printf("Navn er (usa)\n");
> =der udføres ikke noget, også selv om "scanf %s , navn" udskriver dk.

???

Vil du teste for usa eller (usa)?
Den udskriver "Navn er (usa)\n" hvis navn er "(usa)", ellers intet.
scanf udskriver ikke noget
>
>
> if(strcmp(navn, "(dk)") == 0)
> printf("Navn er (dk)\n");
> =den udfører bare fordi den finder 0.
>

Den skal udskrive "Navn er (dk)\n" hvis navn er "(dk)"

/b


Martin Fæster (07-12-2003)
Kommentar
Fra : Martin Fæster


Dato : 07-12-03 01:01

Det virker nu. Jeg kunne heller ikke se hvorfor jeg skulle skrive "(usa)" og
ikke ("usa"), så den skulle lige bedes at se efter det korrekte.
tak for hjælpen.

Mvh.
Martin

"Bertel Brander" <bertel@post4.tele.dk> skrev i en meddelelse
news:3fd25c62$0$27385$edfadb0f@dread16.news.tele.dk...
> Martin Fæster wrote:
>
> > Du kan bruge:
> >
> > if(!strcmp(navn, "(usa)"))
> > printf("Navn er (usa)\n");
> > =der udføres ikke noget, også selv om "scanf %s , navn" udskriver dk.
>
> ???
>
> Vil du teste for usa eller (usa)?
> Den udskriver "Navn er (usa)\n" hvis navn er "(usa)", ellers intet.
> scanf udskriver ikke noget
> >
> >
> > if(strcmp(navn, "(dk)") == 0)
> > printf("Navn er (dk)\n");
> > =den udfører bare fordi den finder 0.
> >
>
> Den skal udskrive "Navn er (dk)\n" hvis navn er "(dk)"
>
> /b
>



Bertel Brander (07-12-2003)
Kommentar
Fra : Bertel Brander


Dato : 07-12-03 02:50

Martin Fæster wrote:

> Det virker nu. Jeg kunne heller ikke se hvorfor jeg skulle skrive "(usa)" og
> ikke ("usa"), så den skulle lige bedes at se efter det korrekte.
> tak for hjælpen.

Der er ingen grund til at skrive ("usa"), det er det samme som "usa".

/b


Martin Fæster (10-12-2003)
Kommentar
Fra : Martin Fæster


Dato : 10-12-03 23:26

Mit program kører som sagt, men jeg vil gerne lave indtastningen smartere og
undgå at programmet behøver genstart.
Når man udfører et alm. regnestykke med de fire gængse regnearter, kan man:
også indtaste bogstaver der for programmet til at regne forkert næste gang
, og
indtaste return før skrevet noget og det flytter cursoren og skriver
udenfor koordinaterne som er indeni en tegnet ramme.
det vil jeg gerne fixe med et eller andet men hvad?.

UDDRAG af ohmslov.cpp, indeholder 17 cases , her er den ene.

/* Hovedmenu */
textcolor(WHITE); /* indstil tekstfarve hvid */
gotoxy(q,w+2); /* g? til linie p? koordinat */
cprintf("Ohms lov calculator af Martin F'ster hold 21D");
gotoxy(q,s+4); /* g? til koordinat x,y*/
cprintf("Dit valg: ");
gotoxy(q,s+15); /* g? til koordinat x,y*/
cprintf("Aktuelle valg: 1,2,3,4,5,6,7,8,9,a,b,c,f,s,p,d,u");
/*Ohm's lov menu p? tekstsk'rm */
switch(ch)
{
case '1': /* Volt n?r har modstand og ampere */
gotoxy(e+11,s+4);
cprintf("1: U=R*I ");
gotoxy(e,s+9);
cprintf("Indtast modstanden: ");
scanf("%f",&f1);
gotoxy(e,s+11);
if(!strcmp(navn, "dkk")) /* hvis strengen indeholder dk */
printf("Indtast strímstyrken: ");
if(!strcmp(navn, "usa")) /* hvis strengen indeholder usa */
printf("Indtast str>mstyrken: ");
scanf("%f",&f2);
f7=f1*f2;
gotoxy(e,s+13);
cprintf("Sp'ndingen er: %.4f volt. ",f7);
textcolor(RED);
gotoxy(e,s+17);
cprintf("Tryk en tast for menu, ESCAPE 2 gange for at afslutte. ");
textcolor(WHITE);
break;



"Bertel Brander" <bertel@post4.tele.dk> skrev i en meddelelse
news:3fd285ee$0$27373$edfadb0f@dread16.news.tele.dk...
> Der er ingen grund til at skrive ("usa"), det er det samme som "usa".
>
> /b
>



Byrial Jensen (11-12-2003)
Kommentar
Fra : Byrial Jensen


Dato : 11-12-03 21:27

Martin Fæster wrote:
> Mit program kører som sagt, men jeg vil gerne lave indtastningen smartere og
> undgå at programmet behøver genstart.
> Når man udfører et alm. regnestykke med de fire gængse regnearter, kan man:
> også indtaste bogstaver der for programmet til at regne forkert næste gang
> , og
> indtaste return før skrevet noget og det flytter cursoren og skriver
> udenfor koordinaterne som er indeni en tegnet ramme.
> det vil jeg gerne fixe med et eller andet men hvad?.

Hvis du vil styre præcist hvad kommer til at stå på skærmen og hvor,
bliver du nødt til fjerne den direkte forbindelse mellem tastatur og skærm.
Læs hver tast for sig uden ekko til skærm, og skriv så hvad du ønsker
til skærmen. Det kan ikke laves i portabel standard C, og jeg ved ikke
hvordan du gør på dit system. På unixer bruger man normalt (n)curses-
biblioteket til sådanne ting.


Martin Fæster (11-12-2003)
Kommentar
Fra : Martin Fæster


Dato : 11-12-03 22:28

Jeg løste det sådan her , det eneste minus er at programmet i nogle tilfælde
kan terminere hvis der er blankt input men det kode kan også godt fjernes.

Først har jeg erklæret variablerne over main, og længere nede i skriptet ser
en case således ud:

switch(ch)
{
case '1': /* Volt n?r har modstand og ampere */
gotoxy(e+11,s+4);
cprintf("1: U=R*I ");
gotoxy(e,s+9);
cprintf("Indtast modstanden: ");
iu[0]=getch();
gotoxy(38+ind,9);
cprintf("%c",iu[ind]);
while((iu[ind]>=46)&&(iu[ind]<=59))
{
ind++;
iu[ind]=getch();
cprintf("%c",iu[ind]);
}
f1=atof(iu);
gotoxy(q,s+11);
if(!strcmp(navn, "dkk")) /* hvis strengen indeholder dk */
printf("Indtast strímstyrken: ");
if(!strcmp(navn, "usa")) /* hvis strengen indeholder usa */
printf("Indtast str>mstyrken: ");
ir[0]=getch();
ind1=0;
gotoxy(38+ind1,11);
cprintf("%c",ir[ind1]);
while((ir[ind1]>=46)&&(ir[ind1]<=59))
{
ind1++;
ir[ind1]=getch();
cprintf("%c",ir[ind1]);
}
f2=atof(ir);
gotoxy(q,s+21);
f7=f1*f2;
/* check hvis input fra bruger = intet */
if (f1==0)
{
textcolor(WHITE+BLINK);
gotoxy(q,s+23);
cprintf("Du angav intet i punkt (1)");
textcolor(WHITE);
}
else
if (f2==0)
{
textcolor(WHITE+BLINK);
gotoxy(q,s+23);
cprintf("Du angav intet i punkt (2)");
textcolor(WHITE);
}
gotoxy(e,s+13);
cprintf("Sp'ndingen er: %.4f volt. ",f7);
textcolor(RED);
gotoxy(e,s+17);
cprintf("Tryk en tast for menu, ESCAPE 2 gange for at afslutte. ");
textcolor(WHITE);
break;


mvh.
Martin

"Byrial Jensen" <bjensen@nospam.dk> skrev i en meddelelse
news:3FD8D303.2010007@nospam.dk...
> Martin Fæster wrote:
> > Mit program kører som sagt, men jeg vil gerne lave indtastningen
smartere og
> > undgå at programmet behøver genstart.
> > Når man udfører et alm. regnestykke med de fire gængse regnearter, kan
man:
> > også indtaste bogstaver der for programmet til at regne forkert næste
gang
> > , og
> > indtaste return før skrevet noget og det flytter cursoren og skriver
> > udenfor koordinaterne som er indeni en tegnet ramme.
> > det vil jeg gerne fixe med et eller andet men hvad?.
>
> Hvis du vil styre præcist hvad kommer til at stå på skærmen og hvor,
> bliver du nødt til fjerne den direkte forbindelse mellem tastatur og
skærm.
> Læs hver tast for sig uden ekko til skærm, og skriv så hvad du ønsker
> til skærmen. Det kan ikke laves i portabel standard C, og jeg ved ikke
> hvordan du gør på dit system. På unixer bruger man normalt (n)curses-
> biblioteket til sådanne ting.
>



Byrial Jensen (12-12-2003)
Kommentar
Fra : Byrial Jensen


Dato : 12-12-03 19:02

Martin Fæster wrote:
> Jeg løste det sådan her , det eneste minus er at programmet i nogle tilfælde
> kan terminere hvis der er blankt input men det kode kan også godt fjernes.
>
> Først har jeg erklæret variablerne over main, og længere nede i skriptet ser
> en case således ud:

Frem for at skrive det samme kode til håndtering af input i alle dine
cases, vil jeg foreslå at du laver en selvstændig funktion til det. Den
kunne for eksempel være erklæret sådan her:

/**
* @param streng Streng som læses fra tastatur med skærm-ekko.
* @param x Skærmkoordinat for streng.
* @param y Skærmkoordinat for streng.
* @param len Maks. længde af streng inkl. NULL-terminering.
* @return Antal tegn læst til streng eksl. NULL-terminering.
*/
int readstring (char *streng, int x, int y, int len);

Så vil det også blive nemmere at gøre redigeringsfaciliterne bedre
efterhånden som man får tid og behov for det, og du får adskilt de
uportable bibliotekskald til terminalhåndtering fra resten af koden.


Martin Fæster (20-12-2003)
Kommentar
Fra : Martin Fæster


Dato : 20-12-03 10:43

Jeg forstår ikke at det er kommenteret med /* */ så kompileren ikke for fat
i det, og slet ikke noget med param endnu.
Programmet har jeg fået et 11 tal for , så projektet er afleveret altså.
Derfor kan jeg poste hele koden nu.
Jeg regner med at lægge det til download fra HtmlClup på htmltips.dk

Martin Fæster


"Byrial Jensen" <bjensen@nospam.dk> skrev i en meddelelse
news:3FDA02AC.8020305@nospam.dk...
> Martin Fæster wrote:
> > Jeg løste det sådan her , det eneste minus er at programmet i nogle
tilfælde
> > kan terminere hvis der er blankt input men det kode kan også godt
fjernes.
> >
> > Først har jeg erklæret variablerne over main, og længere nede i skriptet
ser
> > en case således ud:
>
> Frem for at skrive det samme kode til håndtering af input i alle dine
> cases, vil jeg foreslå at du laver en selvstændig funktion til det. Den
> kunne for eksempel være erklæret sådan her:
>
> /**
> * @param streng Streng som læses fra tastatur med skærm-ekko.
> * @param x Skærmkoordinat for streng.
> * @param y Skærmkoordinat for streng.
> * @param len Maks. længde af streng inkl. NULL-terminering.
> * @return Antal tegn læst til streng eksl. NULL-terminering.
> */
> int readstring (char *streng, int x, int y, int len);
>
> Så vil det også blive nemmere at gøre redigeringsfaciliterne bedre
> efterhånden som man får tid og behov for det, og du får adskilt de
> uportable bibliotekskald til terminalhåndtering fra resten af koden.
>



Byrial Jensen (20-12-2003)
Kommentar
Fra : Byrial Jensen


Dato : 20-12-03 11:39

Martin Fæster wrote:
> Jeg forstår ikke at det er kommenteret med /* */ så kompileren ikke for fat
> i det, og slet ikke noget med param endnu.

Det der var mellem /* og */ var en kommentar som havde til formål at
forklare funktionens grænseflade (argumenter og returværdi). Det var ren
dokumentation og ikke beregnet til oversætteren.

Kommentaren var dog i et specielt format beregnet til programmet doxygen
som kan udtrække information fra sådanne kommentarer til automatisk
genereret dokumentation i flere forskellige filformater.

> "Byrial Jensen" <bjensen@nospam.dk> skrev i en meddelelse
>>
>>/**
>> * @param streng Streng som læses fra tastatur med skærm-ekko.
>> * @param x Skærmkoordinat for streng.
>> * @param y Skærmkoordinat for streng.
>> * @param len Maks. længde af streng inkl. NULL-terminering.
>> * @return Antal tegn læst til streng eksl. NULL-terminering.
>> */
>>int readstring (char *streng, int x, int y, int len);


Martin Fæster (06-12-2003)
Kommentar
Fra : Martin Fæster


Dato : 06-12-03 21:35

den virker på om jeg skriver 0 eller 1, det er til eller fra, men om det er
dk eller usa det ser den ligesom ikke på.

martin


"Bertel Lund Hansen" <nospamius@lundhansen.dk> skrev i en meddelelse
news:r6d4tv0v072edge2es1mf90v8knrfhbp8i@news.stofanet.dk...
> Martin Fæster skrev:
>
> >Den kører if sætningen med strcmp som om den er sand, alt der står efter
> >bliver bare udført, så den kan vel ikke skelne alligevel.
>
> Strcmp() returnerer negativt tal, 0 eller positivt tal. Den
> returnerer kun 0 ved identitet, og det virker lidy bagvendt.
>
> strcmp(a, b);
>
> hvis a er lig b: 0
> hvis a<b -x
> hvis a>b +y
>
> Man kan ikke regne med hvilken talstørrelse x og y er, blot at de
> ikke er 0.
>
> --
> Bertel
> http://bertel.lundhansen.dk/ FIDUSO: http://fiduso.dk/



Troels Thomsen (09-12-2003)
Kommentar
Fra : Troels Thomsen


Dato : 09-12-03 09:48

> >
> Det hedder vist lvalue fordi det er en værdi der kan stå på
> venstre (Left) side af et udtryk.
>

Ja
L for left og R for right

og/eller

L for Location og R for "are" (sig det på engelsk!, altså hvad 'er' den)

Jeg synes disse to regler i sammenhæng giver en sjov måde at tænke over
disse ting, lad mig give et eksempel

char a,b;
a = b + 6;

B er her R value (højre side) og dens værdi er ("are") f.eks. 3
Dertil ligger man 6 dvs resultatet er 9

a er L value (venstre side) og vi vil altså ligge resultatet 9 over på a's
Location.

På den måde er det logisk at compileren ikke vil acceptere
5 = a + b;
fordi 5 ikke har nogen Location. Den har kun en "are" værdi og kan kun stå
på højre side.

Mens chars kan stå som både R og L values, fordi de har både en Location og
en værdi

Bare til inspiration

mvh Troels



Søg
Reklame
Statistik
Spørgsmål : 177459
Tips : 31964
Nyheder : 719565
Indlæg : 6408183
Brugere : 218881

Månedens bedste
Årets bedste
Sidste års bedste