|
| getftime() og setftime i GCC Fra : Bertel Lund Hansen |
Dato : 09-01-01 10:06 |
|
Hej alle
Hvordan bruger jeg disse funktioner? Her er et program jeg har forsøgt med,
men det crasher computeren. Problemet ligger nok i getftimes første
parameter. Jeg aner ikke hvad det er for et handle, hjælpen omtaler.
Den del der har at gøre med at finde filnavnene og skrive dem ud, virker
fint.
char path[]="";
struct ffblk *fb;
struct ftime *tp;
FILE *indfil;
int main () {
char kode, code;
fb=malloc(sizeof(struct ffblk));
tp=malloc(sizeof(struct ftime));
kode=findfirst(strcat(path,"*.htm"),fb,0x3F);
while (!kode) {
indfil=fopen(fb->ff_name,"r");
code=getftime(fb->lfn_handle,&tp); // ballade!
fclose(indfil);
printf("%-30.30s %i/%i\n",fb->ff_name,fb->ft_month,fb->ft_day);
kode=findnext(fb);
}
return 0;
}
Bertel
--
http://lundhansen.dk/bertel/
FIDUSO: http://fiduso.dk/
| |
Mogens Hansen (09-01-2001)
| Kommentar Fra : Mogens Hansen |
Dato : 09-01-01 11:46 |
|
nospamto@lundhansen.dk (Bertel Lund Hansen) wrote in
<8fkl5tstvnpn79s4fc165eou7beq1ucuta@news.tele.dk>:
>Hej alle
>
>Hvordan bruger jeg disse funktioner? Her er et program jeg har forsøgt
>med, men det crasher computeren. Problemet ligger nok i getftimes første
>parameter. Jeg aner ikke hvad det er for et handle, hjælpen omtaler.
>
>Den del der har at gøre med at finde filnavnene og skrive dem ud, virker
>fint.
>
>char path[]="";
Hvor stor er din"path" buffer ? (Svar: 1 tegn !!!)
>
>struct ffblk *fb;
>struct ftime *tp;
>
>FILE *indfil;
>
>int main () {
> char kode, code;
>
> fb=malloc(sizeof(struct ffblk));
> tp=malloc(sizeof(struct ftime));
Hvorfor allokerer du dine strukturer på heapen, i stedet for på stakken ?
>
> kode=findfirst(strcat(path,"*.htm"),fb,0x3F);
Hvor mange tegn kopier du ind i "path" med "strcat" ? (Svar: 6 tegn !!! altså
mere end du har til rådighed. Hvad sker der ? Det er "undefined behavior")
> while (!kode) {
> indfil=fopen(fb->ff_name,"r");
> code=getftime(fb->lfn_handle,&tp); // ballade!
Hvilken type er "&tp" ? (Svar: pointer til en pointer til en "ftime")
Hvilken type forventer "getftime" ? (Svar: på den implementering jeg anvender
(det er ikke GCC) forventer den en pointer til en "ftime" - det kan naturligvis
være anderledes på din implementering)
> fclose(indfil);
> printf("%-30.30s %i/%i\n",fb->ff_name,fb->ft_month,fb->ft_day);
> kode=findnext(fb);
> }
> return 0;
Hvad med noget i retningen af:
int main () {
char kode, code;
struct ffblk fb;
struct ftime tp;
FILE *indfil;
char path[] = "*.htm";
kode=findfirst(path,fb,0x3F);
while (!kode) {
indfil=fopen(fb.ff_name,"r");
code=getftime(fb.lfn_handle,&tp);
fclose(indfil);
printf("%-30.30s %i/%i\n",fb.ff_name,fb.ft_month,fb.ft_day);
kode=findnext(&fb);
}
return 0;
}
Jeg har ikke compileret eller testet det - det er princippet der er vigtigt.
Det vil iøvrigt køre hurtigere. når "fb" og "tb" ikke bliver allokeret på
heapen, hvis det er en bare nogenlunde rimelig compiler.
Venlig hilsen
Mogens Hansen
| |
Bertel Lund Hansen (09-01-2001)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 09-01-01 22:35 |
|
Mogens Hansen skrev:
>Hvorfor allokerer du dine strukturer på heapen, i stedet for på stakken ?
Fordi jeg ikke anede hvor den blev allokeret, jeg ved ikke
hvordan jeg får den andre steder hen, og jeg ved ikke hvilken
fordel der evt. kunne være forbundet dermed.
>Hvor mange tegn kopier du ind i "path" med "strcat" ? (Svar: 6 tegn !!! altså
>mere end du har til rådighed. Hvad sker der ? Det er "undefined behavior")
Ja, det er en fejl, men det er (sandsynligvis) ikke den der er
problemet. Hvis jeg slukker for balladelinjen, virker programmet
uden problemer.
>Hvilken type er "&tp" ? (Svar: pointer til en pointer til en "ftime")
Det er en svipser som ikke var i den kompilerede kode. Jeg
prøvede to måder og fik dem blandet i mit spørgsmål.
Bertel
--
http://lundhansen.dk/bertel/
FIDUSO: http://fiduso.dk/
| |
Mogens Hansen (10-01-2001)
| Kommentar Fra : Mogens Hansen |
Dato : 10-01-01 06:34 |
|
"Bertel Lund Hansen" <nospamto@lundhansen.dk> wrote in message
news:mo0n5t4d2d04fdrlpp328ivhh9gg1i51ho@news.tele.dk...
> Mogens Hansen skrev:
>
> >Hvorfor allokerer du dine strukturer på heapen, i stedet for på stakken ?
>
> Fordi jeg ikke anede hvor den blev allokeret, jeg ved ikke
> hvordan jeg får den andre steder hen, og jeg ved ikke hvilken
> fordel der evt. kunne være forbundet dermed.
Det _skal_ du nødvendigvis have styr på - eller bliver du forvirret.
Du skal finde en bog der forklarer dig det.
>
> >Hvor mange tegn kopier du ind i "path" med "strcat" ? (Svar: 6 tegn !!!
altså
> >mere end du har til rådighed. Hvad sker der ? Det er "undefined
behavior")
>
> Ja, det er en fejl, men det er (sandsynligvis) ikke den der er
> problemet. Hvis jeg slukker for balladelinjen, virker programmet
> uden problemer.
Forkert - det virker ikke uden problemer. Det at du ikke umiddelbart ser
problemer, betyder _ikke_ at det er uden problemer!
Hvis du kopierer 6 karakterer ind i en buffer der er een karakter (f.eks.
med "strcat") har du "undefined behavior". Dette inkluderer alt fra
system-crash til at du ikke kan konstatere nogen fejl i eksekvering på
nuværende tidspunkt (en invitation til fest: brug koden i et stor program,
lad det køre længe hos mange brugere på lidt forskellige operativ-systemer).
Endnu en gang vil jeg anbefale at bruge værktøjer som Rational Purify
(sammen med Microsoft Visual C++) eller CodeGuard sammen med Borland
C++Builder Professional og Enterprise. De vil sikkert finde disse fejl. Jeg
er godt klar over du bruger GCC - men alligevel.
>
> >Hvilken type er "&tp" ? (Svar: pointer til en pointer til en "ftime")
>
> Det er en svipser som ikke var i den kompilerede kode. Jeg
> prøvede to måder og fik dem blandet i mit spørgsmål.
Virker det hvis du fjerne det "&" du havde for meget ?
Venlig hilsen
Mogens Hansen
| |
Bertel Lund Hansen (10-01-2001)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 10-01-01 10:27 |
| | |
Bertel Lund Hansen (09-01-2001)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 09-01-01 23:29 |
|
Mogens Hansen skrev:
>Hvor stor er din"path" buffer ? (Svar: 1 tegn !!!)
Når jeg retter fejl og indsætter 3 (taget ud af den blå luft)
således:
code=getftime(3,&tp);
så crasher computeren ikke, men jeg får bare systemtiden ud af
det.
Hvor skal jeg få det der handle fra?
Bertel
--
http://lundhansen.dk/bertel/
FIDUSO: http://fiduso.dk/
| |
Mogens Hansen (10-01-2001)
| Kommentar Fra : Mogens Hansen |
Dato : 10-01-01 06:34 |
|
"Bertel Lund Hansen" <nospamto@lundhansen.dk> wrote in message
news:b24n5t423dkblqlpfebp2uftpjto2l0s02@news.tele.dk...
> Mogens Hansen skrev:
> Når jeg retter fejl og indsætter 3 (taget ud af den blå luft)
> således:
> code=getftime(3,&tp);
> så crasher computeren ikke, men jeg får bare systemtiden ud af
> det.
Det kan nemt være fordi "3" er et gyldigt handle.
F.eks. kan man nemt oplevet at programmet:
#include <stdio.h>
void main( void )
{
printf( "The file handle for stdin is %d\n", _fileno( stdin ) );
printf( "The file handle for stdout is %d\n", _fileno( stdout ) );
printf( "The file handle for stderr is %d\n", _fileno( stderr ) );
}
giver resultatet:
The file handle for stdin is 0
The file handle for stdout is 1
The file handle for stderr is 2
>
> Hvor skal jeg få det der handle fra?
På den implementering jeg bruger:
Fra resultatet af "fopen" sendt gennem "fileno".
#include <stdio.h>
#include <io.h>
int main(void)
{
FILE *stream;
ftime ft;
if ((stream = fopen("filename.txt",
"wt")) == NULL)
{
fprintf(stderr, "Cannot open output file.\n");
return 1;
}
getftime(fileno(stream), &ft);
printf("File time: %u:%u:%u\n",
ft.ft_hour, ft.ft_min,
ft.ft_tsec * 2);
printf("File date: %u/%u/%u\n",
ft.ft_month, ft.ft_day,
ft.ft_year+1980);
fclose(stream);
return 0;
}
Jeg har ikke compileret og kørt ovenstående program.
Venlig hilsen
Mogens Hansen
| |
Christian Worm Morte~ (15-01-2001)
| Kommentar Fra : Christian Worm Morte~ |
Dato : 15-01-01 20:15 |
|
Hej,
> while (!kode) {
> indfil=fopen(fb->ff_name,"r");
> code=getftime(fb->lfn_handle,&tp); // ballade!
> fclose(indfil);
Hvad er formålet med at åbne filen og lukke den igen?
Venlig Hilsen
Christian Worm
| |
Bertel Lund Hansen (15-01-2001)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 15-01-01 22:12 |
| | |
Christian Worm Morte~ (15-01-2001)
| Kommentar Fra : Christian Worm Morte~ |
Dato : 15-01-01 22:20 |
|
Hej,
> >Hvad er formålet med at åbne filen og lukke den igen?
>
> Jeg postede kun det nødvendigste.
Ok, spørger anderledes så: Hvilken oplysning er det du forsøger at få
getftime til at give dig? getftime tager formodentlig et filhåntag (file
handle) til en åben fil som parameter og returnerer tidspunktet for denne
fil. Men du giver den formodentlig fil håndtaget til den katalog-læse
operation du har startet som parameter.
Venlig Hilsen
Christian Worm
| |
Bertel Lund Hansen (15-01-2001)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 15-01-01 23:17 |
|
Christian Worm Mortensen skrev:
>Ok, spørger anderledes så: Hvilken oplysning er det du forsøger at få
>getftime til at give dig?
Det var et testprogram. Jeg skulle finde ud af getftime. Den skal
jeg bruge i et program der læser en fil og skriver den om uden at
datoen ændres derved. Men jeg har fået den nødvendige hjælp.
Bertel
--
http://lundhansen.dk/bertel/
FIDUSO: http://fiduso.dk/
| |
Christian Worm Morte~ (15-01-2001)
| Kommentar Fra : Christian Worm Morte~ |
Dato : 15-01-01 23:20 |
|
Hej,
> Men jeg har fået den nødvendige hjælp.
Ok, fint, mit umiddelbart indtryk var at problemet var uafklaret.
Venlig Hilsen
Christian Worm
| |
|
|