Oppure

Loading
10/10/17 13:40
fbotta
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:

#include <iostream>
#include <cstring>
using namespace std;

struct prodotto {
	char* codice[13];
	char* data[11];
	float prezzo;
	int pi;
	unsigned int tipologia;
};

struct lista{
	prodotto informazioni;
	lista* next;
};

int prendiprodottiinelenco(lista* L, char* codici[12], prodotto prods[], int size)
{
	int prodottitrovati=0, i=0;
	lista* testa;
	testa=L;
	
	for(i=0;codici[i]!=0;i++) //la condizione puo anche essere i=size, forse è piu giusto
	{
		for(;testa->next!=NULL;testa=testa->next)
		{
			if(strcmp(testa->informazioni->codice , codici[i])==0)
			{
			strcpy (prods[i],testa);
			prodottitrovati++;
			break;
			}
			
			if(strcmp(prods[i]->codice , testa.informazioni.codice)!=0)
			{
				prods[i]->codice = 0;
			}
		}
	testa=L;
	}
return prodottitrovati;
}

}



mi da svariati errori, tutti probabilmente simili.

ad esempio

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

strcpy (prods[i],testa);


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

oppure

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
aaa
10/10/17 16:48
Mikelius
Postato originariamente da fbotta:


#include <iostream>
#include <cstring>
using namespace std;

struct prodotto {
	char* codice[13];
	char* data[11];
	float prezzo;
	int pi;
	unsigned int tipologia;
};




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


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.


[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 10/10/17 16:51
aaa
11/10/17 12:48
fbotta
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 11/10/17 12:48
aaa
11/10/17 13:18
Roby94
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)?
aaa
11/10/17 15:12
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 ...
12/10/17 7:43
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.
Ultima modifica effettuata da fbotta 12/10/17 7:48
aaa
12/10/17 9:24
TheDarkJuster
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.
aaa
12/10/17 10:18
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.