|
| cannot convert `int' to `const void *'... Fra : Andreas Hjordt |
Dato : 10-12-01 16:55 |
|
Jeg modtager følgende fejl fra g++ 2.96 . Og har gloet på det for længe. Alt
hjælp ønsket.
<error>
binarysearch.cpp: In function `int main ()':
binarysearch.cpp:25: cannot convert `int' to `const void *' for argument `2'
to
`bsearch (const void *, const void *, unsigned int, unsigned int, int (*)
(const void *, const void *))'
</error>
<code>
#include <string>
template<class T>
int bsearch(T array[], int size, T value)
{
int first = 0, last = size - 1, middle;
while(first <= last)
{
middle = (first + last) / 2;
if(array[middle] == value)
return(middle);
else if(array[middle] > value)
last = middle - 1;
else
first = middle + 1;
}
return(-1);
}
int main()
{
string snot[5] = {"ss", "AA", "zz", "bb", "JJ"};
cout << bsearch(snot , 4, "JJ") << "\n";
return(0);
}
</code>
mvh
Andreas Hjordt
| |
Kim Petersen (10-12-2001)
| Kommentar Fra : Kim Petersen |
Dato : 10-12-01 17:51 |
|
"Andreas Hjordt" <ahj@trition.dk> writes:
> Jeg modtager følgende fejl fra g++ 2.96 . Og har gloet på det for længe. Alt
> hjælp ønsket.
>
> <error>
> binarysearch.cpp: In function `int main ()':
> binarysearch.cpp:25: cannot convert `int' to `const void *' for argument `2'
> to
> `bsearch (const void *, const void *, unsigned int, unsigned int, int (*)
> (const void *, const void *))'
> </error>
>
> <code>
> ...snip...
> string snot[5] = {"ss", "AA", "zz", "bb", "JJ"};
>
> cout << bsearch(snot , 4, "JJ") << "\n";
> ...snip...
> </code>
Du kalder jo ikke funktionen korrekt, som gcc ganske rigtigt siger..
Definition (man bsearch):
void *bsearch(const void *key, const void *base, size_t nmemb,
size_t size, int (*compar)(const void *, const void *));
Så det rigtige kald ville være:
bsearch((void *)"JJ",(void *)snot,5,2,strcmp);
(i C og hvis dit array var char *'s)...
Men jeg har nu en alvorlig mistanke, om at det som du gerne vil, slet
ikke er hvad denne funktion gør... men at det du vil have er en funktion
i stil med:
<code>
#include <string>
#include <iostream>
int strfind(string arr[],int count,string key)
{
for (int i=0; i<count; i++)
if (arr[i]==key)
return i;
return -1;
}
int main()
{
string snot[5] = {"ss", "AA", "zz", "bb", "JJ"};
std::cout << strfind(snot , 5, "JJ") << std::endl;
return(0);
}
</code>
bare med en hurtigere routine (siden du valge bsearch).
--
Mvh. Kim Petersen /| Tlf: +4575831551 |\ Jomfru Ingefreds Vej 18
Software Engineer / | Fax: (none atm.) | \ 7100 Vejle
LSS / | Email: kim@vindinggaard.dk | \ DK - Danmark
| |
Andreas Hjordt (10-12-2001)
| Kommentar Fra : Andreas Hjordt |
Dato : 10-12-01 18:14 |
|
Jeg prøver at lave en template til binarysearch. Ikke at benytte en
eksisterende funktion.
Kompileren siger at fejlen er ved linje 25: cout << bsearch(snot , 4, "JJ")
<< "\n";
Men jeg tror at den er gal med syntaksen her: int bsearch(T array[], int
size, T value)
tak alligevel,
Andreas Hjordt
"Kim Petersen" <kim@vindinggaard.dk> wrote in message
news:snaj2f3i.fsf@mail.vindinggaard.dk...
> "Andreas Hjordt" <ahj@trition.dk> writes:
>
> > Jeg modtager følgende fejl fra g++ 2.96 . Og har gloet på det for længe.
Alt
> > hjælp ønsket.
> >
> > <error>
> > binarysearch.cpp: In function `int main ()':
> > binarysearch.cpp:25: cannot convert `int' to `const void *' for argument
`2'
> > to
> > `bsearch (const void *, const void *, unsigned int, unsigned int, int
(*)
> > (const void *, const void *))'
> > </error>
> >
> > <code>
> > ...snip...
> > string snot[5] = {"ss", "AA", "zz", "bb", "JJ"};
> >
> > cout << bsearch(snot , 4, "JJ") << "\n";
> > ...snip...
> > </code>
>
> Du kalder jo ikke funktionen korrekt, som gcc ganske rigtigt siger..
>
> Definition (man bsearch):
> void *bsearch(const void *key, const void *base, size_t nmemb,
> size_t size, int (*compar)(const void *, const void *));
>
> Så det rigtige kald ville være:
>
> bsearch((void *)"JJ",(void *)snot,5,2,strcmp);
>
> (i C og hvis dit array var char *'s)...
>
> Men jeg har nu en alvorlig mistanke, om at det som du gerne vil, slet
> ikke er hvad denne funktion gør... men at det du vil have er en funktion
> i stil med:
>
> <code>
>
> #include <string>
> #include <iostream>
>
> int strfind(string arr[],int count,string key)
> {
> for (int i=0; i<count; i++)
> if (arr[i]==key)
> return i;
> return -1;
> }
>
> int main()
> {
> string snot[5] = {"ss", "AA", "zz", "bb", "JJ"};
>
> std::cout << strfind(snot , 5, "JJ") << std::endl;
>
> return(0);
> }
> </code>
>
> bare med en hurtigere routine (siden du valge bsearch).
>
> --
> Mvh. Kim Petersen /| Tlf: +4575831551 |\ Jomfru Ingefreds Vej
18
> Software Engineer / | Fax: (none atm.) | \ 7100
Vejle
> LSS / | Email: kim@vindinggaard.dk | \ DK -
Danmark
| |
Kim Petersen (10-12-2001)
| Kommentar Fra : Kim Petersen |
Dato : 10-12-01 23:12 |
|
"Andreas Hjordt" <ahj@trition.dk> writes:
> Jeg prøver at lave en template til binarysearch. Ikke at benytte en
> eksisterende funktion.
> Kompileren siger at fejlen er ved linje 25: cout << bsearch(snot , 4, "JJ")
> << "\n";
> Men jeg tror at den er gal med syntaksen her: int bsearch(T array[], int
> size, T value)
<Rant>
Glem *alt* i mit tidligere svar!
Jeg er en IDIOT!
</Rant>
Da jeg så dit indlæg - læste jeg fejlen - og skippede direkte til main(),
og overså fuldstændig din nye definition af bsearch() [som er en standard
C function].
Det som er galt, er at du ikke har instantieret templaten [så bruger den
C functionen].
Lav dit kald om til:
bsearch<string>(...)
Og det virker!
--
Mvh. Kim Petersen /| Tlf: +4575831551 |\ Jomfru Ingefreds Vej 18
Software Engineer / | Fax: (none atm.) | \ 7100 Vejle
LSS / | Email: kim@vindinggaard.dk | \ DK - Danmark
| |
Morten Brix Pedersen (10-12-2001)
| Kommentar Fra : Morten Brix Pedersen |
Dato : 10-12-01 18:01 |
|
Andreas Hjordt wrote:
> Jeg modtager følgende fejl fra g++ 2.96 . Og har gloet på det for længe. Alt
> hjælp ønsket.
[SNIP]
> string snot[5] = {"ss", "AA", "zz", "bb", "JJ"};
^^^
Du bør måske overveje at bruge std::vector istedet, meget nemmere og
mere sikkert end arrays.
#include <string>
#include <vector>
#include <algorithm>
using std::string;
using std::vector;
using std::cout;
using std::find;
int main()
{
vector<string> array;
array.push_back("ss");
array.push_back("AA");
array.push_back("zz");
array.push_back("bb");
array.push_back("JJ");
vector<string>::iterator i = find(array.begin(), array.end(), "JJ");
if (i == array.end()) {
cout << "not found" << endl;
} else {
cout << *i << endl;
}
}
- Morten.
| |
Andreas Hjordt (10-12-2001)
| Kommentar Fra : Andreas Hjordt |
Dato : 10-12-01 18:22 |
|
Tak men jeg skal til prøve i dynamiske arrays og ved at jeg ved den
lejlighed skal lave en funktion som udføre binarysearch på et array. Så ikke
noget nyt, det er bare hvad jeg har der skal virke.
mvh
Andreas Hjordt
"Morten Brix Pedersen" <morten@wtf.dk> wrote in message
news:3C14EA5A.60702@wtf.dk...
> Andreas Hjordt wrote:
>
> > Jeg modtager følgende fejl fra g++ 2.96 . Og har gloet på det for længe.
Alt
> > hjælp ønsket.
> [SNIP]
> > string snot[5] = {"ss", "AA", "zz", "bb", "JJ"};
>
> ^^^
> Du bør måske overveje at bruge std::vector istedet, meget nemmere og
> mere sikkert end arrays.
>
> #include <string>
> #include <vector>
> #include <algorithm>
>
> using std::string;
> using std::vector;
> using std::cout;
> using std::find;
>
> int main()
> {
> vector<string> array;
>
> array.push_back("ss");
> array.push_back("AA");
> array.push_back("zz");
> array.push_back("bb");
> array.push_back("JJ");
>
> vector<string>::iterator i = find(array.begin(), array.end(), "JJ");
>
> if (i == array.end()) {
> cout << "not found" << endl;
> } else {
> cout << *i << endl;
> }
>
> }
>
> - Morten.
>
| |
Martin Dyring (10-12-2001)
| Kommentar Fra : Martin Dyring |
Dato : 10-12-01 18:28 |
|
"Andreas Hjordt" <ahj@trition.dk> wrote in message
news:3c14eeb6$0$7883$edfadb0f@dspool01.news.tele.dk...
> Tak men jeg skal til prøve i dynamiske arrays og ved at jeg ved den
> lejlighed skal lave en funktion som udføre binarysearch på et array. Så
ikke
> noget nyt, det er bare hvad jeg har der skal virke.
Lige en tilføjelse til mit andet indlæg ved samme lejlighed:
Hvis din funktion skal virke skal du huske at fodre den med sorteret data
(man kan jo ikke lave en binær søgning i usorteret data).
Held og lykke.
Mvh,
Martin
| |
Andreas Hjordt (10-12-2001)
| Kommentar Fra : Andreas Hjordt |
Dato : 10-12-01 19:11 |
|
"Martin Dyring" <mda@image.dk> wrote in message
news:Ee6R7.1725$Q3.222101@news010.worldonline.dk...
> "Andreas Hjordt" <ahj@trition.dk> wrote in message
> news:3c14eeb6$0$7883$edfadb0f@dspool01.news.tele.dk...
> > Tak men jeg skal til prøve i dynamiske arrays og ved at jeg ved den
> > lejlighed skal lave en funktion som udføre binarysearch på et array. Så
> ikke
> > noget nyt, det er bare hvad jeg har der skal virke.
>
> Lige en tilføjelse til mit andet indlæg ved samme lejlighed:
>
> Hvis din funktion skal virke skal du huske at fodre den med sorteret data
> (man kan jo ikke lave en binær søgning i usorteret data).
Takker. Jeg har lige lavet en template til bubblesort :)
mvh
Andreas Hjordt
| |
Andreas Hjordt (10-12-2001)
| Kommentar Fra : Andreas Hjordt |
Dato : 10-12-01 19:11 |
|
"Martin Dyring" <mda@image.dk> wrote in message
news:Ee6R7.1725$Q3.222101@news010.worldonline.dk...
> "Andreas Hjordt" <ahj@trition.dk> wrote in message
> news:3c14eeb6$0$7883$edfadb0f@dspool01.news.tele.dk...
> > Tak men jeg skal til prøve i dynamiske arrays og ved at jeg ved den
> > lejlighed skal lave en funktion som udføre binarysearch på et array. Så
> ikke
> > noget nyt, det er bare hvad jeg har der skal virke.
>
> Lige en tilføjelse til mit andet indlæg ved samme lejlighed:
>
> Hvis din funktion skal virke skal du huske at fodre den med sorteret data
> (man kan jo ikke lave en binær søgning i usorteret data).
Takker. Jeg har lige lavet en template til bubblesort :)
mvh
Andreas Hjordt
| |
Martin Dyring (10-12-2001)
| Kommentar Fra : Martin Dyring |
Dato : 10-12-01 18:19 |
|
"Andreas Hjordt" <ahj@trition.dk> wrote in message
news:3c14da63$0$77420$edfadb0f@dspool01.news.tele.dk...
> Jeg modtager følgende fejl fra g++ 2.96 . Og har gloet på det for længe.
Alt
> hjælp ønsket.
[snip]
Ved første øjekast ser det ud som om du ikke kalder din egen (template)
udgave af bsearch - men istedet en der er erklæret andetsteds.
Det kald til din hjemmestrikkede bsearch skulle vel se ud i stil med:
int main()
{
string snot[5] = {"ss", "AA", "zz", "bb", "JJ"};
cout << bsearch<string>(snot , 4, "JJ") << "\n";
return(0);
}
Anyhow, med mindre det er en opgave du er sat specifikt til at hjemmebrygge
så vil jeg istedet anbefale dig at kigge nærmere på STL (du kan bl.a. findet
noget dokumentation her: http://www.sgi.com/tech/stl) - nærmere betegnet
upper- samt lower_bound.
Have fun. :)
--
Mvh,
Martin
| |
Andreas Hjordt (10-12-2001)
| Kommentar Fra : Andreas Hjordt |
Dato : 10-12-01 18:28 |
|
takker det var <string> delen jeg havde glemt. og jo det er en spcifik
opgave jeg har fået stillet.
mvh
Andreas Hjordt
"Martin Dyring" <mda@image.dk> wrote in message
news:276R7.1720$Q3.221070@news010.worldonline.dk...
> "Andreas Hjordt" <ahj@trition.dk> wrote in message
> news:3c14da63$0$77420$edfadb0f@dspool01.news.tele.dk...
> > Jeg modtager følgende fejl fra g++ 2.96 . Og har gloet på det for længe.
> Alt
> > hjælp ønsket.
>
> [snip]
>
> Ved første øjekast ser det ud som om du ikke kalder din egen (template)
> udgave af bsearch - men istedet en der er erklæret andetsteds.
>
> Det kald til din hjemmestrikkede bsearch skulle vel se ud i stil med:
>
> int main()
> {
> string snot[5] = {"ss", "AA", "zz", "bb", "JJ"};
> cout << bsearch<string>(snot , 4, "JJ") << "\n";
> return(0);
> }
>
> Anyhow, med mindre det er en opgave du er sat specifikt til at
hjemmebrygge
> så vil jeg istedet anbefale dig at kigge nærmere på STL (du kan bl.a.
findet
> noget dokumentation her: http://www.sgi.com/tech/stl) - nærmere betegnet
> upper- samt lower_bound.
>
> Have fun. :)
>
> --
> Mvh,
> Martin
>
>
| |
|
|