Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - compatibilità tipo puntatori a carattere
Forum - C/C++ - compatibilità tipo puntatori a carattere

Avatar
fbotta (Normal User)
Newbie


Messaggi: 6
Iscritto: 23/08/2017

Segnala al moderatore
Postato alle 15:40
Martedì, 10/10/2017
Ciao a tutti sono relativamente nuovo di qua.
ho piu problemi a capire come mai il mio programma non compila.
ho capito dove sbaglio ma non so come sistemare non essendo esperto di programmazione.

l'esercizio chiede di creare una funzione che dati i seguenti dati strutturati se il codice all'interno della lista è uguale a quello del puntatore a caratteri salva il nodo in un'altra lista e restituisce di return il numero di elementi nella lista.

questo è il mio codice:

Codice sorgente - presumibilmente C++

  1. #include <iostream>
  2. #include <cstring>
  3. using namespace std;
  4.  
  5. struct prodotto {
  6.         char* codice[13];
  7.         char* data[11];
  8.         float prezzo;
  9.         int pi;
  10.         unsigned int tipologia;
  11. };
  12.  
  13. struct lista{
  14.         prodotto informazioni;
  15.         lista* next;
  16. };
  17.  
  18. int prendiprodottiinelenco(lista* L, char* codici[12], prodotto prods[], int size)
  19. {
  20.         int prodottitrovati=0, i=0;
  21.         lista* testa;
  22.         testa=L;
  23.        
  24.         for(i=0;codici[i]!=0;i++) //la condizione puo anche essere i=size, forse è piu giusto
  25.         {
  26.                 for(;testa->next!=NULL;testa=testa->next)
  27.                 {
  28.                         if(strcmp(testa->informazioni->codice , codici[i])==0)
  29.                         {
  30.                         strcpy (prods[i],testa);
  31.                         prodottitrovati++;
  32.                         break;
  33.                         }
  34.                        
  35.                         if(strcmp(prods[i]->codice , testa.informazioni.codice)!=0)
  36.                         {
  37.                                 prods[i]->codice = 0;
  38.                         }
  39.                 }
  40.         testa=L;
  41.         }
  42. return prodottitrovati;
  43. }
  44.  
  45. }




mi da svariati errori, tutti probabilmente simili.

ad esempio

Codice sorgente - presumibilmente Plain Text

  1. if(strcmp(testa->informazioni->codice , codici[i])==0)



in questa riga di codice mi dice che non riesce a convertire char** in const char.
so che con strcmp devono essere const char ma come modifico il codice affinchè il problema si risolva?

oppure qua

Codice sorgente - presumibilmente Plain Text

  1. strcpy (prods[i],testa);



dove l'errore è:[Error] cannot convert 'prodotto' to 'char*' for argument '1' to 'char* strcpy(char*, const char*)'

oppure

Codice sorgente - presumibilmente Plain Text

  1. if(strcmp(prods[i]->codice , testa.informazioni.codice)!=0)


[Error] base operand of '->' has non-pointer type 'prodotto'



spero di non aver violato nessuna regola del regolamento.
grazie in anticipo per l'aiuto
francesco

PM Quote
Avatar
Mikelius (Member)
Expert


Messaggi: 525
Iscritto: 14/04/2017

Segnala al moderatore
Postato alle 18:48
Martedì, 10/10/2017
Testo quotato

Postato originariamente da fbotta:


Codice sorgente - presumibilmente C++

  1. #include <iostream>
  2. #include <cstring>
  3. using namespace std;
  4.  
  5. struct prodotto {
  6.         char* codice[13];
  7.         char* data[11];
  8.         float prezzo;
  9.         int pi;
  10.         unsigned int tipologia;
  11. };





Sicuro che la struct sia giusta?
codice e data sono stringhe o vettori di stringhe?


Codice sorgente - presumibilmente Plain Text

  1. strcpy (prods[i],testa);



