Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Problem mit qsort

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
03.07.2006, 13:55 Uhr
Yadgar



High!

Ich versuche, ausgehend vom Aufruf von qsort für ein int-Feld, einen solchen Aufruf für ein Feld von char-Strings (also char**) zu schreiben... Fehlermeldungen beim Kompilieren bekomme ich keine, aber zur Laufzeit hängt sich das Programm auf. Die Testausgabe "Hallo!" wird zweimal ausgegeben...

Hier der Code:


C++:
// Quicksort mit variablem Funktionsaufruf
// (BREYMANN, C++, Eine Einführung, München 1998, S. 226, Übungsaufgabe 6.7)

#include <iostream>
using namespace std;

int scmp(const void* a, const void* b)
{
   cout << "Hallo!" << endl;
   char* ia = *(char**)a;
   char* ib = *(char**)b;

   return strcmp(ia, ib);
}

int main()
{
   char* sfeld[]={"eins", "zwei", "drei", "vier", "fünf", "sechs", "sieben", "acht", "neun", "zehn"};

   int Groesse=sizeof(sfeld);
   cout << Groesse << endl;
  
   qsort(sfeld, Groesse, sizeof(char*), scmp);
   for (short i=0; i<10; i++)
   {
      for (short j=0; sfeld[i][j]; j++)
         cout << sfeld[i][j];
      cout << endl;
   }
  
   system("pause");
}



Oder bin ich doch einfach nur zu dumm für C++?

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
03.07.2006, 14:26 Uhr
virtual
Sexiest Bit alive
(Operator)


int Groesse=sizeof(sfeld)/sizeof(*sfeld)
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
03.07.2006, 14:56 Uhr
Yadgar



High!


Zitat von virtual:
int Groesse=sizeof(sfeld)/sizeof(*sfeld)


Das funktioniert! Jetzt hätte ich natürlich gerne gewusst, warum... ich war davon ausgegangen, dass in einem Feld von char-Arrays die Größe einfach gleich sizeof(Feldname) ist, da die Bytelänge eines char ja ohnehin 1 ist... "Groesse" wird mir als "40" angezeigt, was auch tatsächlich (von 0 aus gezählt) der Anzahl der im Feld enthaltenen Zeichen entspricht!

Ist es eigentlich normal, dass sich Anfänger derart schwertun, oder fehlt es mir grundsätzlich an Talent zum Programmieren?

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
03.07.2006, 16:25 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat von Yadgar:
High!

Das funktioniert! Jetzt hätte ich natürlich gerne gewusst, warum... ich war davon ausgegangen, dass in einem Feld von char-Arrays die Größe einfach gleich sizeof(Feldname) ist,
a die Bytelänge eines char ja ohnehin 1 ist... "Groesse" wird mir als "40" angezeigt, was auch tatsächlich (von 0 aus gezählt) der Anzahl der im Feld enthaltenen Zeichen entspricht!



Es ist zwar korrekt, daß sizeof(char)==1 ist, aber in deinem Fall hast Du ja kein char array, sondern ein Array von char* Zeigern. Dh ein Feld von sfeld hat die Größe von sizeof(char*).


Zitat von Yadgar:

Ist es eigentlich normal, dass sich Anfänger derart schwertun, oder fehlt es mir grundsätzlich an Talent zum Programmieren?



C/C++ sind im Vergleich zu anderen Sprachen schwere Sprachen, dh gewisse Probleme kehren immer wieder und es ist schwer, gleich am Anfang mehr als 10% richtig zu machen. Also nur Mut.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
03.07.2006, 16:40 Uhr
Yadgar



High!


Zitat von virtual:

Es ist zwar korrekt, daß sizeof(char)==1 ist, aber in deinem Fall hast Du ja kein char array, sondern ein Array von char* Zeigern. Dh ein Feld von sfeld hat die Größe von sizeof(char*).



Und Zeiger sind natürlich erheblich länger als bloss ein Byte... klar, ist ja kein 70er-Jahre-Einplatinencomputer! Haben Zeiger eigentlich prinzipiell alle dieselbe Länge, und wenn ja, wie hoch ist diese beim gcc unter Windows? 4 Byte kommt mir ein bißchen kurz vor, dann wäre schon bei 4 GB RAM der komplette Adressraum ausgeschöpft...


Zitat von virtual:

C/C++ sind im Vergleich zu anderen Sprachen schwere Sprachen, dh gewisse Probleme kehren immer wieder und es ist schwer, gleich am Anfang mehr als 10% richtig zu machen. Also nur Mut.


Dummerweise bin ich keineswegs "ganz am Anfang"... das ist jetzt mein vierter Anlauf, seit ich 1998 mal in einem Volkshochschul-Grundkurs in C++ reingeschnuppert hatte und überrascht war, wie klar und logisch das alles strukturiert war - bis dahin hatte ich mich (nach frustrierenden Erfahrungen mit C64-BASIC in den 80ern) für einen definitiven Nicht-Programmierer gehalten...

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
04.07.2006, 01:53 Uhr
kronos
Quotenfisch
(Operator)



Zitat von Yadgar:
wie hoch ist diese beim gcc unter Windows? 4 Byte kommt mir ein bißchen kurz vor, dann wäre schon bei 4 GB RAM der komplette Adressraum ausgeschöpft...

och, mit vier byte kannste schon mal 2^(4*8) einheiten addressieren, das dürfte für'n paar GB langen.
kannst dir ja mal sizeof(char*) ausgebene lassen, sind afaik tatsächlich vier byte.
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
04.07.2006, 06:43 Uhr
(un)wissender
Niveauwart


Da hat Yadger recht. Aber u.a. darum gibt es jetzt ja auch 64Bit. 32Bit Windows (nicht Server 2003, dass kann mehr) gibt nicht mehr als 2Gb Userram.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
04.07.2006, 11:37 Uhr
Yadgar



High!


Zitat von (un)wissender:
32Bit Windows (nicht Server 2003, dass kann mehr) gibt nicht mehr als 2Gb Userram.


Wieso nur 2 GB? Gibt es einen Grund dafür, dass Zeiger signed sein müssen, oder hat man bei Micro$oft einfach nur geschlampt? 2^32 sind doch 4 294 967 296, also 4 GB...

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: