Oppure

Loading
26/02/11 11:06
dodo154
Salve a tutti,
pongo alla vostra attenzione un esercizio in C che non riesco ancora a risolvere.
Se gentilmente qualcuno riesce a darmi una mano.
Vi ringrazio anticipatamente.

1)supposta l'esistenza di un file binario "dates.dat" in cui nei primi 3 caratteri sono memorizzate le seguenti informazioni:

a)primo numero intero [0-255]
b)secondo numero intero [0-255]
c)un solo carattere!!!

e nei successivi byte gli elementi di una matrice numerica;

I. si acquisisca tale matrice numerica in una struttura dinamica appositamente allocata a run time;
II. si allochi, sempre dinamicamente, un vettore contenente soltanto i valori non nulli presenti in questa matrice e si stampi lo stesso vettore in un file di testo "vettore.txt" appositamente creato.

Nota bene: non è noto a priori nè il numero nè il tipo di elementi che costituiscono la matrice iniziale(e conseguentemente il vettore finale) e l'informazione relativa al tipo deve essere ricavata leggendo il carattere di cui alla lettera c) ovvero c: carattere senza segno; C: carattere con segno; I: intero; F: float; D: double.


se gentilmente qualcuno più esperto di me può darmi una mano, gli e ne sarò grato...
Ultima modifica effettuata da dodo154 26/02/11 11:08
aaa
27/02/11 17:41
dodo154
nessuno riesce.... a darmi una mano...?
aaa
28/02/11 20:28
pierotofy
Beh questa e' la traccia del problema, non credo troverai qualcuno che ti risolva tutto il problema, specifica quale parte del problema non riesci a risolvere e mostra il codice che hai eventualmente scritto fino ad ora.
Il mio blog: piero.dev
03/03/11 11:14
dodo154
ecco qualcosa....
#include<stdio.h>
#include<stdlib.h>





void caricamatrice(unsigned char* ch1, unsigned char* ch2, char* ch3 ,unsigned char*** matc, char*** matC, int*** matI, float*** matF, double*** matD, int* conta)
{
	int i, j, k;
	unsigned char c;
	char C;
	int I;
	float F;
	double D;
	

	FILE* fp;
	fp= fopen("dati.dat", "rb");
	fread(ch1, sizeof(char), 1, fp);
	fread(ch2, sizeof(char), 1, fp);
	fread(ch3, sizeof(char), 1, fp);

	switch(*ch3)
	{
	case 'c':
		*matc= malloc(sizeof(char*)*(*ch1));
		for(i=0; i<*ch1; i++)
			(*matc)[i]= malloc(sizeof(char)*(*ch2));
		printf("%d\t%d\n",*ch1,*ch2);
		for(i=0; i<*ch1; i++)
			for(j=0; j<*ch2; j++)
			{
				fread(&c, sizeof(char), 1, fp);
				(*matc)[i][j]= c;
			}

			fclose(fp);

			for(i=0; i<*ch1; i++)
				for(j=0; j<*ch2; j++)
				{
					if(matc[i][j] != 0)
						*conta++;
				}


				
			break;

	case 'C':
			break;
	case 'I':
			break;
	case 'F':
			break;
	case 'D':
			break;
	default:
		printf("Allocazione fallita a causa di una fallita lettura del terzo carattere");

	}

}

	
void alloca(unsigned char* ch1, unsigned char* ch2, char* ch3 ,unsigned char*** matc, char*** matC, int*** matI, float*** matF, double*** matD, int* conta)
{
	int i, j, k;
	unsigned char* bufc;
	char* bufC;
	int* bufI;
	float* bufF;
	double* bufD;
	FILE* fp;


	bufc= malloc(sizeof(unsigned char)*(*conta));

				k=0;

			for(i=0; i<*ch1; i++)
				for(j=0; j<*ch2; j++)
					{
						if((*matc)[i][j] != 0)
						{
							bufc[k]=matc[i][j];
							k++;
						}
					}
				
			fp=fopen("vettore.txt", "w");
			for(k=0; k<*conta; k++)
				fprintf(fp, "%c", bufc[k]);

			fclose(fp);
			free(bufc);

}

int main()
{
	unsigned char ch1;
	unsigned char ch2;
	char ch3;
	int conta=0;

	unsigned char** matc;
	char** matC;
	int** matI;
	float** matF;
	double** matD;

	caricamatrice(&ch1, &ch2,&ch3, &matc, &matC,&matI, &matF, &matD, &conta);
	alloca(&ch1, &ch2,&ch3, &matc, &matC,&matI, &matF, &matD, &conta);


	system("pause");
	return 0;
}

aaa
03/03/11 17:10
pierotofy
E cos'e' che non va?
Il mio blog: piero.dev
03/03/11 17:16
dodo154
Postato originariamente da pierotofy:

E cos'e' che non va?


nella compilazione... riporta questi errori...

esercizio ufficiale.c:67: error: macro "alloca" passed 9 arguments, but takes just 1
esercizio ufficiale.c:68: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token
esercizio ufficiale.c: In function ‘main’:
esercizio ufficiale.c:115: error: macro "alloca" passed 9 arguments, but takes just 1
aaa
04/03/11 0:18
pierotofy
Alloca è una funzione riservata, non puoi ridefinirla.

Rinonima la tua funzione con un altro nome. Ad esempio "alloca_spazio".
Il mio blog: piero.dev
04/03/11 8:14
dodo154
Postato originariamente da pierotofy:

Alloca è una funzione riservata, non puoi ridefinirla.

Rinonima la tua funzione con un altro nome. Ad esempio "alloca_spazio".


Ho fatto come m'hai detto tu, ora mi da un errore di cast che non riesco ad individuare... :d...

#include<stdio.h>
#include<stdlib.h>





void caricamatrice(unsigned char* ch1, unsigned char* ch2, char* ch3 ,unsigned char*** matc, char*** matC, int*** matI, float*** matF, double*** matD, int* conta)
{
	int i, j, k;
	unsigned char c;
	char C;
	int I;
	float F;
	double D;
	

	FILE* fp;
	fp= fopen("dati.dat", "rb");
	fread(ch1, sizeof(char), 1, fp);
	fread(ch2, sizeof(char), 1, fp);
	fread(ch3, sizeof(char), 1, fp);

	switch(*ch3)
	{
	case 'c':
		*matc= malloc(sizeof(char*)*(*ch1));
		for(i=0; i<*ch1; i++)
			(*matc)[i]= malloc(sizeof(char)*(*ch2));
		printf("%d\t%d\n",*ch1,*ch2);
		for(i=0; i<*ch1; i++)
			for(j=0; j<*ch2; j++)
			{
				fread(&c, sizeof(char), 1, fp);
				(*matc)[i][j]= c;
			}

			fclose(fp);

			for(i=0; i<*ch1; i++)
				for(j=0; j<*ch2; j++)
				{
					if(matc[i][j] != 0)
						*conta++;
				}


				
			break;

	case 'C':
			break;
	case 'I':
			break;
	case 'F':
			break;
	case 'D':
			break;
	default:
		printf("Allocazione fallita a causa di una fallita lettura del terzo carattere");

	}

}

	
void alloca_spazio(unsigned char* ch1, unsigned char* ch2, char* ch3 ,unsigned char*** matc, char*** matC, int*** matI, float*** matF, double*** matD, int* conta)
{
	int i, j, k;
	unsigned char* bufc;
	char* bufC;
	int* bufI;
	float* bufF;
	double* bufD;
	FILE* fp;


	bufc= malloc(sizeof(unsigned char)*(*conta));

				k=0;

			for(i=0; i<*ch1; i++)
				for(j=0; j<*ch2; j++)
					{
						if((*matc)[i][j] != 0)
						{
							bufc[k]=matc[i][j];
							k++;
						}
					}
				
			fp=fopen("vettore.txt", "w");
			for(k=0; k<*conta; k++)
				fprintf(fp, "%c", bufc[k]);

			fclose(fp);
			free(bufc);

}

int main()
{
	unsigned char ch1;
	unsigned char ch2;
	char ch3;
	int conta=0;

	unsigned char** matc;
	char** matC;
	int** matI;
	float** matF;
	double** matD;

	caricamatrice(&ch1, &ch2,&ch3, &matc, &matC,&matI, &matF, &matD, &conta);
	alloca_spazio(&ch1, &ch2,&ch3, &matc, &matC,&matI, &matF, &matD, &conta);


	system("pause");
	return 0;


esercizio ufficiale.c: In function ‘alloca_spazio’:
esercizio ufficiale.c:87: warning: assignment makes integer from pointer without a cast

aaa