Problem mit Queue und array

keydo

Grünschnabel
hallöchen, hab n Problem mit meiner Warteschlange. 8(

Hab das ganze Wochenende gebastelt und hab erstmal folgendes Grundgerüst erstellt.

C++:
# 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 8)

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*


C++:
// 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?
 
Hi.

Erstmal ist das keine Queue die du da implementiert hast. Eine Queue wäre ja eine FIFO Datenstruktur. Deine Datenstruktur ist eine LIFO Datenstruktur - also im Prinzip ein Stack.

Ich verstehe nicht wie du das angeblich kompilieren kannst. Da sind einige Fehler drin:
  1. main muss int zurückgeben
  2. die for-Schleife ist fehlerhaft - ein Komma statt eines Semikolons
  3. die Funktion queue_put bekommt angeblich als 2. Parameter einen int übergeben, aufgerufen wird sie mit einem string
  4. du speicherst angeblich Zeiger von Strings in deiner "Queue", aber übergibst einen String als Wert (call-by-value) an die Funktion
Gruß
 
Zurück