Gegevenstype ongeldig. Kijk wat "Void" is in andere woordenboeken. C-functieaanwijzers doorgeven

Volgens mij is dit heel erg geweldig onderwerp voor beschrijving. Vroeger was het interessant om voor meer zaken een soort server op je computer op te zetten handige uitwisseling bestanden. Nadat ik verschillende en zelfs het protocol had geprobeerd, realiseerde ik me dat ik ze helemaal niet leuk vind, de eerste zien er, op zijn zachtst gezegd, slecht uit in de browser, de tweede, hoewel ze hun duidelijke voordelen hebben, maar verbinding maken netwerk schijf Ik wil het niet op de computers van anderen. Maar op een (mooie en zonnige) dag kwam ik een programma tegen genaamd HTTP Bestandsserver(kortweg HFS), installeerde het, configureerde het (sinds ik met de schoonste versie begon te werken, waren er wat problemen mee) en werd ik bijna verliefd op dit programma. Om toegang te krijgen tot mijn bestanden is het nu voldoende om elke browser te hebben, aangezien alle toegang plaatsvindt via een gewone webpagina. Ik heb ook een map gemaakt waarin de persoon kent het wachtwoord, kan een bestand rechtstreeks via de browser toevoegen. Bestanden van de server kunnen één voor één of in mappen tegelijk worden gedownload. Het programma zelf plaatst de map in een .tar-archief zonder compressie en verzendt deze om te downloaden. Tegelijkertijd ziet de site er vrij netjes uit, al kun je als je dat wenst (en voldoende kennis hebt) zelf een sitesjabloon schrijven. Herken wat het is geweldige manier voor gemakkelijke en handige bestandsoverdracht?

En hier is een voorbeeld van de pagina die je in het browservenster zult zien, zoals je kunt zien is alles mooi en netjes, je kunt veel mooie sjablonen vinden op het programmaforum:

Hoewel haar menu volledig aan staat Engels, voor mij is dit geen belemmering. En voor degenen die het Engels niet goed kennen, zal ik aan het einde van het artikel proberen zo volledig mogelijk uit te leggen waar alle secties van het menu voor verantwoordelijk zijn en hoe ze te gebruiken.

Dus laten we verder gaan met de installatie en HTTP-configuratie Bestandsserver:

1) Om u wat tijd te besparen, heb ik een HFS-assembly met een Russisch-talige websitesjabloon voorbereid en geproduceerd initiële installatie het programma zelf. Je kunt de assembly downloaden van mijn Yandex.Disk via de link. Als u zeker bent van uw capaciteiten, kunt u downloaden schone versie programma op de officiële website http://www.rejetto.com/hfs/

Dat is alles. Ik hoop dat je dit artikel nuttig vond. Klik op een van de onderstaande knoppen om je vrienden erover te vertellen. Abonneer u ook op site-updates door uw e-mailadres in het veld aan de rechterkant in te voeren.

Bedankt voor uw aandacht :)

Tags: Functies in C, prototype, beschrijving, definitie, oproep. Formele parameters en feitelijke parameters. Functieargumenten, passeren op waarde, passeren op aanwijzer. Retourwaarde.

Invoering

Hoe meer we C bestuderen, hoe groter de programma's worden. Wij verzamelen alle acties in één belangrijkste functie en we kopiëren dezelfde acties verschillende keren, waardoor tientallen variabelen met unieke namen ontstaan. Onze programma's zwellen aan en worden steeds minder begrijpelijk, de branches worden langer en vertakt.

Maar er is een uitweg uit deze situatie! Nu zullen we leren hoe we functies in C kunnen maken. Functies zullen ten eerste helpen dubbele code in afzonderlijke subprogramma's te scheiden, ten tweede zullen ze helpen het programma logisch in delen op te splitsen, en ten derde zullen functies in C veel kenmerken hebben die ermee verbonden zijn die het gebruik van nieuwe benaderingen voor het structureren van applicaties mogelijk maken.

Een functie is een benoemd onderdeel van een programma dat herhaaldelijk kan worden aangeroepen vanuit een ander deel van het programma (waarin de functie zichtbaar is). De functie kan een vaste of variabel getal argumenten, of kan geen argumenten hebben. Een functie kan een waarde retourneren of leeg (ongeldig) zijn en niets retourneren.

We zijn al bekend met veel functies en weten hoe we ze moeten aanroepen - dit zijn functies van de bibliotheken stdio, stdlib, string, conio, enz. Bovendien is main ook een functie. Het verschilt alleen van de andere doordat het het startpunt is bij het starten van de applicatie.
De C-functie is gedefinieerd in mondiale context. Functiesyntaxis: (, ...) ( )

Het eenvoudigste voorbeeld is een functie waaraan een getal moet doorgegeven worden soort vlotter en geeft het kwadraat van dit getal terug

#erbij betrekken #erbij betrekken float sqr(float x) ( float tmp = x*x; return tmp; ) void main() ( printf("%.3f", sqr(9.3f)); getch(); )

Binnen de sqr-functie hebben we een lokale variabele gemaakt waaraan de waarde van het argument is toegewezen. Het getal 9.3 werd als argument aan de functie doorgegeven. Het servicewoord return retourneert de waarde van de tmp-variabele. U kunt de functie als volgt herschrijven:

Zweven sqr(zweven x) ( return x*x; )

IN in dit geval De vermenigvuldiging wordt eerst uitgevoerd en vervolgens wordt de waarde geretourneerd. Als de functie niets retourneert, is het retourtype ongeldig. Een functie die bijvoorbeeld het kwadraat van een getal afdrukt:

Ongeldig printSqr(float x) ( printf("%d", x*x); return; )

in dit geval betekent return het verlaten van de functie. Als de functie niets retourneert, hoeft return niet te worden geschreven. Vervolgens voltooit de functie zijn voltooiing en keert de besturing terug naar de aanroepende functie.

Ongeldig printSqr(float x) ( printf("%d", x*x); )

Als de functie geen argumenten heeft, blijven de haakjes leeg. Je kunt ook het woord leegte schrijven:

Ongeldig printHelloWorld() ( printf("Hallo Wereld"); )

equivalent

Ongeldig printHelloWorld(void) ( printf("Hallo wereld"); )

Formele en feitelijke parameters

Bij het declareren van een functie worden formele parameters opgegeven, die vervolgens binnen de functie zelf worden gebruikt. Wanneer we een functie aanroepen, gebruiken we de feitelijke parameters. De werkelijke parameters kunnen elke variabele zijn geschikt type of constanten.

Laten we bijvoorbeeld zeggen dat er een functie is die het kwadraat van een getal retourneert en een functie die twee getallen optelt.

#erbij betrekken #erbij betrekken //De formele parameters hebben de namen a en b //door ze te gebruiken hebben we toegang tot de doorgegeven argumenten binnen de functie int sum(int a, int b) ( return a+b; ) float square(float x) ( return x*x; ) void main() ( // Werkelijke parameters kunnen elke naam hebben, inclusief geen naam int one = 1; float two = 2.0; // Pass variabelen, de tweede variabele wordt gecast het juiste type printf("%d\n", som(één, twee));

//Geef numerieke constanten door printf("%d\n", sum(10, 20)); //We geven numerieke constanten van het verkeerde type door, ze worden automatisch geconverteerd naar de gewenste printf("%d\n", sum(10, 20.f));//Een variabele van het type integer wordt geconverteerd naar een drijvende-kommatype printf("%.3f\n", square(one));
//Het argument kan ook een functieaanroep zijn die de gewenste waarde retourneert printf("%.3f\n", square(sum(2 + 4, 3)));

#erbij betrekken #erbij betrekken haal(); )

Houd er rekening mee dat typecasting impliciet en alleen indien mogelijk plaatsvindt. Als een functie een getal als argument ontvangt, kunt u dit niet doorgeven

variabele tekenreeks

#erbij betrekken #erbij betrekken void change(int a) ( a = 100; printf("%d\n", a); ) void main() ( int d = 200; printf("%d\n", d); change(d) ;printf("%d", d);

De programma's worden weergegeven
200
100
200
Het is duidelijk waarom. Binnen de functie werken we met de variabele x, die een kopie is van de variabele d. We veranderen de lokale kopie, maar de variabele d zelf verandert niet. Nadat de functie is afgesloten, wordt de lokale variabele vernietigd. De variabele d zal op geen enkele manier veranderen.
Hoe kun je dan de variabele veranderen? Om dit te doen, moet u het adres van deze variabele doorgeven. Laten we de functie herschrijven zodat deze een pointer accepteert typ int

#erbij betrekken #erbij betrekken void change(int *a) ( *a = 100; printf("%d\n", *a); ) void main() ( int d = 200; printf("%d\n", d); change (&d); printf("%d", d);

Nu wordt het programma uitgevoerd
200
100
100
Hier werd ook een lokale variabele aangemaakt, maar omdat het adres was doorgegeven, hebben we de waarde van de variabele d gewijzigd met behulp van zijn adres in RAM.

Bij het programmeren wordt de eerste methode voor het doorgeven van parameters passeren op waarde genoemd, de tweede - passeren op aanwijzer. Onthoud een eenvoudige regel: als u een variabele wilt wijzigen, moet u een verwijzing naar die variabele doorgeven aan de functie. Als u een aanwijzer wilt wijzigen, moet u daarom een ​​aanwijzer doorgeven aan een aanwijzer, enz. Laten we bijvoorbeeld een functie schrijven die de grootte heeft van een array van het type int en deze maken. Op het eerste gezicht zou de functie er ongeveer zo uit moeten zien:

#erbij betrekken #erbij betrekken #erbij betrekken void init(int *a, niet-ondertekende grootte) ( a = (int*) malloc(size * sizeof(int)); ) void main() ( int *a = NULL; init(a, 100); if (a = = NULL) ( printf("ERROR"); ) else ( printf("Oké..."); free(a); ) getch();

Maar deze functie geeft ERROR weer. We hebben het adres van de variabele doorgegeven. Binnen de init-functie is een lokale variabele gemaakt die het adres van de array opslaat. Nadat de functie was verlaten, werd deze lokale variabele vernietigd. Naast wat we niet konden bereiken gewenst resultaat, ontdekten we een geheugenlek: geheugen werd toegewezen aan de heap, maar er is niet langer een variabele die het adres van dit gebied zou opslaan.

Om een ​​object te wijzigen, moet u er een pointer naar doorgeven, in dit geval een pointer naar een pointer.

#erbij betrekken #erbij betrekken #erbij betrekken void init(int **a, niet-ondertekende grootte) ( *a = (int*) malloc(size * sizeof(int)); ) void main() ( int *a = NULL; init(&a, 100); if ( a == NULL) ( printf("ERROR"); ) else ( printf("Oké..."); free(a); ) getch();

Nu werkt alles zoals het hoort.
Nog een soortgelijk voorbeeld. Laten we een functie schrijven die een string als argument neemt en een verwijzing retourneert naar het geheugengebied waarnaar deze string is gekopieerd.

#erbij betrekken #erbij betrekken #erbij betrekken #erbij betrekken char* initByString(const char *str) ( char *p = (char*) malloc(strlen(str) + 1); strcpy(p, str); return p; ) void main() ( char *test = initByString( "Hallo wereld!"); printf("%s", test);

In dit voorbeeld is er geen sprake van een geheugenlek. We hebben geheugen toegewezen met behulp van malloc-functies, kopieerde de string daarheen en retourneerde vervolgens de pointer. De lokale variabelen zijn verwijderd, maar de testvariabele slaat het adres van een stukje geheugen op de heap op, zodat dit kan worden verwijderd met behulp van de gratis functie.

Functiedeclaratie en functiedefinitie. Creëer uw eigen bibliotheek

In C kun je een functie declareren voordat je deze definieert. Een functiedeclaratie, het prototype ervan, bestaat uit een retourwaarde, een functienaam en het type argumenten. De namen van de argumenten kunnen worden weggelaten. Bijvoorbeeld

#erbij betrekken #erbij betrekken //Functieprototypes. De namen van de argumenten hoeven niet in odd(int) geschreven te worden; int zelfs(int); void main() ( printf("if %d oneven? %d\n", 11, oneven(11)); printf("if %d oneven? %d\n", 10, oneven(10)); getch (); ) //Definitie van functies int even(int a) ( if (a) ( odd(--a); ) else ( return 1; ) ) int odd(int a) ( if (a) ( even( - -a); anders (retourneert 0; ) )

Dit is een gemengde recursie: de oneven functie retourneert 1 als het getal oneven is en 0 als het even is.

Meestal wordt de functiedeclaratie afzonderlijk in het .h-bestand geplaatst, en de functiedefinities in het .c-bestand. Het headerbestand vertegenwoordigt dus de interface van de bibliotheek en laat zien hoe u ermee kunt werken zonder op de inhoud van de code in te gaan.

Laten we een eenvoudige bibliotheek maken. Om dit te doen, moet u twee bestanden maken: één met de extensie .h en daar de functieprototypes plaatsen, en de andere met de extensie .c en daar de definities van deze functies plaatsen. Als u met een IDE werkt, moet het .h-bestand in de map Header-bestanden worden gemaakt en de codebestanden in de map Bestanden broncode. Laat de bestanden File1.h en File1.c heten
Laten we de vorige code herschrijven. Dit is hoe het headerbestand File1.h eruit zal zien

#ifndef _FILE1_H_ #define _FILE1_H_ int oneven(int); int zelfs(int); #endif

Inhoud van het broncodebestand File1.c

#include "Bestand1.h" int even(int a) ( if (a) ( oneven(--a); ) else ( return 1; ) ) in oneven(int a) ( if (a) ( even(-- a); ) anders ( retourneert 0; ) )

Onze belangrijkste functie

#erbij betrekken #erbij betrekken #include "File1.h" void main() ( printf("if %d oneven? %d\n", 11, oneven(11)); printf("if %d oneven? %d\n", 10, oneven(10));

Laten we eens kijken naar de kenmerken van elk bestand. Ons bestand, dat de hoofdfunctie bevat, bevat de bibliotheken die het nodig heeft, evenals het headerbestand File1.h. De compiler kent nu de functieprototypen, dat wil zeggen dat hij het retourtype, het aantal en type argumenten en de functienamen kent.

Het headerbestand bevat, zoals eerder vermeld, het functieprototype. Ook de gebruikte bibliotheken kunnen hier worden opgenomen. Macrobescherming #define _FILE1_H_ enz. gebruikt om te voorkomen dat bibliotheekcode tijdens het compileren opnieuw wordt gekopieerd. Deze lijnen kunnen worden vervangen door één

#pragma eenmaal int oneven(int); int zelfs(int);

Het broncodebestand File1.c bevat het headerbestand. Alles is zoals gewoonlijk logisch en eenvoudig. In headerbestanden is het gebruikelijk om, naast functieprototypes, constanten en macrovervangingen op te nemen en nieuwe gegevenstypen te definiëren. Bovendien kunt u in de headerbestanden uitgebreid commentaar geven op de code en voorbeelden van het gebruik ervan schrijven.

Een array als argument doorgeven

