7 svar
96 visningar
I am Me är nöjd med hjälpen
I am Me 681
Postad: 16 okt 2022 17:46 Redigerad: 16 okt 2022 19:03

Array

Hej! Sorry för att jag ställer fråga hela tiden😬. Önskade att jag hade någon bredvid mig så att jag kunde ställa mina frågat direkt. Men men 

Uppgiften lösning:

Fråga 1: Funktionerna fill_array och print_array antopades i main. Meeen varför skriver de arr ?? Alltså de skriver i main fill_array (n, arr) och inte fill_array (n, array[]) ?? För att i själva funktionen fill_array står int array så borde det inte stå array även i main funktionen???

Fråga2: funktionerna fill_array och print_array är av typen void. De retunerar inget, så hur kan man få värde på parametrar/argument som man skickar till fill_array och print_array???

Min lärare hade sagt att värdet som man räknar kommer försvinna om man inte retunerar det på något sätt alltså med hjälp av att skriva return eller använda pekare. 

Jag vet att man inte kan retunera två värde och som det är nu i funktionen void fill_array( int n, int array[] ) , vi kan inte retunerar värde på parametern n och array . Men hur kan koden fungerar trots att vi inte kan retunera något???

Förvirrad! 

CurtJ 1143
Postad: 16 okt 2022 18:43

När du deklarerar funktionerna fill_array och print_array så talar du om vilken typ av parametrar du förväntar dig när funktionen anropas. I anropet sen så ger du parametrarna verkliga värden. I deklarationen anger du en int array[] dvs du förväntar dig en vektor av int's och du ger vektorn namnet array (lite förvirrande) som du sen använder i funktionen. I anropet anger du sen värdet n för din int-parameter och värdet arr för din array-parameter. Int-värdet skickas som det aktuella värdet (by-value på programmeringslingo) och vektorn skickas i form av adressen till vektorn och det kallas by-reference, kompilatorn vet att det är en vektor och skicka då en pekare till vektorn. Det innebär att om du ändrar på vektorn med namnet array i funktionen så ändras värdet i den vektorn som pekaren som skickas in pekar på. Om du däremot ändrar på n så ändras inte det ursprungliga värdet eftersom den skickas in by-value

Det förklarar också varför du inte behöver något returvärde från funktionen, det enda du ändrar är ju värdet på elementen i array (i fill_array) och där ändrar du ju värdet på den vektor du skickar in. Man skulle kunna returnera array från fill_array för att vara tydlig med att funktionen ändrar i värdet och många programmerare gör det men det är inte nödvändigt i språk som skickar den typen av parametrar by-reference. Om du däremot ändrar en int så måste du returnera den enligt beskrivningen ovan. Ta t ex en funktion som räknar ut kvadraten, den skulle kunna se ut som

 

int square (int i) {
    return i*i;
}

 

Hoppas det blev lite tydligare

Laguna Online 28477
Postad: 16 okt 2022 18:55

Man kan tillägga att man inte behöver veta (och inte har någon nytta av att veta) namnen som användes när funktionen definierades, när man ska anropa den. 

anders_k Online 234
Postad: 16 okt 2022 19:07 Redigerad: 16 okt 2022 19:08

--1--

När man skriver en funktion som tar parametrar kan man ha vilket namn som helst på parameter, de kallas för formella parametrar.

nedan heter den formella parametern n

int sqr(int n){
  return n*n;
}

och här ropas med den aktuella parametern kalle:

int main()
{
  int kalle = 12;
  printf("sqr=%d\n", sqr(kalle));
}

--2--

funktionerna fill_array och print_array tar storlek och en array som formella parametrar, viktigt att veta är att en array är inget annat än en startadress i minnet där arrayen börjar

när du skickar in arr till funktionerna så skickar du in adressen där arrayen börjar och då kan en funktion ändra i arrayen eftersom den då  vet var den börjar i minnet.

int v[5] = {1,2,3,4,5};
foo(v,5);
...
void foo(int* w, int size){
  w[1] = 42; 
}
I am Me 681
Postad: 16 okt 2022 19:20
CurtJ skrev:

