[C] C en C++ niet gelijk?

Pagina: 1
Acties:
  • 519 views sinds 30-01-2008
  • Reageer

Anoniem: 87291

Topicstarter
Ik ben op de uni bezig met C te leren, we zijn pas net begonnen dus niveau is nog relatief laag; maar dat verandert hopelijk snel. Nu heb ik op aanraden van mensen hier DEV C++ editor & compiler gedownload om mijn C progjes te maken. Nu maak ik een loop voorbeeld uit het boek, alleen doet hij niet wat het boek aangeeft, terwijl ik toch letterlijk intyp wat daar staat [10 x nagekeken] is het misschien zo, dat er toch verschillen zitten tussen C en C++ ? Maar C zou juist toch onder c++ moeten draaien?

of maakt het boek een fout?

//edit: het boek is overigens "C programming, a modern aproach " door KN King

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/*de som van een serie getallen */
# include <stdio.h> 
  
main () 
{ 
  
int n, som = 0;

printf("dit programma berekent de som van een serie getallen:\n");
printf("toets een getal in (of 0 om te stop): ");

scanf("%d", &n) ;
while (n != 0) {
    som += n;
    scanf("%d", &n);
}
    
printf("de som is: %d\n", som);
     
    return 0;

}

[ Voor 9% gewijzigd door Anoniem: 87291 op 21-09-2003 21:12 ]


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 11-06 20:01

Robtimus

me Robtimus no like you

Wat doet hij dan niet/anders? En wat voor foutmeldingen krijg je?

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Anoniem: 9930

int main()

Anoniem: 87291

Topicstarter
hij doet gewoon niets: vraagt om een getal & als je een getal invult en entert, krijgt gewoon een blanco scherm ipv dat hij iets uitvoert.

int main() ?

[ Voor 8% gewijzigd door Anoniem: 87291 op 20-09-2003 20:28 ]


  • SWfreak
  • Registratie: Juni 2001
  • Niet online
Anoniem: 87291 schreef op 20 September 2003 @ 20:27:
hij doet gewoon niets: vraagt om een getal & als je een getal invult en entert, krijgt gewoon een blanco scherm ipv dat hij iets uitvoert.

int main() ?
Als je 1 getal invoert, is er idd geen uitvoer. Maar als je 1 getal invoert, gevolgd door enter en vervolgens een 0 invoert, dan zou het toch moeten werken? Ik zie niets vreemds aan de code...

  • Arie Kanarie
  • Registratie: Augustus 2002
  • Laatst online: 12-07-2023
int main() ?
Ja heeft iets met return waarde te maken volgens mij. Wanneer een programma goed verloopt is de return 0. Bij een error kun je een 1 returnen (en daar weer allerhande leuke dingen mee doen). :) (en anders moet ik mijn C++ boek maar weer eens tevoorschijn halen)

[ Voor 22% gewijzigd door Arie Kanarie op 20-09-2003 20:39 ]

-


  • ^Mo^
  • Registratie: Januari 2001
  • Laatst online: 19-04 08:34
Anoniem: 87291 schreef op 20 September 2003 @ 20:27:
hij doet gewoon niets: vraagt om een getal & als je een getal invult en entert, krijgt gewoon een blanco scherm ipv dat hij iets uitvoert.

int main() ?
Dat is toch juist? Je voert een getal in, dit wordt opgeteld bij som, en daarna moet je weer een getal invullen. Dit gaat door tot het getal dat je invoert 0 is.
En de functie main heeft het return type int. Maar volgens mij kan je het technisch gesproken weglaten... netter is om het expliciet neer te zetten.

"There are 10 kinds of people in the world, those who understand binary and those who don't" | Werkbak specs


  • ^Mo^
  • Registratie: Januari 2001
  • Laatst online: 19-04 08:34
aaargh, verkeerde knopje, sowwy :D

[ Voor 95% gewijzigd door ^Mo^ op 20-09-2003 20:39 . Reden: Op reply gedrukt ipv edit 8)7 ]

"There are 10 kinds of people in the world, those who understand binary and those who don't" | Werkbak specs


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 27-05 16:00

curry684

left part of the evil twins

_Mo_ schreef op 20 September 2003 @ 20:37:
[...]

Dat is toch juist? Je voert een getal in, dit wordt opgeteld bij som, en daarna moet je weer een getal invullen. Dit gaat door tot het getal dat je invoert 0 is.
En de functie main heeft het return type int. Maar volgens mij kan je het technisch gesproken weglaten... netter is om het expliciet neer te zetten.
Een niet gedefinieerde returnwaarde wordt default door de compiler altijd als 'int' beschouwd. Iedere compiler die ik ken geeft er overigens een zware warning op.

Reden dat 'int' wordt assumed en niet 'void' is dat het ontbreken van een return-statement bij int wel een compilererror oplevert, dus het is restrictiever en beschermt beter tegen fouten.

Verder ziet die code er idd perfect uit imho.

Professionele website nodig?


  • Evilbee
  • Registratie: November 2002
  • Laatst online: 23:19
Heb je ook geprobeert je prog te compilen met een c compiler, want volgens mij is devc++ een c++ compiler.

Ik gebruikt Miracle C. En die werkt bij mij perfect.

LinkedIn - Collega worden?


  • Soultaker
  • Registratie: September 2000
  • Nu online
Dev-C++ is slechts een IDE die samenwerkt met GCC (niet eens exclusief, geloof ik). Je kunt dus met Dev-C++ uitstekend C-code compileren, al zul je dat wel aan moeten geven bij je project settings (als je met een C++ project werkt).

  • dArtagnan
  • Registratie: Mei 2002
  • Laatst online: 09-06 23:36

dArtagnan

Een voor allen, allen voor een

Ik heb de code ook even getest (met Dev-C++) en het werkt. Het is alleen een beetje onduidelijk wat je moet doen na het eerste getal. Ook heb ik even wat dingen toegevoegt.

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/*de som van een serie getallen */ 
# include <stdio.h>  
   
main ()  
{  
   
int n, som = 0; 

printf("dit programma berekent de som van een serie getallen:\n"); 
printf("toets een getal in (of 0 om te stop) \n\n"); 

printf("Getal (0 om te stoppen): ");
scanf("%d", &n) ; 
while (n != 0) { 
    som += n; 
    printf("Getal (0 om te stoppen): ");
    scanf("%d", &n); 
} 
     
printf("\nde som is: %d\n", som);
printf("\Druk op een toets om het programma te beeindigen ...");
getchar(); getchar ();
      
    return 0; 

}


Je zou return 0; ook nog weg kunnen laten.

[ Voor 11% gewijzigd door dArtagnan op 20-09-2003 23:28 ]


Anoniem: 43846

Koraalduivel schreef op 20 September 2003 @ 23:27:Je zou return 0; ook nog weg kunnen laten.
je zou ook "while (n)" kunnen doen ipv "while (n != 0)" :P

edit: nog compacter:
code:
1
while (scanf("%d", &n), n) som += n;
als ik me niet vergis :)

[ Voor 24% gewijzigd door Anoniem: 43846 op 20-09-2003 23:38 ]


Anoniem: 14126

ipv van printf("\Druk op een toets...");
getchar(); getchar();

is:

system("pause");

ook aan te raden

  • dArtagnan
  • Registratie: Mei 2002
  • Laatst online: 09-06 23:36

dArtagnan

Een voor allen, allen voor een

Anoniem: 14126 schreef op 20 September 2003 @ 23:35:
ipv van printf("\Druk op een toets...");
getchar(); getchar();

is:

system("pause");

