Skillnad mellan versioner av "Tips och Trick i C"

Från Täpp-Anders
Hoppa till: navigering, sök
(Antal element i en array)
(Antal element i en array)
 
(En mellanliggande version av samma användare visas inte)
Rad 15: Rad 15:
  
 
== Antal element i en array ==
 
== Antal element i en array ==
C saknar denna funktion men du kan implementera den själv enkelt genom följande kod:
+
C saknar denna funktion men en del implementerar den själv med hjälp av sizeof-funktionen. Det kan vara fullständigt livsfarligt att göra, ta en titt på följande kod där ''array'' och ''array_p'' skall vara helt ekvivalenta men ger helt olika svar.
 
 
<pre>
 
{
 
  my_type array[100];
 
 
 
  for (i = 0; i < (sizeof array / sizeof *array); i++)
 
  {
 
      /* ... */
 
  }
 
}
 
</pre>
 
Däremot kan koden vara direkt farlig om du har en pekare som deklareras separat. Därför måste du verkligen vara försiktig när du använder detta trick. Kör man exempelvis följande kod:
 
 
<pre>
 
<pre>
 
int main(int argc, char *argv[])
 
int main(int argc, char *argv[])
Rad 36: Rad 24:
 
   array_p = array;
 
   array_p = array;
  
   printf("sizeof array: %d\n", sizeof array);
+
   printf("sizeof array:   %d\n", sizeof array);
 
   printf("sizeof array_p: %d\n", sizeof array_p);
 
   printf("sizeof array_p: %d\n", sizeof array_p);
  
Rad 43: Rad 31:
 
</pre>
 
</pre>
  
kommer utskriften att vara:
+
Kör du koden kommer utskriften att vara:
  
 
<pre>
 
<pre>
sizeof array: 400
+
sizeof array:   400
 
sizeof array_p: 4
 
sizeof array_p: 4
 
</pre>
 
</pre>

Nuvarande version från 24 februari 2013 kl. 16.27

Varning.jpg

Denna sida är under konstruktion och ej färdig ännu och därför kan väsentliga detaljer fortfarande saknas.

Tilldelning

Problem: I C är syntaxen för tilldelning, =, och för jämförelse, ==, lika nog för att ett litet misstag skall direkt orsaka rejäla problem. Ett exempel är jämförelser inuti if()-satser som kan orsaka smärre katastrofer om man slarvar.

Ponera att vi vill jämföra en variabel a med värdet 5 för att se om variabeln har samma eller ett annat värde. Vi slarvar dock och råkar i stället skriva:

if(a = 5)

Om variabeln a är av sådant slag att jämförelsen fungerar så fungerar även tilldelningen. I ovanstående tilldelas a värdet 5 och eftersom det är skilt från noll innebär det att satsen alltid kommer vara sann.

if(5 = a)

Skriver man på ovanstående sätt så kommer man direkt få ett kompilatorfel vilket gör att hela problemet kan undvikas. Anledningen är naturligtvis att variabeln a:s innehåll ej kan tilldelas en konstant som 5.

Antal element i en array

C saknar denna funktion men en del implementerar den själv med hjälp av sizeof-funktionen. Det kan vara fullständigt livsfarligt att göra, ta en titt på följande kod där array och array_p skall vara helt ekvivalenta men ger helt olika svar.

int main(int argc, char *argv[])
{
  int array[100];
  int *array_p;

  array_p = array;

  printf("sizeof array:   %d\n", sizeof array);
  printf("sizeof array_p: %d\n", sizeof array_p);

  return 0;
}

Kör du koden kommer utskriften att vara:

sizeof array:   400
sizeof array_p: 4