/ 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
[C++ Error] array.cpp(157): E2034 Cannot c~
Fra : Skovge


Dato : 13-02-04 13:37

Jeg har lidt problemer med nedenstående kode:

void insertName(string array[], string name, string token, string type)
{
int i;

while(array[i][0] != 0)
i++;

array[i][0]=name;
array[i][1]=token;
array[i][2]=type;
}

int findName(string name, string array[])
{
string tempName;
int i;

while(name != tempName)
{
for(i=0;i<100;i++)
{
tempName = array[i][0];
if(name == tempName)
return i;
}
}
return 0;
}

..........når jeg compiler det, får jeg fejlen:
[C++ Error] array.cpp(157): E2034 Cannot convert 'string' to 'char'

- er der nogen der kan se fejlen?



 
 
Kristian Dupont (13-02-2004)
Kommentar
Fra : Kristian Dupont


Dato : 13-02-04 14:31

> void insertName(string array[], string name, string token, string type)
> {
> int i;
>
> while(array[i][0] != 0)
> i++;
>
> array[i][0]=name;
> array[i][1]=token;
> array[i][2]=type;
> }

Din variabel i bliver ikke initialiseret her og har derfor en udefineret
værdi. Hvis denne kode virker er det sandsynligvis fordi du kører en debug
configuration, der sørger for at nye variable nulstilles.
Derudover ser det ud til at du har et array af strenge, array, som du vil
indsætte tre strenge ind i pr. plads. Med mindre name, token og type alle er
præcist ét tegn lange, tror jeg ikke du opnår dét, du vil her. Det er
selvfølgelig forudsat at string typen opfører sig som ekesmpelvis c++
standardens string. Er det denne, du bruger?


> int findName(string name, string array[])
> {
> string tempName;
> int i;
>
> while(name != tempName)
> {
> for(i=0;i<100;i++)
> {
> tempName = array[i][0];
> if(name == tempName)
> return i;
> }
> }
> return 0;
> }

Igen ser det ud til at du blander strenge og tegnene i strengene lidt
sammen. Hvorfor indekserer du array[i][0] ? Det sidste [0] vil sandsynligvis
give dig det første tegn i den givne streng. Dertil kommer at du har en
while løkke der indkapsler for løkken og som, i fald for løkken ikke finder
den søgte streng, vil fortsætte i det uendelige.

Jeg går ud fra at du bruger c++, da din fejlmeddelelse siger [C++ Error].
Hvis det er tilfældet, så er alt det, du er ved at konstruere allerede
implementeret for dig.
Pas på med at bruge arrays, og pas især på med at bruge arrays af udefineret
størrelse (x[]). Brug eksempelvis en vector i stedet.
Her er et eksempel på noget lignende det, jeg fornemmer du vil lave:
(uafprøvet, så der er muligvis fejl og mangler)

#include <vector>
#include <string>
#include <algorithm>

using namespace std;

int main(...)
{
vector<string> sv;

// Indsæt et par strenge...
sv.push_back("hej");
sv.push_back("med");
sv.push_back("dig");

// Find en given streng
int dig_pos = find(sv.begin, sv.end(), "dig") - sv.begin();

cout << "Teksten 'dig' blev fundet som streng nummer " << dig_pos << " i
sv." << endl;
}

Med venlig hilsen
Kristian Dupont



Skovge (15-02-2004)
Kommentar
Fra : Skovge


Dato : 15-02-04 22:24

Jeg skulle måske have beskrevet lidt nærmere hvad det er jeg prøver at
lave!!!

Det er meningen at jeg skal konstruere en symbol table til en linux
compiler, uden brug af eksisterende c++ funktioner (dvs. lave det hele
selv, fra bunden) - meningen med arrayet er, at det skal være på 100
linier og 3 kolonner - deraf: array[100][3] - således at man i de tre
kolonner har navn, token og type (repræsenteret som string) - og man så
kan sætte værdier ind efterhånden som lexical analyser, syntax analyzer
og semantic analyzer finder dem, deraf:

> >array[i][0]=name;
> > array[i][1]=token;
> > array[i][2]=type;

Det er muligt at jeg ikke bruger array på den rigtige måde - jeg er vant
til at bruge borland builder, og så bare lave en ODBC til en Access
database eller lignende!


