/ 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
Hjælp et program som ikke fungere.
Fra : Morten


Dato : 17-12-01 20:43

Jeg har netop indtastet dette program fra en bog. Jeg anvender MS Visual C++
v6.0 og mig operativsystem er windows 2000pro:

/* Using putchar() to display strings. */

#include<stdio.h>

#define MAXSTRING 80

char message[] = "Displayed with putchar().";
main()
{
int count;

for(count = 0; count < MAXSTRING; count++)
{

/* Look for the end of the string. When it's found, */
/* write a newline character and exit the loop. */

if(message[count] == '\0')
{
putchar('\n');
break;
}
else

/* If end of string not found, write the next character. */

puts(message[count]);
}
return 0;
}

Efter at jeg har prøvet at compile dette får jeg to advarsler:
1) d:\...\list14_11.c(27) : warning C4047: 'function' : 'const char *'
differs in levels of indirection from 'char '. og
2) d:\...\list14_11.c(27) : warning C4024: 'puts' : different types for
formal and actual parameter 1.

Som de fleste nok ved kan man, trods advarsler fra ens complier, stadig
prøve at køre programmet. Men da jeg prøvede dette fik jeg følgende
fejlmeddelse:
Instruktionen ved "0x00401bf0" refererede hukommelse ved "0x00000044".
Hukommelsen kunne ikke "read".
....
Kan nogen hjælpe mig med dette problem?

Mvh.: Morten



 
 
Kent Friis (17-12-2001)
Kommentar
Fra : Kent Friis


Dato : 17-12-01 20:52

Den Mon, 17 Dec 2001 20:43:12 +0100 skrev Morten:
>Jeg har netop indtastet dette program fra en bog. Jeg anvender MS Visual C++
>v6.0 og mig operativsystem er windows 2000pro:
>
>/* Using putchar() to display strings. */
>
>#include<stdio.h>
>
>#define MAXSTRING 80
>
>char message[] = "Displayed with putchar().";
>main()
>{
> int count;
>
> for(count = 0; count < MAXSTRING; count++)
> {
>
> /* Look for the end of the string. When it's found, */
> /* write a newline character and exit the loop. */
>
> if(message[count] == '\0')
> {
> putchar('\n');
> break;
> }
> else
>
> /* If end of string not found, write the next character. */
>
> puts(message[count]);
> }
> return 0;
>}
>
>Efter at jeg har prøvet at compile dette får jeg to advarsler:
>1) d:\...\list14_11.c(27) : warning C4047: 'function' : 'const char *'
>differs in levels of indirection from 'char '. og
>2) d:\...\list14_11.c(27) : warning C4024: 'puts' : different types for
>formal and actual parameter 1.

Du laver et program der skal bruge putchar til at skrive et tegn af
gangen, men du bruger faktisk puts...

Mvh
Kent
--
http://www.celebrityshine.com/~kfr/

Morten (18-12-2001)
Kommentar
Fra : Morten


Dato : 18-12-01 23:01


"Kent Friis" <kfr@fleggaard.dk> skrev i en meddelelse
news:9vlicr$88g$1@sunsite.dk...
> Den Mon, 17 Dec 2001 20:43:12 +0100 skrev Morten:
> >Jeg har netop indtastet dette program fra en bog. Jeg anvender MS Visual
C++
> >v6.0 og mig operativsystem er windows 2000pro:
> >
> >/* Using putchar() to display strings. */
> >
> >#include<stdio.h>
> >
> >#define MAXSTRING 80
> >
> >char message[] = "Displayed with putchar().";
> >main()
> >{
> > int count;
> >
> > for(count = 0; count < MAXSTRING; count++)
> > {
> >
> > /* Look for the end of the string. When it's found, */
> > /* write a newline character and exit the loop. */
> >
> > if(message[count] == '\0')
> > {
> > putchar('\n');
> > break;
> > }
> > else
> >
> > /* If end of string not found, write the next character. */
> >
> > puts(message[count]);
> > }
> > return 0;
> >}
> >
> >Efter at jeg har prøvet at compile dette får jeg to advarsler:
> >1) d:\...\list14_11.c(27) : warning C4047: 'function' : 'const char *'
> >differs in levels of indirection from 'char '. og
> >2) d:\...\list14_11.c(27) : warning C4024: 'puts' : different types for
> >formal and actual parameter 1.
>
> Du laver et program der skal bruge putchar til at skrive et tegn af
> gangen, men du bruger faktisk puts...
>

Jeg indser, at jeg er kommet til at lave en simple taste fejl.
Tak for hjælpen.
Mvh: Morten



