[C++||NEWBIE]Error bij init van char

Pagina: 1
Acties:

  • BezurK
  • Registratie: Juni 2001
  • Laatst online: 14-06 09:12
Ik heb om een beetje te oefenen met C++ in kdevelop dit progje geschreven:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
    char szword[];
    szword=argv[1];
  cout << "Word given: " << szword << endl;

  char szrevword[];
  for(int i=0; i<strlen(szword); i++)
      szrevword[strlen(szword)-i]=szword[i];

  cout << "Reversed word: " << szrevword << endl;
    
    return EXIT_SUCCESS;
}

Waarom krijg ik een foutmelding dat de grootte van szword niet opgegeven is? Volgens het boek waar ik het uit leer (C++ voor dummies :)) is dat niet nodig!

Rookworst zonder R is ook worst.


  • D2k
  • Registratie: Januari 2001
  • Laatst online: 31-08 10:19

D2k

der moet echt wel een grootte staan hoor :)

Doet iets met Cloud (MS/IBM)


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Op woensdag 02 januari 2002 12:39 schreef BezurK het e.e.a.
Vervang
char szword [];
eens door
char *szword;

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • D2k
  • Registratie: Januari 2001
  • Laatst online: 31-08 10:19

D2k

Op woensdag 02 januari 2002 12:41 schreef drm het volgende:

[..]

Vervang
char szword [];
eens door
char *szword;
sssssssssssssssst (ut was een dummy's boek. simpel houden dus)

Doet iets met Cloud (MS/IBM)


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Op woensdag 02 januari 2002 12:42 schreef D2k het volgende:

[..]

sssssssssssssssst (ut was een dummy's boek. simpel houden dus)
Ik hoopte dat hij ons daarna om uitleg ging vragen :)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • BezurK
  • Registratie: Juni 2001
  • Laatst online: 14-06 09:12
Oh, nu heb ik dat opgelost door szword als volgt te declareren:
code:
1
char szword[strlen(argv[1])]

ik wil namelijk het eerste argument (dus niet [0] maar [1]) erin opslaan omdat het woord dus omgedraaid moet worden, maar dan komtie met incompatible types op de proppen, waarom? :(

En trouwens, is het niet verdomde lastig als je constant moet anticiperen op de grootte van een string? Hoe kan je dat dan doen als je bijvoorbeeld je input krijgt via cin oid???

Rookworst zonder R is ook worst.


  • BezurK
  • Registratie: Juni 2001
  • Laatst online: 14-06 09:12
Op woensdag 02 januari 2002 12:41 schreef drm het volgende:



[..]



Vervang

char szword [];

eens door

char *szword;
sweet! waarom werkt het nu wel dan? :? (*grin*)

Rookworst zonder R is ook worst.


Verwijderd

het TYPE wat je wilt maken is een char[], dus declareren als:
char[] szword;

Done ;-)

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Op woensdag 02 januari 2002 12:44 schreef BezurK het volgende:
Oh, nu heb ik dat opgelost door szword als volgt te declareren:
code:
1
char szword[strlen(argv[1])]

ik wil namelijk het eerste argument (dus niet [0] maar [1]) erin opslaan omdat het woord dus omgedraaid moet worden, maar dan komtie met incompatible types op de proppen, waarom? :(
Is ook allesbehalve netjes.
En trouwens, is het niet verdomde lastig als je constant moet anticiperen op de grootte van een string? Hoe kan je dat dan doen als je bijvoorbeeld je input krijgt via cin oid???
Je anticipeert niet, je legt vast. Als je wilt dat er geen grenzen mogen/hoeven zijn, dan zorg je dat je programma dat ondersteunt. As simple as that.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • BezurK
  • Registratie: Juni 2001
  • Laatst online: 14-06 09:12
Op woensdag 02 januari 2002 12:45 schreef wouterd het volgende:
het TYPE wat je wilt maken is een char[], dus declareren als:

char[] szword;

Done ;-)
Whaaaaaa, waarom krijg ik 3 verschillende antwoorden??? HELP

Rookworst zonder R is ook worst.


Verwijderd

Over dat anticiperen op de grootte:

Je zult het moeten doen, tenzij je een eigen classe maakt die zijn eigen geheugen allocatie afhandeld (zoals de CString classe in MFC).

Voor dynamisch gebruik:

Ingeval van een array: alloceer éénmalig een array die groot genoeg is en gebruik deze voor alles.
Dus: #define MY_MAX_SIZE 255
char szMyCharArray[MY_MAX_SIZE];

Voor char* maak gebruik van bijvoorbeeld malloc(sizeof(de grootte). Vergeet dan niet de free(...) te gebruiken als je klaar bent, anders heb je een geheugenvreter.


EiSl

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Op woensdag 02 januari 2002 12:45 schreef BezurK het volgende:
sweet! waarom werkt het nu wel dan? :? (*grin*)
;)

Je geeft aan dat szword een pointer is naar een character. Oftewel, een geheugenadres. Dit geheugenadres bevat in dit geval het adres van het eerste character van de string argv[1]. Je maakt dus geen kopie van de inhoud van argv[1] zoals je waarschijnlijk veronderstelt, maar je maakt een verwijzing naar de string.

De structuur van C zit zo in elkaar, dat wanneer je over een tekenreeks spreekt, je die tekenreeks aangeeft met een pointer naar het 1e character van de string, en de string eindigt met een '\0' character. Maar, er moet van te voren bepaald worden welke geheugenruimte er voor die string gebruikt mag worden. Dit kan op verschillende manieren.

1 manier is het "aan de compiler vertellen". Van te voren, dus:
code:
1
char string [ 12 ];

Een andere is (C) door dynamisch geheugen gebruikt. In C++ gebeurt dat met "new" en "delete". In C met de alloc ()-familie en free ()

In jouw voorbeeld wordt door het in het OS al geheugen gereserveerd voor de argumenten van het programma, en het OS geeft pointers aan het programma mee naar die argumenten.

Oftewel: argv is een array van pointers. Vandaar: char * argv []

Snappie het nog?

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • BezurK
  • Registratie: Juni 2001
  • Laatst online: 14-06 09:12
Op woensdag 02 januari 2002 12:53 schreef drm het volgende:
[..]
Snappie het nog?
Ik denk het wel ja :)

Dat stuk over pointers heb ik al gehad in het boek maar ik snap(te) er bar weinig van eigenlijk, kan je het misschien in een soort van voorbeeldje uitleggen wat *, ** en & precies doet? Ik weet bijvoobeeld dat als je int blaat heb dat *blaat het geheugenadres is van de inhoud van blaat, toch? :?

Rookworst zonder R is ook worst.


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Op woensdag 02 januari 2002 13:49 schreef BezurK het volgende:

[..]

Ik denk het wel ja :)

Dat stuk over pointers heb ik al gehad in het boek maar ik snap(te) er bar weinig van eigenlijk, kan je het misschien in een soort van voorbeeldje uitleggen wat *, ** en & precies doet? Ik weet bijvoobeeld dat als je int blaat heb dat *blaat het geheugenadres is van de inhoud van blaat, toch? :?
Nee.

paar voorbeeldjes:
code:
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
27
28
29
30
31
32
char   *pointerNaarChar;
char   &referentieAanChar;
char    charWaarde;
char    nogEenChar;

referentieAanChar = charWaarde;  
// geef aan dat referentieAanChar aan charWaarde moet refereren.

charWaarde = 'c';

referentieAanChar = 'd';

/* 
charWaarde en referentieAanChar zijn beide gelijk ('d'), 
want ze representeren beiden de inhoud van hetzelfde 
geheugenadres.
*/

pointerNaarChar = &charWaarde; 
// pointerNaarChar bevat nu _het_adres_van_ (&) charWaarde;

nogEenChar = *pointerNaarChar; 
// nogEenChar krijgt nu _de_inhoud_van_ (*) geheugenadres 
// pointerNaarChar , maar het is *wel* een kopie.

charWaarde = 'e';

/*
nogEenChar bevat nu nog steeds 'd', want heeft namelijk een
_eigen_ geheugenadres, maar referentieAanChar en 
charWaarde bevatten nu allebei 'e'
*/

snappie het nog steeds :P ?

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 23:11
Op woensdag 02 januari 2002 12:39 schreef BezurK het volgende:
Ik heb om een beetje te oefenen met C++ in kdevelop dit progje geschreven:
code:
1
2
3
4
< knip >
    char szword[];
< knip >
}

Waarom krijg ik een foutmelding dat de grootte van szword niet opgegeven is? Volgens het boek waar ik het uit leer (C++ voor dummies :)) is dat niet nodig!
(1) een C++ boek wat char[] gebruikt is niet voor Dummies maar door Dummies !
(2) omdat de grootte niet nodig is als je de inhoud vantevoren geeft; dan snapt je compiler wel hoe groot het moet zijn. Maar zonder inhoud weet de compiler niets.

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


  • BezurK
  • Registratie: Juni 2001
  • Laatst online: 14-06 09:12
Ja volgens mij snap ik het, daar kom ik wel achter als ik er zo ff mee ga stoeien, maar wat is nu de functie ervan? En dan bedoel ik dus wat is het voordeel van (uit jouw voorbeeld) referentieAanChar?

Rookworst zonder R is ook worst.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 23:11
Op woensdag 02 januari 2002 12:44 schreef BezurK het volgende:
Oh, nu heb ik dat opgelost door szword als volgt te declareren:
[code]
En trouwens, is het niet verdomde lastig als je constant moet anticiperen op de grootte van een string? Hoe kan je dat dan doen als je bijvoorbeeld je input krijgt via cin oid???
std::string - dat is een echt string type. Zo kun je bv
gewoon std::string word = argv[1] zeggen en dan werkt't meteen. Effe opletten: std::string zit in header <string> dus niet in <string.h>

En dan kun je 'm omdraaien met
std::string reverse_word = word; // lengte goed krijgen
std::copy( word.begin(), word.end(), reverse_word.rbegin() );

Da's toch simpeler - kopieer word van begin() naar end(), en kopieer het naar rbegin(). rbegin() is de reverse begin, dus van het eind naar voren.

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


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 23:11
Op woensdag 02 januari 2002 14:10 schreef drm het volgende:
paar voorbeeldjes:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
char   *pointerNaarChar;
char   &referentieAanChar;
char    charWaarde;
char    nogEenChar;

referentieAanChar = charWaarde;  
// geef aan dat referentieAanChar aan charWaarde moet refereren.

charWaarde = 'c';

referentieAanChar = 'd';

/* 
charWaarde en referentieAanChar zijn beide gelijk ('d'), 
want ze representeren beiden de inhoud van hetzelfde 
geheugenadres.
*/

snappie het nog steeds :P ?
'k snap er niks van - en mijn compilers ook niet. References werken anders : je moet ze meteen naar een object laten wijzen. Dus char& referentieAanChar=charWaarde;
Dan is referentieAanChar gewoon een andere naam voor charWaarde. Klinkt misschien niet handig, een andere naam, maar als je geen charWaarde hebt maar
char& the_char = getTheXThingy()->someXobject.withan.char_member; dan kan een andere, kortere naam handig zijn, en bovendien sneller.

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


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Op woensdag 02 januari 2002 14:29 schreef MSalters het volgende:
Dus char& referentieAanChar=charWaarde;
Dat is waar, ja. Nooit references gebruikt in die context, vandaar...

Maar dat is wel het idee.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 23:11
Op woensdag 02 januari 2002 12:47 schreef BezurK het volgende:

[..]

Whaaaaaa, waarom krijg ik 3 verschillende antwoorden??? HELP
:(
Teveel mensen die niet weten wat ze doen. Aan iedereen die antwoordt: Als je niet ZEKER weet of je antwoord goed is, probeer het dan op z'n minst zelf te compileren of met te checken met een goed boek. Deze groep heeft geen moderators om overduidelijk foute antwoorden eruit te mikken.
Een newbie heeft niks aan
code:
1
char[] X;

. Er is geen enkele context is C++ waar dat legaal is.

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


  • BezurK
  • Registratie: Juni 2001
  • Laatst online: 14-06 09:12
Zucht, zo kom ik er natuurlijk nooit uit... Zou iemand dan ff mijn programmaatje zo kunnen veranderen dat het dus wel werkt? Waarschijnlijk dat ik het dan wel snap.
(voor als het nog niet duidelijk is, het is dus de bedoeling dat er een command-line argument gegeven word (een woord) en vervolgens het woord omgedraaid word)

Rookworst zonder R is ook worst.


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Op woensdag 02 januari 2002 14:46 schreef BezurK het volgende:
Zucht, zo kom ik er natuurlijk nooit uit... Zou iemand dan ff mijn programmaatje zo kunnen veranderen dat het dus wel werkt? Waarschijnlijk dat ik het dan wel snap.
(voor als het nog niet duidelijk is, het is dus de bedoeling dat er een command-line argument gegeven word (een woord) en vervolgens het woord omgedraaid word)
*snif*snif* dit riekt naar huiswerk :)

Wat begrijp je niet aan mijn uitleg (verbeterd door MSalters)?

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 23:11
Op woensdag 02 januari 2002 14:46 schreef BezurK het volgende:
Zucht, zo kom ik er natuurlijk nooit uit... Zou iemand dan ff mijn programmaatje zo kunnen veranderen dat het dus wel werkt? Waarschijnlijk dat ik het dan wel snap.
(voor als het nog niet duidelijk is, het is dus de bedoeling dat er een command-line argument gegeven word (een woord) en vervolgens het woord omgedraaid word)
In't geval dat nog niet duidelijk was; mijn post daarboven heeft de oplossing ( std::copy van word.begin() naar
reverse_word.rbegin() )

[ ASCII art ]

"woord"
^begin() ->
^end()
"droow"
<- ^rbegin()

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


  • BezurK
  • Registratie: Juni 2001
  • Laatst online: 14-06 09:12
Op woensdag 02 januari 2002 17:21 schreef MSalters het eea:
Jaja, allemaal leuk en aardig en het zal wel werken, maar dat snap ik nou weer niet, dus heb ik er ook geen flikker aan aangezien het zelstudie is en ik het dus ook niet ff aan een leraar kan vragen |:(

Rookworst zonder R is ook worst.


  • Orphix
  • Registratie: Februari 2000
  • Niet online
Op woensdag 02 januari 2002 14:35 schreef MSalters het volgende:
Deze groep heeft geen moderators om overduidelijk foute antwoorden eruit te mikken.
Moderators werken hier anders dan nieuwsgroep moderators. De mods hier zijn meer ingesteld op censuur en illegale praktijken.
IMHO is het verwijderen van een 'foute' oplossing niet goed, van andermans fouten kan je leren en bovendien weet diegene die met die oplossing ook kwam ook 'waarom' het fout is (wanneer dit dus verbeterd wordt in een volgende reactie).

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Op woensdag 02 januari 2002 22:33 schreef Orphix het volgende:

[..]

Moderators werken hier anders dan nieuwsgroep moderators. De mods hier zijn meer ingesteld op censuur en illegale praktijken.
IMHO is het verwijderen van een 'foute' oplossing niet goed, van andermans fouten kan je leren en bovendien weet diegene die met die oplossing ook kwam ook 'waarom' het fout is (wanneer dit dus verbeterd wordt in een volgende reactie).
/move discussion to [forum=15] ;)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 23:11
Op woensdag 02 januari 2002 19:19 schreef BezurK het volgende:

[..]

Jaja, allemaal leuk en aardig en het zal wel werken, maar dat snap ik nou weer niet, dus heb ik er ook geen flikker aan aangezien het zelstudie is en ik het dus ook niet ff aan een leraar kan vragen |:(
Ben er ook net achtergekomen dat ASCII art niet werkt in HTML. |:(
Maar ok, probeer ik het nog eens.

1) Je hebt een string. In C++ gebruik je daarvoor type std::string, bijvoorbeeld std::string word = argv[1];
1A) string werkt vergelijkbaar met int, = en == werken net zo. + doet iets anders ( plakt aan elkaar )
2) In C++ kopieer je reeksen met std::copy. Argumenten zijn begin van source, eind van source en begin van destination.
3) Als je reeksen kopieert met std::copy moet je zorgen voor een bestemming die groot genoeg is. Met resize() kun je de bestemming groot genoeg maken. std::copy weet immers niet wat het eind van de destination is.
4) Een string loopt standaard van begin() tot end(), maar je kunt de volgorde omdraaien door van rbegin() tot rend() te lopen.
5A) Dus als je van s1.begin() naar s2.begin() kopieert doe je hetzelfde als s2=s1
5B) en als je van s1.begin() naar s2.rbegin() kopieert draai je de zaak om.

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


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op donderdag 03 januari 2002 10:07 schreef MSalters het volgende:

[..]

Ben er ook net achtergekomen dat ASCII art niet werkt in HTML. |:(
wel als je het tussen [ code ] tags gooit:
code:
1
2
3
4
5
"woord"
 ^begin() ->
     ^end()
"droow"
  <- ^rbegin()

tadaaaa :)

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.


  • BezurK
  • Registratie: Juni 2001
  • Laatst online: 14-06 09:12
Hahahhaaa, van je uitleg word ik ietsje wijzer maar volgens mij vergeet je dat ik een totale C newbie ben en dus van al die api shit niets weet, alleen de syntax en cin/cout ken ik eigenlijk min of meer :)
Maakt ook allemaal niet uit, ik probeer er zelf wel ff uit te komen... :+

Rookworst zonder R is ook worst.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 23:11
Op donderdag 03 januari 2002 16:15 schreef BezurK het volgende:
Hahahhaaa, van je uitleg word ik ietsje wijzer maar volgens mij vergeet je dat ik een totale C newbie ben en dus van al die api shit niets weet, alleen de syntax en cin/cout ken ik eigenlijk min of meer :)
Maakt ook allemaal niet uit, ik probeer er zelf wel ff uit te komen... :+
't Gaat niet helpen als je C en C++ door elkaar haalt. Dat zijn twee talen, en de programma's die een goede C programmeur schrijft lijken niet op die van een goede C++ programmeur.
Dat is overigens mogelijk een van de redenen waarom je zoveel verschillende antwoorden kreeg; je zei in je hdr C++, maar je programma was in een mengsel van C en C++, voornamelijk C, en de fouten waren C-fouten. Dus welke kant moest't op? De C-fouten fixen, of alle C eruit halen ?

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

Pagina: 1