"Kristian Dupont" <kristian_SPAMMENOT@chrylers.com> skrev i en
meddelelse news:c0ijiq$9dq$1@news.cybercity.dk...
> > void insertName(string array[], string name, string token, string
type)
> > {
> > int i;
> >
> > while(array[i][0] != 0)
> > i++;
> >
> > array[i][0]=name;
> > array[i][1]=token;
> > array[i][2]=type;
> > }
>
> Din variabel i bliver ikke initialiseret her og har derfor en
udefineret
> værdi. Hvis denne kode virker er det sandsynligvis fordi du kører en
debug
> configuration, der sørger for at nye variable nulstilles.
> Derudover ser det ud til at du har et array af strenge, array, som du
vil
> indsætte tre strenge ind i pr. plads. Med mindre name, token og type
alle er
> præcist ét tegn lange, tror jeg ikke du opnår dét, du vil her. Det er
> selvfølgelig forudsat at string typen opfører sig som ekesmpelvis c++
> standardens string. Er det denne, du bruger?
>
>
> > int findName(string name, string array[])
> > {
> > string tempName;
> > int i;
> >
> > while(name != tempName)
> > {
> > for(i=0;i<100;i++)
> > {
> > tempName = array[i][0];
> > if(name == tempName)
> > return i;
> > }
> > }
> > return 0;
> > }
>
> Igen ser det ud til at du blander strenge og tegnene i strengene lidt
> sammen. Hvorfor indekserer du array[i][0] ? Det sidste [0] vil
sandsynligvis
> give dig det første tegn i den givne streng. Dertil kommer at du har
en
> while løkke der indkapsler for løkken og som, i fald for løkken ikke
finder
> den søgte streng, vil fortsætte i det uendelige.
>
> Jeg går ud fra at du bruger c++, da din fejlmeddelelse siger [C++
Error].
> Hvis det er tilfældet, så er alt det, du er ved at konstruere allerede
> implementeret for dig.
> Pas på med at bruge arrays, og pas især på med at bruge arrays af
udefineret
> størrelse (x[]). Brug eksempelvis en vector i stedet.
> Her er et eksempel på noget lignende det, jeg fornemmer du vil lave:
> (uafprøvet, så der er muligvis fejl og mangler)
>
> #include <vector>
> #include <string>
> #include <algorithm>
>
> using namespace std;
>
> int main(...)
> {
> vector<string> sv;
>
> // Indsæt et par strenge...
> sv.push_back("hej");
> sv.push_back("med");
> sv.push_back("dig");
>
> // Find en given streng
> int dig_pos = find(sv.begin, sv.end(), "dig") - sv.begin();
>
> cout << "Teksten 'dig' blev fundet som streng nummer " << dig_pos
<< " i
> sv." << endl;
> }
>
> Med venlig hilsen
> Kristian Dupont
>
>



Mogens Hansen (16-02-2004)
Kommentar
Fra : Mogens Hansen


Dato : 16-02-04 07:01


"Skovge" <skovge@lite.dk> wrote:

[8<8<8<]
> Det er meningen at jeg skal konstruere en symbol table til en linux
> compiler, uden brug af eksisterende c++ funktioner (dvs. lave det hele
> selv, fra bunden)

Hvorfor ikke bruge den funktionalitet der ligger i C++ Standard library ?
Er det for nemt eller er det at snyde ?
Du bruger jo i forvejen std::string.

Med hensyn til at bygge en compiler, så kan det være en ide at kigge på
parser-biblioteket Boost.Spirit (www.boost.org).

> - meningen med arrayet er, at det skal være på 100
> linier og 3 kolonner - deraf: array[100][3] - således at man i de tre
> kolonner har navn, token og type (repræsenteret som string)

Hvad med at repræsentere navn, token og type som en datastruktur ?

Kig iøvrigt på containertyperne std::map og en eller anden form for
hash_map.

Venlig hilsen

Mogens Hansen



Mogens Hansen (13-02-2004)
Kommentar
Fra : Mogens Hansen


Dato : 13-02-04 16:22


"Skovge" <skovge@lite.dk> wrote:
> Jeg har lidt problemer med nedenstående kode:
>
> void insertName(string array[], string name, string token, string
> type)

Hvorfor overfører du name, token og type by value ?
Plejer du at programmere Java ?

Det er mere effektivt og idiomatisk at overføre som const reference.
Altså
..., const string& name, const string& token, const string& type)

>{
> int i;

Brug size_t i stedet for int, så er du sikker på den kan blive stor nok til
alle array.

Hvilken værdi har "i" inden løkken starter ?

> while(array[i][0] != 0)

Hvilken type har "array[i]" ?
string

Hvilken type har string[0] ?
char

Du finder altså hvad ?
Mit umiddelbare bud er at du finder den første tomme streng, hvis en sådan
findes, men det er ikke særligt tydeligt.

> i++;
>
> array[i][0]=name;
> array[i][1]=token;
> array[i][2]=type;

Hvad var det meningen at der skulle ske ?
Hvad hvis token har en værdi, der også kan være navn ?

> }
>
> int findName(string name, string array[])
> {
> string tempName;
> int i;
>
> while(name != tempName)

Hvorfor denne while løkke ?

> {
> for(i=0;i<100;i++)
> {
> tempName = array[i][0];

Hvorfor denne tildeling af et temporært objekt

[8<8<8<]
> - er der nogen der kan se fejlen?

Jeg kunne forestille mig at fejlen er at dit design ligger for lang fra dit
problem, og derfor bliver det svært at overskue.

Lav en datastruktur, der indeholder sammenhørende data.
Brug de containere og algoritmer der er til rådighed i C++ Standard library,
så er problemet stort set løst.

Prøv med noget i retningen af

<C++ kode>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

struct info
{
info(const string& name_arg, const string& token_arg, const string&
type_arg) :
name(name_arg), token(token_arg), type(type_arg) {}
info() {}

string name;
string token;
string type;

// Function object types for comparing
struct eq_name; // equal by name
};

struct info::eq_name
{
eq_name(const string& name_value_arg) :
name_value(name_value_arg) {}
bool operator()(const info& info_arg)
{ return info_arg.name == name_value; }

private:
const string& name_value;
};


int main()
{
vector<info> info_array;

// instead of insertName
info_array.push_back(info("name", "token", "type"));

// instead of findName
vector<info>::iterator i =
find_if(info_array.begin(), info_array.end(), info::eq_name("name"));
if(info_array.end() != i) {
// Entry found
}
}
</C++ kode>

Venlig hilsen

Mogens Hansen




Jesper Louis Anderse~ (14-02-2004)
Kommentar
Fra : Jesper Louis Anderse~


Dato : 14-02-04 02:06

In article <c0ipr4$h4l$1@news.cybercity.dk>, Mogens Hansen wrote:

> Det er mere effektivt og idiomatisk at overføre som const reference.
> Altså
> ..., const string& name, const string& token, const string& type)

Kan du fortaelle hvorfor det er mere effektivt? Jeg kan ikke umiddel-
bart komme paa noget der skulle goere det.

--
j.

Mogens Hansen (14-02-2004)
Kommentar
Fra : Mogens Hansen


Dato : 14-02-04 08:47


"Jesper Louis Andersen" <jlouis@miracle.mongers.org> wrote:
> In article <c0ipr4$h4l$1@news.cybercity.dk>, Mogens Hansen wrote:
>
> > Det er mere effektivt og idiomatisk at overføre som const reference.
> > Altså
> > ..., const string& name, const string& token, const string& type)
>
> Kan du fortaelle hvorfor det er mere effektivt?

Naturligvis.

C++ anvender call by value til parameter overførsel, når man ikke angiver
eksplicit at det skal være call by reference.

Givet 2 funktioner (hvor <string> er includeret så std::string er en kendt
klasse)

void foo(string s);
void bar(const string& s)

som bliver kaldt fra

int main()
{
const string hello_world = "Hello World!";
foo(hello_world);
bar(hello_world);
}

Hvad sker der når "foo" kaldes ?
Der bliver oprettet et temporært objekt, der er en _kopi_ af "hello_world"
(typisk) på kaldestakken.
Funktionen "foo" har _ingen_ mulighed for at ændre på værdien af
"hello_world" variablen i "main".


Hvad sker der når "bar" kaldes ?
Der bliver overført en _reference_ til "hello_world" (typisk) på
kaldestakken. En reference er typisk implementeret på samme måde som en
pointer (selvom den er semantisk anderledes).
Funktionen "foo" har _ingen_ mulighed (bortset fra at ved at anvende
const_cast) for at ændre væriden af "hello_world" variablen i "main".


> Jeg kan ikke umiddel-
> bart komme paa noget der skulle goere det.

Det er oplagt mere effektivt at overføre en reference til et objekt, end at
oprette og nedlægge en kopi af objektet (når objektet er mere komplekst end
en reference, hvilket er tilfældet for "string" men typisk ikke for "int").

Er du med på den nu ?

Venlig hilsen

Mogens Hansen



Jesper Louis Anderse~ (14-02-2004)
Kommentar
Fra : Jesper Louis Anderse~


Dato : 14-02-04 11:58

In article <c0kjif$5em$1@news.cybercity.dk>, Mogens Hansen wrote:

> Det er oplagt mere effektivt at overføre en reference til et objekt, end at
> oprette og nedlægge en kopi af objektet (når objektet er mere komplekst end
> en reference, hvilket er tilfældet for "string" men typisk ikke for "int").

Ah, ja. Selvfoelgelig. Jeg rendte rundt og taenkte paa at alle data
kun fyldte hvad der svarer til en pointer, so kopien ikke er dyrere
at lave.

--
j.

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408920
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste