PDA

View Full Version : [C] Problema con funzioni e puntatori


facano92
28-05-2012, 16:06
Salve ragazzi, all'uni ci stanno facendo fare un corso di informatica con "basi" di programmazione in C, per quanto riguarda quest'ultimo non ho ancora capito come funzionano i puntatori e gli array multidimensionali.
Ho cercato di fare qualcosa da solo: un programma che acquisista una matrice con 2 righe e un numero di colonne pari al massimo della lunghezza della stringa (il mio caso [2][50]), che le stampi e poi ho voluto creare una funzione che inserendo il numero della riga mi stampasse solamente quella riga, ma non ci sono riuscito. ç_ç
Ecco a voi cosa ho fatto:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

void stampa (char *v, int n);

int main()
{
char v[2][50];
int r;
for (r=0; r<2; r++)
{
gets(v[r]);
}
printf("\n\n");
for (r=0; r<2; r++)
{
puts(v[r]);
}
printf("\nQuale riga vuoi stampare?");
scanf("%d", &r);
stampa (&v, r);
return 0;
}


void stampa (char *v, int n)
{
puts((*v[n]));
}



Dove sbaglio? Le ho provate tutte ma non ho capito ç_ç

cirano994
01-06-2012, 20:37
Salve ragazzi, all'uni ci stanno facendo fare un corso di informatica con "basi" di programmazione in C, per quanto riguarda quest'ultimo non ho ancora capito come funzionano i puntatori e gli array multidimensionali.
Ho cercato di fare qualcosa da solo: un programma che acquisista una matrice con 2 righe e un numero di colonne pari al massimo della lunghezza della stringa (il mio caso [2][50]), che le stampi e poi ho voluto creare una funzione che inserendo il numero della riga mi stampasse solamente quella riga, ma non ci sono riuscito. ç_ç
Ecco a voi cosa ho fatto:



Dove sbaglio? Le ho provate tutte ma non ho capito ç_ç


Magari è troppo tardi, ma lo scrivo comunque:

Quando vuoi passare come parametro ad una funzione una matrice, devi specificare il numero delle colonne, quindi:
<T> nomeFunzione(<T> matrice[][COLONNE])

(<T> è un "marcatore" per indicare un tipo generico, puoi mettere quello che vuoi)

Ho notato anche che hai scritto:
puts((*v[n]));

Quando passi ad una funzione un vettore o una matrice, sei obbligato a passarli per riferimento (e quindi passi il puntatore). A quel punto devi comportarti nel modo "normale" ovvero come se il vettore (o matrice) l'avessi creata all'interno di quella funzione.
Quindi non serve il *.
(Comportandoti in modo "normale" per fare scanf e mettere il valore nella matrice devi usare sempre &, anche se sei in una funzione e la matrice è un parametro).

In più:
stampa (&v, r);

Non devi mettere &, perchè v è già il puntatore alla matrice.

Se hai bisogno chiedi pure. ;)

Squall 94
02-06-2012, 12:16
Magari è troppo tardi, ma lo scrivo comunque:

Quando vuoi passare come parametro ad una funzione una matrice, devi specificare il numero delle colonne, quindi:
<T> nomeFunzione(<T> matrice[][COLONNE])

(<T> è un "marcatore" per indicare un tipo generico, puoi mettere quello che vuoi)

Ho notato anche che hai scritto:
puts((*v[n]));

Quando passi ad una funzione un vettore o una matrice, sei obbligato a passarli per riferimento (e quindi passi il puntatore). A quel punto devi comportarti nel modo "normale" ovvero come se il vettore (o matrice) l'avessi creata all'interno di quella funzione.
Quindi non serve il *.
(Comportandoti in modo "normale" per fare scanf e mettere il valore nella matrice devi usare sempre &, anche se sei in una funzione e la matrice è un parametro).

In più:
stampa (&v, r);

Non devi mettere &, perchè v è già il puntatore alla matrice.

Se hai bisogno chiedi pure. ;)

Il passaggio del valore credo sia errato perchè se v è una matrice non puoi non passarli il secondo valore, o ci metti 0 o non saprei dirti, in C++ facevo così.
Poi conta che da matrice in questo caso diventi un vettore, forse fa una sorta di casting ( difficile ) oppure un errore che non ti so spiegare.

cirano994
02-06-2012, 12:53
Il passaggio del valore credo sia errato perchè se v è una matrice non puoi non passarli il secondo valore, o ci metti 0 o non saprei dirti, in C++ facevo così.
Poi conta che da matrice in questo caso diventi un vettore, forse fa una sorta di casting ( difficile ) oppure un errore che non ti so spiegare.

Così funziona:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

void stampa (char v[][50], int n);

int main(){
char v[2][50];
int r;
for (r=0; r<2; r++)
gets(v[r]);
printf("\n\n");
for (r=0; r<2; r++)
puts(v[r]);
printf("\nQuale riga vuoi stampare?");
scanf("%d",&r);
stampa(v,r);
system("PAUSE");
}


void stampa (char v[][50], int n){
puts(v[n]);
}


Non capisco qual è il problema.

:)