När du deklarerar funktionerna fill_array och print_array så talar du om vilken typ av parametrar du förväntar dig när funktionen anropas. I anropet sen så ger du parametrarna verkliga värden. I deklarationen anger du en int array[] dvs du förväntar dig en vektor av int's och du ger vektorn namnet array (lite förvirrande) som du sen använder i funktionen. I anropet anger du sen värdet n för din int-parameter och värdet arr för din array-parameter. Int-värdet skickas som det aktuella värdet (by-value på programmeringslingo) och vektorn skickas i form av adressen till vektorn och det kallas by-reference, kompilatorn vet att det är en vektor och skicka då en pekare till vektorn. Det innebär att om du ändrar på vektorn med namnet array i funktionen så ändras värdet i den vektorn som pekaren som skickas in pekar på. Om du däremot ändrar på n så ändras inte det ursprungliga värdet eftersom den skickas in by-value

Det förklarar också varför du inte behöver något returvärde från funktionen, det enda du ändrar är ju värdet på elementen i array (i fill_array) och där ändrar du ju värdet på den vektor du skickar in. Man skulle kunna returnera array från fill_array för att vara tydlig med att funktionen ändrar i värdet och många programmerare gör det men det är inte nödvändigt i språk som skickar den typen av parametrar by-reference. Om du däremot ändrar en int så måste du returnera den enligt beskrivningen ovan. Ta t ex en funktion som räknar ut kvadraten, den skulle kunna se ut som

 

int square (int i) {
    return i*i;
}

 

Hoppas det blev lite tydligare

Tack för din förklaring!!

I am Me 681
Postad: 16 okt 2022 19:25 Redigerad: 16 okt 2022 19:26
I am Me skrev:
CurtJ skrev:

När du deklarerar funktionerna fill_array och print_array så talar du om vilken typ av parametrar du förväntar dig när funktionen anropas. I anropet sen så ger du parametrarna verkliga värden. I deklarationen anger du en int array[] dvs du förväntar dig en vektor av int's och du ger vektorn namnet array (lite förvirrande) som du sen använder i funktionen. I anropet anger du sen värdet n för din int-parameter och värdet arr för din array-parameter. Int-värdet skickas som det aktuella värdet (by-value på programmeringslingo) och vektorn skickas i form av adressen till vektorn och det kallas by-reference, kompilatorn vet att det är en vektor och skicka då en pekare till vektorn. Det innebär att om du ändrar på vektorn med namnet array i funktionen så ändras värdet i den vektorn som pekaren som skickas in pekar på. Om du däremot ändrar på n så ändras inte det ursprungliga värdet eftersom den skickas in by-value

Det förklarar också varför du inte behöver något returvärde från funktionen, det enda du ändrar är ju värdet på elementen i array (i fill_array) och där ändrar du ju värdet på den vektor du skickar in. Man skulle kunna returnera array från fill_array för att vara tydlig med att funktionen ändrar i värdet och många programmerare gör det men det är inte nödvändigt i språk som skickar den typen av parametrar by-reference. Om du däremot ändrar en int så måste du returnera den enligt beskrivningen ovan. Ta t ex en funktion som räknar ut kvadraten, den skulle kunna se ut som

 

int square (int i) {
    return i*i;
}

 

Hoppas det blev lite tydligare

Tack för din förklaring!!

 

I am Me 681
Postad: 16 okt 2022 19:27
anders_k skrev:

--1--

När man skriver en funktion som tar parametrar kan man ha vilket namn som helst på parameter, de kallas för formella parametrar.

nedan heter den formella parametern n

int sqr(int n){
  return n*n;
}

och här ropas med den aktuella parametern kalle:

int main()
{
  int kalle = 12;
  printf("sqr=%d\n", sqr(kalle));
}

--2--

funktionerna fill_array och print_array tar storlek och en array som formella parametrar, viktigt att veta är att en array är inget annat än en startadress i minnet där arrayen börjar

när du skickar in arr till funktionerna så skickar du in adressen där arrayen börjar och då kan en funktion ändra i arrayen eftersom den då  vet var den börjar i minnet.

int v[5] = {1,2,3,4,5};
foo(v,5);
...
void foo(int* w, int size){
  w[1] = 42; 
}

Ahaaaaaaa ok, nu förstår jag, så arr är en adress. Juste , arr är arr[0] , där arrayen börjar. 

I am Me 681
Postad: 16 okt 2022 20:56

TACK bra förklaringar! Ni är bäst!!!

Svara Avbryt
Close