Hilfe: C-Programm mit unerklärlichem Syntaxfehler

words ist ein char*-Zeiger, also ein Zeiger auf einen Char. Einem Char kannst du keinen Zeiger zuweisen. Du brauchst also einen Zeiger auf einen Zeiger auf einen Char, um ein zweidimensionales Array zu erzeugen.
Code:
 char **words ;
Allerdings kannst du ein solches Array auch einfacher deklarieren, z.B.:
Code:
char *words = (char*)malloc( sizeof( char )*ZEILEN_LAENGE*SPALTEN_HOEHE ) ;
words[y*ZEILEN_LAENGE+x] = Wert ;
Du berechnest dir deinen Offset in das Array also selbst. Mit einem Makro geht das natürlich etwas schöner (aber da muss man immer etwas aufpassen, dass man keinen Schmuh treibt):
Code:
#define WORDS(x,y) (words[(y)*ZEILEN_LAENGE+(x)])
WORDS(2,7) = Wert ;
Sollte deine Zeilenlänge eine Zweierpotenz sein, fällt außerdem die Multiplikation weg, denn die kannst du dann durch ein Linksshift ersetzen. (Ich denke, das würde der Compiler aber auch automatisch machen während der Optimierung.)

Gawayn
 
Zuletzt bearbeitet:
Mit der dynamischen Speicherreservierung komm ich noch nicht ganz klar.

Bis jetzt habe ich folgendes:

Code:
char *words[100001];
...
for (i; i>1; i--)
	{
		fgets(word, n, duden);
		
		words[x] = malloc(strlen(word)+1);
		strcpy(words[x], word);				//String in C-Array kopieren
		words[x][strlen(word)-1] = '\0';			//Zeilenumbruch löschen
		//printf ("Das neue Wort lautet: %s\n", words[x]);
		x++;
	}
Nun wollte ich das ganz so umgestalten, dass ich am Anfang den Speicher mit "malloc" reserviere. Etwa so:
Code:
char **words = (char *) malloc(1);
Und dann den das Array vergrößere denn ich weiß, wie viele Spalten ich benötige:
Code:
**words = (char *) malloc(sizeof(char)*i);
Anschließend dann die for-Schleife, wo die Arraygröße nochmal verändert wird.
Leider klappt das so noch nicht richtig. Könnt ihr mir weiterhelfen?

Vielen Dank.
Cu Issy
 
In deinem Code überschreibst du deinen Zeiger, nachdem du ihm Speicher zugewiesen hast. Das kann nicht funktionieren. Du musst doch den ELEMENTEN des Arrays neuen Speicher zuweisen, nicht dem Zeiger auf das Array. Beispielsweise:
Code:
words = (char**)malloc( ... ) ;
words[0] = (char*)malloc( ... ) ;
Gawayn
 
Original geschrieben von SvenK
Vor allem solltest du auch
Code:
main()
einen Typ zuweisen...
d.h.
Code:
int main() { }
Hat er implizit. Und wahrscheinlich eher unbeabsichtigt. Bei C ist es so, dass das Fehlen eines Rückgabetyps implizit int bedeutet. Und tatsächlich, am Ende der main() gibt er 0 zurück. Das sollte also nicht das Problem gewesen sein. Aber bei dem Compiler würde es mich nicht wundern, wenn es daran lag.. :)
 
Hmmm, irgendwie bringt der mir noch nicht das richtige.
Habe folgendes ersetzt:
Code:
char *words[100001];
Durch:
Code:
char **words;
...
words = (char**)malloc(sizeof(char)*i);       //nachdem i bekannt ist
Wenn ich das Array ausgebe, dann kommen nur cryptische Zeichen. Kann es an der Große liegen? Ist ein Array mit 80000 Zeilen und in jeder Zeile steht ein Wort. Auf die andere Art und Weise ist die Array-Ausgabe richtig.
Wenn ich ein kleines Array habe, z.B. 5 Wörter, dann klappt das mit "malloc", aber bei dem großen nicht. :(
PS: Das mit "int" ändert nichts. ;-)
Freue mich für jede Hilfe. Danke.
cu Issy
 
Zuletzt bearbeitet:
Habe den Fehler glaub ich gefunden. Könnte das sein:
Code:
words = (char**)malloc(sizeof(char*)*i);
cu Issy :)
 
So, ich habe jetzt mein "großes" Array sortieren lassen. Mit BubbleSort hat es geklappt.
Nun wollte ich was schnelleres probieren und hab es mit QuickSort probiert.
Hier kommt der Fehler: Fatal stack overflow error.
Es betrifft die folgende Quicksort-Implementation:
Code:
void quicksort (char *w[], int q, int r) {
  int i,s;
  char *tmp = (char *) malloc(100);
  char *pivot = (char *) malloc(100);
  void swap (char **, char **);

  if (q < r) {
    strcpy(pivot, w[q]);
    //pivot = w[q];
    s = q;
    for (i = q+1; i <= r; i++) {
      if (strcmp(pivot, w[i]) >= 0) {
        s++;
		swap (&w[s], &w[i]);
      }
    }
	swap (&w[q], &w[s]);
    quicksort(w, q, s-1);
    quicksort(w, s+1, r);
    }
}
void swap (char **p, char **q)
{
	char *temp;

	temp = *p;
	*p = *q;
	*q = temp;
}
Bin ich jetzt aufgeschmissen, oder gibt es dafür eine Lösung?
THX vor help. :)
cu Issy

EDIT: Jetzt bricht er das Programm darin ab, ohne einer Fehlermeldung. :(
 
Zuletzt bearbeitet:
Okay, tut mir leid, dass der letzte Beitrag so dorcheinander war.

Hier nochmal mein Problem:
Oben genannte Quicksort-Prozedur läuft prima mit einem Array, in dem Zahlen sind. Wenn ich ein Array mit Wörtern benutze, dann bricht das Programm ohne Fehlermeldung ab. :(
 
Zurück