Jonas Meyer Rasmusse~ (17-12-2001)
Kommentar
Fra : Jonas Meyer Rasmusse~


Dato : 17-12-01 21:52

"Morten" <mozart@mobilixnet.dk> writes:
> Jeg har netop indtastet dette program fra en bog. Jeg anvender MS Visual C++
> v6.0 og mig operativsystem er windows 2000pro:
>
> /* Using putchar() to display strings. */
>
> #include<stdio.h>
>
> #define MAXSTRING 80
>
> char message[] = "Displayed with putchar().";
> main()
> {
> int count;
>
> for(count = 0; count < MAXSTRING; count++)
Her looper du 80 gange
> {
>
> /* Look for the end of the string. When it's found, */
> /* write a newline character and exit the loop. */
>
> if(message[count] == '\0')
Det vil sige at du her kommer til at pille ud fra message arrayet
fra 0-80.
Den message du har erklæret er ikke 80 chars lang.
brug i stedet strlen og skriv din forløkke sådan her:

for(count = 0; count < strlen(message); count++)


Mvh
Jonas Meyer Rasmussen


Byrial Jensen (17-12-2001)
Kommentar
Fra : Byrial Jensen


Dato : 17-12-01 22:54

Jonas Meyer Rasmussen <meyer@berling.diku.dk> skrev:
> "Morten" <mozart@mobilixnet.dk> writes:
>> Jeg har netop indtastet dette program fra en bog.

Hvis det er indtastet rigtig, bør man nok overveje at udskifte
bogen med en som er bedre.

>> #define MAXSTRING 80
>>
>> char message[] = "Displayed with putchar().";
>> main()
>> {
>> int count;
>>
>> for(count = 0; count < MAXSTRING; count++)
> Her looper du 80 gange

Forkert. Der er en break-sætning i løkken som vil bryde ud
tidligere.

>> if(message[count] == '\0')
> Det vil sige at du her kommer til at pille ud fra message arrayet
> fra 0-80.

Nej. Netop når der ikke er flere tegn, forlades løkken.

> Den message du har erklæret er ikke 80 chars lang.
> brug i stedet strlen og skriv din forløkke sådan her:
>
> for(count = 0; count < strlen(message); count++)

Det er ikke specielt smart at beregne længden af strengen en gang
for hvert løkkegennemløb.

Jeg tror faktisk slet ikke at jeg ville tælle antallet af tegn,
men lave løkken omtrent sådan her (utestet):

int main()
{
char *ch;

for (ch = message ; *ch != '\0' ; ch++)
{
putchar (*ch);
}
putchar ("\n");
return 0;
}

Jonas Meyer Rasmusse~ (17-12-2001)
Kommentar
Fra : Jonas Meyer Rasmusse~


Dato : 17-12-01 23:22

ak, jeg kan se jeg har lavet en stor brøler
jeg beklager.



Ostehapsen (17-12-2001)
Kommentar
Fra : Ostehapsen


Dato : 17-12-01 18:20

Byrial Jensen wrote:

> Jeg tror faktisk slet ikke at jeg ville tælle antallet af tegn,
> men lave løkken omtrent sådan her (utestet):
>
> int main()
> {
> char *ch;
>
> for (ch = message ; *ch != '\0' ; ch++)
> {
> putchar (*ch);
> }
> putchar ("\n");
> return 0;
> }
>

Eller hvad med sådan:
int main()
{
char *ch;

for (ch = message ; *ch != '\0' ; )
{
putchar (*ch++);
}
putchar ("\n");
return 0;
}





Kent Friis (18-12-2001)
Kommentar
Fra : Kent Friis


Dato : 18-12-01 18:23

Den Mon, 17 Dec 2001 21:53:50 GMT skrev Byrial Jensen:
>Jeg tror faktisk slet ikke at jeg ville tælle antallet af tegn,
>men lave løkken omtrent sådan her (utestet):
>
>int main()
>{
> char *ch;
>
> for (ch = message ; *ch != '\0' ; ch++)

for(ch=message; *ch; ch++)

> {
> putchar (*ch);
> }
> putchar ("\n");
> return 0;
>}

Mvh
Kent
--
http://www.celebrityshine.com/~kfr/

Ostehapsen (17-12-2001)
Kommentar
Fra : Ostehapsen


Dato : 17-12-01 19:00

Kent Friis wrote:

> for(ch=message; *ch; ch++)


Så er der den på flere måder forvanskede (obfuskerede?) udgave:

static void put(char*c){*c?putchar(*c),put(c+1):putchar('\n');}
int main(){put(message);}

--
Aksel


Kent Friis (18-12-2001)
Kommentar
Fra : Kent Friis


Dato : 18-12-01 19:09

Den Mon, 17 Dec 2001 18:59:30 +0100 skrev Ostehapsen:
>Kent Friis wrote:
>
>> for(ch=message; *ch; ch++)
>
>
>Så er der den på flere måder forvanskede (obfuskerede?) udgave:

Mit forslag er IMHO ikke spor obfuscated. Der står "sæt ch til starten
af message", "så længe der findes et tegn", og "tæl ch en op".

Altså behøver man i den sammenhæng slet ikke bekymre sig om at strenge
i C er nul-terminerede (selvom det reelt betyder det samme).

Mvh
Kent
--
http://www.celebrityshine.com/~kfr/

Ostehapsen (17-12-2001)
Kommentar
Fra : Ostehapsen


Dato : 17-12-01 19:25

Kent Friis wrote:

> Mit forslag er IMHO ikke spor obfuscated.

Næ, men det er mit :)
--
Aksel





Ostehapsen (17-12-2001)
Kommentar
Fra : Ostehapsen


Dato : 17-12-01 19:11

Byrial Jensen wrote:

> int main()
> {
> char *ch;
>
> for (ch = message ; *ch != '\0' ; ch++)
> {
> putchar (*ch);
> }
> putchar ("\n");
> return 0;
> }


One-lineren:



int main(){char*c=message;do{putchar(*c?*c:'\n');}while(*c++);}


--
Aksel



Morten (18-12-2001)
Kommentar
Fra : Morten


Dato : 18-12-01 23:17


"Ostehapsen" <blah@blah.dk> skrev i en meddelelse
news:3C1E3549.3090600@blah.dk...
> One-lineren:
....
> int main(){char*c=message;do{putchar(*c?*c:'\n');}while(*c++);}
> Aksel
Hvorfor overhovedet anvende en så absort linje som ingen alligevel kan
forstå undtagen den som har skrevet den. Et skræmmende eksemple på hvor
krytisk et C program KAN skrives!



Kent Friis (19-12-2001)
Kommentar
Fra : Kent Friis


Dato : 19-12-01 00:18

Den Tue, 18 Dec 2001 23:17:22 +0100 skrev Morten:
>
>"Ostehapsen" <blah@blah.dk> skrev i en meddelelse
>news:3C1E3549.3090600@blah.dk...
>> One-lineren:
>...
>> int main(){char*c=message;do{putchar(*c?*c:'\n');}while(*c++);}
>> Aksel
>Hvorfor overhovedet anvende en så absort linje som ingen alligevel kan
>forstå undtagen den som har skrevet den. Et skræmmende eksemple på hvor
>krytisk et C program KAN skrives!

Den kan da sagtens læses, selvom man ikke lige er vandt til den
formatering...

Alternativt kan indent(1) hjælpe på problemet.

Forøvrigt er det ikke kun i C at man kan skrive det hele som en lang
linie. Det gælder faktisk alle sprog hvor whitespace ikke har nogen
betydning (i modsætning til fx. Cobol).

Mvh
Kent
--
http://www.celebrityshine.com/~kfr/

Byrial Jensen (19-12-2001)
Kommentar
Fra : Byrial Jensen


Dato : 19-12-01 06:46

Kent Friis <kfr@fleggaard.dk> skrev:
> Den Tue, 18 Dec 2001 23:17:22 +0100 skrev Morten:
>>"Ostehapsen" <blah@blah.dk> skrev i en meddelelse
>>> One-lineren:
>>...
>>> int main(){char*c=message;do{putchar(*c?*c:'\n');}while(*c++);}

Der mangler en return i funktionen.

>>Hvorfor overhovedet anvende en så absort linje som ingen alligevel kan
>>forstå undtagen den som har skrevet den. Et skræmmende eksemple på hvor
>>krytisk et C program KAN skrives!
>
> Den kan da sagtens læses, selvom man ikke lige er vandt til den
> formatering...

Du svarer ikke på spørgsmålet om hvorfor overhodevet skrive på den
måde. Jeg undrede mig også over formålet.

Jeg kan godt læse linjen. Jeg kunne også skrive tilsvarende med
endnu færre tegn, men det ville jeg aldrig gøre i praksis. Det
nedsætter væsentligt den tid man skal bruge på at læse og forstå
programmet og gør det svært at vedligeholde.

Kent Friis (19-12-2001)
Kommentar
Fra : Kent Friis


Dato : 19-12-01 16:26

Den Wed, 19 Dec 2001 05:46:12 GMT skrev Byrial Jensen:
>Kent Friis <kfr@fleggaard.dk> skrev:
>> Den Tue, 18 Dec 2001 23:17:22 +0100 skrev Morten:
>>>"Ostehapsen" <blah@blah.dk> skrev i en meddelelse
>>>> One-lineren:
>>>...
>>>> int main(){char*c=message;do{putchar(*c?*c:'\n');}while(*c++);}
>
>Der mangler en return i funktionen.
>
>>>Hvorfor overhovedet anvende en så absort linje som ingen alligevel kan
>>>forstå undtagen den som har skrevet den. Et skræmmende eksemple på hvor
>>>krytisk et C program KAN skrives!
>>
>> Den kan da sagtens læses, selvom man ikke lige er vandt til den
>> formatering...
>
>Du svarer ikke på spørgsmålet om hvorfor overhodevet skrive på den
>måde. Jeg undrede mig også over formålet.

Måske fordi jeg ikke kunne finde på at skrive det på den måde

Mvh
Kent
--
http://www.celebrityshine.com/~kfr/

Byrial Jensen (19-12-2001)
Kommentar
Fra : Byrial Jensen


Dato : 19-12-01 20:44

Byrial Jensen <bjensen@nospam.dk> skrev:
>>>"Ostehapsen" <blah@blah.dk> skrev i en meddelelse
>>>> int main(){char*c=message;do{putchar(*c?*c:'\n');}while(*c++);}
>
> Der mangler en return i funktionen.

Lige en rettelse af mig selv.

C99 har faktisk en undtagelse for main() som tillader ovenstående:
"reaching the } that terminates the main function returns a value
of 0." (fra afsnit 5.1.2.2.3).

Det går stadigvæk ikke for andre funktioner: "If the } that
terminates a function is reached, and the value of the function
call is used by the caller, the behavior is undefined." (fra
afsnit 6.9.1).

Det er efter mening noget underligt rod at main() må behandles
anderledes end alle andre funktioner, og jeg havde glemt det i
morges.

Ostehapsen (18-12-2001)
Kommentar
Fra : Ostehapsen


Dato : 18-12-01 22:32

Byrial Jensen wrote:

> C99 har faktisk en undtagelse for main() som tillader ovenstående:
> "reaching the } that terminates the main function returns a value
> of 0." (fra afsnit 5.1.2.2.3).
>
> Det går stadigvæk ikke for andre funktioner: "If the } that
> terminates a function is reached, and the value of the function
> call is used by the caller, the behavior is undefined." (fra
> afsnit 6.9.1).
>
> Det er efter mening noget underligt rod at main() må behandles
> anderledes end alle andre funktioner, og jeg havde glemt det i
> morges.


