Eliminazione duplicati da un vettore ordinato

SalvatCpo
Logicamente mi sembra apposto, eppure il programma non mi stampa nulla…
Grazie in anticipo :)

#include <stdio.h>
#include <stdlib.h>
#define dim 10
//Scrivi un programma contenente una funzione che elimina i duplicati da un vettore ORDINATO.
void eliminaduplicati (int v[dim], int *k);
int main () {
	int a[dim];
	int i=0;
	printf ("Inserire un vettore ordinato:  \n");
	while (i<dim)
	{
		scanf ("%d", &a[i]);
		i++;
	}
	int n=0;
	eliminaduplicati (a, &n);
	i=0;
	printf ("Vettore senza duplicati: \n");
	while (i<n)
	{
		printf ("%d\n ", a[i]);
		i++;
	}
	system ("PAUSE");
	return 0;
}
void eliminaduplicati (int v[dim], int *k)
{
	int i=1;
	*k=1;
	while (i<dim)
	{
		if (v[i]!=v[i-1])
		{
			v[*k]=v[i];
			*k++;
		}
		i++;
	}
}

Risposte
Super Squirrel
Considera il seguente vettore

2 2 5 5 5 7 8 8 9 9

e prova a stampare il valore di n in seguito alla chiamata a funzione eliminaduplicati().
Il valore mostrato è quello che ti aspetteresti?

SalvatCpo
Non me lo stampa

Super Squirrel
Come non te lo stampa?!

Posta il codice che hai lanciato.

SalvatCpo
#include <stdio.h>
#include <stdlib.h>
#define dim 10
//Scrivi un programma contenente una funzione che elimina i duplicati da un vettore ORDINATO.
void eliminaduplicati (int v[dim], int *k);
int main () {
	int a[dim];
	int i=0;
	printf ("Inserire un vettore ordinato:  \n");
	while (i<dim)
	{
		scanf ("%d", &a[i]);
		i++;
	}
	int n=0;
	eliminaduplicati (a, &n);
	printf ("%d", n);
	i=0;
	printf ("Vettore senza duplicati: \n");
	while (i<n)
	{
		printf ("%d\n ", a[i]);
		i++;
	}
	system ("PAUSE");
	return 0;
}
void eliminaduplicati (int v[dim], int *k)
{
	int i=1;
	*k=1;
	while (i<dim)
	{
		if (v[i]!=v[i-1])
		{
			v[*k]=v[i];
			*k++;
		}
		i++;
	}
}


E' lo stesso di prima.



Questa invece è l'esecuzione. Mi fa inserire il vettore, ma poi termina senza far nulla.



Super Squirrel
Visto che a me non crashava volevo aiutarti ad individuare l'errore in modo autonomo.
In ogni caso il problema è nella riga di codice *k++. Dal momento che l'operatore di incremento/decremento suffisso ha la precedenza su quello di dereferenziazione, la suddetta riga coincide con *(k++), che ovviamente non è l'operazione voluta. La scrittura corretta quindi è la seguente (*k)++.

SalvatCpo
Okay, grazie.
Caspita, quanto contano i dettagli!!

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.