/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
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

Mogens Hansen skrev:

>Virker det hvis du fjerne det "&" du havde for meget ?

Nej.

Bertel
--
http://lundhansen.dk/bertel/
FIDUSO: http://fiduso.dk/

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 Mortensen skrev:

>Hvad er formålet med at åbne filen og lukke den igen?

Jeg postede kun det nødvendigste.

Bertel
--
http://lundhansen.dk/bertel/
FIDUSO: http://fiduso.dk/

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



Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408847
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste