Kuidas parandada Turbo C / Borland C tõrke “Ujukomavormingud pole lingitud”

Kas olete kunagi kohanud C- või C++-programmis viga “ujukomavormingud pole lingitud”? Allpool on toodud selle vea põhjus ja ka lahendus sellele. Pange tähele: kasutatud kompilaator on Turbo C/Borland C.

1
Programmi loetelu allpool.int main() {struct STUDENT{int rollno;char stdname[20];float protsenti;} *s1;printf(“Sisestage õpilase andmed: “);scanf(“%d %s %f” ,&s1->rollno,s1->stdname,&s1->protsent);printf(“nSisestatud üksikasjad on: “);printf(“Rull: %d, Nimi: %s, Protsent: %f “,s1- >rollno,s1->stdname,s1->protsent);getch();return 0;}Ülaltoodud C programm on kirjutatud ja kompileeritud Turbo C-s. Programmi käivitamisel kuvab kompilaator järgmise vea,Scanf: floating punktivormingud pole lingitud ja programm lõpetatakse ebanormaalselt. See juhtub muutuja *s1 tõttu, mis osutab struktuurile “STUDENT”, milles programmeerija oli defineerinud “ujuva” muutuja nimega “protsent”. See tähendab, et kui programm üritas struktuurikursori abil ujukandmetüübi väärtust lugeda, leiti viga. Programmi käivitamisel kuvas kompilaator real scanf käitusaegse vea (“%f”, … %s1->protsent). See võib juhtuda, kui kasutame Borland C/ C++ või TurboC/C ++. koostaja. “Ujukomavormingud pole lingitud” on Borlandi käitusaegne viga (Borland C või C++, Turbo C või C++). Borlandi kompilaatorid ei loo ujukoma (f-p) teegis linke, kui meil seda vaja pole. Seetõttu peame sunniviisiliselt lisama mis tahes ujukoma (f-p) funktsiooni, kui meil on “%f” või muud ujukoma (f-p) vormingud scanf() või printf() väljakutsetes.

2
Selle vea parandamiseks helistage ujukoma (f-p) funktsioonile või lisage lihtsalt faili link, mis sisaldab vähemalt ühte ujukoma (f-p) funktsiooni. Selleks võiks häkkinud lahendus olla defineerida dummy funktsioon kuskil lähtefailis, kuid ära kutsuda seda:void dummy(float *a) {float b=*a; //teostage ujuv accessdummy (&b); //ujukomafunktsiooni kutsumine}See ei pea olema põhiprogrammiga moodulis, kui see on moodulis, mis lisatakse lingile. Seetõttu tuleks ülaltoodud programm kirjutada järgmiselt:

3
Allpool on loetletud kaks programmi.void dummy(float *a) {float b=*a; //teostage ujuv accessdummy (&b); //ujukomafunktsiooni kutsumine}int main(){struct STUDENT{int rollno;char stdname[20];ujukomaprotsent;} *s1;printf(“Sisestage õpilase andmed: “);scanf(“%d %s %f”,&s1->rollno,s1->stdname,s1->protsent);printf(“nSisestatud üksikasjad on: “);printf(“Rull: %d, nimi: %s, protsent: %f ” ,s1->rollno,s1->stdname,s1->percentage)getch();return 0;}Ülaltoodud programmis on “dummy” kasutaja määratud funktsioon. Sellele funktsioonile võite anda suvalise nime “mannekeeni” asemel. Samamoodi on “a” ja “b” muutujate nimed, mida saate muuta. Selle põhjuseks on asjaolu, et Turbo ja Borland C/C++ kompilaatorid jätavad mõnikord ujukoma toe välja ja kasutavad ruumi säästmiseks printf ja scanf mitte-ujukoma versiooni väiksemad süsteemid. Ujukoma funktsiooni näivkutse sunnib kompilaatorit laadima ujukoma toe ja lahendama algse probleemi.

4
Puhtam võimalus on lubada ujukomateegi linkimine Turbo C/C++ või Borland C/C++ puhul teegi linkerivalikutest, et lisada ujukoma.