/ 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
Bech_bb 500
kyllekylle 500
jdjespers.. 500
gibson 300
scootergr.. 300
molokyle 287
10  strarup 270
Hvordan følgende muligt med pointers
Fra : Jesper Staun Hansen


Dato : 02-05-07 15:08

Vil gerne benytte pointers til at sætte filename og mode.
Men jeg ikke dette er muligt, da den giver fejl som følgende:
writedb.c: In function ‘writedb’:
writedb.c:14: warning: passing argument 1 of ‘fopen’ from incompatible
pointer type
writedb.c:14: warning: passing argument 2 of ‘fopen’ from incompatible
pointer type


--- kode ---

char questfile[120];
char questmode[4];

int function(void) {

char *filename;
filename = &questfile;
char *mode;
mode = &questmode;

fp = fopen(*filename, *mode)

}

 
 
Jakob Bøhm (02-05-2007)
Kommentar
Fra : Jakob Bøhm


Dato : 02-05-07 15:32

Jesper Staun Hansen wrote:
> Vil gerne benytte pointers til at sætte filename og mode.
> Men jeg ikke dette er muligt, da den giver fejl som følgende:
> writedb.c: In function ‘writedb’:
> writedb.c:14: warning: passing argument 1 of ‘fopen’ from incompatible
> pointer type
> writedb.c:14: warning: passing argument 2 of ‘fopen’ from incompatible
> pointer type
>
>
> --- kode ---
>
> char questfile[120];
> char questmode[4];
>
> int function(void) {
>
> char *filename;
> filename = &questfile;
> char *mode;
> mode = &questmode;
>
> fp = fopen(*filename, *mode)
>
> }

Du bruger for mange * og & operatorer.

I C er navnet på et array og en strengconstant begge equivalente til en
peger til første element/tegn.

Den bedste introduktion til C jeg har læst (og også den første) er
klassikeren over dem alle:

Brian Kernigan & Dennis Ritchie "The C Programming Language", 2. udgave

Det er en lille tynd bog, men den gennemgår hele sproget med tydelige
forklaringer og eksempler. Bagerst i bogen er der en meget præcis (men
dog uofficiel) definition af C sproget. De to forfattere opfandt selv
sproget C og skrev den første compiler. 1. udgave af bogen (nu
forældet) var faktisk selve definitionen af sproget C før 1989.

-- kode --

char questfile[120];
char questmode[4];

int function(void) {

char *filename;
filename = questfile;
char *mode;
mode = questmode;

fp = fopen(filename, mode);

}


--
Jakob Bøhm, M.Sc.Eng. * jb@danware.dk * direct tel:+45-45-90-25-33
Danware Data A/S * Bregnerodvej 127 * DK-3460 Birkerod * DENMARK
http://www.netop.com * tel:+45-45-90-25-25 * fax tel:+45-45-90-25-26
Information in this mail is hasty, not binding and may not be right

Jesper Staun Hansen (02-05-2007)
Kommentar
Fra : Jesper Staun Hansen


Dato : 02-05-07 15:41

Jakob Bøhm wrote:
> Jesper Staun Hansen wrote:
>> Vil gerne benytte pointers til at sætte filename og mode.
>> Men jeg ikke dette er muligt, da den giver fejl som følgende:
>> writedb.c: In function ‘writedb’:
>> writedb.c:14: warning: passing argument 1 of ‘fopen’ from incompatible
>> pointer type
>> writedb.c:14: warning: passing argument 2 of ‘fopen’ from incompatible
>> pointer type
>>
>>
>> --- kode ---
>>
>> char questfile[120];
>> char questmode[4];
>>
>> int function(void) {
>>
>> char *filename;
>> filename = &questfile;
>> char *mode;
>> mode = &questmode;
>>
>> fp = fopen(*filename, *mode)
>>
>> }
>
> Du bruger for mange * og & operatorer.
>
> I C er navnet på et array og en strengconstant begge equivalente til en
> peger til første element/tegn.
>
> Den bedste introduktion til C jeg har læst (og også den første) er
> klassikeren over dem alle:
>
> Brian Kernigan & Dennis Ritchie "The C Programming Language", 2. udgave
>
> Det er en lille tynd bog, men den gennemgår hele sproget med tydelige
> forklaringer og eksempler. Bagerst i bogen er der en meget præcis (men
> dog uofficiel) definition af C sproget. De to forfattere opfandt selv
> sproget C og skrev den første compiler. 1. udgave af bogen (nu
> forældet) var faktisk selve definitionen af sproget C før 1989.
>

Vil bestemt lede efter den

> -- kode --
>
> char questfile[120];
> char questmode[4];
>
> int function(void) {
>
> char *filename;
> filename = questfile;
> char *mode;
> mode = questmode;
>
> fp = fopen(filename, mode);
>
> }
>
>

Ah, mange tak for det. Rodder rundt i de pointers nogle gange og er
stadig ikke sikker på hvordan de bruges helt 100% hvorhenne endnu.

I den bog jeg sidder med lige nu, så giver de eksempler med
gets(variabel); men gcc-4.1 siger at denne farlig og bør ikke benyttes.
Er der nogle der ligner den? (således jeg ikke skal bruge nogle linjer
kode med på en while løkke der tjekker efter enter og fylder i en array)

Jakob Bøhm (02-05-2007)
Kommentar
Fra : Jakob Bøhm


Dato : 02-05-07 17:33

Jesper Staun Hansen wrote:
> Jakob Bøhm wrote:
>> Jesper Staun Hansen wrote:
>>> Vil gerne benytte pointers til at sætte filename og mode.
>>> Men jeg ikke dette er muligt, da den giver fejl som følgende:
>>> writedb.c: In function ‘writedb’:
>>> writedb.c:14: warning: passing argument 1 of ‘fopen’ from
>>> incompatible pointer type
>>> writedb.c:14: warning: passing argument 2 of ‘fopen’ from
>>> incompatible pointer type
>>>
>>>
>>> --- kode ---
>>>
>>> char questfile[120];
>>> char questmode[4];
>>>
>>> int function(void) {
>>>
>>> char *filename;
>>> filename = &questfile;
>>> char *mode;
>>> mode = &questmode;
>>>
>>> fp = fopen(*filename, *mode)
>>>
>>> }
>>
>> Du bruger for mange * og & operatorer.
>>
>> I C er navnet på et array og en strengconstant begge equivalente til
>> en peger til første element/tegn.
>>
>> Den bedste introduktion til C jeg har læst (og også den første) er
>> klassikeren over dem alle:
>>
>> Brian Kernigan & Dennis Ritchie "The C Programming Language", 2. udgave
>>
>> Det er en lille tynd bog, men den gennemgår hele sproget med tydelige
>> forklaringer og eksempler. Bagerst i bogen er der en meget præcis
>> (men dog uofficiel) definition af C sproget. De to forfattere opfandt
>> selv sproget C og skrev den første compiler. 1. udgave af bogen (nu
>> forældet) var faktisk selve definitionen af sproget C før 1989.
>>
>
> Vil bestemt lede efter den
>
>> -- kode --
>>
>> char questfile[120];
>> char questmode[4];
>>
>> int function(void) {
>>
>> char *filename;
>> filename = questfile;
>> char *mode;
>> mode = questmode;
>>
>> fp = fopen(filename, mode);
>>
>> }
>>
>>
>
> Ah, mange tak for det. Rodder rundt i de pointers nogle gange og er
> stadig ikke sikker på hvordan de bruges helt 100% hvorhenne endnu.
>
> I den bog jeg sidder med lige nu, så giver de eksempler med
> gets(variabel); men gcc-4.1 siger at denne farlig og bør ikke benyttes.
> Er der nogle der ligner den? (således jeg ikke skal bruge nogle linjer
> kode med på en while løkke der tjekker efter enter og fylder i en array)
fgets

--
Jakob Bøhm, M.Sc.Eng. * jb@danware.dk * direct tel:+45-45-90-25-33
Danware Data A/S * Bregnerodvej 127 * DK-3460 Birkerod * DENMARK
http://www.netop.com * tel:+45-45-90-25-25 * fax tel:+45-45-90-25-26
Information in this mail is hasty, not binding and may not be right

Jesper Staun Hansen (03-05-2007)
Kommentar
Fra : Jesper Staun Hansen


Dato : 03-05-07 08:43

Jakob Bøhm wrote:
> Jesper Staun Hansen wrote:
>> Jakob Bøhm wrote:
>>> Jesper Staun Hansen wrote:
>>>> Vil gerne benytte pointers til at sætte filename og mode.
>>>> Men jeg ikke dette er muligt, da den giver fejl som følgende:
>>>> writedb.c: In function ‘writedb’:
>>>> writedb.c:14: warning: passing argument 1 of ‘fopen’ from
>>>> incompatible pointer type
>>>> writedb.c:14: warning: passing argument 2 of ‘fopen’ from
>>>> incompatible pointer type
>>>>
>>>>
>>>> --- kode ---
>>>>
>>>> char questfile[120];
>>>> char questmode[4];
>>>>
>>>> int function(void) {
>>>>
>>>> char *filename;
>>>> filename = &questfile;
>>>> char *mode;
>>>> mode = &questmode;
>>>>
>>>> fp = fopen(*filename, *mode)
>>>>
>>>> }
>>>
>>> Du bruger for mange * og & operatorer.
>>>
>>> I C er navnet på et array og en strengconstant begge equivalente til
>>> en peger til første element/tegn.
>>>
>>> Den bedste introduktion til C jeg har læst (og også den første) er
>>> klassikeren over dem alle:
>>>
>>> Brian Kernigan & Dennis Ritchie "The C Programming Language", 2. udgave
>>>
>>> Det er en lille tynd bog, men den gennemgår hele sproget med tydelige
>>> forklaringer og eksempler. Bagerst i bogen er der en meget præcis
>>> (men dog uofficiel) definition af C sproget. De to forfattere
>>> opfandt selv sproget C og skrev den første compiler. 1. udgave af
>>> bogen (nu forældet) var faktisk selve definitionen af sproget C før
>>> 1989.
>>>
>>
>> Vil bestemt lede efter den
>>
>>> -- kode --
>>>
>>> char questfile[120];
>>> char questmode[4];
>>>
>>> int function(void) {
>>>
>>> char *filename;
>>> filename = questfile;
>>> char *mode;
>>> mode = questmode;
>>>
>>> fp = fopen(filename, mode);
>>>
>>> }
>>>
>>>
>>
>> Ah, mange tak for det. Rodder rundt i de pointers nogle gange og er
>> stadig ikke sikker på hvordan de bruges helt 100% hvorhenne endnu.
>>
>> I den bog jeg sidder med lige nu, så giver de eksempler med
>> gets(variabel); men gcc-4.1 siger at denne farlig og bør ikke benyttes.
>> Er der nogle der ligner den? (således jeg ikke skal bruge nogle linjer
>> kode med på en while løkke der tjekker efter enter og fylder i en array)
> fgets
>

hmmm... Der er noget jeg ikke har fået fat i vil jeg tro.

Har fikset følgende:


==================================
#include <stdio.h>
char questfile[120];
char questmode[4];

int writedb() {
   FILE *fp;
   char *filename;
   filename = questfile;linjer
   char *mode;
   mode = questmode;

   if((fp = fopen(filename, mode)) == NULL) {
      printf("File error. File %c may not exist in %c mode\n",
puts(questfile), puts(questmode));
   } else {
      printf("yay");
   }
}

#include <stdio.h>
#include "writedb.c"

int main(void) {
long offset = 1;
fgets(questfile, 120, stdin);
fgets(questmode, 4, stdin);
writedb();
return 0;
}
===================================

Det giver følgende output:
whopper
r
r
whopper
File error. File  may not exist in  mode

Jesper Staun Hansen (03-05-2007)
Kommentar
Fra : Jesper Staun Hansen


Dato : 03-05-07 08:51

Jesper Staun Hansen wrote:
> Jakob Bøhm wrote:
>> Jesper Staun Hansen wrote:
>>> Jakob Bøhm wrote:
>>>> Jesper Staun Hansen wrote:
>>>>> Vil gerne benytte pointers til at sætte filename og mode.
>>>>> Men jeg ikke dette er muligt, da den giver fejl som følgende:
>>>>> writedb.c: In function ‘writedb’:
>>>>> writedb.c:14: warning: passing argument 1 of ‘fopen’ from
>>>>> incompatible pointer type
>>>>> writedb.c:14: warning: passing argument 2 of ‘fopen’ from
>>>>> incompatible pointer type
>>>>>
>>>>>
>>>>> --- kode ---
>>>>>
>>>>> char questfile[120];
>>>>> char questmode[4];
>>>>>
>>>>> int function(void) {
>>>>>
>>>>> char *filename;
>>>>> filename = &questfile;
>>>>> char *mode;
>>>>> mode = &questmode;
>>>>>
>>>>> fp = fopen(*filename, *mode)
>>>>>
>>>>> }
>>>>
>>>> Du bruger for mange * og & operatorer.
>>>>
>>>> I C er navnet på et array og en strengconstant begge equivalente til
>>>> en peger til første element/tegn.
>>>>
>>>> Den bedste introduktion til C jeg har læst (og også den første) er
>>>> klassikeren over dem alle:
>>>>
>>>> Brian Kernigan & Dennis Ritchie "The C Programming Language", 2. udgave
>>>>
>>>> Det er en lille tynd bog, men den gennemgår hele sproget med
>>>> tydelige forklaringer og eksempler. Bagerst i bogen er der en meget
>>>> præcis (men dog uofficiel) definition af C sproget. De to
>>>> forfattere opfandt selv sproget C og skrev den første compiler. 1.
>>>> udgave af bogen (nu forældet) var faktisk selve definitionen af
>>>> sproget C før 1989.
>>>>
>>>
>>> Vil bestemt lede efter den
>>>
>>>> -- kode --
>>>>
>>>> char questfile[120];
>>>> char questmode[4];
>>>>
>>>> int function(void) {
>>>>
>>>> char *filename;
>>>> filename = questfile;
>>>> char *mode;
>>>> mode = questmode;
>>>>
>>>> fp = fopen(filename, mode);
>>>>
>>>> }
>>>>
>>>>
>>>
>>> Ah, mange tak for det. Rodder rundt i de pointers nogle gange og er
>>> stadig ikke sikker på hvordan de bruges helt 100% hvorhenne endnu.
>>>
>>> I den bog jeg sidder med lige nu, så giver de eksempler med
>>> gets(variabel); men gcc-4.1 siger at denne farlig og bør ikke benyttes.
>>> Er der nogle der ligner den? (således jeg ikke skal bruge nogle
>>> linjer kode med på en while løkke der tjekker efter enter og fylder i
>>> en array)
>> fgets
>>
>
> hmmm... Der er noget jeg ikke har fået fat i vil jeg tro.
>
> Har fikset følgende:
>
>
> ==================================
> #include <stdio.h>
> char questfile[120];
> char questmode[4];
>
> int writedb() {
> FILE *fp;
> char *filename;
> filename = questfile;linjer
> char *mode;
> mode = questmode;
>
> if((fp = fopen(filename, mode)) == NULL) {
> printf("File error. File %c may not exist in %c mode\n",
> puts(questfile), puts(questmode));
> } else {
> printf("yay");
> }
> }
>
> #include <stdio.h>
> #include "writedb.c"
>
> int main(void) {
> long offset = 1;
> fgets(questfile, 120, stdin);
> fgets(questmode, 4, stdin);
> writedb();
> return 0;
> }
> ===================================
>
> Det giver følgende output:
> whopper
> r
> r
> whopper
> File error. File  may not exist in  mode

Skulle måske sige at filen whopper findes og at hvis filen ikke findes,
så skulle den skrive : File error. File whopper may not exist in r mode

Jesper Staun Hansen (03-05-2007)
Kommentar
Fra : Jesper Staun Hansen


Dato : 03-05-07 09:09

Jesper Staun Hansen wrote:
> Jesper Staun Hansen wrote:
>> Jakob Bøhm wrote:
>>> Jesper Staun Hansen wrote:
>>>> Jakob Bøhm wrote:
>>>>> Jesper Staun Hansen wrote:
>>>>>> Vil gerne benytte pointers til at sætte filename og mode.
>>>>>> Men jeg ikke dette er muligt, da den giver fejl som følgende:
>>>>>> writedb.c: In function ‘writedb’:
>>>>>> writedb.c:14: warning: passing argument 1 of ‘fopen’ from
>>>>>> incompatible pointer type
>>>>>> writedb.c:14: warning: passing argument 2 of ‘fopen’ from
>>>>>> incompatible pointer type
>>>>>>
>>>>>>
>>>>>> --- kode ---
>>>>>>
>>>>>> char questfile[120];
>>>>>> char questmode[4];
>>>>>>
>>>>>> int function(void) {
>>>>>>
>>>>>> char *filename;
>>>>>> filename = &questfile;
>>>>>> char *mode;
>>>>>> mode = &questmode;
>>>>>>
>>>>>> fp = fopen(*filename, *mode)
>>>>>>
>>>>>> }
>>>>>
>>>>> Du bruger for mange * og & operatorer.
>>>>>
>>>>> I C er navnet på et array og en strengconstant begge equivalente
>>>>> til en peger til første element/tegn.
>>>>>
>>>>> Den bedste introduktion til C jeg har læst (og også den første) er
>>>>> klassikeren over dem alle:
>>>>>
>>>>> Brian Kernigan & Dennis Ritchie "The C Programming Language", 2.
>>>>> udgave
>>>>>
>>>>> Det er en lille tynd bog, men den gennemgår hele sproget med
>>>>> tydelige forklaringer og eksempler. Bagerst i bogen er der en
>>>>> meget præcis (men dog uofficiel) definition af C sproget. De to
>>>>> forfattere opfandt selv sproget C og skrev den første compiler. 1.
>>>>> udgave af bogen (nu forældet) var faktisk selve definitionen af
>>>>> sproget C før 1989.
>>>>>
>>>>
>>>> Vil bestemt lede efter den
>>>>
>>>>> -- kode --
>>>>>
>>>>> char questfile[120];
>>>>> char questmode[4];
>>>>>
>>>>> int function(void) {
>>>>>
>>>>> char *filename;
>>>>> filename = questfile;
>>>>> char *mode;
>>>>> mode = questmode;
>>>>>
>>>>> fp = fopen(filename, mode);
>>>>>
>>>>> }
>>>>>
>>>>>
>>>>
>>>> Ah, mange tak for det. Rodder rundt i de pointers nogle gange og er
>>>> stadig ikke sikker på hvordan de bruges helt 100% hvorhenne endnu.
>>>>
>>>> I den bog jeg sidder med lige nu, så giver de eksempler med
>>>> gets(variabel); men gcc-4.1 siger at denne farlig og bør ikke benyttes.
>>>> Er der nogle der ligner den? (således jeg ikke skal bruge nogle
>>>> linjer kode med på en while løkke der tjekker efter enter og fylder
>>>> i en array)
>>> fgets
>>>
>>
>> hmmm... Der er noget jeg ikke har fået fat i vil jeg tro.
>>
>> Har fikset følgende:
>>
>>
>> ==================================
>> #include <stdio.h>
>> char questfile[120];
>> char questmode[4];
>>
>> int writedb() {
>> FILE *fp;
>> char *filename;
>> filename = questfile;linjer
>> char *mode;
>> mode = questmode;
>>
>> if((fp = fopen(filename, mode)) == NULL) {
>> printf("File error. File %c may not exist in %c mode\n",
>> puts(questfile), puts(questmode));
>> } else {
>> printf("yay");
>> }
>> }
>>
>> #include <stdio.h>
>> #include "writedb.c"
>>
>> int main(void) {
>> long offset = 1;
>> fgets(questfile, 120, stdin);
>> fgets(questmode, 4, stdin);
>> writedb();
>> return 0;
>> }
>> ===================================
>>
>> Det giver følgende output:
>> whopper
>> r
>> r
>> whopper
>> File error. File  may not exist in  mode
>
> Skulle måske sige at filen whopper findes og at hvis filen ikke findes,
> så skulle den skrive : File error. File whopper may not exist in r mode

Fik løst problem, da fputs også indsætter et \n når jeg trykker enter
. Mærkelig opførelse

Jakob Bøhm (03-05-2007)
Kommentar
Fra : Jakob Bøhm


Dato : 03-05-07 09:52

Jesper Staun Hansen wrote:
> Jakob Bøhm wrote:
>> Jesper Staun Hansen wrote:
>>> Jakob Bøhm wrote:
>>>> Jesper Staun Hansen wrote:
>>>>> Vil gerne benytte pointers til at sætte filename og mode.
>>>>> Men jeg ikke dette er muligt, da den giver fejl som følgende:
>>>>> writedb.c: In function ‘writedb’:
>>>>> writedb.c:14: warning: passing argument 1 of ‘fopen’ from
>>>>> incompatible pointer type
>>>>> writedb.c:14: warning: passing argument 2 of ‘fopen’ from
>>>>> incompatible pointer type
>>>>>
>>>>>
>>>>> --- kode ---
>>>>>
>>>>> char questfile[120];
>>>>> char questmode[4];
>>>>>
>>>>> int function(void) {
>>>>>
>>>>> char *filename;
>>>>> filename = &questfile;
>>>>> char *mode;
>>>>> mode = &questmode;
>>>>>
>>>>> fp = fopen(*filename, *mode)
>>>>>
>>>>> }
>>>>
>>>> Du bruger for mange * og & operatorer.
>>>>
>>>> I C er navnet på et array og en strengconstant begge equivalente til
>>>> en peger til første element/tegn.
>>>>
>>>> Den bedste introduktion til C jeg har læst (og også den første) er
>>>> klassikeren over dem alle:
>>>>
>>>> Brian Kernigan & Dennis Ritchie "The C Programming Language", 2. udgave
>>>>
>>>> Det er en lille tynd bog, men den gennemgår hele sproget med
>>>> tydelige forklaringer og eksempler. Bagerst i bogen er der en meget
>>>> præcis (men dog uofficiel) definition af C sproget. De to
>>>> forfattere opfandt selv sproget C og skrev den første compiler. 1.
>>>> udgave af bogen (nu forældet) var faktisk selve definitionen af
>>>> sproget C før 1989.
>>>>
>>>
>>> Vil bestemt lede efter den
>>>
>>>> -- kode --
>>>>
>>>> char questfile[120];
>>>> char questmode[4];
>>>>
>>>> int function(void) {
>>>>
>>>> char *filename;
>>>> filename = questfile;
>>>> char *mode;
>>>> mode = questmode;
>>>>
>>>> fp = fopen(filename, mode);
>>>>
>>>> }
>>>>
>>>>
>>>
>>> Ah, mange tak for det. Rodder rundt i de pointers nogle gange og er
>>> stadig ikke sikker på hvordan de bruges helt 100% hvorhenne endnu.
>>>
>>> I den bog jeg sidder med lige nu, så giver de eksempler med
>>> gets(variabel); men gcc-4.1 siger at denne farlig og bør ikke benyttes.
>>> Er der nogle der ligner den? (således jeg ikke skal bruge nogle
>>> linjer kode med på en while løkke der tjekker efter enter og fylder i
>>> en array)
>> fgets
>>
>
> hmmm... Der er noget jeg ikke har fået fat i vil jeg tro.
>
> Har fikset følgende:
>
>
> ==================================
> #include <stdio.h>
> char questfile[120];
> char questmode[4];
>
> int writedb() {
> FILE *fp;
> char *filename;
> filename = questfile;linjer
> char *mode;
> mode = questmode;
>
> if((fp = fopen(filename, mode)) == NULL) {
> printf("File error. File %c may not exist in %c mode\n",
> puts(questfile), puts(questmode));
perror(questfile); /* Skriver f.eks. whopper: File not found\n */
fprintf(stderr, "File error in %s mode\n", questmode);
/* bemærk at man bruger %s og strengen som argument for at udskrive en
streng, ikke et kald til puts inde i printf-kaldet */
> } else {
> printf("yay");
> }
> }
>
> #include <stdio.h>
> #include "writedb.c"
>
/* fgets tager linieskiftet sidst på linien med i sit resultat, hvis der
var plads i bufferen. Denne funktion fjerner det igen */
void choplf(char *pBuf, size_t bufcnt)
{
if (pBuf && bufcnt) {
char *pEnd = memchr(buf, 0, bufcnt);
if (!pEnd)
pEnd = buf + bufcnt - 1; /* 0-terminering manglede! */
while (pEnd > pBuf && (pEnd[-1] == '\n' || pEnd[-1] == '\r'))
--pEnd;
*pEnd = 0; /* klip halen af og sørg for at strengen er
nultermineret */
}
}

> int main(void) {
> long offset = 1;
> fgets(questfile, 120, stdin);
/* sizeof/sizeof-formlen finder ud af at der står 120 i erklæringen af
questfile, så undgår du at skulle huske at rette tallet 3 steder */
fgets(questfile, sizeof(questfile)/sizeof(questfile[0]), stdin);
choplf(questfile, sizeof(questfile)/sizeof(questfile[0]));
> fgets(questmode, 4, stdin);
fgets(questmode, sizeof(questmode)/sizeof(questmode[0]), stdin);
choplf(questmode, sizeof(questmode)/sizeof(questmode[0]));
> writedb();
> return 0;
> }
> ===================================
>
> Det giver følgende output:
> whopper
> r
> r
> whopper
> File error. File  may not exist in  mode


--
Jakob Bøhm, M.Sc.Eng. * jb@danware.dk * direct tel:+45-45-90-25-33
Danware Data A/S * Bregnerodvej 127 * DK-3460 Birkerod * DENMARK
http://www.netop.com * tel:+45-45-90-25-25 * fax tel:+45-45-90-25-26
Information in this mail is hasty, not binding and may not be right

Ukendt (02-05-2007)
Kommentar
Fra : Ukendt


Dato : 02-05-07 19:09

>>
>> char *filename;
>>
>> fp = fopen(filename, mode);
>>
>
> Ah, mange tak for det. Rodder rundt i de pointers nogle gange og er stadig
> ikke sikker på hvordan de bruges helt 100% hvorhenne endnu.
>

Én måde at forstå hvorfor der ikke skal * foran variablen i dit eksempel
kunne være ved at tænke på typerne således:
Hvis vi skriver
char* theFileName;
og jeg så spørger, hvilken type er 'theFileName', så er svaret jo 'char
pointer'

Hvis vi så har prototypen på en funktion:
FILE * fopen ( char* filename) // har slettet noget ....
Så kan vi se at den tager en parameter, filename, som skal være af typen
'char pointer'.

Ahh, det vil sige at 'theFileName' allerede har den rigtige type.
Derfor skal du hverken bruge * eller & når du kalder funktionen
fopen(theFileName)


Om man skriver
char* theFileName;
eller
char *theFileName;
er religion, - folk har meget stærke meninger om det.

Fordelen ved det første er , in-my-very-very-humble-opinion, at det gør det
tydeligere at * betyder noget forskelligt i erklæringer end i resten af
koden.
I erklæringer, char* theFileName, betyder det som tidligere nævnt at typen
af theFileName ikke bliver char, men char-pointer. Altså , du har navnet
(theFileName), og alt det der står foran er typen.
Alle andre steder betyder * at du gerne vil de-referere pointeren. Dvs at
jeg vil ikke arbejde med pointeren, men med den værdi pointeren peger på.
Hvis pA er en pointer til en integer, så er typen af *pA bare int.

En af de oftest brugte argumenter imod denne måde at skrive char* er at det
kan virke forvirrende i tilfælde som dette:
int a,b,c,d // erklærer 4 integers
char* aa, bb, cc, dd // watch out !!, 1 char* og 3 chars !!

Af en eller anden grund er sprogdefinitionen sådan at * kun binder til den
første variabel, således at du på denne måde får én char-pointer , og 3
chars. Lige præcist i dette tilfælde må jeg jo indrømme er det tydeligere at
se hvad der sker hvis man sætter stjernen på denne måde:
char *aa, *bb, cc, dd // erklærer to char-pointers, og to chars

tpt




Søg
Reklame
Statistik
Spørgsmål : 177416
Tips : 31962
Nyheder : 719565
Indlæg : 6407857
Brugere : 218876

Månedens bedste
Årets bedste
Sidste års bedste