Zoals eerder vermeld, wordt de arraynaam vervangen door een pointer, dus het doorgeven van een eendimensionale array is gelijk aan het doorgeven van een pointer. Voorbeeld: de functie ontvangt een array en de grootte ervan en drukt af:

#erbij betrekken #erbij betrekken void printArray(int *arr, unsigned size) ( unsigned i; for (i = 0; i< size; i++) { printf("%d ", arr[i]); } } void main() { int x = {1, 2, 3, 4, 5}; printArray(x, 10); getch(); }

In dit voorbeeld zou de functie er als volgt uit kunnen zien

Void printArray(int arr, unsigned size) ( unsigned i; for (i = 0; i< size; i++) { printf("%d ", arr[i]); } }

Ik wil u er ook aan herinneren dat de regel voor het vervangen van een array door een pointer niet recursief is. Dit betekent dat het noodzakelijk is om tijdens het verzenden de afmetingen van de tweedimensionale array te specificeren

#erbij betrekken #erbij betrekken void printArray(int arr, unsigned size) ( unsigned i, j; for (i = 0; i< size; i++) { for (j = 0; j < 5; j++) { printf("%d ", arr[i][j]); } printf("\n"); } } void main() { int x = { { 1, 2, 3, 4, 5}, { 6, 7, 8, 9, 10}}; printArray(x, 2); getch(); }

Of je kunt schrijven

#erbij betrekken #erbij betrekken void printArray(int (*arr), niet-ondertekende grootte) ( niet-ondertekende i, j; for (i = 0; i< size; i++) { for (j = 0; j < 5; j++) { printf("%d ", arr[i][j]); } printf("\n"); } } void main() { int x = { { 1, 2, 3, 4, 5}, { 6, 7, 8, 9, 10}}; printArray(x, 2); getch(); }

Als tweedimensionale array dynamisch gemaakt, kunt u een pointer doorgeven aan een pointer. Een functie die bijvoorbeeld een array van woorden neemt en een array van gehele getallen retourneert die gelijk zijn aan de lengte van elk woord:

#erbij betrekken #erbij betrekken #erbij betrekken #erbij betrekken #define SIZE 10 unsigned* getLengths(const char **words, unsigned size) ( unsigned *lengths = NULL; unsigned i; lengtes = (unsigned*) malloc(size * sizeof(unsigned)); for (i = 0; i< size; i++) { lengths[i] = strlen(words[i]); } return lengths; } void main() { char **words = NULL; char buffer; unsigned i; unsigned *len = NULL; words = (char**) malloc(SIZE * sizeof(char*)); for (i = 0; i < SIZE; i++) { printf("%d. ", i); scanf("%127s", buffer); words[i] = (char*) malloc(128); strcpy(words[i], buffer); } len = getLengths(words, SIZE); for (i = 0; i < SIZE; i++) { printf("%d ", len[i]); free(words[i]); } free(words); free(len); getch(); }

In plaats van een pointer naar een array terug te sturen, kunt u een array doorgeven die moet worden gevuld

#erbij betrekken #erbij betrekken #erbij betrekken #erbij betrekken #define SIZE 10 void getLengths(const char **words, unsigned size, unsigned *out) ( unsigned i; for (i = 0; i< size; i++) { out[i] = strlen(words[i]); } } void main() { char **words = NULL; char buffer; unsigned i; unsigned *len = NULL; words = (char**) malloc(SIZE * sizeof(char*)); for (i = 0; i < SIZE; i++) { printf("%d. ", i); scanf("%127s", buffer); words[i] = (char*) malloc(128); strcpy(words[i], buffer); } len = (unsigned*) malloc(SIZE * sizeof(unsigned)); getLengths(words, SIZE, len); for (i = 0; i < SIZE; i++) { printf("%d ", len[i]); free(words[i]); } free(words); free(len); getch(); }

Hier eindigt de eerste kennismaking met de functies: het onderwerp is erg groot en is verdeeld in verschillende artikelen.

Verhaal

Te midden van moderne talen Bij het programmeren verscheen het trefwoord void voor het eerst in C++ om het concept van generieke verwijzingen te ondersteunen. Dankzij het snelle lenen van C++ echter de eerste normatief document, dat dit trefwoord bevatte, werd de C-taalstandaard, gepubliceerd door ANSI in 1989. Binnen de C++-taal werd void in 1998 gestandaardiseerd.

Vervolgens werden het void-trefwoord en de gerelateerde taalconstructies geërfd Java-talen en C#, D.

Syntaxis

Syntactisch gezien is void een van de typespecificaties die in more algemene groep advertentiespecificaties.

Semantiek

