Visualizzazione dei risultati da 1 a 6 su 6

Discussione: Array Resize

  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    33

    Array Resize

    Ciao a tutti!
    Svolgendo un esercizio sugli stack ad un certo punto il programma mi dava errore, ma non in fase di compilazione. Cercando di capire dove fosse il problema ho provato a cambiare compilatore passando da CodeBlock a WxDevC++ e ora, già in fase di compilazione, mi esce un errore nella funzione array resize, questa è la funzione
    codice:
    void array_resize(TArray *a,int new_length){
       if(new_length > a->size || new_length < a->size -SHRINK_DELTA){
          int new_size=new_length+GROW_DELTA;
          a->item=realloc(a->item, sizeof(TInfo)*new_size);  //Pare che qui sia l'errore
          assert(a->item!=NULL || new_size!=0);
          a->size=new_size;
          }
       a->length=new_length;
       }
    e l'errore che mi compare è questo : invalid conversion from 'void*' to 'TInfo*{aka int*}' [-fpermissive], qualcuno sa a cosa è dovuto ? grazie per l'aiuto.

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Devi fare il cast al tipo di puntatore che intendi restituire dalla realloc.

    a->item=(TInfo *)realloc(....)
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    33
    Grazie mille. Visto ora che proprio non riesco a trovare l'errore nell'esercizio spero possiate darmi una mano anche qui
    Nell'esercizio viene chiesto di creare due stack, A e B. Si si vogliono inserire elementi si inseriscono nello stack B, se voglio prelevare elementi li prelevo dallo stack A. Se lo stack A è vuoto vengono prima copiati tutti gli elementi dallo stack B allo stack A e poi si procede con il prelievo. Il mio errore sta già nel primo case, in pratica non riesco a inserire elementi nello stack B. Ecco il codice :

    codice:
    #include<stdio.h>
    #include<stdlib.h>
    #include<assert.h>
    #include<stdbool.h>
    
    #define GROW_DELTA 10
    #define SHRINK_DELTA 20
    
    typedef int TInfo;
    
    struct SArray{
       TInfo *item;
       int length;
       int size;
       };
    typedef struct SArray TArray;
    
    struct SStack{
       TArray array;
       };
    typedef struct SStack TStack;
    
    TArray array_create(int initial_length){
       TArray a;
       a.item=(TInfo*)malloc(sizeof(TInfo)*initial_length);
       assert(a.item!=NULL);
       a.length=initial_length;
       a.size=initial_length;
       }
    
    void array_destroy(TArray *a){
       free(a->item);
       a->item=NULL;
       a->length=0;
       a->size=0;
       }
    
    void array_resize(TArray *a,int new_length){
       if(new_length > a->size || new_length < a->size -SHRINK_DELTA){
          int new_size=new_length+GROW_DELTA;
          a->item=realloc(a->item, sizeof(TInfo)*new_size);
          assert(a->item!=NULL || new_size!=0);
          a->size=new_size;
          }
       a->length=new_length;
       }
    
    TStack stack_create(void){
       TStack s;
       s.array=array_create(0);
       return s;
       }
    
    void stack_destroy(TStack *s){
       array_destroy(&s->array);
       }
    
    void stack_push(TStack *s, TInfo x){
       int n=s->array.length;
       array_resize(&s->array, n+2);
    
       s->array.item[n]=x;
       }
    
    TInfo stack_pop(TStack *s){
        int n=s->array.length;
        TInfo x=s->array.item[n-1];
        array_resize(&s->array, n-1);
        return x;
       }
    
    TInfo stack_top(TStack *s){
       int n=s->array.length;
       return s->array.item[n-1];
       }
    
    bool stack_is_empty(TStack *s){
       return s->array.length==0;
       }
    
    int menu(){
       printf("\n1) Inserire un elemento.\n");
       printf("2) Prelievo di un elemento.\n");
       printf("3) Verifica coda vuota.\n");
       printf("4) EXIT.\n\n");
       printf("Fai la tua scelta :  ");
       }
    
    int main(){
    
       TStack stackA,stackB;
       int scelta=0;
       TInfo elemento;
    
       stackA=stack_create();
       stackB=stack_create();
    
       while(scelta!=4){
          menu();
          scanf("%d", &scelta);
    
          switch(scelta){
    
             case 1 :   printf("Inserire il nuovo elemento :\n");
                        scanf("%d", &elemento);
                        stack_push(&stackB, elemento);
                break;
    
             case 2 : if(stack_is_empty(&stackA)){
                           while(stackB.array.length!=0)
                               stack_push(&stackA , stack_pop(&stackB));
                           elemento=stack_pop(&stackA);
                           printf("ELEMENTO  %d   \n", elemento);
                           }
    
                        else {
                           elemento=stack_pop(&stackA);
                           printf("%d   \n", elemento);
                           }
                break;
    
             case 3 :
                break;
    
             }
    
          }
    
       return EXIT_SUCCESS;
       }

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Devi tenere conto delle regole del forum ...

    Questo thread ha come titolo "Array Resize" ... chiuso quell'argomento non puoi discutere di altro se non in un altro thread con titolo apposito ...

    E sarebbe bene anche indicare *precisamente* il problema e non con un generico "non riesco a inserire elementi nello stack B" lasciando a chi ti risponde l'onere di testare tutto il tuo codice.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    33
    Ho già testato il codice e se sapessi dov'è l'errore non avrei chiesto qui
    con "non riesco a inserire elementi nell stack B" intendo che forse il problema sta proprio nella funzione stack push, che però ho ricontrollato 1000 volte. Ho riportato tutto il codice per completezza e chiarezza, secondo me è più chiaro che riportare un pezzetto alla volta che magari non contiene neanche errori. Ora apro un nuovo topic, chiedo scusa.

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304

    Moderazione

    Visto che questo problema (quello trattato nel "titolo") è stato risolto, chiudo questa discussione, lascio aperta l'altra e ti invito a prendere visione del Regolamento interno, che non è stato messo lì in bella mostra solo per far presenza.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.