Newsgroup: it.comp.lang.c++
Titolo: Problema di puntatori, sintassi o cosa?

Salve a tutti,
dunque stavo cercando di fare un piccolo programma C che mi leggesse i tag 
ID3v1 del file passato come argomento.
Ora, il programma mi lancia degli errori all'esecuzione dicendo che la 
memoria nn può essere "read", anche se funziona se evito di usare le 
funzioni, oppure ne chiamo una o due al massimo. Non riesco a capire il 
problema...
Sono ben accette le critiche e i suggerimenti riguardo il codice.
Ecco il codice:
code:------------------------------------------------------------------------------
#include <stdio>
#include <iostream>
using namespace std;
/*
byte 3 - 32: track name
byte 33 - 62: artist name
byte 63 - 92: album name
byte 93 - 96: year
byte 97 - 126: comment
byte 127: genre */
char * readTrack(FILE * f){
   char * ret;
   cout << fseek(f, -125, SEEK_END);
   fgets(ret,30,f);
   return ret;
}
char * readArtist(FILE * f){
   char * ret;
   cout << fseek(f, -95, SEEK_END);
   fgets(ret,30,f);
   return ret;
}
char * readAlbum(FILE *f){
   char * ret;
   cout << fseek(f, -65, SEEK_END);
   fgets(ret,30,f);
   return ret;
}
char * readYear(FILE * f){
   char *ret;
   cout << fseek(f, -35, SEEK_END);
   fgets(ret, 4, f);
   return ret;
}
char * readComment(FILE * f){
   char * ret;
   cout << fseek(f, -31, SEEK_END);
   fgets(ret, 30, f);
   return ret;
}
char readGenre(FILE * f){
   char ret;
   cout << fseek(f, -1, SEEK_END);
   ret = fgetc(f);
   return ret;
}
int main(int numArgs, char * *args){
   FILE * file;
   char *data;
   file = fopen(args[1], "r+");
   if(!file){
      perror("Impossibile aprire file");
      return(0);
   }
   cout << "Nome traccia:-";
   cout << readTrack(file);
   cout<<"\nArtista:-";
   cout <<  readArtist(file);
   cout << "\nAlbum:-";
   cout <<  readAlbum(file);
   cout <<"\nAnno:-";
   cout << readYear(file);
   cout << "\nCommento:-";
   cout << readComment(file);
   cout <<"\nGenere:-";
   cout << readGenre(file);
   fclose(file);
   cout<< endl;
   system("pause");
}
------------------------------------------------------------------------------
Ringrazio anticipatamente. 


E' un problema di puntatori perche' le funzioni : readTrack, readArtist, 
readAlbum, readYear, readComment usi dei puntatori a char (la variabile 
"ret") senza allocare lo spazio necessario in piu' la variabile "data" 
nella funzione main non viene mai usata (quest'ultimo non e' un vero e 
proprio errore).
Ti consiglierei di compilare il tuo codice attivando tutti i warnings 
possibili (se usi gcc devi compilare con -Wall) e di passarlo a qualche 
  programma tipo lint (ne trovi sicuramente una versione freeware o gnu 
se cerchi su google).
Dopo che hai corretto il problema dell'allocazione devi ricordarti di 
liberare la memoria che occupi con le new facendo le delete opportune.
ciao,
Nids
p.s.: ti consiglio di non usare FILE ma di usare gli streams del C++
p.p.s.: <stdio> non esiste nello standard C++ esistono <cstdio> oppure 
<stdio.h>
p.p.p.s: cout<<fseek(...) ti stampa 0 se la seek e' andata bene per il 
resto e' inutile.

 #include <stdio>
in C++ e' #include<cstdio> in C e' <stdio.h>
Dopo di che, se il resto del codice (la parte di lettura tag) e' corretta,
allora dovrebbe funzionare.
Un paio di note riassuntive affinche' tu possa imparare:
se una funzione C si aspetta un puntatore a char, leggi la documentazione
della funzione per vedere se veramente vuole "char *p" oppure se si aspetta
un puntatore a memoria allocata "char *p = malloc(n);" oppure "char
p[128];".
Quando ritorni un puntatore assicurati che la zona di memoria a cui punta
non venga cancellata. Nel caso di "char p[128]" essa viene cancellata, se
usi malloc no, ma poi devi ricordarti di fare la free, se usi static invece
non viene cancellata e non serve la free, ma tale variabile esistera' per
tutta la durata del programma.
HTH,
Tommy

 resto e' inutile.
Hai ragione l'avevo messa come "debug" per vedere cosa stampava....ho 
dimenticato di toglierla prima di inviare il messaggio 

Veramente molto esaustivo grazie per tutti i chiarimenti e per le 
delucidazioni...