Newsgroup: it.comp.lang.c
Titolo: _access

Ciao a tutti ho realizzato un programma che dopo varie elaborazioni mi
ritorna una lista di nomi file che poi devo visualizzare la lista
viene creata nel seguente modo:
void createlistimg(double rank, char *name, selectedimg **validImageP)
{
	selectedimg *prec = NULL, *temp = *validImageP, *newimg;
	newimg = (selectedimg *)malloc(sizeof(selectedimg ));
	newimg->filename = (char *)malloc((strlen(name) + 1 ) *
sizeof(char));
	newimg->filename[0] = '\0';
	strcpy(newimg->filename, name);
	newimg->rank = rank;
	while (temp != NULL && temp->rank > rank){
		prec = temp;
		temp = temp->next;
	}
	if (prec != NULL){
		prec->next = newimg;
		newimg->next = temp;
		newimg->prec = prec;
		if( temp != NULL)
  		    temp->prec = newimg;
	}else {
          newimg->prec = NULL;
		  newimg->next = *validImageP;
		  *validImageP = newimg;
	}
}
quando poi faccio
if(_access(validImagP->filename, 0) != 0)
entra nell'if anche se quel nome file esiste ed il path è corretto
dov'è che sbaglio?
Grazie a tutti

dov'� che sbaglio?
Verifica le operazioni sui puntatori precedenti, � possibile che tu
stia sovrascrivendo porzioni di memoria critiche. A me successe una
cosa analoga con fopen().

 cosa analoga con fopen().
scusa come faccio con la malloc a sovrascrivere porzioni di memoria
precedentemente allocate?


Ps se stampo il valore della variabile validImagP->filename è corretto
pero non mi accede al file anche con openCV non funziona

precedentemente allocate?
Non ho detto con la malloc() ma con l'utilizzo dei puntatori che
compi. Quando si ha a che fare con i puntatori, non bisogna *MAI*
escludere che certe aree di memoria possano essere sovrascritte per
errore. Purtroppo il debug in questi casi � mostruosamente complicato.
La mia comunque � solo un'ipotesi, il problema potrebbe annidarsi da
altre parti.

pero non mi accede al file anche con openCV non funziona
Non conosco n� _access() n� openCV() (non sono standard ISO) per� ti
invito a controllarne la semantica. Se stai elaborando correttamente i
loro risultati e se i loro parametri di ingresso sono corretti, allora
il bug si insinua, probabilmente, tra le operazioni sui puntatori.
Prova a fare un debug stupido: loggare (per es. stampare a video)
tutte le operazioni che fai e controllare che siano corrette.

il problema è ancora piu a monte mi spiego io ho fatto una funzione
che mi carica da un file alcuni dati necessari all'elaborazione tale
file contiene il nome dell'immagine e successivamente altri dati, la
funzione che consente di leggerli è la seguente (allego solo la parte
che mi interessa farvi vedere)
while(pos < s.st_size){
        inddir = 0;
        indseg = 0;
		char *nameimg = (char *)malloc(max_name);
		i = 0;
		//legge il nome del file
		while(filecontent[pos] != '\n'){
	  	   nameimg[i] = filecontent[pos];
	 	   pos++;
		   i++;
		}
		nameimg[i] = '\0';
		pos++;
		printf("la lunghezza di %s è = %d\n", nameimg, strlen(nameimg));
		imageptr->nameimage = (char *)malloc((strlen(nameimg)) *
sizeof(char));
		if(imageptr->nameimage == NULL) printf("E' NULL\n");
		else printf("TUTTO OK \n");
		imageptr->img = NULL;
		if(strcpy(imageptr->nameimage, nameimg) == NULL ) printf("cpy E'
NULL");
	    else printf("e' OK\n");
}
ora se a questo punto provo a fare l' _access (sia con nameimg che con
imageptr->nameimage) gia mi dice che non è possibile accedere idem con
il cvLoadImage di openCv quindi il problema è a monte la porzione di
codice con cui ho iniziato il post si trova alla fine
dell'elaborazione mentre questo è il primo passo.. sapreste aiutarmi?

ho risolto nel seguente modo anziche fare
while(filecontent[pos] != '\n')
il confronto diventa
while((int)filecontent != 13)
sembra funzionare ora cio che non mi spiego perche nel primo caso non
funziona?

gabriele ha scritto:

Perche' '\n'  e' il Line feed (LF== 0x0A o 10) mentre tu stai cercando 
uno '\r' che
e' un Carriage return (CR== 0x0D o 13). Evidentemente il tuo sistema usa il
CR come terminatore di linea nel file invece che l' LF.
B.

quando lo scrivo il file termino la linea con '\n' quando poi lo leggo
nella sequenza dei caratteri trovo 13 e poi 10 perche?

 
Perche' quando apri un file di testo in scrittura ("w") e ci scrivi 
sopra '\n', in realt� viene scritta la saquenza di fine linea:
Windows/DOS -> \r\n
Unix -> \n
Mac  -> \r (credo che da OS X in poi sia diventato \n, ma non sono sicuro).
Apri il file in binario ("wb") se vuoi evitare questa conversione.
Remo.D

   
Perche' stai, credo, lavorando su un sistema Windows ed hai aperto il 
file in
modo testo, questo comporta l' uso di un filtro che converte gli LF in 
CR ;-)
B.

effettivamente lavoro su windows ed apro il file in scrittura con "a+"
quindi posso aprire in binario "ab+" e risolvere il problema? devo
cambiare qualcosa nel codice ovvero  nella lettura/scrittura che ora
avviene tramite fprintf(f, "a b c \n"); ??
grazie a tutti siete stati grandi :=)



Sotto Windows, se non usi il flag "b", si assume che tu stia trattando
il file come testo, quindi le sequenze di new-line in uscita vengono
convertita nella sequenza di a capo del sistema; in entrata accade il
viceversa. E' ovvio che se gestisci un file in scrittura come file di
testo, non puoi aspettarti di applicare gli stessi meccanismi se lo
gestisci in lettura come file binario. E viceversa.

 		imageptr->nameimage = (char *)malloc((strlen(nameimg)) * sizeof(char));
Ti segnalo un bug nel codice:
Stai allocando strlen(nomeimg) mentre dovresti allocare
strlen(nomeimg)+1 per considerare anche il '\0' finale.
e due osservazioni, gia' che ci siamo :)
- sizeof(char) e' sempre 1 per definizione quindi non serve
moltiplicare
- malloc restituisce un (void *) quindi non serve il cast
Riassumendo, io scriverei:
imageptr->nameimage = malloc( strlen(nameimg) +1 );
ciao
Giacomo