Problem mit Queue und Array
-
hallöchen, hab n Problem mit meiner Warteschlange. 8(
Hab das ganze Wochenende gebastelt und hab erstmal folgendes Grundgerüst erstellt.
# include <stdio.h> # include <stdlib.h> # define WAIT for(;;) #include <iostream> #include <string> using namespace std; struct queue { int *array; int size; int last; }; extern struct queue *que_construct(); extern void que_destruct( struct queue *que); extern int que_put( struct queue *que, int val); extern int que_get( struct queue *que, int *val); void main() { struct queue *que; int i; que = que_construct(); printf( "\nPush:"); for(i = 0; i < 10; i++) { printf( " %d", i); que_put(que, i); } printf( "\nGet:"); while( que_get( que, &i)) printf( " %d", i); printf( "\n"); que_destruct( que); WAIT; } extern struct queue *que_construct() { struct queue *que; que = (struct queue *)malloc( sizeof( struct queue)); if( !que) return 0; que->array = (int *)malloc(100*sizeof(int)); if( !que->array) return 0; que->size = 100; que->last = 0; return que; }; extern int que_put( struct queue *que, int val) { if(que->last == que->size) { que->array = (int *)realloc(que->array, (que->size+50)*sizeof(int)); que->size += 50; } que->array[que->last] = val; que->last++; return 1; } extern int que_get( struct queue *que, int *val) { int i; if(que->last == 0) return 0; *val = que->array[0]; que->last--; for(i = 0; i < que->last; i++) que->array[i] = que->array[i+1]; return 1; } extern void que_destruct( struct queue *que) { free( que->array); free( que); }Man sieht das die zahlen 1-9 in die Schlange geschrieben werden und dann wieder aus der Schlange gelesen werden. So weit so gut

So, das klappt mit den Int Zahlen schon ganz fein ABER nu:
- Problem: wenn ich ein komplettes Array bestehend aus strings in die Warteschlange schreiben möchte kommt es zu einem Überlauf, schon bei der zuweisung in die Schlange *vermute ich*
// abänderungen # include <stdio.h> # include <stdlib.h> # define WAIT for(;;) #include <iostream> #include <string> using namespace std; struct queue { string *array; int size; int last; }; extern struct queue *que_construct(); extern void que_destruct( struct queue *que); extern int que_put( struct queue *que, int val); extern int que_get( struct queue *que, int *val); void main() { struct queue *que; int i; que = que_construct(); string chars[10] = {"test1","test2","test3"}; for( i = 0 ; i < 3, i++) que_put(que, chars[i]); for( i = 0; i < 3, i++) cout << que_get( que, &i)); que_destruct( que); WAIT; } extern struct queue *que_construct() { struct queue *que; que = (struct queue *)malloc( sizeof( struct queue)); if( !que) return 0; que->array = (int *)malloc(100*sizeof(string)); if( !que->array) return 0; que->size = 100; que->last = 0; return que; }; extern int que_put( struct queue *que, string val) { if(que->last == que->size) { que->array = (int *)realloc(que->array, (que->size+50)*sizeof(string)); que->size += 50; } que->array[que->last] = val; que->last++; return 1; } extern int que_get( struct queue *que, string *val) { int i; if(que->last == 0) return 0; *val = que->array[0]; que->last--; for(i = 0; i < que->last; i++) que->array[i] = que->array[i+1]; return 1; } extern void que_destruct( struct queue *que) { free( que->array); free( que); }Ich komme da nicht weiter. Woran liegt es dass er kein ganzes array in die Schlange schieben kann?
-
Erste Frage: Soll das jetzt C oder C++ werden?
Zweite Frage: Wenn C++ - ist es wirklich nötig, die Funktionen von Hand nachzubauen?
-
*nach unten gugg* Ich bediene mich den Büchern die ich vor mir habe und versuche halt gewisse Probleme umzusetzen. Das vlt. c mit c++ gemischt wird, ist von mir keine böswillige Absicht. Für den Anfänger ist es zum einen schwer beide Sprachen auseinander zu halten und zum anderen fehlt das Wissen welches Rad schon erfunden wurde um es zu bedienen 8/. Somit ist am Ende, bei Problemaufgaben, der Anfänger auf die Hilfen der Foren angewiesen.
Ich bin für jede Hilfe dankbar.
Ich gugge mir auch schon reichlich kleinere tricks ab, die ich hier im Form so finde 8P. Ob c / c++ ist nicht primär von Bedeutung für mich. Erst wenn das Progamm steht, versuch ich es noch zu optimieren, soweit man da von optimieren sprechen kann ^^
-
hmm pack doch einfach mal deine que-FUnktionen in eine Klasse que ... wo du dann auch einen Konstruktor und Destruktor zum initialisieren usw. hast.
-
Ich frage nur, weil der Code dort (abgesehen davon, daß du <string> und <iostream> einbindest) reines C ist. Und in C++ mußt du sowas nicht selber schreiben, dort gibt es eine fertig entwickelte Template-Klasse std::queue<> für diese Aufgaben.
(PS: Und die malloc()-Familie mit non-POD Typen (und dazu gehört auch std::string) anzuwenden kann leichter ins Auge gehen als du vielleicht erwartest)
-
Das sind dann meistens meine verzweifelten überpleibsel, wenn Fehlermeldungen auftauchen bei denen ich nicht genaus weiss was los ist. :>