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

    Passare un vettore ad una funzione in C...

    Ciao a tutti, sto studiando per preparare l'esame di Programmazione I della facoltà di Informatica di Verona...qualcuno mi saprebbe dire che istruzione usare per passare un vettore bidimensionale, ad esempio int vet [2][3], ad una funzione? Grazie mille per l'aiuto...

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    La funzione sarà simile a

    void funz(int v[2][3]);

    o anche

    void funz(int v[][3]);

    e la userai con

    funz(vet);
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    ...grazie mille per la tempestività con cui mi hai risposto...io avrei provato ad usare un puntatore...funzionava benissimo per un vettore unidimensionale, ma non con il bidimansionale...potresti dirmi dove ho sbagliato? Te ne sarei molto grato...ti posto il codice e scusa la mia ignoranza, ma sono proprio alle prime armi
    #include <stdio.h>
    #define SIZE_R 2
    #define SIZE_C 3
    int somma (int *aPtr);

    int main ()

    { int x[SIZE_R][SIZE_C];
    int i,j;
    int risultato;

    printf ("Inserire i %d numeri interi del vettore:\n", (SIZE_R * SIZE_C));
    for (i=0; i<SIZE_R; i++)
    { for (j=0; j<SIZE_C; j++)
    { scanf ("%d", &x[i][j]); }
    }

    printf ("Gli elementi del vettore x sono:\n");
    for (i=0; i<SIZE_R; i++)
    { for (j=0; j<SIZE_C; j++)
    { printf ("x[%d][%d] = %d", i, j, x[i][j]); }
    }

    risultato = somma (x);

    printf ("La somma degli elementi del vettore è:\n%d\n", risultato);

    return 0;

    }

    int somma (int *aPtr)

    { int c,d;
    int totale = 0;

    for (c=0; c<SIZE_R; c++)
    { for (d=0; d<SIZE_C; d++)
    { totale = totale + aPtr[c][d];}
    }

    return totale;

    }

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da freethinker
    io avrei provato ad usare un puntatore...funzionava benissimo per un vettore unidimensionale, ma non con il bidimansionale...
    Un vettore è una sequenza di valori e quindi il puntatore al suo primo valore permette al compilatore di accedere ad ogni suo elemento.

    Ma un array a due dimensioni, anche se in memoria è una sequenza di valori, è organizzato logicamente in una matrice m x n e un semplice puntatore non direbbe nulla al compilatore circa m e n.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    13
    ciao.
    contando che il C gli array bidimensionali li salva in memoria come fossero un array monodimensionale (ovvero ogni riga è consecutiva alla precedente) puoi semplicemente sfruttare l'aritmetica dei puntatori sommando ogni volta l'elemento successivo. Nella chiamata: risultato = somma(x); cambia la riga così: risultato = somma(&x[0][0]); in modo tale da passargli l'indirizzo del primo elemento della prima riga dell'array. Ora la funzione sarà così:

    codice:
    int somma(int *aPtr)
    {
        int totale=0;
        for(; aPtr <= aPtr[SIZE_R - 1][SIZE_C - 1]; aPtr++)
            totale += *aPtr;
        
        return totale;
    }
    prova e dimmi come va.

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da laurgaor
    ... contando che il C ...
    Non vedo come possa funzionare, dato che

    aPtr[SIZE_R - 1][SIZE_C - 1]

    rappresenta un valore (che fra l'altro il compilatore non sa come ottenere a partire dal puntatore) e non un puntatore (con cui vorresti confrontarlo).

    Semmai, dato che come dicevo prima, l'array è comunque in memoria come sequenza di valori e che li vuoi trattare tutti, potresti scrivere

    risultato = somma(&x[0][0]);

    e

    codice:
    	int somma(int *aPtr)
    	{
    		int totale=0;
    		int el;
    		for(el=0; el<SIZE_R*SIZE_C; el++)
    			totale += *(aPtr+el);
        
    		return totale;
    	}
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    ...per oregon: è vero quello che mi hai scritto ed a dire la verità ci avevo anche pensato, ma poi l'avevo accantonato...proverò a svolgerlo come mi hai suggerito tu e ti farò sapere...grazie ancora...

    ...per laurgeor: il programma con la tua modifica funziona! Grazie mille...

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da freethinker
    ...per laurgeor: il programma con la tua modifica funziona! Grazie mille...
    Ma ne sei proprio sicuro?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    13
    Originariamente inviato da freethinker
    ...per oregon: è vero quello che mi hai scritto ed a dire la verità ci avevo anche pensato, ma poi l'avevo accantonato...proverò a svolgerlo come mi hai suggerito tu e ti farò sapere...grazie ancora...

    ...per laurgeor: il programma con la tua modifica funziona! Grazie mille...
    di nulla.

    X Oregon: Gli array bidimensionali il C li salva in memoria come un array monodimensionale quindi con un puntatore è possibile scorrere tutti i suoi elementi.

  10. #10
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    13
    Originariamente inviato da oregon
    Non vedo come possa funzionare, dato che

    aPtr[SIZE_R - 1][SIZE_C - 1]

    rappresenta un valore (che fra l'altro il compilatore non sa come ottenere a partire dal puntatore) e non un puntatore (con cui vorresti confrontarlo).

    Semmai, dato che come dicevo prima, l'array è comunque in memoria come sequenza di valori e che li vuoi trattare tutti, potresti scrivere

    risultato = somma(&x[0][0]);

    e

    codice:
    	int somma(int *aPtr)
    	{
    		int totale=0;
    		int el;
    		for(el=0; el<SIZE_R*SIZE_C; el++)
    			totale += *(aPtr+el);
        
    		return totale;
    	}
    asp li hai ragione ho scordato di mettere la "&" a "aPtr[SIZE_R - 1][SIZE_C - 1]"

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.