Permalänk
Medlem

Arrays och pekare i C

Jag har ett program med flera c och header-filer där alla header-filer är inkluderade i en main-fil. Jag har en array i main-filen som heter a.

Hur gör jag för att kunna ändra värdena i a med en funktion change som finns i en annan fil?

Jag antar att jag måste skicka med en pekare till a som argument när jag kallar på funktionen change från main-filen.

Kort sagt vill jag kunns skriva change(a); i main och därefter ändras innehållet i a med hjälp av change.

Hur gör jag detta på bästa sätt? Eller finns det andra sätt?

Visa signatur

---

Permalänk
Medlem

Du kan göra något i stil med...

void updatearray(int *a) { if(!a) return; *a = 123; } int main(int argc, char **argv) { int *myarray = (int *)malloc(12*sizeof(int)); updatearray(myarray); }

Visa signatur

weeeee

Permalänk

// forward declaration, change void change(int *a); // implementation, change void change(int *a) { a[0] = 5; // modify 0th element of a } // main change(a); // call change to have element 0 modified

Jag förutsatte att det var en array av heltal. Eventuellt vill du ha en extra parameter som informerar funktionen change om hur många element det finns i a. Fast det kanske räcker att definiera en konstant för det i det här fallet. Du kanske också vill kontrollera att den inte är 0.

När du anropar change från main så skickar du adressen till det första elementet av a till change. Det är samma sak som att i main göra följande:

int a[5] = { 0, 1, 2, 3, 4 }; int *p_to_a = a; // spara adressen till början av a i p_to_a, det är precis det här som händer när du anropar change p_to_a[0] = 5; // detta utförs annars i change

Så kan du alltså uppnå samma sak utan funktionen change.

Permalänk
Medlem

Det burkar vara konvention att skicka med längden av arrayen också, så man vet hur lång den är i funktionen som tar emot den.

void change(int *arr, unsigned int num_elements) { // ... }

Visa signatur

void@qnet
teeworlds, stålverk80, evil schemer, c, c++
Languages shape the way we think, or don't.

Permalänk
Glömsk
Skrivet av jdv:

Det burkar vara konvention att skicka med längden av arrayen också, så man vet hur lång den är i funktionen som tar emot den.

void change(int *arr, unsigned int num_elements) { // ... }

[/quote]

Och vill man vara jävligt konventionell (!) så brukar man som typ på storlekar använda size_t, och C-funktioner brukar returnera en int (som är icke-0 vid fel). Så en väldigt C:ig vore:

int change(int *arr, size_t num_elements) { /* do stuff */ ... if (error) { return 1; } return 0; }

Vill man vara riktigt idiomatisk skulle man dessutom kunna göra lite #define för felkoder också, istället för att returnera 1

#define ERR_ALLOC 1 ... if (<failure because of malloc>) { return ERR_ALLOC; }

etc.

Visa signatur

...man is not free unless government is limited. There's a clear cause and effect here that is as neat and predictable as a law of physics: As government expands, liberty contracts.

Permalänk
Medlem

Det som fascinerar mig med "enkla" språk som C (till skillnad från C++) är att trots all enkelhet så kan man gräva ner sig, fastna i hur man ska/bör göra saker.
Att olika läger formeras kring olika språk-relaterade saker som att "man får absolut inte använda labels", "man ska returnera så tidigt man kan i en funktion", "man ska bara returnera från ett ställe i en funktion" etc.
Jag har nog oftast haft en ödmjuk inställning och kan se både för och nackdelar med båda lägren i de olika frågorna beroende på applikationen. Men hur kommer det sig att programmerare (inte alla), de med rutin och det som precis börjat, så hårt måste greppa kring deras ideologi?

Sedan om man kikar på sådana kontroversiella och skumma språk som C++ som man kan vinna någon slags hat-kärlek till då är det inte konstigt att problemen hopar sig. För att inte tala om skript-liknande språk typ php, hur många sätt kan man skjuta sig i foten på samtidigt som man hängt sig i minst två snaror och skurit varenda ven och artär i de stackars armarna

Jag är i alla fall glad att forumet här är ganska sansat. Underbart att fyra svar, som alla på sitt sätt visar hur man kan göra saker, kan samsas i samma tråd utan att ett svar varken nedvärderar eller uttrycker någon slags totalitet. Eloge till swec.

Visa signatur

weeeee