invalid conversion from 'void*' to 'char*'

Pubblicità

bembem85

Nuovo Utente
Messaggi
23
Reazioni
0
Punteggio
25
Salve io ho fatto questo codice con il dev-c++:

Codice:
/* per la specifica dell'esercizio vedi prima esercitazione 
   autoguidata - es. 1.8 */
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#define N 40
#define MAXLUNG 50

/* ****** dichiarazioni delle funzioni usate ****** */
void aggiungi (char *v[], char *, int *);
int ricerca (char *[], int , char *);
void sostituisci (char *v[], int quante, char * quale, char *conChi);
void stampaStringhe (char *v[], int quante);
main(){
 int i, scelta,
     numeroStringhe;      /* per sapere quante stringhe sono nell'array */
 char *stringhe[N],       /* array di N stringhe */ 
       buffer[MAXLUNG+1], buffer2[MAXLUNG+1];
 numeroStringhe=0;   /* inizializzazione del numero di stringhe 
                        presenti nell'array */
 do {
   printf(" -      scegli      -\n");
   printf(" - aggiunta     (1) -\n");
   printf(" - sostituzione (2) -\n");
   printf(" - stampa       (3) -\n");
   printf(" - fine         (0) -\n");
   scanf("%d", &scelta);
   
   switch (scelta) {
     case 1: 
            printf("stringa di al piu' %d caratteri: ", MAXLUNG);
            scanf("%s", buffer);              /*lettura stringa*/
            aggiungi(stringhe, buffer, &numeroStringhe);
            break;
     case 2: 
            printf("stringa da sostituire: ");
            scanf("%s", buffer);              
            printf("stringa con cui sostituirla: ");
            scanf("%s", buffer2);              
        sostituisci(stringhe, numeroStringhe, buffer, buffer2);
            break;
     case 3:
            printf(" - ecco le stringhe\n");
        stampaStringhe(stringhe, numeroStringhe);
            break;
     case 0: 
            printf(" - USCITA DAL PROGRAMMA\n");
            break;
     default: 
            printf(" - opzione sballata\n");
   } /* fine switch */
 } while (scelta!=0);       /* fine do_while*/
 
printf("\nFINE\n");
return 0;
}

/* ************* funzioni usate ********************** */
/* trova la stringa cercata nell'array v, sapendo che 
il numero di stringhe presenti in v e' quante 
restituisce il puntatore alla stringa trovata o NULL */
int ricerca (char *v[], int quante, char *cercata) {
  int trovata, i;
  
  trovata=0;     /* inizializzazioni */
  
  for (i=0; ((i<quante)&&(!trovata)) ; i++)
    /*se troviamo la stringa in v[i], assegnamo trovata in modo che
      il ciclo si interrompa */
    if (strcmp(v[i],cercata)==0) {
      trovata=1;
    }
/* se ora i vale quante vuol dire che la ricerca della stringa non ha
avuto successo (e si restituisce -1);
se la stringa e' stata trovata, l'ultima iterazione del ciclo ha
- scoperto che v[i] conteneva la stringa cercata
- assegnato trovata a 1
- incrementato i di 1
poi il ciclo si e' interrotto
quindi l'indice della stringa cercata e' i-1 */
  if (i==quante)
    return -1;
  else return (i-1);
} /* fine ricerca */
 
void aggiungi (char *v[], char *nuova, int*quante) {
  if (*quante>=N)   /* se non c'e' spazio nell'array */
    printf(" - non c'e' spazio nell'array!\n");
  else {
    v[*quante]=malloc(strlen(nuova)+1); /* allocazione stringa */
    if (v[*quante]==NULL)
      printf("problemi in allocazione\n");  
    else {                              /* (se possibile)                  */
       strcpy(v[*quante], nuova);       /* assegnazione stringa aggiunta e */
       *quante += 1;                    /* incremento del numero di stringhe
                       presenti nell'array             */
    } /* fine secondo else */
  } /* fine primo else */ 
return;
} /* fine aggiungi */

/* sostituisce la stringa quale con la stringa conChi nell'array v,
sapendo che ci sono quante stringhe nelle'array */
void sostituisci (char *v[], int quante, char * quale, char *conChi) {
  int indiceStringa;
  indiceStringa = ricerca(v, quante, quale);
  if (indiceStringa==-1)
    printf("guarda che %s non c'e' ...", quale);
  else {       /* sostituzione */
    free(v[indiceStringa]);   /* prima si libera la memoria occupata
                 dalla stringa che non serve piu' */
    v[indiceStringa] = malloc(strlen(conChi));  /* poi si alloca
                          spazio per la nuova */
                  /* e poi, se non ci sono stati problemi
                  di allocazione, si copia la nuova
                  stringa in sede */
    if (v[indiceStringa]==NULL)
      printf("problemi in allocazione\n");
    else
      strcpy(v[indiceStringa], conChi);
  } /* fine primo else */
return;
}
void stampaStringhe (char *v[], int quante){
  int i;
  for (i=0;i<quante;i++)
    printf("%s\n", v[i]);
return;
}

Mi dice in:
Codice:
 v[*quante]=malloc(strlen(nuova)+1); /* allocazione stringa */
e
Codice:
 v[indiceStringa] = malloc(strlen(conChi));  /* poi si alloca

invalid conversion from 'void*' to 'char*' che vuol dire? Io mi ci sono sudato a fa sto programma e mi da sto errore?
Ma stiamo scherzando?
Grazie a chi mi aiuterà.
 
prova così :

v[*quante]=(char*)malloc(strlen(nuova)+1);

alcuni compilatori non fanno implicitamente il cast di quello che allochi con malloc al tipo di destinazione (Borland lo fà, Gcc no, ad esempio).

:ok:
 
e comunque sia vale anche nell'altra istruzioneaggiungere il (char*) ma perchè? Cos'è che non andava....però non è venuto quello che volevo io.
Ehm perchè volevo fare 2 mini programmi:

SOSTITUZIONE:

1) Utente scrive la frase
2) Utente scrive la parola da cercare
3) Utente scrive la parola da sostituire a quella cercata
4) Stampa la sostituzione nuova

capito?

TOGLI

come la sostituzione ma che toglie la parola cercata e quindi farla sparire
senza lasciare un grande spazio esempio:

Ciao pinco pallino
tolgo pinco
DEVE DIVENTARE Ciao pallino e non Ciao pallino.
Ok?
Grazie cordiali saluti
 
come ho scritto prima, la malloc ti alloca un buffer di una certa grandezza, che gli specifichi tu come parametro. Il buffer allocato però non ha un tipo preciso, quindi ti viene restituito come void* (puntatore generico).
Sta a te convertire il puntatore generico nel tipo che ti serve...

Si, puoi fare la stessa cosa anche per l' altra istruzione (era sottinteso).

Per il comportamento del programma non saprei, non ho guardato cosa facesse (sono al lavoro e ogni tanto "stacco un attimo") :ok:
 
eh?! per cosa? :boh: mica ho capito il senso della domanda...

Ricominciamo, ok?! (eeeh, qui due sono le cose : o sto invecchiando, o c' ho bisogno di ferie:lol:)
 
Cioè si possono fare due programmi separati che poi diventeranno funzioni che verranno chiamate ogni volta che l'utente decide se togliere una parola, sostituire una parola e anche aggiungere una parola a una frase digitata inizialmente?
 
si, certo... puoi creare delle funzioni , ognuna che fà una cosa, e le puoi richiamare come vuoi da un menù principale, dove l' utente decide cosa fare...

I programmi non sono mai scritti tutti in un unica funzione, sarebbe una pazzia... si "spezza" sempre il codice in moduli, ognuno con un compito preciso...

buon lavoro :ok:
 
tranquillo perchè se ti interess ti farò vedere il progetto che sto facendo insieme alla mia ragazza. Lei conosce benissimo il visual basic e access...il c gli sta sulle *****!!!! Però mi fa insegnante privato e sexy di questi due linguaggi e io invece sono esperto in ASM e le faccio da insegnante privato e sexy anceh io!!
 
eheh buone "lezioni" allora :asd:...

E' abbastanza comune l' odio per il C da parte di chi usa il VB ...
senza offesa per la tua ragazza eh, ma VB è trooooppo entry level...

- usi le variabili senza dichiararle prima, volendo
- tutte le variabili sono di tipo "Dim", poi se la vede lui a convertirle
- non è multithread

In ambito professionale serve qualcosa di più potente, di solito...

Però come "palestra" per imparare, senza abituarsi troppo alle comodità che offre, può anche andare... :ok:
 
Pubblicità
Pubblicità
Indietro
Top