Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 21
  1. #1

    [C] Inversione vettore

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    #define MAX_VETT 100
    
    int inverso(int vett);
    int vett[MAX_VETT],inv_vett[MAX_VETT];
    int i,dim_vett,j;
    
    main()
    {
        inizio:
        printf("Inserisci la dimensione del vettore (MAX 100): ");
        scanf("%d",&dim_vett);
        if(dim_vett<=MAX_VETT)
        {
            printf("Ora inserici uno ad uno i valori del vettore: \n");
            for(i=0;i<dim_vett;i++)
            {
                scanf("%d",&vett[i]);
    
            }
            for(j=0;j<dim_vett;j++)
                printf("%2d",vett[j]);
            printf("\n\n");
            inverso(vett);
            for(j=0;j<dim_vett;j++)
                printf("%2d",inv_vett[j]);
        }
        else
        {
            printf("\n\nIl valore max e' 100!!! RIPROVA!!!\n\n");
            goto inizio;
        }
        system("pause");
    }
    
    int inverso(int vett)
    {
        for(i=dim_vett;i=0;i--)
        {
            for(j=0;j<dim_vett;j++)
            {
                inv_vett[j]=vett[i];
            }
        }
        return(inv_vett);
    }
    In teoria dovrei prendere un vettore e invertirlo... Ma non viene...
    Ragazzi mi sapete dire perchè non funziona??? non riesco a trovare l'intoppo...

    grazie a tutti...

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

    Re: [C] Inversione vettore

    Originariamente inviato da Ov3rLo4d
    codice:
    int inverso(int vett)
    {
        for(i=dim_vett;i=0;i--) <-- for(i=dim_vett; i>=0; i--)
        {
            for(j=0;j<dim_vett;j++)
            {
                inv_vett[j]=vett[i];
            }
        }
        return(inv_vett);
    }
    In teoria dovrei prendere un vettore e invertirlo... Ma non viene...
    Ragazzi mi sapete dire perchè non funziona??? non riesco a trovare l'intoppo...

    grazie a tutti...
    Non ho guardato tutto il codice, ma questo l'ho notato subito!
    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

  3. #3
    già buono questo non lo sapevo... adesso sto ricontrollando... ma quell'errore penso sia il meno

    Cmq thk


    MOD1:

    Penso sia un fatto di puntatori... solo che non gli ho capiti molto bene...

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Originariamente inviato da Ov3rLo4d
    già buono questo non lo sapevo... adesso sto ricontrollando... ma quell'errore penso sia il meno

    Cmq thk
    Quell'errore vuol dire tante cose:

    1) Non hai ben chiaro come funziona un ciclo FOR
    2) Non hai ben chiara la differenza fra un confronto e un'assegnazione
    3) Non hai ben chiaro che un'espressione con valore "0" è sempre valutata come "false" nel dominio dei booleani

    MOD1:

    Penso sia un fatto di puntatori... solo che non gli ho capiti molto bene...
    No, non è una questione di puntatori... è che stai cercando di utilizzare una funzione che dovrebbe ricevere un array di interi e invece riceve un intero e tu gli stai passando (come correttamente vorresti fare) un array di interi... in questo modo la tua funzione riceve l'indirizzo base del tuo array... direi che c'è bisogno di tanto studio ancora...


    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

  5. #5
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    #define MAX_VETT 100
    
    int inverso(int vett);
    int vett[MAX_VETT],inv_vett[MAX_VETT];
    int i,dim_vett,j;
    
    main()
    {
        inizio:
        printf("Inserisci la dimensione del vettore (MAX 100): ");
        scanf("%d",&dim_vett);
        if(dim_vett<=MAX_VETT)
        {
            printf("Ora inserici uno ad uno i valori del vettore: \n");
            for(i=0;i<dim_vett;i++)
            {
                scanf("%d",&vett[i]);
    
            }
            for(j=0;j<dim_vett;j++)
                printf("%2d",vett[j]);
            printf("\n\n");
            for(j=0;j<dim_vett;j++)
                inverso(vett[j]);
            for(j=0;j<dim_vett;j++)
                printf("%2d",inv_vett[j]);
        }
        else
        {
            printf("\n\nIl valore max e' 100!!! RIPROVA!!!\n\n");
            goto inizio;
        }
        system("pause");
    }
    
    int inverso(int vett)
    {
        for(i=dim_vett;i>=0;i--)
        {
            for(j=0;j<dim_vett;j++)
            {
                inv_vett[j]=vett[i];
            }
        }
        return(inv_vett);
    }
    Penso di aver capito cosa intendi... guarda un po', ho corretto... spero di averti capito bene... l'errore da quella riga infatti sparisce...

    Ora ho degli errori nella funzione, mi dice:

    line 45 error: invalid types 'int[int]' for array subscript
    line 48 error: invalid conversion from 'int*' to 'int'

    cosa vogliono dire???

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Originariamente inviato da Ov3rLo4d
    Ora ho degli errori nella funzione, mi dice:

    line 45 error: invalid types 'int[int]' for array subscript
    line 48 error: invalid conversion from 'int*' to 'int'

    cosa vogliono dire???
    Vogliono dire che non hai corretto l'errore, ma hai solo fatto in modo che il compilatore accetti la chiamata alla funzione (aggiungendo quindi un errore logico).

    La tua funzione continua a ricevere un intero, mentre dovrebbe ricevere un array di interi...
    infatti al suo interno tratti il suo argomento come array: ma guarda la firma della funzione ed anche il suo prototipo... sono sbagliati!


    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

  7. #7
    Boh... non riesco a capire come risolverlo... riusciresti mica a correggere l'errore... forse è l'unico modo che ho per capire...

    Se fossi così gentile da scrivere quello che dovrei cambiare... grazie grazie grazie...

    non so più veramente cosa fare... ormai e più di 1 ora che sono bloccato... fra pochi giorni ho un esonero e sono nella M...

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Vediamo di fare un po' di luce.
    La differenza fra un intero e un puntatore ad intero è essenziale: un intero è un numero in memoria, un puntatore ad intero è un indirizzo di memoria dove è memorizzato un numero.

    Gli array altro non sono che "puntatori": c'è una lista di interi e c'è un puntatore che serve per raggiungerli. Ciascun array, quindi, possiede implicitamente un puntatore al primo elemento, da cui poi si può raggiungere tutti gli altri sommandoci di volta in volta l'offset (1 per il secondo elemento, 2 per il terzo elemento, ecc).

    Ma se non conosci la differenza fra un numero e il suo indirizzo in memoria si fa pochissima strada. E soprattutto se non sai distinguere fra un numero intero e una lista di numeri interi le cose si complicano ulteriorimente.

    La tua funzione dovrebbe ricevere una lista di interi (e non un intero, ovviamente!) e dovrebbe restituire la stessa lista di interi invertita (e non un intero, ancora una volta!).

    Quindi la tua funzione dovrebbe cambiare da così:
    codice:
    int inverso(int vett);
    che significa "prendo un intero e restituisco un intero"...
    a così:
    codice:
    int *inverso(int *vett);
    che significa "prendo una lista di interi e restituisco una lista di interi".

    Poi, la dichiarazione di inv_vett a livello globale non ha molto senso, ma non importa.


    Fatta questa modifica devi riadattare la chiamata. Non puoi passare un intero, ma un vettore (come avevi fatto all'inizio) e, contestualmente, dovrai ricevere un vettore e non buttare via il risultato. Quindi:
    codice:
    inv_vett = inverso(vett);
    che significa "ottengo nella variabile inv_vett l'inverso del vettore vett"...


    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

  9. #9
    Ciao... grazie... alcune cose mi sono diventate più chiare di prima

    c'è ancora un problema che non fa partire il programma:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    #define MAX_VETT 100
    
    int *inverso(int *vett[]);
    int vett[MAX_VETT],inv_vett[MAX_VETT];
    int i,dim_vett,j;
    
    main()
    {
        inizio:
        printf("Inserisci la dimensione del vettore (MAX 100): ");
        scanf("%d",&dim_vett);
        if(dim_vett<=MAX_VETT)
        {
            printf("Ora inserici uno ad uno i valori del vettore: \n");
            for(i=0;i<dim_vett;i++)
                scanf("%d",&vett[i]);
            for(j=0;j<dim_vett;j++)
                printf("%2d",vett[j]);
            printf("\n\n");
            for(j=0;j<dim_vett;j++)
                inv_vett=inverso(vett[j]);
            for(j=0;j<dim_vett;j++)
                printf("%2d",inv_vett[j]);
        }
        else
        {
            printf("\n\nIl valore max e' 100!!! RIPROVA!!!\n\n");
            goto inizio;
        }
        system("pause");
    }
    
    int *inverso(int *vett[])
    {
        for(i=dim_vett;i>=0;i--)
        {
            for(j=0;j<dim_vett;j++)
            {
                inv_vett[j]=*vett[i];
            }
        }
        return(inv_vett);
    }
    Mi da ancora 3 errori li nella parte rossa:

    1error: invalid conversion from 'int' to 'int**'
    2error: initializing argument 1 of 'int* inverso(int**)'
    3error: incompatible types in assignement of 'int*' to 'int[100]'


    Come li risolvo??

    Grazie ancora

  10. #10
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Non so se hai notato che in quella parte di codice stai chiedendo di effettuare tante inversioni quanti sono gli elementi (ovvero, per ciascun elemento dell'array, richiami la funzione di inversione dell'array... un po' troppo, no?)

    In secondo luogo... stai continuando a passare un elemento dell'array alla funzione, invece di passare l'intero array...


    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.