Hehe, du får det til at lyde som om denne C99 ting er din bibel og at du
har et erklæret mål om at lære den udenad ;)

Jeg supplerer dig lige med citater fra K&R (det gamle testamente ;)).

Lidt generelt om returværdier:

Side 26:
A function need not return a value; a return statement with no
expression causes control, but no useful value, to be returned to the
caller, as does "falling off the end" of a function by reaching the
terminating right brace. And the calling function can ignore a value
returned by a function

Side 70:
Control also returns to the caller with no value when execution "falls
off the end" of the function by reaching the closing right brace. It is
not illegal, but probably a sign of trouble, if a function returns a
value from one place and no value from another. In any case, if a
function fails to return a value, its "value" is certain to be garbage.

Lidt om returværdier fra "main":

Side 164:
Within main, return expr is equivalent to exit(expr). exit has the
advantage that it can be called from other functions, and that calls to
it can be found with a pattern-searching program [klip].

Side 26:
In the interest of simplicity, we have omitted return statements from
our main functions up to this point, but we will include them hereafter,
as a reminder that programs should return status to their environment.

Side 164 igen:
We have generally not worried about exit status in our small
illustrative programs, but any serious program should take care to
return sensible, useful status values.

Det vil nok være en tilsnigelse at kalde vores strengudskrivning for "a
serious program" ;)

Desværre kunne jeg ikke lige finde noget i K&R om at "main" returnerer 0
hvis ikke andet angives (Det var vist det du ikke kunne li'?).

Lidt om argumenter til "main":

Side 72-73:
This special meaning of the empty argument list is intended to permit
older C programs to compile with new compilers. But it's a bad idea to
use it with new programs. If the function takes arguments, declare them;
if it takes no arguments, use void.

Det må ikke komme som nogen overraskelse hvis en kompilator spytter en
advarsel ud i forbindelse med manglende "return", men det er åbenbart
ikke "ulovligt". På samme måde er det ikke ulovligt at udelade
argumenterne til "main".

Hvad siger C99 iøvrigt om dette:

char a = 4["Juleleg"];
a = a++;

--
Aksel


Igor V. Rafienko (20-12-2001)
Kommentar
Fra : Igor V. Rafienko


Dato : 20-12-01 17:46

[ blah@blah.dk ]

[ dropp den idiotiske nic'en, så blir du tatt litt mer alvorlig ]

[ snip ]

> Hehe, du får det til at lyde som om denne C99 ting er din bibel og
> at du har et erklæret mål om at lære den udenad ;)
>
> Jeg supplerer dig lige med citater fra K&R (det gamle testamente
> ;)).


Det skal også sies at K&R ikke er et dokument som definerer språket.