De semantiek van het trefwoord void is niet onderworpen aan de algemene semantiek van typespecificaties en is afhankelijk van de gebruiksmethode:

  • Als de naam van het waardetype dat door een functie wordt geretourneerd: geeft aan dat de functie geen waarde retourneert en dat de aanroep van een dergelijke functie een lege expressie is. De hoofdtekst van een dergelijke functie mag geen return-instructies met expressies bevatten. Bijvoorbeeld:

    Leegte f() ;

  • Als onderdeel van een functiedeclarator: geeft aan dat de functie een prototype heeft en geen parameters heeft. Bijvoorbeeld:

    Int f(nietig) ;

  • Zoals de naam van het doeltype van een cast-bewerking: zo'n void cast betekent afstand doen van de waarde van de expressie die wordt gecast. Bijvoorbeeld:

    #define promote_ptr() ((void) (ptr++))

  • Als onderdeel van de typenaam van een void pointer: zo'n pointer kan de waarden weergeven van alle pointers naar object en niet-object volledige soorten, d.w.z. adressen van eventuele objecten. Een lege aanwijzer is dus een gegeneraliseerde objectaanwijzer. void pointers zijn niet in staat de waarden van functiepointers weer te geven. Behalve in het geval van het casten van een const nul-pointer naar een functie-pointer in C, zijn er geen expliciete of impliciete conversies tussen lege pointers en functie-pointers.

Het leegtetype wordt gedefinieerd als een onvolledig type dat niet kan worden uitgebreid. Als gevolg hiervan mag dit type niet worden gebruikt als alleen volledige typen zijn toegestaan, zoals een parametertype in een functiedefinitie.

De C-taal vóór de introductie van void

Vóór de publicatie van de eerste C-standaard in 1989, die het trefwoord void in de taal introduceerde, was het gebruikelijk om functies te declareren die geen waarde retourneerden zonder typespecificaties te gebruiken. Hoewel deze declaratie semantisch gelijkwaardig was aan het declareren van een functie die een waarde van het type int retourneerde, benadrukte het opzettelijk weglaten van typespecificaties dat de functie geen specifieke waarde retourneerde. Bijvoorbeeld:

F(lange l) ( /* ... */ )

Op dezelfde manier werden functiedefinities zonder parameters geschreven met lege haakjes:

Int hoofd() ( /* ... */ )

Een pointer naar char werd gebruikt als algemene pointer. Bovendien, moderne normen vereisen dat de representatie- en uitlijningsvereisten voor void pointers dezelfde zijn als voor char pointers, wat betekent dat de typen uitwisselbaar zijn.

Het eerste standaarddialect van C (C89), hoewel er al mee geschreven kon worden trefwoord void stond dit gebruik van een impliciete int nog steeds toe om de compatibiliteit met bestaande code te behouden. Het moderne dialect C (C99) staat de afwezigheid van typespecificaties in typenamen en -declaraties niet toe.

Voorbeelden

C++

#erbij betrekken void main() ( printf("Hallo!\n"); )

Java

void message())( System.out.println("Hallo!"); )

C

ongeldig bericht(ongeldig) ( printf("Hallo!"); )

D

void bericht() ( writefln("Hallo!"); )

Koppelingen


Wikimedia Stichting.

2010.

    Kijk wat "Void" is in andere woordenboeken: leegte

    - 1 / vȯid/ adj 1: zonder kracht of gevolg volgens de wet een nietig huwelijk 2: vernietigbare nietigheid n leegte 2 vt: maken of verklaren … Wetboek Leegte - kan verwijzen naar: In fictie: * Void (strips), personage uit WildC.A.T.S. *Leegte( Dodelijke strijd

    - 1 / vȯid/ adj 1: zonder kracht of gevolg volgens de wet een nietig huwelijk 2: vernietigbare nietigheid n leegte 2 vt: maken of verklaren … Wetboek), een fictieve locatie of rijk in Mortal Kombat * Void, een van de kleine schurken in Sonic the Hedgehog * Void 1.1, een sciencefiction-oorlogsspel gemaakt... ... Wikipedia

    - 1 / vȯid/ adj 1: zonder kracht of gevolg volgens de wet een nietig huwelijk 2: vernietigbare nietigheid n leegte 2 vt: maken of verklaren … Wetboek- Pour la commune française, voir Void Vacon. Bij het programmeren is er geen reden om terug te gaan naar de taal en andere programmeertalen zijn niet van oorsprong origineel, zoals C++, C# of Java. Ce mot clé void… … Wikipédia in het Frans

    Kijk wat "Void" is in andere woordenboeken:- Nietig, een.

    - 1 / vȯid/ adj 1: zonder kracht of gevolg volgens de wet een nietig huwelijk 2: vernietigbare nietigheid n leegte 2 vt: maken of verklaren … Wetboek 1. Bevat niets; leeg; vacant; niet bezet; niet gevuld.... - bijvoeglijk naamwoord WET Een contract of overeenkomst die nietig is, heeft geen juridisch effect omdat het in strijd is met de wet: volgens de staatswet is een contract om willens en wetens geld te betalen voor gokken nietig. leeg werkwoord: Mr. Mullen's ontslag... ...Financiële en zakelijke voorwaarden

    - 1 / vȯid/ adj 1: zonder kracht of gevolg volgens de wet een nietig huwelijk 2: vernietigbare nietigheid n leegte 2 vt: maken of verklaren … Wetboek- Nietig, v. T. 1. Om de inhoud te verwijderen van; leegmaken of leeg laten staan; stoppen; vertrekken; zoals, om een ​​tafel ongeldig te maken.

    Kijk wat "Void" is in andere woordenboeken:- leeg verlaten, kaal, onvruchtbaar, beroofd, helder, beroofd, berooid, verstoken, uitgeput, leeggemaakt, vrij, ontbrekend, karig, kort, verlegen, huurderloos, ongevuld, onbewoond, vacant, leeg, zonder; concepten 481.583.740.774 Ant. gevuld, vol, bezet…Nieuwe thesaurus