Stai copiando una struct TESTA in una PRODOTTO, come mettere 5 litri in una bottiglia di 2. A parte che la funzione è per le strighe e non per le struct.


Codice sorgente - presumibilmente C/C++

  1. [Error] base operand of '->' has non-pointer type 'prodotto'



la variabile non è un puntatore quindi per i suoi menbri devi accedere tramite il ' . ' e non '->'
ed attento che anche qui stai passando vettori di stringhe e non stringhe.


Ultima modifica effettuata da Mikelius il 10/10/2017 alle 18:51
PM Quote
Avatar
fbotta (Normal User)
Newbie


Messaggi: 6
Iscritto: 23/08/2017

Segnala al moderatore
Postato alle 14:48
Mercoledì, 11/10/2017
codice e data
non sono ne stringhe ne vettori di stringhe
sono puntatori a carattere cioè un vettore contenente puntatori a stringhe


Ultima modifica effettuata da fbotta il 11/10/2017 alle 14:48
PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 15:18
Mercoledì, 11/10/2017
Testo quotato

Postato originariamente da fbotta:
sono puntatori a carattere cioè un vettore contenente puntatori a stringhe



Questa tua affermazione non è ne coerente con il tuo codice ne coerente con se stessa. Se sono puntatori a carattere non sono vettori di puntatori a stringhe. Spiega cosa dovrebbero rappresentare slegati dalle formalità del C. Devono rappresentare due stringhe, una per la data(testuale) e una per un codice (es alfanumerico)?

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 17:12
Mercoledì, 11/10/2017
Testo quotato

Postato originariamente da fbotta:

codice e data
non sono ne stringhe ne vettori di stringhe
sono puntatori a carattere cioè un vettore contenente puntatori a stringhe




Quello che hai scritto non ha nessun senso ...


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
fbotta (Normal User)
Newbie


Messaggi: 6
Iscritto: 23/08/2017

Segnala al moderatore
Postato alle 9:43
Giovedì, 12/10/2017
scusate probabilmente non avendo idea dell'entità dell'errore non posso essere utile neanche a dare indicazioni per la risoluzione dello stesso.
allego una foto del tema d'esame di modo che ogni eventuale mia incomprensione non sia d'intralcio.


fbotta ha allegato un file: foto-min.jpg (445689 bytes)
Clicca qui per guardare l'immagine

Ultima modifica effettuata da fbotta il 12/10/2017 alle 9:48
PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 11:24
Giovedì, 12/10/2017
Leggi cos'è una stringa. Una stringa è un array, o vettore che dir si voglia di caratteri terminante con il carattere ASCII 0. Viene manipolato tramite il puntatore al suo primo carattere e può essere dichiarato così char* stringa.

Ovviamente poi devi eseguire un malloc per allocare la sua memoria nello heap.
L'alternativa è dichiararlo così: char stringa[50] se vuoi che risieda nel stack.

Un vettore di stringe è un array di puntatori a puntatori, che a loro volta puntano ai primi caratteri della lista: char** stringhe.
Se il numero di stringe è fisso: char* stringhe[3].

Le funzioni che manipolano le stringhe si aspettano il carattere terminatore, quindi strcpy fa la copia di tutti i caratteri finché non trova il primo 0. Dovevi usare memcpy, che copia un numero fisso (stabilito da te) di bytes.

Ora puoi parzialmente sistemare il tuo programma.

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 12:18
Giovedì, 12/10/2017
Testo quotato

Postato originariamente da fbotta:

scusate probabilmente non avendo idea dell'entità dell'errore non posso essere utile neanche a dare indicazioni per la risoluzione dello stesso.
allego una foto del tema d'esame di modo che ogni eventuale mia incomprensione non sia d'intralcio.



Quindi saranno

        char codice[13];
        char data[11];

ma questo tipo di confusione non dovresti averla nello svolgere questi semplici esercizi.


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote