View Full Version : [C] Incompatible types in assignment...help!
alebertaz
03-07-2006, 14:46
Devo ordinare un vettore di stringhe in ordine crescente.
L'algoritmo è il selection sort ma ho alcuni errori con le funzioni delle stringhe (strlen e strcpy)...potete darmi una mano? Grazie!!! :)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void ordina (char (*v)[5], int dim) {
int i, i_min, j;
char *temp;
for (i=0; i<dim-1; i++) {
i_min=i;
for (j=i+1; j<dim; j++)
i=strlen(v[j]);
if ((strlen(v[j])<strlen(v[i_min])) //<-syntax error berfore i_min
i_min=j;
if (i!=i_min) {
temp=strcpy(temp,v[i_min]);
v[i_min]=strcpy(v[i_min], v[i]); //<- incompatible types in assignment
v[i]=strcpy(v[i], temp); //idem
}
}
}
int main() {}
trallallero
03-07-2006, 14:54
hai sbagliato la dichiarazione di v.
Hai fatto una specie di puntatore a funzione ma fatto male :)
devi togliere le ()
void ordina (char *v[5], int dim) {
ti manca anche una )
if ((strlen(v[j])<strlen(v[i_min]))) /*<-syntax error berfore i_min*/
ciao :)
alebertaz
03-07-2006, 14:56
hai sbagliato la dichiarazione di v.
Hai fatto una specie di puntatore a funzione ma fatto male :)
devi togliere le ()
void ordina (char *v[5], int dim) {
ti manca anche una )
if ((strlen(v[j])<strlen(v[i_min]))) /*<-syntax error berfore i_min*/
ciao :)
Grazie per la risposta ma il codice iniziale della funzione da completare è:
void ordina (char (*v)[STRLUNG], int dim)
:confused:
trallallero
03-07-2006, 15:19
Grazie per la risposta ma il codice iniziale della funzione da completare è:
void ordina (char (*v)[STRLUNG], int dim)
:confused:
??? se avessi internet aperto cercherei le dichiarazioni avanzate
dei puntatori (tipo a stringa a lunghezza fissa etc) perché
non mi ricordo il significato di char (*v)[5] ma
se non sbaglio é proprio puntatore a char array[5]
che c'azzecca poco con la tua funzione.
Mi spiace
alebertaz
03-07-2006, 15:23
??? se avessi internet aperto cercherei le dichiarazioni avanzate
dei puntatori (tipo a stringa a lunghezza fissa etc) perché
non mi ricordo il significato di char (*v)[5] ma
se non sbaglio é proprio puntatore a char array[5]
che c'azzecca poco con la tua funzione.
Mi spiace
grazie lo stesso per il tuo cortese aiuto
up
trallallero
03-07-2006, 15:23
infatti:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void ordina (char (*v)[5], int dim)
{
puts( (char *)v );
}
int main()
{
ordina ( (char (*)[5])"ciao", 1);
}
out: ciao
se vedi v é un semplice puntatore a stringa di 5 caratteri.
Tu invece lo tratti come se fosse una array di stringhe ;)
alebertaz
03-07-2006, 15:32
infatti:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void ordina (char (*v)[5], int dim)
{
puts( (char *)v );
}
int main()
{
ordina ( (char (*)[5])"ciao", 1);
}
out: ciao
se vedi v é un semplice puntatore a stringa di 5 caratteri.
Tu invece lo tratti come se fosse una array di stringhe ;)
Già ma questo è il testo dell'esercizio (ovviamente la mia funzione ordina non è ricorsiva...):
http://img134.imageshack.us/img134/4373/es3oz.jpg
trallallero
03-07-2006, 15:39
Già ma questo è il testo dell'esercizio (ovviamente la mia funzione ordina non è ricorsiva...):
http://img134.imageshack.us/img134/4373/es3oz.jpg
non posso andare sul sito (non vedo neanche l'img ... ho vista solo il link facendo "quote")
se puoi postare il testo :D
alebertaz
03-07-2006, 16:11
non posso andare sul sito (non vedo neanche l'img ... ho vista solo il link facendo "quote")
se puoi postare il testo :D
Esercizio 1. Scrivere una procedura (nel mi caso non ricorsiva) ordina che, dati un vettore di stringhe v e la sua dimensione, ordina il vettore in senso crescente rispetto alla lunghezza delle stringhe utilizzando il selection sort o l’insertion sort. Inoltre definire una funzione listaDispari che dato il vettore v ordinato in senso crescente restituisce una lista semplice ordinata in senso decrescente che contiene le stringhe del vettore v con lunghezza dispari.
I prototipi della procedura e della funzione sono:
void ordina(char (*v)[STRLUNG], int dim)
Lista str listaDispari(char (*v)[STRLUNG], int dim)
dove STRLUNG è una costante e dim è la dimensione del vettore di input.
Deve essere specificato quale algoritmo di ordinamento `e stato scelto e deve essere dichiarato il tipo utilizzato per definire le liste.
Esempio:
Sia v = <Quando,un,giorno,da,un,malchiuso,portone>
Allora l = [malchiuso,portone].
trallallero
03-07-2006, 16:20
Esercizio 1. Scrivere una procedura (nel mi caso non ricorsiva) ordina che, dati un vettore di stringhe v e la sua dimensione, ordina il vettore in senso crescente rispetto alla lunghezza delle stringhe utilizzando il selection sort o l'insertion sort. Inoltre definire una funzione listaDispari che dato il vettore v ordinato in senso crescente restituisce una lista semplice ordinata in senso decrescente che contiene le stringhe del vettore v con lunghezza dispari.
I prototipi della procedura e della funzione sono:
void ordina(char (*v)[STRLUNG], int dim)
Lista str listaDispari(char (*v)[STRLUNG], int dim)
dove STRLUNG è una costante e dim è la dimensione del vettore di input.
Deve essere specificato quale algoritmo di ordinamento `e stato scelto e deve essere dichiarato il tipo utilizzato per definire le liste.
Esempio:
Sia v = <Quando,un,giorno,da,un,malchiuso,portone>
Allora l = [malchiuso,portone].
insisto che
char (*v)[STRLUNG]
é la dichiarazione di un puntatore ad un array di char di lunghezza STRLUNG,
quindi non puó essere un vettore di stringhe.
Non l'ho mai usato e visto il suo utilizzo ma mi ricordo
che l'avevo visto su un manuale online dedicato
proprio alla dichiarazione di puntatori speciali in C.
Piú di questo non so che dire. Per me i prototipi sono sbagliati. Non ci vanno le () al puntatore "v".
Ma non mi prendo responsabilitá :D
alebertaz
03-07-2006, 16:43
insisto che
char (*v)[STRLUNG]
é la dichiarazione di un puntatore ad un array di char di lunghezza STRLUNG,
quindi non puó essere un vettore di stringhe.
Non l'ho mai usato e visto il suo utilizzo ma mi ricordo
che l'avevo visto su un manuale online dedicato
proprio alla dichiarazione di puntatori speciali in C.
Piú di questo non so che dire. Per me i prototipi sono sbagliati. Non ci vanno le () al puntatore "v".
Ma non mi prendo responsabilitá :D
bò :confused: :confused: ...grazie ancora :)
alebertaz
03-07-2006, 18:50
Ho risolto così, adesso funziona :) :
void ordina (char (*v)[6], int dim) {
int i, i_min, j;
char temp[6];
for (i=0; i<dim-1; i++) {
i_min=i;
for (j=i+1; j<dim; j++)
if ((strlen(v[j])<strlen(v[i_min])))
i_min=j;
if (i!=i_min) {
strcpy(temp, v[i_min]);
strcpy(v[i_min], v[i]);
strcpy(v[i], temp);
}
}
}
// procedura Lista_str listaDispari
int main() {
char x[][6]={{'C','i','a','o','\0'}, {'M','a','x','\0'}};
ordina(x,2);
printf("%s",x[0]); //stampa Max
printf("%s",x[1]); //stampa Ciao
}
alebertaz
03-07-2006, 19:21
Esercizio risolto :read:
Soluzione completa:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct elem_s {
char val[6];
struct elem_s * next;
} elem_str;
typedef elem_str * Lista_str;
void ordina (char (*v)[6], int dim) {
int i, i_min, j;
char temp[6]; //deve essere lunghezza 6 altrimenti la copia dà errore
for (i=0; i<dim-1; i++) {
i_min=i;
for (j=i+1; j<dim; j++)
if ((strlen(v[j])<strlen(v[i_min])))
i_min=j;
if (i!=i_min) {
strcpy(temp, v[i_min]);
strcpy(v[i_min], v[i]);
strcpy(v[i], temp);
}
}
}
Lista_str listaDispari (char (*v)[6], int dim) {
elem_str* x=(elem_str*)malloc(sizeof(elem_str));
Lista_str l=x;
int i=dim-1;
while (i>=0) {
if ((strlen(v[i]))%2 !=0) {
strcpy(x->val, v[i]);
x->next=(elem_str*)malloc(sizeof(elem_str));
x=x->next;
i--;
}
else i--;
}
return l;
}
int main() {
char x[][6]={{'C','i','a','o','\0'}, {'P','a','o','l','o'},{'M','a','x','\0'}};
Lista_str l=listaDispari(x,3);
ordina(x,3);
printf("%s",x[0]); //stampa Max
printf("%s",x[1]); //stampa Ciao
printf("%s",x[2]); //stampa Paolo
printf("%s",l->val); //stampa Max
printf("%s",l->next->val); //stampa Paolo
}
trallallero
04-07-2006, 10:19
e chi te lo ha fatto, se posso saperlo ? :D
passare da un'istruzione errata come
temp=strcpy(temp,v[i_min]);
ad una malloc perfetta nel giro di poche ore é un pó strano ... :read:
o no ?
vabbé, cmq spero tu abbia capito quello che hai fatto :)
alebertaz
04-07-2006, 10:24
e chi te lo ha fatto, se posso saperlo ? :D
passare da un'istruzione errata come
temp=strcpy(temp,v[i_min]);
ad una malloc perfetta nel giro di poche ore é un pó strano ... :read:
o no ?
vabbé, cmq spero tu abbia capito quello che hai fatto :)
no no l'ho fatto tutto io...e ci ho perso anche parecchio tempo ieri...
...adesso sono ingarbugliato in questo:
http://www.hwupgrade.it/forum/showthread.php?p=12982160#post12982160
:mc:
trallallero
04-07-2006, 10:32
no no l'ho fatto tutto io...e ci ho perso anche parecchio tempo ieri...
bene, meglio cosí :)
...adesso sono ingarbugliato in questo:
http://www.hwupgrade.it/forum/showthread.php?p=12982160#post12982160
:mc:
vedo che sono giá in tanti ad aiutarti ;)
alebertaz
04-07-2006, 10:36
bene, meglio cosí :)
vedo che sono giá in tanti ad aiutarti ;)
si però adesso è da parecchio che non risponde qualcuno... :( ...cmq fa niente...mi hai aiutato già ieri...:)
ciao!
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.