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++ - esercizio in C
Forum - C/C++ - esercizio in C

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
dodo154 (Normal User)
Newbie


Messaggi: 14
Iscritto: 07/02/2011

Segnala al moderatore
Postato alle 12:06
Sabato, 26/02/2011
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 il 26/02/2011 alle 12:08
PM Quote
Avatar
dodo154 (Normal User)
Newbie


Messaggi: 14
Iscritto: 07/02/2011

Segnala al moderatore
Postato alle 18:41
Domenica, 27/02/2011
nessuno riesce.... a darmi una mano...?

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 21:28
Lunedì, 28/02/2011
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: https://piero.dev
PM Quote
Avatar
dodo154 (Normal User)
Newbie


Messaggi: 14
Iscritto: 07/02/2011

Segnala al moderatore
Postato alle 12:14
Giovedì, 03/03/2011
ecco qualcosa....
Codice sorgente - presumibilmente C

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3.  
  4.  
  5.  
  6.  
  7.  
  8. void caricamatrice(unsigned char* ch1, unsigned char* ch2, char* ch3 ,unsigned char*** matc, char*** matC, int*** matI, float*** matF, double*** matD, int* conta)
  9. {
  10.         int i, j, k;
  11.         unsigned char c;
  12.         char C;
  13.         int I;
  14.         float F;
  15.         double D;
  16.        
  17.  
  18.         FILE* fp;
  19.         fp= fopen("dati.dat", "rb");
  20.         fread(ch1, sizeof(char), 1, fp);
  21.         fread(ch2, sizeof(char), 1, fp);
  22.         fread(ch3, sizeof(char), 1, fp);
  23.  
  24.         switch(*ch3)
  25.         {
  26.         case 'c':
  27.                 *matc= malloc(sizeof(char*)*(*ch1));
  28.                 for(i=0; i<*ch1; i++)
  29.                         (*matc)[i]= malloc(sizeof(char)*(*ch2));
  30.                 printf("%d\t%d\n",*ch1,*ch2);
  31.                 for(i=0; i<*ch1; i++)
  32.                         for(j=0; j<*ch2; j++)
  33.                         {
  34.                                 fread(&c, sizeof(char), 1, fp);
  35.                                 (*matc)[i][j]= c;
  36.                         }
  37.  
  38.                         fclose(fp);
  39.  
  40.                         for(i=0; i<*ch1; i++)
  41.                                 for(j=0; j<*ch2; j++)
  42.                                 {
  43.                                         if(matc[i][j] != 0)
  44.                                                 *conta++;
  45.                                 }
  46.  
  47.  
  48.                                
  49.                         break;
  50.  
  51.         case 'C':
  52.                         break;
  53.         case 'I':
  54.                         break;
  55.         case 'F':
  56.                         break;
  57.         case 'D':
  58.                         break;
  59.         default:
  60.                 printf("Allocazione fallita a causa di una fallita lettura del terzo carattere");
  61.  
  62.         }
  63.  
  64. }
  65.  
  66.        
  67. void alloca(unsigned char* ch1, unsigned char* ch2, char* ch3 ,unsigned char*** matc, char*** matC, int*** matI, float*** matF, double*** matD, int* conta)
  68. {
  69.         int i, j, k;
  70.         unsigned char* bufc;
  71.         char* bufC;
  72.         int* bufI;
  73.         float* bufF;
  74.         double* bufD;
  75.         FILE* fp;
  76.  
  77.  
  78.         bufc= malloc(sizeof(unsigned char)*(*conta));
  79.  
  80.                                 k=0;
  81.  
  82.                         for(i=0; i<*ch1; i++)
  83.                                 for(j=0; j<*ch2; j++)
  84.                                         {
  85.                                                 if((*matc)[i][j] != 0)
  86.                                                 {
  87.                                                         bufc[k]=matc[i][j];
  88.                                                         k++;
  89.                                                 }
  90.                                         }
  91.                                
  92.                         fp=fopen("vettore.txt", "w");
  93.                         for(k=0; k<*conta; k++)
  94.                                 fprintf(fp, "%c", bufc[k]);
  95.  
  96.                         fclose(fp);
  97.                         free(bufc);
  98.  
  99. }
  100.  
  101. int main()
  102. {
  103.         unsigned char ch1;
  104.         unsigned char ch2;
  105.         char ch3;
  106.         int conta=0;
  107.  
  108.         unsigned char** matc;
  109.         char** matC;
  110.         int** matI;
  111.         float** matF;
  112.         double** matD;
  113.  
  114.         caricamatrice(&ch1, &ch2,&ch3, &matc, &matC,&matI, &matF, &matD, &conta);
  115.         alloca(&ch1, &ch2,&ch3, &matc, &matC,&matI, &matF, &matD, &conta);
  116.  
  117.  
  118.         system("pause");
  119.         return 0;
  120. }



PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 18:10
Giovedì, 03/03/2011
E cos'e' che non va?


Il mio blog: https://piero.dev
PM Quote
Avatar
dodo154 (Normal User)
Newbie


Messaggi: 14
Iscritto: 07/02/2011

Segnala al moderatore
Postato alle 18:16
Giovedì, 03/03/2011
Testo quotato

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

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 1:18
Venerdì, 04/03/2011
Alloca è una funzione riservata, non puoi ridefinirla.

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


Il mio blog: https://piero.dev
PM Quote
Avatar
dodo154 (Normal User)
Newbie


Messaggi: 14
Iscritto: 07/02/2011

Segnala al moderatore
Postato alle 9:14
Venerdì, 04/03/2011
Testo quotato

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...

Codice sorgente - presumibilmente C

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3.  
  4.  
  5.  
  6.  
  7.  
  8. void caricamatrice(unsigned char* ch1, unsigned char* ch2, char* ch3 ,unsigned char*** matc, char*** matC, int*** matI, float*** matF, double*** matD, int* conta)
  9. {
  10.         int i, j, k;
  11.         unsigned char c;
  12.         char C;
  13.         int I;
  14.         float F;
  15.         double D;
  16.        
  17.  
  18.         FILE* fp;
  19.         fp= fopen("dati.dat", "rb");
  20.         fread(ch1, sizeof(char), 1, fp);
  21.         fread(ch2, sizeof(char), 1, fp);
  22.         fread(ch3, sizeof(char), 1, fp);
  23.  
  24.         switch(*ch3)
  25.         {
  26.         case 'c':
  27.                 *matc= malloc(sizeof(char*)*(*ch1));
  28.                 for(i=0; i<*ch1; i++)
  29.                         (*matc)[i]= malloc(sizeof(char)*(*ch2));
  30.                 printf("%d\t%d\n",*ch1,*ch2);
  31.                 for(i=0; i<*ch1; i++)
  32.                         for(j=0; j<*ch2; j++)
  33.                         {
  34.                                 fread(&c, sizeof(char), 1, fp);
  35.                                 (*matc)[i][j]= c;
  36.                         }
  37.  
  38.                         fclose(fp);
  39.  
  40.                         for(i=0; i<*ch1; i++)
  41.                                 for(j=0; j<*ch2; j++)
  42.                                 {
  43.                                         if(matc[i][j] != 0)
  44.                                                 *conta++;
  45.                                 }
  46.  
  47.  
  48.                                
  49.                         break;
  50.  
  51.         case 'C':
  52.                         break;
  53.         case 'I':
  54.                         break;
  55.         case 'F':
  56.                         break;
  57.         case 'D':
  58.                         break;
  59.         default:
  60.                 printf("Allocazione fallita a causa di una fallita lettura del terzo carattere");
  61.  
  62.         }
  63.  
  64. }
  65.  
  66.        
  67. void alloca_spazio(unsigned char* ch1, unsigned char* ch2, char* ch3 ,unsigned char*** matc, char*** matC, int*** matI, float*** matF, double*** matD, int* conta)
  68. {
  69.         int i, j, k;
  70.         unsigned char* bufc;
  71.         char* bufC;
  72.         int* bufI;
  73.         float* bufF;
  74.         double* bufD;
  75.         FILE* fp;
  76.  
  77.  
  78.         bufc= malloc(sizeof(unsigned char)*(*conta));
  79.  
  80.                                 k=0;
  81.  
  82.                         for(i=0; i<*ch1; i++)
  83.                                 for(j=0; j<*ch2; j++)
  84.                                         {
  85.                                                 if((*matc)[i][j] != 0)
  86.                                                 {
  87.                                                         bufc[k]=matc[i][j];
  88.                                                         k++;
  89.                                                 }
  90.                                         }
  91.                                
  92.                         fp=fopen("vettore.txt", "w");
  93.                         for(k=0; k<*conta; k++)
  94.                                 fprintf(fp, "%c", bufc[k]);
  95.  
  96.                         fclose(fp);
  97.                         free(bufc);
  98.  
  99. }
  100.  
  101. int main()
  102. {
  103.         unsigned char ch1;
  104.         unsigned char ch2;
  105.         char ch3;
  106.         int conta=0;
  107.  
  108.         unsigned char** matc;
  109.         char** matC;
  110.         int** matI;
  111.         float** matF;
  112.         double** matD;
  113.  
  114.         caricamatrice(&ch1, &ch2,&ch3, &matc, &matC,&matI, &matF, &matD, &conta);
  115.         alloca_spazio(&ch1, &ch2,&ch3, &matc, &matC,&matI, &matF, &matD, &conta);
  116.  
  117.  
  118.         system("pause");
  119.         return 0;



Codice sorgente - presumibilmente C/C++

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


PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 16:24
Venerdì, 04/03/2011
Ad occhio, alla riga 87:

Codice sorgente - presumibilmente Plain Text

  1. bufc[k]=matc[i][j];



E' sbagliato; controlla l'aritmetica dei puntatori. Dovrebbe essere:

Codice sorgente - presumibilmente Plain Text

  1. bufc[k]=(*matc)[i][j];



Altre cose che dovresti migliorare nel tuo codice:
1. Evita nomi come x1, matc, k. Non sono descrittivi. Usa nomi come matriceChar, numElementi, etc.
2. Una funzione non dovrebbe mai avere piu' di 7 parametri, perche' sono difficili da comprendere e ricordare.
3. Quando fai confronti come:

Codice sorgente - presumibilmente Plain Text

  1. if((*matc)[i][j] != 0)



Devi prima assicurarti che quello spazio di memoria sia inizializzato! Chiamare malloc non lo fara' per te, e stai giocando con il fuoco se per concidenza il sistema operativo ti alloca un area di memoria dove tutto e' zero. Usa la funzione memset o bzero per inizializzare un area di memoria a zero prima di utilizzarla.


Il mio blog: https://piero.dev
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo