Inhoud
Andere sectiesBen je ooit de "drijvende-komma-indelingen niet gelinkt" fout in een C- of C ++ -programma? Hieronder wordt de reden voor deze fout gegeven en ook de oplossing ervoor. Let op: de gebruikte compiler is Turbo C / Borland C.
Stappen
Analyseer de volgende programmalijst en na het succesvol bouwen van het programma, verschijnt de bovengenoemde runtime-fout.
Programma een
- Programma met een hieronder.
- int main () {
struct STUDENT {
int rollno;
char stdname;
zwevende percentage;
} * s1;
printf (" Voer studentgegevens in:");
scanf ("% d% s% f",
& s1-> rollno,
s1-> stdname,
& s1-> percentage);
printf (" nDe ingevoerde gegevens zijn:");
printf ("Rol:% d, naam:% s, percentage:% f",
s1-> rollno,
s1-> stdname,
s1-> percentage);
getch ();
retourneer 0;
} - Het bovenstaande C-programma is geschreven en gecompileerd in Turbo C. Wanneer dit programma wordt uitgevoerd, geeft de compiler de volgende fout weer:
Scanf: drijvende-komma-formaten niet gekoppeld en het programma wordt abnormaal beëindigd. - Dit gebeurt vanwege de variabele * s1, die een verwijzing is naar de structuur "STUDENT", waarin de programmeur een "float" -variabele met de naam "percentage" had gedefinieerd. Het betekent dat er een fout is gevonden toen het programma probeerde een waarde voor het gegevenstype zwevend te lezen met behulp van een aanwijzer om te structureren. Wanneer het programma wordt uitgevoerd, toont de compiler een runtime-fout bij de regel scanf ("% f", ...% s1-> percentage).
- Het kan gebeuren als we Borland C / C ++ of TurboC / C ++ als compiler gebruiken. "Drijvende-komma-indelingen niet gelinkt" is een Borland-runtime-fout (Borland C of C ++, Turbo C of C ++). De compilers van Borland linken niet in de drijvende-kommabibliotheek (f-p) tenzij we die nodig hebben. Daarom moeten we met geweld een drijvende-kommafunctie (f-p) toevoegen als we "% f" of andere drijvende-komma-indelingen (f-p) hebben in de aanroepen van scanf () of printf ().
- int main () {
-
Om deze fout op te lossen, roept u een drijvende-kommafunctie (f-p) aan of voegt u gewoon een link toe van een bestand dat ten minste één drijvende-kommafunctie (f-p) bevat. Om dit te doen, zou een hackachtige oplossing kunnen zijn om een dummy-functie ergens in een bronbestand te definiëren, maar deze niet te noemen:- leegte dummy (float * a) {
zweven b = * a; // voer een zwevende toegang uit
dummy (& b); // een drijvende-kommafunctie aanroepen
} - Het hoeft niet in een module met het hoofdprogramma te staan, zolang het maar in een module zit die in de link wordt opgenomen. Daarom moet het bovenstaande programma als volgt worden geschreven:
- leegte dummy (float * a) {
Programmalijst twee
-
Programma met twee hieronder.- leegte dummy (float * a) {
zweven b = * a; // voer een zwevende toegang uit
dummy (& b); // een drijvende-kommafunctie aanroepen
}
int main () {
struct STUDENT {
int rollno;
char stdname;
zwevende percentage;
} * s1;
printf (" Voer studentgegevens in:");
scanf ("% d% s% f",
& s1-> rollno,
s1-> stdname,
s1-> percentage);
printf (" nDe ingevoerde gegevens zijn:");
printf ("Rol:% d, naam:% s, percentage:% f",
s1-> rollno,
s1-> stdname,
s1-> percentage)
getch ();
retourneer 0;
} - In het bovenstaande programma is "dummy" een door de gebruiker gedefinieerde functie. U kunt deze functie een willekeurige naam geven in plaats van "dummy". Evenzo zijn "a" en "b" variabelenamen, die u kunt wijzigen.
- Dit komt doordat Turbo en Borland C / C ++ compilers soms ondersteuning voor drijvende komma weglaten en een niet-drijvende komma versie van printf en scanf gebruiken om ruimte te besparen op kleinere systemen. De dummy-aanroep naar een drijvende-kommafunctie dwingt de compiler om de drijvende-kommadrager te laden en het oorspronkelijke probleem op te lossen.
- leegte dummy (float * a) {
-
Een schonere optie is om het linken van drijvende-kommabibliotheken in Turbo C / C ++ of Borland C / C ++ in te schakelen vanuit linkeropties voor bibliotheek om drijvende-komma op te nemen.