ook aan te raden
Welk bestand moet je dan toevoegen bij #include?
'system' undeclared (first use this function)
[Build Error] (Each undeclared identifier is reported only once

  • Arzie
  • Registratie: Juni 1999
  • Laatst online: 07:06
Anoniem: 14126 schreef op 20 september 2003 @ 23:35:
ipv van printf("\Druk op een toets...");
getchar(); getchar();

is:

system("pause");

ook aan te raden
Dat lijkt me juist niet, ben je meteen van je portabiliteit af.

Acties:
  • 0 Henk 'm!

  • Arzie
  • Registratie: Juni 1999
  • Laatst online: 07:06
Anoniem: 87291 schreef op 20 September 2003 @ 20:27:
hij doet gewoon niets: vraagt om een getal & als je een getal invult en entert, krijgt gewoon een blanco scherm ipv dat hij iets uitvoert.
Je voert het programma niet toevallig uit vanuit Explorer ofzo? Dan opent zich een windowtje, waarin je je cijfertjes invult, maar als je met een 0 de boel beëindigt zal het windowtje vrijwel meteen sluiten.
Wat beter werkt is dat je het programma vanuit een cmd-box uitvoert, dan kom je na beëindiging terug bij de prompt en kun je het resultaat nog lezen.

Acties:
  • 0 Henk 'm!

  • dArtagnan
  • Registratie: Mei 2002
  • Laatst online: 09-06 23:36

dArtagnan

Een voor allen, allen voor een

Arzie schreef op 21 September 2003 @ 00:04:
[...]


Je voert het programma niet toevallig uit vanuit Explorer ofzo? Dan opent zich een windowtje, waarin je je cijfertjes invult, maar als je met een 0 de boel beëindigt zal het windowtje vrijwel meteen sluiten.
Wat beter werkt is dat je het programma vanuit een cmd-box uitvoert, dan kom je na beëindiging terug bij de prompt en kun je het resultaat nog lezen.
Daarom heb ik er ook getchar(); getchar(); neergezet. Dan kun je hem wel gewoon vanuit explorer openen.

Acties:
  • 0 Henk 'm!

Anoniem: 30045

ik heb ook net C++ gehad :P moet straks ook met char werke... :D

main? void main() { ?

Acties:
  • 0 Henk 'm!

  • dArtagnan
  • Registratie: Mei 2002
  • Laatst online: 09-06 23:36

dArtagnan

Een voor allen, allen voor een

Anoniem: 30045 schreef op 21 September 2003 @ 00:09:
ik heb ook net C++ gehad :P moet straks ook met char werke... :D

main? void main() { ?
Eerst zet je de #include en #define onderdelen bovenaan. Daarna komt je de basis van je programma: main() of int main(). Die basis komt dan tussen { en }.
Dit is trouwens C.

Acties:
  • 0 Henk 'm!

  • Arzie
  • Registratie: Juni 1999
  • Laatst online: 07:06
Koraalduivel schreef op 21 September 2003 @ 00:06:
[...]

Daarom heb ik er ook getchar(); getchar(); neergezet. Dan kun je hem wel gewoon vanuit explorer openen.
Idd, dat is een nettere oplossing.

Acties:
  • 0 Henk 'm!

  • MPAnnihilator
  • Registratie: Juni 2002
  • Laatst online: 25-05 19:19
By the way, soms krijg je van die meldingen dat je verouderde headers gebruikt enz..., dan verwijst Dev c++ naar hoofdstuk blabla , van pagina blabla, van het standaard c++ boek ( of zoiets ). Enig idee waar je dat kan downloaden ? Ik zit namelijk heel erg in de knoei met zaken die ik 4 jaar geleden in school gebruikte met een borland c++ compiler. En ik wil weten welke funties er in welke headers zitten. Is er een manier in devc++ om alle funties te bekijken in een header ? Weet iemand dit ?

Mijn Specs


Acties:
  • 0 Henk 'm!

  • Arzie
  • Registratie: Juni 1999
  • Laatst online: 07:06
-GF-Annihilator schreef op 21 September 2003 @ 00:24:
By the way, soms krijg je van die meldingen dat je verouderde headers gebruikt enz...
Als het gaat om een verouderde manier van headers includen kun je gewoon .h weghalen, dan wordt het dus #include <stdio>.

Bij Borlandproducten zit in de help vaak een complete functiereference (met bij elke functie aangegeven in welke headerfile hij zit).

Acties:
  • 0 Henk 'm!

  • rollebol
  • Registratie: Mei 2000
  • Laatst online: 25-09-2024
Overigens, het is nog niet echt ter sprake gekomen hier, maar C en C++ zijn inderdaad niet helemaal hetzelfde. Er zijn wat subtiele verschillen waar ik even niet op kan komen, maar deze is wel erg voor de hand liggend (en flauwer dan de voorbeelden waar ik niet op kan komen):

C:
1
2
3
int main (int bool, char **class) {
  return puts ("Hello world!");
}

Als je in een stuk C++ ergens C nodig hebt (of grote hoeveelheden legacy code overhebt die het woord 'class' gebruikt - zoals de Linux kernel) dan kan je gebruik maken van 'extern C' als volgt:
C++:
1
2
3
extern "C" {
  /* Doe hier je ding */
};

[ Voor 28% gewijzigd door rollebol op 21-09-2003 00:37 ]


Acties:
  • 0 Henk 'm!

  • MPAnnihilator
  • Registratie: Juni 2002
  • Laatst online: 25-05 19:19
Arzie schreef op 21 September 2003 @ 00:31:
[...]

Bij Borlandproducten zit in de help vaak een complete functiereference (met bij elke functie aangegeven in welke headerfile hij zit).
Bij Dev C++ dus niet ?

Mijn Specs


Acties:
  • 0 Henk 'm!

  • dArtagnan
  • Registratie: Mei 2002
  • Laatst online: 09-06 23:36

dArtagnan

Een voor allen, allen voor een

Ik kon het niet vinden in onder help bij dev-c++. Maar misschien heb ik verkeerd gekeken.

Acties:
  • 0 Henk 'm!

  • MisterData
  • Registratie: September 2001
  • Laatst online: 05-06 17:06
Als het je puur om de C Runtime functies gaat, kijk dan op CPPReference.com :)

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 09:29

.oisyn

Moderator Devschuur®

Demotivational Speaker

rollebol schreef op 21 september 2003 @ 00:32:
Als je in een stuk C++ ergens C nodig hebt (of grote hoeveelheden legacy code overhebt die het woord 'class' gebruikt - zoals de Linux kernel) dan kan je gebruik maken van 'extern C' als volgt:
C++:
1
2
3
extern "C" {
  /* Doe hier je ding */
};
Dat is onzin. Met extern geef je alleen de linkage aan, niet hoe het gecompileerd gaat worden. Code dat door een C++ translation unit gaat zal dus altijd als C++ code geinterpreteerd worden, ongeacht of je nou in een extern "C" blok zit of niet

Verder heeft C++ een strictere typechecking dan C, dus een C++ translation unit compileert niet alle C code (je komt vooral in de knoei met implicit casts van void * naar een ander pointer type, wat in C geen probleem is, maar in C++ niet mag)
Verder is sinds de komst van C99 het verschil alleen maar groter geworden, vooral omdat de 2 standaarden onafhankelijk van elkaar door ontwikkeld worden. Een aanpassing aan de C standaard is dus niet automatisch een aanpassing aan de C++ standaard

[ Voor 30% gewijzigd door .oisyn op 21-09-2003 14:23 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • MPAnnihilator
  • Registratie: Juni 2002
  • Laatst online: 25-05 19:19
C:/Dev-Cpp/include/c++/backward/backward_warning.h:32:2: warning: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <sstream> instead of the deprecated header <strstream.h>.
Hier meldt hij dus dat je voor de nieuwe headers moet gaan kijken in "found in section 17.4.1.2 of the C++ standard" , waar vind ik dit , is dit een boek welke je kan kopen in de handel , is dat ergens te downloaden, iemand een idee ?

Als ik bij sommige headers dan de '.h' weglaat , dan krijg ik de error dat hij mijn geliefde 'cin' en 'cout' niet meer kent |:(

Dus als ik volgende headers gebruik 'conio.h' en 'iostream.h' , dan kan ik 'getch()' en 'cin' en 'cout' wel gebruiken maar krijg ik telkens die melding over die verouderde headers. :'(

Iemand een beter idee/header om die 'cin' en 'cout' te kunnen blijven gebruiken met c++ in devc++?

[ Voor 19% gewijzigd door MPAnnihilator op 21-09-2003 14:27 ]

Mijn Specs


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Nu online
Erm ja, je zou natuurlijk ook de letterlijke foutmelding kunnen lezen, he:
Examples include substituting the <X> header for the <X.h> header for C++ includes, or <sstream> instead of the deprecated header <strstream.h>.
Als het dus misgaat met het includen van iostream.h, wat zou je dan verkeerd doen?
-GF-Annihilator schreef op 21 September 2003 @ 14:26:
Hier meldt hij dus dat je voor de nieuwe headers moet gaan kijken in "found in section 17.4.1.2 of the C++ standard" , waar vind ik dit , is dit een boek welke je kan kopen in de handel , is dat ergens te downloaden, iemand een idee ?
Het is in ieder geval niet te downloaden, want het is een ISO standaard, en de ISO laat zich goed betalen door geinteresseerde particulieren.
Als ik bij sommige headers dan de '.h' weglaat , dan krijg ik de error dat hij mijn geliefde 'cin' en 'cout' niet meer kent |:(
Dat klopt; dan zitten ze namelijk in de (goede) namespace "std". Je kunt ze dan met "std::cin" en "std::cout" benaderen, of ze importeren met "using std::cin;" en "using std::cout;", of als derde (enigzins lompe) mogelijkheid alles uit de namespace importeren: "using namespace std;".

[ Voor 61% gewijzigd door Soultaker op 21-09-2003 14:57 ]


Acties:
  • 0 Henk 'm!

Anoniem: 63072

Heeft Femkester het progsel inmiddels aan de praat gekregen? Wel een vaag boek waar hij uit leertzeg.

De return type van main niet expliciet opgeven is mijn inziens bad coding style. Een while statement gebruik in een prgsel dat het schoolvoorbeeld is van een do ... while loop (dan staat er maar 1x scanf , alleen in de loop). Of ben ik de enige die er zo over denkt?

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 11-06 15:22
Arzie schreef op 21 september 2003 @ 00:31:
Als het gaat om een verouderde manier van headers includen kun je gewoon .h weghalen, dan wordt het dus #include <stdio>.
Volgens mij heet die header <cstdio>

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 09:29

.oisyn

Moderator Devschuur®

Demotivational Speaker

Anoniem: 63072 schreef op 21 september 2003 @ 15:02:
De return type van main niet expliciet opgeven is mijn inziens bad coding style.
maar is niet verkeerd in C
Een while statement gebruik in een prgsel dat het schoolvoorbeeld is van een do ... while loop (dan staat er maar 1x scanf , alleen in de loop). Of ben ik de enige die er zo over denkt?
En do...while? Mag jij mij vertellen hoe je dat implementeert. Het punt is dat je de controle in het midden van de loop moet doen.

in psuedocode:
code:
1
2
3
4
5
6
start:
    n = leesgetal ();
    if (n == 0)
        goto eind;
    som += n;
    goto start;


Kijk, de n=0 check zit daar in het midden. Na die check moet er nog wat gedaan worden, afhankelijk van de uitkomt van de check. Dat lukt je niet met een do...while lus. (Wel met een while (true) of for (;;) lus, waarbij je de if handmatig uitvoert en zonodig break'd, maar of dat nou zo mooi is)
farlane schreef op 21 september 2003 @ 15:14:

Volgens mij heet die header
idd, alle ANSI C headers worden in C++ de header zonder extensie en met en c ervoor. Met als resultaat dat alle C symbols ook ineens in de std namespace staan

[ Voor 8% gewijzigd door .oisyn op 21-09-2003 15:25 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

Anoniem: 63072

.oisyn schreef op 21 September 2003 @ 15:24:

En do...while? Mag jij mij vertellen hoe je dat implementeert. Het punt is dat je de controle in het midden van de loop moet doen.

in psuedocode:
code:
1
2
3
4
5
6
start:
    n = leesgetal ();
    if (n == 0)
        goto eind;
    som += n;
    goto start;


Kijk, de n=0 check zit daar in het midden. Na die check moet er nog wat gedaan worden, afhankelijk van de uitkomt van de check. Dat lukt je niet met een do...while lus. (Wel met een while (true) of for (;;) lus, waarbij je de if handmatig uitvoert en zonodig break'd, maar of dat nou zo mooi is)
Die hele check halverwege is in dit geval niet nodig, dat is het gevolg van het kiezen van 0 als stop conditie. Het doet er niet toe of je deze bij de som optelt, deze blijft gelijk.

code:
1
2
3
4
do {
    scanf("%d", &n);
    som += n;
} while (n)

Acties:
  • 0 Henk 'm!

  • rollebol
  • Registratie: Mei 2000
  • Laatst online: 25-09-2024
.oisyn schreef op 21 September 2003 @ 14:20:
[...]

Dat is onzin. Met extern geef je alleen de linkage aan, niet hoe het gecompileerd gaat worden. Code dat door een C++ translation unit gaat zal dus altijd als C++ code geinterpreteerd worden, ongeacht of je nou in een extern "C" blok zit of niet
Dat wist ik niet. Ik zie ook niet helemaal concreet voor me waar je dat extern "C" dan voor nodig hebt.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 09:29

.oisyn

Moderator Devschuur®

Demotivational Speaker

Anoniem: 63072 schreef op 21 September 2003 @ 15:34:
[...]


Die hele check halverwege is in dit geval niet nodig, dat is het gevolg van het kiezen van 0 als stop conditie. Het doet er niet toe of je deze bij de som optelt, deze blijft gelijk.
Dat is idd waar, 0 bij de som optellen verandert natuurlijk niets aan de som. De vraag is of het wel correct is. Want wat als nu niet de 0 wordt gebruikt als stopcritereum, maar een 1? Dan werkt het al niet meer.

Daarnaast wordt de scanf operatie niet gecontroleerd op errors, maar dat terzijde ;)
rollebol schreef op 21 September 2003 @ 15:37:
[...]
Dat wist ik niet. Ik zie ook niet helemaal concreet voor me waar je dat extern "C" dan voor nodig hebt.
Zoals ik al zei, het geeft de external linkage aan. In C++ kun je functies overloaden met verschillende parametertypen. Maar dat heeft als gevolg dat meerdere functies dezelfde naam hebben, en dus kun je niet puur die naam in een gecompileerde object file zetten. En dus krijgt elke C++ functie een aangepaste naam waarin de declaratie in terug te vinden is. Dit heet name-mangling (en is compiler-afhankelijk). Omdat dit in C niet gebeurt, en je wel graag vanuit C (of een andere taal) een C++ functie aan wilt kunnen roepen, is er de extern directive, die aangeeft dat een bepaalde functie-naam niet gemangled mag worden

Oftewel, als je de volgende C source hebt:
C:
1
2
3
4
5
6
void cppFunc ();

int main ()
{
    cppFunc ();
}


en de volgende C++ source

C++:
1
2
3
4
5
6
#include <iostream>

void cppFunc ()
{
    std::cout << "hello world" << std::endl;
}


en je compileert en linkt dat, dan krijg je een linker error. Iets in de trand van:
main.o: Unresolved external symbol "_cppFunc"
Om het toch te laten werken, moet je je C++ source zo aanpassen:
C++:
1
2
3
4
5
6
#include <iostream>

extern "C" void cppFunc ()
{
    std::cout << "hello world" << std::endl;
}

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

Anoniem: 87291

Topicstarter
het vreemde is dat het voorbeeld dat ik geef rechtstreeks uit het boek komt, dus erg vreemd dat het aanpassingen behoeft..

het boek is overigens "C programming, a modern aproach " door KN King

[ Voor 24% gewijzigd door Anoniem: 87291 op 21-09-2003 21:11 ]


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Nu online
Anoniem: 87291 schreef op 21 september 2003 @ 21:09:
het vreemde is dat het voorbeeld dat ik geef rechtstreeks uit het boek komt, dus erg vreemd dat het aanpassingen behoeft..

het boek is overigens "C programming, a modern aproach " door KN King
Op zich zou het de eerste keer niet zijn dat er in een echt, papieren boek geschreven door een man die daar voor betaald wordt, toch wat fouten voorkomen, waarbij 'wat' nogal ruim geinterpreteerd kan worden.

In dit geval is dat, volgens mij, echter niet aan de orde. De oorspronkelijke gegeven programmacode is in principe gewoon correct en als C programma ook niet slecht (al zou ik zelf die scanf-regel niet hebben willen dupliceren, maar dat terzijde). Dat jij niet in staat bent het programma in de console te executeren, valt de auteur van een boek over een programmeertaal natuurlijk niet te verwijten.

Acties:
  • 0 Henk 'm!

  • rollebol
  • Registratie: Mei 2000
  • Laatst online: 25-09-2024
.oisyn: Nu je de term 'name mangling' noemt snap ik direct wat je bedoelt, bij alleen maar 'dat heeft met linkage te maken' had ik nog een extra hint nodig. :)

Duidelijk.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 06-06 08:54
Wat je probeerde heette "implicit int", en dat is invalide in C en C++. Alleen is het in C++ om technische redenen erg lastig om dit te gedogen, waar veel C compilers het wel kunnen gedogen. Het boek is dus fout.

( Voor ISO C / ANSI C in 1990 was de de facto standaard Kernigham&Richie's boek, eerste editie en daarin was het wel legaal. In de standaard en K&R2 is het veranderd. )

[edit: dit was eigenlijk al gezegd :Z ]

extern "C" doet hele andere dingen dan C++ als C compileren. Ook in een extern "C" block is class een gereserveerd woord. Het zorgt ervoor dat dat blok code aan een aparte .c file gelinkt kan worden. Op die manier kun je .c en .cpp files en dus C en C++ mengen.Niet op regel nivo, alleen op file nivo.

De verouderde headers waarschuwing los je inderdaad op door .h weg te halen, maar stdio.h is niet zo'n header. Dat is een valide en courante C header. De C++ variant daarvan is <cstdio>, niet <stdio>. Dit leidt nogal eens tot verwarring met <string.h>, <cstring> en <string>. In C++ zijn dat alle 3 valide headers. De eerste twee zijn vrijwel identiek, de derde is compleet anders (nl. de C++ std::string class ipv C string functies)

[ Voor 15% gewijzigd door MSalters op 27-09-2003 21:13 . Reden: :Z ]

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Anoniem: 77820

Ik heb heel dit topic niet gelezen maar @ topicstarter, de while loop wordt beeindig zodra n == 0. En dan pas wordt de som wergegeven, printf() staat immers NA de while loop. Ik ben trouwens ook een beginner, maar net iets verder als jij. En ik heb ook uren lang met dit soort problemen gezeten :p

.modbreak: als je het niet leest, post dan ook niet, nu ga je alleen maar dingen noemen die allang naar voren zijn gekomen

[ Voor 22% gewijzigd door .oisyn op 29-09-2003 16:12 ]

Pagina: 1