In les 1 heb je verschillende C++-programma's gemaakt. Destijds was het uw doel om het proces van het maken en compileren van C++-programma's te begrijpen, niet om C++-instructies te begrijpen. In deze les ga je voor het eerst dieper in op de instructies waaruit een C++-programma bestaat. Je zult merken dat de meeste C++-programma's hetzelfde formaat volgen: beginnend met een of meer #-instructies.erbij betrekken, de tekenreeks bevatten leegte hoofd(leegte),en vervolgens een reeks uitspraken gegroepeerd tussen links en rechts krullende beugels. Zoals je in deze tutorial zult zien, zijn deze enigszins intimiderende operators eigenlijk heel gemakkelijk onder de knie te krijgen. Tegen het einde deze les Je leert de volgende kernbegrippen:

  • Operator # erbij betrekken biedt de voordelen van het gebruik van headerbestanden die C++-instructies of programmadefinities bevatten.
  • Het grootste deel van een C++-programma begint met de instructie leegte hoofd(leegte).
  • Programma's bestaan ​​uit een of meer functies, die op hun beurt bestaan ​​uit instructies die bedoeld zijn om een ​​specifiek probleem op te lossen.
  • Wanneer uw programma's op het scherm worden afgedrukt, zullen ze uitgebreid gebruik maken van de uitvoerstroom uit.

Als je C++-programma's schrijft, werk je eigenlijk in termen van exploitanten, maar geen instructies. Later ga je studeren toewijzingsoperator, die waarden toewijst aan variabelen, operator als, waarmee het programma beslissingen kan nemen, enz. Voorlopig verwijzen we naar de inhoud van uw programma als programma-exploitanten.


EEN KIJK OP PROGRAMMA-OPERATOREN

In les 1 heb je een C++-programma gemaakt, FIRST.CPP, dat de volgende instructies bevatte:

#erbij betrekken

leegte hoofd(leegte)

{
uit<< «Учимся программировать на языке С++!»;
}

In dit geval bevat het programma drie instructies. Accolades (genaamd karakters groeperen) groepsgerelateerde operators:

#erbij betrekken

leegte hoofd (leegte)

{
uit<< «Учимся программировать << «на языке С++!»;
}

In het volgende gedeelte wordt elk van de programma-instructies gedetailleerder beschreven.

INLEIDING VOOR DE OPERATOR #erbij betrekken

Elk programma dat in les 1 wordt gepresenteerd, begint met de volgende verklaring # erbij betrekken:

#erbij betrekken

Wanneer u C++-programma's schrijft, profiteert u van de operatoren en definities die de compiler u biedt. Bij het compileren van een programma wordt de operator # erbij betrekken zorgt ervoor dat de compiler de inhoud van een bepaald bestand aan het begin van uw programma opneemt. In dit geval neemt de compiler de inhoud van het bestand op iostream.h.

Bestanden met de extensie h die u aan het begin opneemt (of titel) uw programma wordt aangeroepen header-bestanden. Als u naar de map kijkt die uw compilerbestanden bevat, vindt u een submap met de naam INCLUDE die verschillende headerbestanden bevat. Elk headerbestand bevat definities van de compiler voor verschillende bewerkingen. Er is bijvoorbeeld een headerbestand dat definities voor wiskundige bewerkingen bevat, een ander headerbestand dat bestandsbewerkingen beschrijft, enzovoort.

Headerbestanden zijn ASCII-bestanden, zodat u de inhoud ervan naar het scherm of de printer kunt uitvoeren. Maak je voorlopig geen zorgen over de inhoud van de headerbestanden. Begrijp gewoon dat de operator # erbij betrekken staat u toe deze bestanden te gebruiken. Alle C++-programma's die u in dit boek maakt, bevatten #-instructies. erbij betrekken, die u in uw programma's moet gebruiken.

C++ header-bestanden

Elk C++-programma dat u schrijft, begint met een of meer #include-instructies. Deze instructies vertellen de compiler dat hij de inhoud van een bepaald bestand (headerbestand) in uw programma moet opnemen, alsof het programma instructies bevat die zich in een include-bestand bevinden. Headerbestanden bevatten definities die door de compiler worden gebruikt voor verschillende soorten bewerkingen. Er zijn headerbestanden die C++ I/O-bewerkingen, systeemfuncties (zoals functies die de huidige datum en tijd retourneren) en nog veel meer definiëren.

Headerbestanden zijn, net als C++-programma's, ASCII-bestanden waarvan u de inhoud kunt bekijken of afdrukken. Om de inhoud van headerbestanden beter te begrijpen, neemt u even de tijd om het headerbestand IOSTREAM.H af te drukken, waarvan u de inhoud zult gebruiken in elk C++-programma dat u schrijft. Normaal gesproken bevindt het headerbestand IOSTREAM.H zich in een submap met de naam INCLUDE, die zich bevindt in de map met de C++-compilerbestanden. Gebruik een teksteditor om de inhoud van de headerbestanden te bekijken en af ​​te drukken.

Let op: Wijzig nooit de inhoud van headerbestanden. Dit kan leiden tot compilatiefouten in elk programma dat u maakt.

WAT IS ongeldig hoofd(nietig)

Wanneer u een C++-programma maakt, bevat uw bronbestand veel instructies. Zoals u tijdens uw studie zult leren, hoeft de volgorde waarin instructies in een programma verschijnen niet de volgorde te zijn waarin de instructies worden uitgevoerd wanneer het programma wordt uitgevoerd. Elk C++-programma heeft één invoer van waaruit de programma-uitvoering begint: hoofdprogramma. In C++-programma's de operator leegte hoofd(leegte) geeft het startpunt van uw programma aan.

Naarmate uw programma's groter en complexer worden, verdeelt u ze in verschillende kleine, gemakkelijk te beheren delen. In dit geval de exploitant leegte hoofd(leegte) geeft de initiële (of hoofd) instructies van een programma aan - het deel van het programma dat als eerste wordt uitgevoerd.

Inleiding tot het hoofdprogramma

C++-bronbestanden kunnen veel instructies bevatten. Wanneer een programma start, definieert de void main(void)-instructie het hoofdprogramma dat de eerste instructie bevat die moet worden uitgevoerd. Uw C++-programma's moeten altijd één en slechts één instructie bevatten, genaamd main.

Als je naar grote C++-programma's kijkt, zoek dan naar main om de instructies te identificeren waarmee de uitvoering van het programma begint.

Gebruik Kijk wat "Void" is in andere woordenboeken:

Naarmate uw programma complexer wordt, moet u het opsplitsen in kleinere, beter beheersbare stukken, de zogenaamde functies. Een functie is een eenvoudige reeks instructies binnen een programma die een specifieke taak uitvoeren. Als u bijvoorbeeld een betalingsdocumentprogramma aan het maken bent, kunt u mogelijk een functie maken met de naam salaris het berekenen van de salarissen van werknemers. Op dezelfde manier zou u, als u een wiskundig programma zou schrijven, functies kunnen maken met de naam vierkante_wortel of kubus die het resultaat van bepaalde wiskundige bewerkingen retourneren. Als uw programma een functie gebruikt, voert de functie zijn taak uit en stuurt vervolgens het resultaat terug naar het programma.

Elke functie in uw programma heeft een unieke naam. En elk programma heeft minstens één functie. Elk programma uit les 1 had slechts één functienaam voornaamst. Les 9 geeft een gedetailleerder overzicht van de functies. Houd er voorlopig rekening mee dat een functie bestaat uit verschillende gerelateerde instructies die een specifieke taak uitvoeren.

Terwijl u verschillende C++-programma's verkent, zult u voortdurend bezig zijngeconfronteerd met het woord leegte. Programma's gebruiken het woord Kijk wat "Void" is in andere woordenboeken: om aan te geven dat een functie geen waarde retourneert of dat er geen waarden aan zijn doorgegeven. Als u bijvoorbeeld een MS-DOS- of UNIX-omgeving gebruikt, kan het programma worden beëindigd en een statuswaarde retourneren naar het besturingssysteem die kan worden geverifieerd door het opdrachtbestand. MS-DOS-batchbestanden controleren de uitvoerstatus van een programma met behulp van de opdracht IF ERRORLEVEL. Stel bijvoorbeeld een programma met de naam PAYROLL. EXE wordt afgesloten met een van de volgende uitvoerstatuswaarden, afhankelijk van het verwerkingsresultaat:

In een MS-DOS-batchbestand kunt u de uitvoer van het programma controleren met de opdracht IF ERRORLEVEL:

PAYROLL

ALS FOUTNIVEAU 0 ALS NIET FOUTNIVEAU 1 GAAT SUCCESVOL
ALS FOUTLEVEL 1 ALS NIET FOUTLEVEL 2 GA NAAR NO_FILE
ALS FOUTNIVEAU 2 ALS NIET FOUTNIVEAU 3 GA NAAR GEEN_PAPIER
REM Vervolgens komen andere commando's

De meeste eenvoudige C++-programma's die u in dit boek gaat maken, sturen geen statusuitvoer terug naar het besturingssysteem. Daarom moet u het woord plaatsen Kijk wat "Void" is in andere woordenboeken: voor voornaamst zoals hieronder:

leegte hoofd (leegte) //- ——-> Het programma retourneert geen waarde

In de volgende lessen leert u dat uw programma's informatie (zoals een bestandsnaam) kunnen gebruiken die de gebruiker op de opdrachtregel invoert wanneer hij of zij het programma uitvoert. Als het programma geen opdrachtregelinformatie gebruikt, moet u het woord Kijk wat "Void" is in andere woordenboeken: tussen haakjes na voornaamst zoals hieronder:

leegte hoofd( leegte) //———————-> Het programma maakt geen gebruik van opdrachtregelargumenten

Naarmate uw programma's complexer worden, kunnen ze waarden retourneren naar het besturingssysteem of opdrachtregelparameters gebruiken. Maar voorlopig gewoon gebruiken leegte in exploitant met voornaamst zoals weergegeven in dit programma.