[ snip ]


> Det må ikke komme som nogen overraskelse hvis en kompilator spytter
> en advarsel ud i forbindelse med manglende "return",


Jeg ville faktisk bli overrasket om en kompilator gjorde for "main",
men jeg ville _forvente_ at en kompilator gjorde det for alle andre
ikke-void funksjoner.


> Hvad siger C99 iøvrigt om dette:
>
> char a = 4["Juleleg"];


op[] har alltid vært kommutativ.


> a = a++;


Og dette har aldri vært lovlig (2 modifiseringer av samme objekt uten
en "sequence point" imellom).





ivr
--
Typical biased DRC opinion: All ADT's should be made in C++ rather than C
if a choice between those two fundamental languages exists. Templates make
the old C way of doing things downright foolish (when it comes to ADT's).
          --   Dann Corbit on <news:comp.lang.c>

Morten (20-12-2001)
Kommentar
Fra : Morten


Dato : 20-12-01 19:16


"Byrial Jensen" <bjensen@nospam.dk> skrev i en meddelelse > >>> int
main(){char*c=message;do{putchar(*c?*c:'\n');}while(*c++);}
>
....
> Jeg kan godt læse linjen. Jeg kunne også skrive tilsvarende med
> endnu færre tegn, men det ville jeg aldrig gøre i praksis. Det
> nedsætter væsentligt den tid man skal bruge på at læse og forstå
> programmet og gør det svært at vedligeholde.

Jeg er fuldstændig enig med dem, hvorfor gøre sproget mere indviklet end
nødvendig, når det alligevel ikke gør programmet mere effiktiv.

Mvh.: Morten



Morten (20-12-2001)
Kommentar
Fra : Morten


Dato : 20-12-01 19:20


"Byrial Jensen" <bjensen@nospam.dk> skrev i en meddelelse > Du svarer ikke
på spørgsmålet om hvorfor overhodevet skrive på den

>>main(){char*c=message;do{putchar(*c?*c:'\n');}while(*c++);}
> Jeg kan godt læse linjen. Jeg kunne også skrive tilsvarende med
> endnu færre tegn, men det ville jeg aldrig gøre i praksis. Det
> nedsætter væsentligt den tid man skal bruge på at læse og forstå
> programmet og gør det svært at vedligeholde.

Jeg er fuldstændig enig med dem, hvorfor gøre sproget mere indviklet end
nødvendig, når det alligevel ikke gør programmet mere effiktiv.

Mvh.: Morten





Ostehapsen (19-12-2001)
Kommentar
Fra : Ostehapsen


Dato : 19-12-01 21:29

Morten wrote:

> Jeg er fuldstændig enig med dem, hvorfor gøre sproget mere indviklet end
> nødvendig, når det alligevel ikke gør programmet mere effiktiv.


Så, ikke mere tudefjæs nu, vel?

--
Aksel


Ostehapsen (18-12-2001)
Kommentar
Fra : Ostehapsen


Dato : 18-12-01 17:39

Morten wrote:

> Hvorfor overhovedet anvende en så absort linje som ingen alligevel kan
> forstå undtagen den som har skrevet den. Et skræmmende eksemple på hvor
> krytisk et C program KAN skrives!


Du svarer selv på spørgsmålet. Iøvrigt synes jeg selv at eksemplet med
rekursion var absortere... ;)

Detteher er jo helt tilforladeligt hvis man ombryder linierne rigtigt og
laver indryk.

--
Aksel



Søg
Reklame
Statistik
Spørgsmål : 177500
Tips : 31968
Nyheder : 719565
Indlæg : 6408518
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste