|
| loade værdier ind i arrays ! Fra : Heureka |
Dato : 20-01-05 20:32 |
|
Hejsa,
Jeg har lavet en klasse i hvilken jeg har defineret et array på følgende
vis:
int vector[15];
Når jeg så prøver at initialisere denne vektor i en "memberfunction" med:
vector = {0,0,0,0,0,0,0,0,0,0,0,0,0,0};
eller
vector[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
Brokker kompileren sig over '{'
Jeg bruger Visual Studio 7!
Nogen foreslag?
\Thomas
| |
Bertel Brander (20-01-2005)
| Kommentar Fra : Bertel Brander |
Dato : 20-01-05 21:12 |
|
Heureka wrote:
> vector[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
Man kan ikke initialisere et array på den måde i en member funktion.
Du bliver nødt til at loop gennem arrayet:
for(size_t i = 0; i < sizeof(vector)/sizeof(vector[0]); i++)
vector[i] = 0;
Eller bruge memset (bør virke med 0, men ikke nødvendigvis med andre
værdier):
memset(vector, 0, sizeof(vector));
--
"We learned more from a three minute record, baby
than we ever learned in school"
- Bruce Springsteen
| |
Mogens Hansen (20-01-2005)
| Kommentar Fra : Mogens Hansen |
Dato : 20-01-05 22:11 |
|
"Heureka" <stoltzo@hotmail.com> wrote in message
news:41f00749$1@news.wineasy.se...
> Hejsa,
>
> Jeg har lavet en klasse i hvilken jeg har defineret et array på følgende
> vis:
>
> int vector[15];
Brug C++ Standard Library funktionen "std::fill":
fill(&vector[0], &vector[15], 0);
Det er ikke nogen god ide at kalde arrayet vector - der er en klasse i C++
Standard Library som hedder det.
Giv den hellere et navn, der siger noget om hvad den bliver brugt til:
int person_height[15];
Overvej iøvrigt at benytte klassen "std::vector<int>" i stedet - det er ofte
et bedre valg, hvis der ikke _altid_ er brug for _netop_ 15 elementer.
Hvis du har brug for _netop_ 15 elementer med værdien 0 som medlem i en
klasse skriver du:
class foo
{
public:
foo();
private:
vector<int> bar;
};
foo::foo() :
bar(15, 0)
{
}
Hvis værdien 0 i virkeligheden indikerer at elementet ikke er brugt skal du
slet ikke skrive noget, men indsætte værdier efterhånden som du får brug for
dem med
bar.push_back(new_bar_element);
Hvis index i arrayet har en særlig betydning, men ikke alle pladser er fyldt
med noget meningsfyldt (sparse array), kan man bruge klassen "std::map":
class foo
{
public:
// ...
private:
map<int, int> bar;
};
bar[3] = 7;
Kort sagt: kig på C++ Standard Library klasserne "std::vector" og
"std::map" - de er ofte nyttige.
Venlig hilsen
Mogens Hansen
| |
Thorsten Ottosen (20-01-2005)
| Kommentar Fra : Thorsten Ottosen |
Dato : 20-01-05 23:07 |
|
"Mogens Hansen" <mogens_h@dk-online.dk> wrote in message
news:csp6p3$14pm$1@news.cybercity.dk...
|
| "Heureka" <stoltzo@hotmail.com> wrote in message
| news:41f00749$1@news.wineasy.se...
| > Hejsa,
| >
| > Jeg har lavet en klasse i hvilken jeg har defineret et array på følgende
| > vis:
| >
| > int vector[15];
| Kort sagt: kig på C++ Standard Library klasserne "std::vector" og
| "std::map" - de er ofte nyttige.
Jeg kan kun sige at Mogens har fuldstøndig ret. Man bør *aldrig*
bruge indbyggede arrays in C++. Det lyder mærkeligt, men
de er så nemme at lave fejl med at de ikke er værd at bruge og
alternativerne er lige så effective.
Brug først std::vector<T>.
Du kan måske overveje boost::array<T,int>. Se
http://www.boost.org/doc/html/array.html
Hvis du skal initialise disse på en smart måde, så kan du overveje at
bruge Boost.assign:
std::vector<int> v ( boost::assign::list_of(1)(2)(3)(5)(7) );
virker på samme måde for array<int, 10>. Du kan også
sige
boost::array<int,10> a( boost::assign::list_of(0) );
for at sætte alle til 0.
Se http://www.boost.org/libs/assign/doc/index.html
mvh
Thorsten
| |
Bertel Brander (21-01-2005)
| Kommentar Fra : Bertel Brander |
Dato : 21-01-05 00:06 |
|
Thorsten Ottosen wrote:
> Jeg kan kun sige at Mogens har fuldstøndig ret. Man bør *aldrig*
> bruge indbyggede arrays in C++.
Hvis man er ny inden for C++ og måske programmering, har arrays den
store fordel at de er nemme at bruge. Derfor (og af en mængde andre
grunde) er din påstand en fejltagelse.
> Du kan måske overveje boost::array<T,int>. Se
Man kunne også vælge at gøre det simpelt -> ingen boost.
--
"We learned more from a three minute record, baby
than we ever learned in school"
- Bruce Springsteen
| |
Thorsten Ottosen (21-01-2005)
| Kommentar Fra : Thorsten Ottosen |
Dato : 21-01-05 01:32 |
|
"Bertel Brander" <bertel@post4.tele.dk> wrote in message
news:41f0395f$0$51616$edfadb0f@dread14.news.tele.dk...
| Thorsten Ottosen wrote:
|
| > Jeg kan kun sige at Mogens har fuldstøndig ret. Man bør *aldrig*
| > bruge indbyggede arrays in C++.
|
| Hvis man er ny inden for C++ og måske programmering, har arrays den
| store fordel at de er nemme at bruge.
what? der er minimal forskel på et array af T og boost::array<T,int>.
Hvad er det for en stor forskel?
Arrays er specielt unødvendige for nybegyndere;
50 af deres fejl går med at debugge array kode; de burde bruge tiden
på at lære at programmere.
| Derfor (og af en mængde andre
| grunde) er din påstand en fejltagelse.
hvilke andre grunde?
| > Du kan måske overveje boost::array<T,int>. Se
|
| Man kunne også vælge at gøre det simpelt -> ingen boost.
ja, og man kunne også vælge at bruge copy-paste i stedet
for at lave en ny function---det er trods alt simplere.
-Thorsten
| |
Bertel Brander (21-01-2005)
| Kommentar Fra : Bertel Brander |
Dato : 21-01-05 01:42 |
|
> | Thorsten Ottosen wrote:
> |
> | > Jeg kan kun sige at Mogens har fuldstøndig ret. Man bør *aldrig*
> | > bruge indbyggede arrays in C++.
> |
> | Hvis man er ny inden for C++ og måske programmering, har arrays den
> | store fordel at de er nemme at bruge.
>
> what? der er minimal forskel på et array af T og boost::array<T,int>.
> Hvad er det for en stor forskel?
Hvad er den store fordel ved std::vector? For mig at ser er der
meget små fordele i starten, en af de store ulemper er at der
er en del ekstra man skal sætte sig ind i.
> Arrays er specielt unødvendige for nybegyndere;
Arrays er aldrig unødvendige.
> 50 af deres fejl går med at debugge array kode; de burde bruge tiden
> på at lære at programmere.
Jeg vil så påstå at nybegynderen (og de lidt øvede) laver mindst lige
så mange fejl ved at bruge std::vector.
>
> | Derfor (og af en mængde andre
> | grunde) er din påstand en fejltagelse.
>
> hvilke andre grunde?
F.ex. at der er et vist overhead i at bruge en vector, det er ikke
alle der kan ignorere dette overhead.
--
"We learned more from a three minute record, baby
than we ever learned in school"
- Bruce Springsteen
| |
Thorsten Ottosen (21-01-2005)
| Kommentar Fra : Thorsten Ottosen |
Dato : 21-01-05 01:52 |
|
"Bertel Brander" <bertel@post4.tele.dk> wrote in message
news:41f04ff3$0$164$edfadb0f@dread11.news.tele.dk...
|> | Thorsten Ottosen wrote:
| > |
| > | > Jeg kan kun sige at Mogens har fuldstøndig ret. Man bør *aldrig*
| > | > bruge indbyggede arrays in C++.
| > |
| > | Hvis man er ny inden for C++ og måske programmering, har arrays den
| > | store fordel at de er nemme at bruge.
| >
| > what? der er minimal forskel på et array af T og boost::array<T,int>.
| > Hvad er det for en stor forskel?
|
| Hvad er den store fordel ved std::vector?
- der er ingen initiliserings problemer.
- der er som regelt bounds-checking i debug
- der er size(), begin(), end()
- den gror automatisk
.....
|For mig at ser er der
| meget små fordele i starten, en af de store ulemper er at der
| er en del ekstra man skal sætte sig ind i.
det er noget vrøvl.
| > Arrays er specielt unødvendige for nybegyndere;
|
| Arrays er aldrig unødvendige.
jo.
| > 50 af deres fejl går med at debugge array kode; de burde bruge tiden
| > på at lære at programmere.
|
| Jeg vil så påstå at nybegynderen (og de lidt øvede) laver mindst lige
| så mange fejl ved at bruge std::vector.
hvilke fejl?
| >
| > | Derfor (og af en mængde andre
| > | grunde) er din påstand en fejltagelse.
| >
| > hvilke andre grunde?
|
| F.ex. at der er et vist overhead i at bruge en vector, det er ikke
| alle der kan ignorere dette overhead.
nybegyndere kan i hvert fald.
og ellers så brug boost::array<T,int>.
-Thorsten
| |
Bertel Brander (21-01-2005)
| Kommentar Fra : Bertel Brander |
Dato : 21-01-05 02:18 |
|
Thorsten Ottosen wrote:
> |
> | Hvad er den store fordel ved std::vector?
>
> - der er ingen initiliserings problemer.
> - der er som regelt bounds-checking i debug
> - der er size(), begin(), end()
> - den gror automatisk
Hvilket følgende lille begynder program på glimrende vis beviser:
#include <vector>
#include <iostream>
int main()
{
std::vector<int >MyVector;
MyVector[12] = 13;
std::cout << MyVector[12] << std::endl;
}
--
"We learned more from a three minute record, baby
than we ever learned in school"
- Bruce Springsteen
| |
Mogens Hansen (21-01-2005)
| Kommentar Fra : Mogens Hansen |
Dato : 21-01-05 08:39 |
|
"Bertel Brander" <bertel@post4.tele.dk> wrote in message
news:41f05841$0$178$edfadb0f@dread11.news.tele.dk...
[8<8<8<]
> std::vector<int >MyVector;
> MyVector[12] = 13;
> std::cout << MyVector[12] << std::endl;
Det er ikke væsentligt forskelligt fra
int my_array[10];
my_array[12] = 13;
cout << my_array[12] << endl;
Med (altid anbefalelsesvædige) debug værktøjer som f.eks. Borland CodeGuard,
Compuware BoundsChecker (tidligere NuMega) eller Rational Purify vil sådanne
fejl blive afsløret.
Desuden kan Standard Library implementeringen have indbygget debug-kode der
vil afsløre fejl i forbindelse med anvendelsen af f.eks. "std::vector".
Det er gammel kendt teknologi, se f.eks.SafeSTL af Cay Horstmann
( http://www.horstmann.com/safestl.html) fra 1995.
Generelt gælder det at C++ ikke er et programmeringssprog med indbygget
barnepige.
Der er dog god grund til at anvende en klar programmeringsstil, så
programmet er nemmere at skrive og vedligeholde korrekt.
Her har std::vector de klare fordele frem for simple arrays at:
* elementerne er altid initialiseret
* den indeholder direkte information om hvormange elementer der er
* intet behov for "magiske" værdier som indikerer elementet ikke er
brugbart
* intet behov for et lille bogholderi ved siden af
* størrelsen vokser dynamisk med behovet
Jeg anerkender ikke at array er simplere i brug en std::vector.
Der er mindre syntaks knyttet til indbyggede array - tilgengæld er der mere
konvention der skal huskes og overholdes.
F.eks. går information om arrayets kapacitet nemt tabt ved funktionskald
(f.eks. strcpy) - hvilket er en væsentlig grund til mange, alvorlige
programfejl.
Venlig hilsen
Mogens Hansen
| |
Thorsten Ottosen (21-01-2005)
| Kommentar Fra : Thorsten Ottosen |
Dato : 21-01-05 08:47 |
|
"Bertel Brander" <bertel@post4.tele.dk> wrote in message
news:41f05841$0$178$edfadb0f@dread11.news.tele.dk...
| Thorsten Ottosen wrote:
| > |
| > | Hvad er den store fordel ved std::vector?
| >
| > - der er ingen initiliserings problemer.
| > - der er som regelt bounds-checking i debug
| > - der er size(), begin(), end()
| > - den gror automatisk
|
| Hvilket følgende lille begynder program på glimrende vis beviser:
|
| #include <vector>
| #include <iostream>
|
| int main()
| {
| std::vector<int >MyVector;
| MyVector[12] = 13;
| std::cout << MyVector[12] << std::endl;
| }
Du for jo samme fejl med arrays.
Og hvis du bruger et pasende standard bibliotek, så får du jo at vide hvad
fejlen er.
Så prøv igen.
-Thorsten
| |
Bertel Brander (21-01-2005)
| Kommentar Fra : Bertel Brander |
Dato : 21-01-05 19:57 |
|
Thorsten Ottosen wrote:
> "Bertel Brander" <bertel@post4.tele.dk> wrote in message
> news:41f05841$0$178$edfadb0f@dread11.news.tele.dk...
> | Thorsten Ottosen wrote:
> | > |
> | > | Hvad er den store fordel ved std::vector?
> | >
> | > - der er ingen initiliserings problemer.
> | > - der er som regelt bounds-checking i debug
> | > - der er size(), begin(), end()
> | > - den gror automatisk
> |
> | Hvilket følgende lille begynder program på glimrende vis beviser:
> |
> | #include <vector>
> | #include <iostream>
> |
> | int main()
> | {
> | std::vector<int >MyVector;
> | MyVector[12] = 13;
> | std::cout << MyVector[12] << std::endl;
> | }
>
> Du for jo samme fejl med arrays.
>
> Og hvis du bruger et pasende standard bibliotek, så får du jo at vide hvad
> fejlen er.
Mit lille eksempel var et forsøg på at demonstrere at:
1: En vector IKKE gror automatisk.
2: At der er de samme initialiserings problemer med vector
som med array.
3: Der er ingen af mine kompilere der giver mig nogen besked,
jeg får en box hvor der står om jeg vil sende en besked til
Microsoft om at programmet har udført en ulovlig handling.
Et andet lille eksempel, der kunne demonstrere hvorfor nogen kunne
synes at det er lettere at bruge arrays:
#include <vector>
#include <iostream>
int main()
{
std::vector<std::vector<std::vector<int> > >MyVector(10,
std::vector<std::vector<int> >(20, std::vector<int>(30)));
MyVector[9][19][29] = 123;
std::cout << MyVector[9][19][29] << std::endl;
}
Det er efter min mening lettere at skrive:
int Array[10][20][30];
--
"We learned more from a three minute record, baby
than we ever learned in school"
- Bruce Springsteen
| |
Mogens Hansen (21-01-2005)
| Kommentar Fra : Mogens Hansen |
Dato : 21-01-05 20:50 |
|
"Bertel Brander" <bertel@post4.tele.dk> wrote in message
news:41f15067$0$33621$edfadb0f@dread16.news.tele.dk...
[8<8<8<]
> Mit lille eksempel var et forsøg på at demonstrere at:
> 1: En vector IKKE gror automatisk.
vector gror automatisk når man kalder push_back.
Men der er oplagt mulighed for at bruge den forkert.
Hvis man vil have sikkerhed for ikke at adressere ud over vector, så brug
"at" i stedet for "operator[]".
Generelt bryder jeg med dog ikke om at bruge "vector::at" bare for en
sikkerheds skyld.
Hvis det er en del af den almindelig program eksekvering, er det ikke en
undtagelse der retfærdiggør brugen af exception.
Hvis det er for en "sikkerheds skyld", uden
> 2: At der er de samme initialiserings problemer med vector
> som med array.
Ikke helt.
int a[10];
efterlader en med 10 integerer med udefineret værdi.
vector<int> a(10)
efterlader en med 10 integerer, der hver har værdien 0.
Det er simpelt at sikre at vector kun indeholder faktis anvendte værdier,
hvorimod størrelsen på arrayet angivet dets kapacitet.
char name[1024];
strcpy(name, "Hello World");
> 3: Der er ingen af mine kompilere der giver mig nogen besked,
Hvis du bruger Microsoft Visual C++ er det måske værd at supplere den med
Compuware BoundsChecker eller Rational Purify.
Hvis du bruger Borland C++Builder kan du aktivere CodeGuard.
Hvis du bruger Linux er Valgrind måske værd at kigge på.
De råd gælder uanset om man bruger vector eller build-in array.
Venlig hilsen
Mogens Hansen
| |
Heureka (21-01-2005)
| Kommentar Fra : Heureka |
Dato : 21-01-05 00:30 |
|
Mange tak for jeres gode forslag!
Jeg vil tage et kig på std::vector klassen
Igen Tak
Thomas
"Mogens Hansen" <mogens_h@dk-online.dk> wrote in message
news:csp6p3$14pm$1@news.cybercity.dk...
>
> "Heureka" <stoltzo@hotmail.com> wrote in message
> news:41f00749$1@news.wineasy.se...
>> Hejsa,
>>
>> Jeg har lavet en klasse i hvilken jeg har defineret et array på følgende
>> vis:
>>
>> int vector[15];
>
> Brug C++ Standard Library funktionen "std::fill":
> fill(&vector[0], &vector[15], 0);
>
> Det er ikke nogen god ide at kalde arrayet vector - der er en klasse i C++
> Standard Library som hedder det.
> Giv den hellere et navn, der siger noget om hvad den bliver brugt til:
> int person_height[15];
>
> Overvej iøvrigt at benytte klassen "std::vector<int>" i stedet - det er
> ofte et bedre valg, hvis der ikke _altid_ er brug for _netop_ 15
> elementer.
> Hvis du har brug for _netop_ 15 elementer med værdien 0 som medlem i en
> klasse skriver du:
>
> class foo
> {
> public:
> foo();
>
> private:
> vector<int> bar;
> };
>
> foo::foo() :
> bar(15, 0)
> {
> }
>
> Hvis værdien 0 i virkeligheden indikerer at elementet ikke er brugt skal
> du slet ikke skrive noget, men indsætte værdier efterhånden som du får
> brug for dem med
> bar.push_back(new_bar_element);
>
> Hvis index i arrayet har en særlig betydning, men ikke alle pladser er
> fyldt med noget meningsfyldt (sparse array), kan man bruge klassen
> "std::map":
>
> class foo
> {
> public:
> // ...
> private:
> map<int, int> bar;
> };
>
> bar[3] = 7;
>
> Kort sagt: kig på C++ Standard Library klasserne "std::vector" og
> "std::map" - de er ofte nyttige.
>
> Venlig hilsen
>
> Mogens Hansen
>
| |
Per Abrahamsen (21-01-2005)
| Kommentar Fra : Per Abrahamsen |
Dato : 21-01-05 09:23 |
|
Bertel Brander <bertel@post4.tele.dk> writes:
> Thorsten Ottosen wrote:
>
>> Jeg kan kun sige at Mogens har fuldstøndig ret. Man bør *aldrig*
>> bruge indbyggede arrays in C++.
Man skal aldrig sige aldrig.
C arrays kan blive tvunget til at bruge når man skal kommunikere med
gammel software. De kan måske også bruges med fordel for meget
avancerede brugere i helt specielle situationer, som når de skal
implementere nye container-klasser.
> Hvis man er ny inden for C++ og måske programmering, har arrays den
> store fordel at de er nemme at bruge.
Nej, arrays er meget vanskelige ar bruge og forstå. vector er meget
simplere, specielt for begyndere. For eksempel bliver en vector ikke
på mystisk vis forvandlet til en pointer når man kigger skævt på den.
Den har almindelig value semantik som alt andet i sproget (undtagen
altså C vektorer).
| |
Mogens Hansen (21-01-2005)
| Kommentar Fra : Mogens Hansen |
Dato : 21-01-05 11:03 |
|
"Per Abrahamsen" <abraham@dina.kvl.dk> wrote in message
news:rjwtu75gxt.fsf@sheridan.dina.kvl.dk...
> Bertel Brander <bertel@post4.tele.dk> writes:
[8<8<8<]
> Man skal aldrig sige aldrig.
Enig.
Man skal blot have det simpleste og sikreste som default valg.
>
> C arrays kan blive tvunget til at bruge når man skal kommunikere med
> gammel software.
Nej - ikke tvunget.
"std::vector" er specificeret (i TC1 - alle kendte implementeringer inden
fungerede også som forventet) til at kunne bruges i den forbindelse med
ældre API'er.
F.eks.
vector<char> text(12);
strcpy(&text[0], "Hello World");
(ikke at jeg anbefaler vector<char> eller strcpy til tekst-håndtering - brug
std::string)
Det åbner for samme muligheder for buffer-overrun som man altid har haft.
Det er en egenskab til strcpy og ikke ved vector.
Venlig hilsen
Mogens Hansen
| |
Thorsten Ottosen (25-01-2005)
| Kommentar Fra : Thorsten Ottosen |
Dato : 25-01-05 14:24 |
|
"Per Abrahamsen" <abraham@dina.kvl.dk> wrote in message
news:rjwtu75gxt.fsf@sheridan.dina.kvl.dk...
| Bertel Brander <bertel@post4.tele.dk> writes:
|
| > Thorsten Ottosen wrote:
| >
| >> Jeg kan kun sige at Mogens har fuldstøndig ret. Man bør *aldrig*
| >> bruge indbyggede arrays in C++.
|
| Man skal aldrig sige aldrig.
og alligevel skal man sige det to gange for at sige man ikke skal sige det.
anyway, boost::array har alle "fordele", som almindelige
arrays har, men færre ulemper.
-Thorsten
| |
Per Abrahamsen (21-01-2005)
| Kommentar Fra : Per Abrahamsen |
Dato : 21-01-05 09:28 |
|
Per Abrahamsen <abraham@dina.kvl.dk> writes:
> C arrays kan blive tvunget til at bruge når man skal kommunikere med
> gammel software. De kan måske også bruges med fordel for meget
> avancerede brugere i helt specielle situationer, som når de skal
> implementere nye container-klasser.
Oh, jeg glemte lige den vigtigste fordel ved C arrays:
Man kan initialisere dem statisk. Hvis man har indlejrede data i
programmet, er det normalt både mere effektivt og bekvemt at placere
dem i statiske arrays, fremfor i en vector der må initialiseres
dynamisk.
| |
Thorsten Ottosen (25-01-2005)
| Kommentar Fra : Thorsten Ottosen |
Dato : 25-01-05 14:22 |
|
"Per Abrahamsen" <abraham@dina.kvl.dk> wrote in message
news:rjmzv3425l.fsf@sheridan.dina.kvl.dk...
| Per Abrahamsen <abraham@dina.kvl.dk> writes:
|
| > C arrays kan blive tvunget til at bruge når man skal kommunikere med
| > gammel software. De kan måske også bruges med fordel for meget
| > avancerede brugere i helt specielle situationer, som når de skal
| > implementere nye container-klasser.
|
| Oh, jeg glemte lige den vigtigste fordel ved C arrays:
|
| Man kan initialisere dem statisk.
Det kan man også med boost::array<T,int>.
-Thorsten
| |
Per Abrahamsen (21-01-2005)
| Kommentar Fra : Per Abrahamsen |
Dato : 21-01-05 12:44 |
|
"Mogens Hansen" <mogens_h@dk-online.dk> writes:
> "Per Abrahamsen" <abraham@dina.kvl.dk> wrote in message
> news:rjwtu75gxt.fsf@sheridan.dina.kvl.dk...
>
>> C arrays kan [man] blive tvunget til at bruge når man skal kommunikere med
>> gammel software.
>
> Nej - ikke tvunget.
Hvordan undgår man det hvis man vil snakke med det her interface:
extern "C"
{
typedef struct {
char name[12];
int age;
} foo_t;
void foo_init (foo_t* foo);
}
?
| |
Mogens Hansen (21-01-2005)
| Kommentar Fra : Mogens Hansen |
Dato : 21-01-05 13:22 |
|
"Per Abrahamsen" <abraham@dina.kvl.dk> wrote in message
news:rjr7kfvwg6.fsf@sheridan.dina.kvl.dk...
[8<8<8<]
> Hvordan undgår man det hvis man vil snakke med det her interface:
>
> extern "C"
> {
> typedef struct {
> char name[12];
> int age;
> } foo_t;
>
> void foo_init (foo_t* foo);
> }
Lige ud af landevejen - char er ikke speciel:
vector<foo_t> foos(2);
foo_init(&foos[0]);
&foo[0] giver en foo_t*, og man kan ikke se hvor og hvordan den er
allokeret.
Naturligvis har vi samme spørgsmål som med strcpy: hvordan ved foo_init hvor
mange elementer der er i arrayet.
Venlig hilsen
Mogens Hansen
| |
Bertel Brander (21-01-2005)
| Kommentar Fra : Bertel Brander |
Dato : 21-01-05 19:59 |
|
Mogens Hansen wrote:
> "Per Abrahamsen" <abraham@dina.kvl.dk> wrote in message
> news:rjr7kfvwg6.fsf@sheridan.dina.kvl.dk...
>
> [8<8<8<]
>
>>Hvordan undgår man det hvis man vil snakke med det her interface:
>>
>> extern "C"
>> {
>> typedef struct {
>> char name[12];
>> int age;
>> } foo_t;
>>
>> void foo_init (foo_t* foo);
>> }
>
>
> Lige ud af landevejen - char er ikke speciel:
> vector<foo_t> foos(2);
> foo_init(&foos[0]);
>
Jeg tror at det var arrayet i foo_t der er problemet, ikke foo_t
i sig selv.
--
"We learned more from a three minute record, baby
than we ever learned in school"
- Bruce Springsteen
| |
Mogens Hansen (21-01-2005)
| Kommentar Fra : Mogens Hansen |
Dato : 21-01-05 20:14 |
|
"Bertel Brander" <bertel@post4.tele.dk> wrote in message
news:41f150d3$0$33621$edfadb0f@dread16.news.tele.dk...
[8<8<8<]
> Jeg tror at det var arrayet i foo_t der er problemet, ikke foo_t
> i sig selv.
Jeg forstår ikke helt.
Hvordan skulle indholdet af foo_t skulle spille nogen rolle for hvordan man
kan kalde foo_init ?
Min antagelse var at foo_t og foo_init var lavet for længe side og ikke
kunne ændres, og at foo_init forventede en pointer til første element i et
array - oprindeligt tænkt som et build-in array (ligesom f.eks. strlen).
Venlig hilsen
Mogens Hansen
| |
Bertel Brander (21-01-2005)
| Kommentar Fra : Bertel Brander |
Dato : 21-01-05 20:26 |
|
Mogens Hansen wrote:
> "Bertel Brander" <bertel@post4.tele.dk> wrote in message
> news:41f150d3$0$33621$edfadb0f@dread16.news.tele.dk...
>
> [8<8<8<]
>
>>Jeg tror at det var arrayet i foo_t der er problemet, ikke foo_t
>>i sig selv.
>
>
> Jeg forstår ikke helt.
> Hvordan skulle indholdet af foo_t skulle spille nogen rolle for hvordan man
> kan kalde foo_init ?
>
Hvis name i foo_t var en std::vector og foo_init var implementeret i
C ville man have et problem.
--
"We learned more from a three minute record, baby
than we ever learned in school"
- Bruce Springsteen
| |
Mogens Hansen (21-01-2005)
| Kommentar Fra : Mogens Hansen |
Dato : 21-01-05 20:48 |
|
"Bertel Brander" <bertel@post4.tele.dk> wrote in message
news:41f15742$0$33642$edfadb0f@dread16.news.tele.dk...
[8<8<8<]
> Hvis name i foo_t var en std::vector og foo_init var implementeret i
> C ville man have et problem.
Hvordan kunne den situation opstå ?
foo_init må være defineret samtidig eller senere end foo_t.
foo_init afhænger af foo_t, hvorimod foo_t ikke afhænger af foo_init.
Hvis foo_t indeholdt en std::vector ville det være en C++ struktur og
følgeligt kunne foo_init implementeres i C++ og der ville ikke være noget
problem.
Den situation jeg kunne forestille mig er at foo_init og foo_t er lavet i C,
og man ønsker at benytte det fra et C++ program.
Venlig hilsen
Mogens Hansen
| |
Per Abrahamsen (22-01-2005)
| Kommentar Fra : Per Abrahamsen |
Dato : 22-01-05 13:48 |
|
"Mogens Hansen" <mogens_h@dk-online.dk> writes:
> "Bertel Brander" <bertel@post4.tele.dk> wrote in message
> news:41f150d3$0$33621$edfadb0f@dread16.news.tele.dk...
>
> [8<8<8<]
>> Jeg tror at det var arrayet i foo_t der er problemet, ikke foo_t
>> i sig selv.
Jeps.
> Jeg forstår ikke helt.
> Hvordan skulle indholdet af foo_t skulle spille nogen rolle for hvordan man
> kan kalde foo_init ?
Fordi foo_init forventer at indholdet af foo_t har et bestemt layout i
memory, og det layout kan du ikke med rimelighed duplikere fra C++
uden at bruge arrays. Præcis som vi gjorde i eksemplet.
| |
Per Abrahamsen (22-01-2005)
| Kommentar Fra : Per Abrahamsen |
Dato : 22-01-05 13:53 |
|
"Mogens Hansen" <mogens_h@dk-online.dk> writes:
> Min antagelse var at foo_t og foo_init var lavet for længe side og ikke
> kunne ændres,
Jeps.
> og at foo_init forventede en pointer til første element i et
> array - oprindeligt tænkt som et build-in array (ligesom f.eks. strlen).
Forkert, foo_init forventer en pointer til et enkelt objekt der skal
initialiseres.
Pointen er at hvis en C rutine forventer en pointer til en array, kan
se simuleres fra C++ med v.begin (), fordi en C array konverteres til
en pointer til første element når man bruger den som argument til en
funktion.
Men hvis den array er pakket ind i en struct kan man ikke længere
bruge det trick, fordi en array er indlejret i en struct og ikke
længere en pointer som fra modtagerens side.
| |
Mogens Hansen (21-01-2005)
| Kommentar Fra : Mogens Hansen |
Dato : 21-01-05 08:04 |
|
"Heureka" <stoltzo@hotmail.com> wrote in message
news:41f00749$1@news.wineasy.se...
[8<8<8<]
> Nogen foreslag?
Er du med på forskellen på initialisering og tildeling ?
I C++ er der en skarp skelnen.
Når man skriver:
int values[] = {0,0,0,0,0};
initialiserer man arrayet.
Når man skriver
int values[5];
er det initialiseret til udefinerede værdier.
Når man så senere forsøger at skrive
values = {0,0,0,0,0};
er det et forsøg til tildeling - hvilket ikke er tilladt på den måde.
Se f.eks.
The C++ Programming Language, Special Edition
Bjarne Stroustrup
ISBN 0-201-70073-5
side 283 for yderligere detaljer.
Venlig hilsen
Mogens Hansen
| |
|
|