Newsgroup: it.comp.lang.c++
Titolo: Array bidimensionali e puntatori...

Salve ragazzi. in questo programma ho un problemino:
**
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define RIGHE 3
#define LUNGHEZZA 16
int ricerca(char *p[], char *name)
{
    int i,vero;
    for(i = 0; i < RIGHE; i++)
    if (strcmp(*(p)[i],*name) == 0) /*Linea 12*/
        return(1);
}
 
int main(void)
    {
    char tab[RIGHE][LUNGHEZZA];
    char nome[LUNGHEZZA];
    int i;
    for (i=0; i < RIGHE; i++)
        {
             printf("Introduci il %d-o nome: ", i+1);
             scanf(" %s", tab[i]);
        }
    printf("\n\nIntroduci il nome da cercare: ");
    scanf(" %s", nome);
    if (ricerca(tab,nome) == 1) /*Linea 28*/
        printf("Il nome %s č stato trovato!", nome);
    else printf("Nulla");
    scanf("d", &i);
    return(0);
    }
**
Il programma non dovrebbe far altro che confrontare l'array della
stringa da cercare con l'array bidimensionale che viene inizializzato
dall'utente coi nomi da cercare (questo lo dovrebbe fare la funzione
"ricerca")
Il problema perņ č che il compilatore mi restituisce questi errori:
Linea 12: [Warning] passing arg 1 of `strcmp' makes pointer from
integer without a cast
Linea 12: [Warning] passing arg 2 of `strcmp' makes pointer from
integer without a cast
Linea 28: [Warning] passing arg 1 of `ricerca' from incompatible
pointer type
Praticamente č come se non riuscissi a far puntare correttamente il
puntatore *p all'array bidimensionale tab. Magari se qualcuno mi puņ
dare un chiarimento a riguardo gliene sarei grato!
Fr4nz


cut
Eccoti il programma corretto.
Volevo dirti anche che si tratta di C e non di C++, per cui la prossima
volta usa std::string e std::vector
al posto di char * e di arrays.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define RIGHE 3
#define LUNGHEZZA 16
/* Maurus: Ti ho modificato il primo parametro formale di ricerca */
int ricerca(char (*p)[LUNGHEZZA], char *name)
{
    int i,vero;
    for(i = 0; i < RIGHE; i++)
/* Maurus: Ti ho modificato entrambi gli argomenti di strcmp */
    if (strcmp(p[i],name) == 0) /*Linea 12*/
        return(1);
}
int main(void)
    {
    char tab[RIGHE][LUNGHEZZA];
    char nome[LUNGHEZZA];
    int i;
    for (i=0; i < RIGHE; i++)
        {
             printf("Introduci il %d-o nome: ", i+1);
             scanf(" %s", tab[i]);
        }
    printf("\n\nIntroduci il nome da cercare: ");
    scanf(" %s", nome);
    if (ricerca(tab,nome) == 1) /*Linea 28*/
        printf("Il nome %s è stato trovato!", nome);
    else printf("Nulla");
    scanf("d", &i);
    return(0);
    }
Spiegazione:
Il primo parametro formale della funzione ricerca non e' un semplice array
di puntator a char in quanto tu passi tab che hai dichiarato come array
bidimensionale di char e la seconda dimensione e' di size LUNGHEZZA.
Per cui per non far incacchiare il compilatore tu devi passare un puntatore
a vettori di char di size LUNGHEZZA, appunto come dichiarato nel parametro
formale.
Secondo errore, nella funzione strcmp tu avevi come argomenti non i
puntatori a carattere ma bensi' i caratteri stessi, usando *name al posto di
name.
Per cui non devi deferenziare altrimenti strcmp si arrabbia.
Vedi perche' e' meglio non usare i puntatori a char e in C++ hanno inventato
string ?
Maurus

al posto di char * e di arrays.
Il problema Maurus è che dovevo proprio usare puntatori ed arrays in
questo esercizio datomi all'università! Cmq grazie per l'aiuto!
Ah ti volevo chiedere: come mai hai tolto l'asterisco dal puntatore p
e dal puntatore name nella funzione? In teoria la strcmp non deve
confrontare il contenuto degli arrays carattere di riferimento?
Fr4nz

 Fr4nz
Se vai sull'help in linea dell' MSDN:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore98/ht
ml/_crt_strcmp.2c_.wcscmp.2c_._mbscmp.asp
(maronna che linkone!)
vedrai che la strcmp ha questo prototipo:
int strcmp( const char *string1, const char *string2 );
Ora, poiche' la funzione ricerca aveva la signature:
int ricerca(char (*p)[LUNGHEZZA], char *name)
non e' corretto passare a strcmp il contenuto di name come avevi fatto tu,
ma bensi' name stesso che e' un puntatore a char come vuole la funzione
strcmp (discorso analogo per p).
Il tuo compilatore ti dava dei warning in quanto ti avvertiva che gli
argomenti della strcmp sarebbero stati convertiti in puntatore a char, senza
che tu avessi fatto esplicitamente un cast, per cui ti faceva suonare un
campanello di allarme per una cosa che in effetti tu non volevi.
Alla prossima e vedi di prendere un bel 30
Maurus

 punizione l'esercizio in STL nudo e crudo :-))
Non perdo una parola...  E aspetto..
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html
Dept. of Physics, Univ. of Padova, Italy              ROT13: 
ybe...@cq.vasa.vg

Alla prossima e vedi di prendere un bel 30
Ehm Maurus sono al primo anno di univ., ho iniziato a Settembre ;-)
Stiamo facendo il C e non il C++, ecco il perchè di questi errori :-)