WEERGAVE VAN GROEPEERDERS ( )

Naarmate uw programma's complexer worden, zal er één reeks instructies zijn die de computer een bepaald aantal keren moet uitvoeren, en een andere reeks instructies die de computer moet uitvoeren als aan een bepaalde voorwaarde is voldaan. In het eerste geval kan de computer dezelfde reeks instructies 100 keer uitvoeren om testpunten voor 100 studenten toe te voegen. In het tweede geval kan de computer één bericht weergeven als alle studenten slagen voor de toets, en een ander bericht als één of meerdere studenten niet slagen. In uw C++-programma's gebruikt u accolades links en rechts () om gerelateerde instructies te groeperen. In de eenvoudige programma's die in de eerste paar lessen van het boek worden gepresenteerd, groeperen deze symbolen uitspraken die overeenkomen met uitspraken in uw hoofdprogramma.

GEBRUIK uit OM UITVOER OP HET SCHERM WEERGEVEN

Alle C++-programma's die u in Les 1 hebt gemaakt, hebben berichten op het scherm afgedrukt. Om het bericht weer te geven, worden de gebruikte programma's gebruikt uit en dubbel minder dan teken (<<), как показано ниже:

uit<< «Привет, C++!»;

Woord uitvertegenwoordigtuitvoerstroom,die C++ toewijst aan het standaarduitvoerapparaat van het besturingssysteem. Standaard wijst het besturingssysteem het standaarduitvoerapparaat toe aan het weergavescherm. Om een ​​bericht op het scherm af te drukken, gebruikt u eenvoudigweg het dubbele kleiner dan-symbool (de invoegoperator genoemd) met de uitvoerstroomuit.In les 3 leert u dat u de invoegoperator kunt gebruiken om symbolen, cijfers en andere tekens aan het scherm door te geven.

Weergave van cout-uitvoerstroom

Je weet al dat C++-programma's de uitvoerstroom gebruiken om berichten op het scherm weer te geven. Wanneer u cout gebruikt om berichten weer te geven, moet u cout beschouwen als een stroom tekens die het besturingssysteem op het scherm weergeeft. Met andere woorden: de volgorde waarin uw programma tekens naar cout stuurt, bepaalt de volgorde van de tekens die op het scherm verschijnen. Bijvoorbeeld voor de volgende programma-instructies:

uit<< «Это сообщение появляется первым,»;
uit<< » а за ним следует настоящее сообщение.»;

Het besturingssysteem voert de tekenstroom als volgt uit:

Dit bericht verschijnt eerst, gevolgd door het daadwerkelijke bericht.

Invoegoperator (<<) называется так, потому что позволяет вашей программе вставлять символы в выходной поток.

Je weet al dat de uitvoerstroom dat is uit standaardinstellingen die overeenkomen met uw scherm. Met andere woorden, wanneer uw programma's uitvoer verzenden naar uit, de uitvoer verschijnt op het scherm. Door echter de uitvoeromleidingsoperatoren van het besturingssysteem te gebruiken, kunt u de uitvoer van het programma naar een printer of naar een bestand sturen. De volgende opdracht instrueert MS-DOS bijvoorbeeld om de uitvoer van het FIRST.EXE-programma naar de printer te sturen in plaats van naar het scherm:

C:\>EERSTE>PRN

Zoals u in les 3 zult leren, gebruikt u uit In C++ kunt u tekens, gehele getallen zoals 1001 en drijvende-kommagetallen zoals 3.12345 afdrukken. In les 8 leer je dat er in C++ ook een invoerstroom is genaamd cin, die uw programma's kunnen gebruiken om toetsenbordinvoer te lezen.

WAT U MOET WETEN

In deze les zijn enkele veelvoorkomende problemen besproken die u tegen kunt komen in C++-programma's. In les 3 leer je hoe je dit kunt gebruiken op zoek naar uitvoertekens, gehele getallen en drijvende-kommawaarden. U leert ook hoe u de uitvoer kunt formatteren. Zorg ervoor dat u, voordat u les 3 bestudeert, de volgende basisconcepten onder de knie heeft:

  1. De meeste C++-programma's beginnen met de operator # erbij betrekken, die de compiler instrueert om de inhoud van een bepaald headerbestand in het programma op te nemen.
  2. Headerbestanden bevatten definities van de compiler die uw programma's kunnen gebruiken.
  3. Het bronbestand kan uit veel instructies bestaan; exploitant leegte hoofd(leegte) geeft het begin van het hoofdprogramma aan, dat de eerste programma-instructie bevat die moet worden uitgevoerd.
  4. Naarmate uw programma complexer wordt, groepeert u gerelateerde instructies in kleine, gemakkelijk te beheren stukjes die functies worden genoemd. Groepeer programma-instructies met behulp van accolades links en rechts ().
  5. De meeste C++-programma's gebruiken een uitvoerstroom uit om informatie op het scherm weer te geven; Door echter de I/O-omleidingsoperatoren van het besturingssysteem te gebruiken, kunt u de uitvoer omleiden uit naar een bestand, een apparaat (zoals een printer), of maak er zelfs de invoer van een ander programma van.