23 svar
163 visningar
I am Me 720
Postad: 14 okt 2022 17:36

Har inte riktigt förstått fält konsenpten.

Hej! 

Man vill att fältet ska få värden direkt i deklarationen. Men jag förstår inte varför de skriver {5,3......} ???

Varför der är fel att skriva 

int arr [0,1,2,3,4,5,6,7,8,9] 

Jag vet det är fel. Men vad säger den??

 

Mvh 

Uppgift ;

Lösning: 

 

Laguna Online 30711
Postad: 14 okt 2022 18:58

int arr[5] skulle vara en array med fem element.

int arr[5][4] skulle vara en tvådimensionell array med 4*5 element.

Jag tror du får kompileringsfel för int arr[1,2]. Är det inte så?

anders_k 237
Postad: 14 okt 2022 22:59
I am Me skrev:

Hej! 

Man vill att fältet ska få värden direkt i deklarationen. Men jag förstår inte varför de skriver {5,3......} ???

Varför der är fel att skriva 

int arr [0,1,2,3,4,5,6,7,8,9] 

Jag vet det är fel. Men vad säger den??

 

Mvh 

När du initialiserar en array så använder du {} för att dimensionera en array använder du []

int a[10]; // deklarerar en array med 10 element
int a[10,10]; // deklarerar en matris med 100 element

int a[10] = { 1,2,3,4,5,6,7,8,9,10 }; // initialiserar en array med 10 element
I am Me 720
Postad: 15 okt 2022 08:19
Laguna skrev:

int arr[5] skulle vara en array med fem element.

int arr[5][4] skulle vara en tvådimensionell array med 4*5 element.

Jag tror du får kompileringsfel för int arr[1,2]. Är det inte så?

Precis jag får kompileringsfel. vad jag undrade var varför kunde man initialisera fältet genom att skriva talet inom måsvingar framför deklaratione. Men jag antar att jag har fått svar till min fråga. 

I am Me 720
Postad: 15 okt 2022 08:20
anders_k skrev:
I am Me skrev:

Hej! 

Man vill att fältet ska få värden direkt i deklarationen. Men jag förstår inte varför de skriver {5,3......} ???

Varför der är fel att skriva 

int arr [0,1,2,3,4,5,6,7,8,9] 

Jag vet det är fel. Men vad säger den??

 

Mvh 

När du initialiserar en array så använder du {} för att dimensionera en array använder du []

int a[10]; // deklarerar en array med 10 element
int a[10,10]; // deklarerar en matris med 100 element

int a[10] = { 1,2,3,4,5,6,7,8,9,10 }; // initialiserar en array med 10 element

Med "dimensionera" menar du att fixa dimensionen av fältet?? 

I am Me 720
Postad: 15 okt 2022 08:23

TAAAACK för att ni svarar! Har tenta om 4 dagar och har fått panik:(( Men att få hjälp här gör att jag känner mig lite mindre stressad. Tack för att ni finns!!

I am Me 720
Postad: 15 okt 2022 08:34 Redigerad: 15 okt 2022 08:36

#include <stdio.h>
int main(void)
{
    const int size= 10;
                       
    int arr [size] = {5,3,9,0,1,8,7,6,2,4}
   
    return 0;
}

 

Varför det går inte att köra programmet om jag skriver såhär?? Jag har ju deklarerat och skrivit att fältet "arr" har 10 element och inom måsvingarna jag har angett vilka värde varje plats motsvarar. Alltså varför behöver man skriva en loop här??

MVH

Hondel 1389
Postad: 15 okt 2022 08:41

Vad får du för fel? Titta på felmeddelandet. Men utan att ha sett det, du har missat ett ; tror jag? 

I am Me 720
Postad: 15 okt 2022 08:48

#include <stdio.h>
int main(void)
{
    const int size= 10;
                       
    int arr [size];
    for (int i=0; i < size; i++) {
        printf("På plats %d i arrayen står det %d \n", i,arr);
       
    }
    return 0;
}

 

När jag kör programmet utan att initalisera får jag ....

På plats 0 i arrayen står det 308280656
På plats 1 i arrayen står det 308280656
På plats 2 i arrayen står det 308280656
På plats 3 i arrayen står det 308280656
På plats 4 i arrayen står det 308280656
På plats 5 i arrayen står det 308280656
På plats 6 i arrayen står det 308280656
På plats 7 i arrayen står det 308280656
På plats 8 i arrayen står det 308280656
På plats 9 i arrayen står det 308280656

Vad säger den?? Varför får man samma värde i hela fältsträngen?? 

Hondel 1389
Postad: 15 okt 2022 08:52

Nu har du två funderingar samtidigt. Se mitt svar om förra frågan varför du inte lyckas initialisera. 

På din nya fråga: du har inte initialiserat, så det blir bara något värde. Tydligen 308280656 

I am Me 720
Postad: 15 okt 2022 08:54
Hondel skrev:

Vad får du för fel? Titta på felmeddelandet. Men utan att ha sett det, du har missat ett ; tror jag? 

Ok, nu satte jag ; efter måsvingarna. Men det är fortfarande fel. 

jag fick ......

ov6-2.c: In function 'main':
ov6-2.c:9:2: error: variable-sized object may not be initialized
9 | int arr [size] = {5,3,9,0,1,8,7,6,2,4};
| ^~~
ov6-2.c:9:6: warning: unused variable 'arr' [-Wunused-variable]
9 | int arr [size] = {5,3,9,0,1,8,7,6,2,4};
| ^~~

I am Me 720
Postad: 15 okt 2022 08:57
Hondel skrev:

Nu har du två funderingar samtidigt. Se mitt svar om förra frågan varför du inte lyckas initialisera. 

På din nya fråga: du har inte initialiserat, så det blir bara något värde. Tydligen 308280656 

Jag vet:) tänkte att frågan gäller samma uppgift så det vore bra att ställa den under samma tråd. 

Men var kom 308280656 ifrån?

Hondel 1389
Postad: 15 okt 2022 09:01
I am Me skrev:
Hondel skrev:

Vad får du för fel? Titta på felmeddelandet. Men utan att ha sett det, du har missat ett ; tror jag? 

Ok, nu satte jag ; efter måsvingarna. Men det är fortfarande fel. 

jag fick ......

ov6-2.c: In function 'main':
ov6-2.c:9:2: error: variable-sized object may not be initialized
9 | int arr [size] = {5,3,9,0,1,8,7,6,2,4};
| ^~~
ov6-2.c:9:6: warning: unused variable 'arr' [-Wunused-variable]
9 | int arr [size] = {5,3,9,0,1,8,7,6,2,4};
| ^~~

Okej, jag vet inte men jag gissar att Google kan ge dig hjälp om ingen här svarar. Sök på ”error: variable-sized object may not be initialized”

Hondel 1389
Postad: 15 okt 2022 09:02
I am Me skrev:
Hondel skrev:

Nu har du två funderingar samtidigt. Se mitt svar om förra frågan varför du inte lyckas initialisera. 

På din nya fråga: du har inte initialiserat, så det blir bara något värde. Tydligen 308280656 

Jag vet:) tänkte att frågan gäller samma uppgift så det vore bra att ställa den under samma tråd. 

Men var kom 308280656 ifrån?

Det blir bara något tal, eftersom du inte sagt vad det ska vara, Vad förväntade du dig att det skulle bli för tal? 

Laguna Online 30711
Postad: 15 okt 2022 09:15

Du skriver bara ut arr, vilket är adressen på arrayen. Den ändrar sig förstås inte. Värdet på plats i får du genom arr[i].

I am Me 720
Postad: 15 okt 2022 09:16
Laguna skrev:

Du skriver bara ut arr, vilket är adressen på arrayen. Den ändrar sig förstås inte. Värdet på plats i får du genom arr[i].

tack märkte den nyss. 

Men var kommer dessa värde ifrån? väljer kompilatorn själv att sätta ett värde i varje position? 

Laguna Online 30711
Postad: 15 okt 2022 09:22

Inte varje position, det är var arrayen börjar i minnet. Kompilatorn och länkaren och runtimesystemet bestämmer olika delar av var allting ligger i minnet.

Tydligen får man inte initiera en array vars storlek kan variera, och size är en variabel även om man vet att den är 10 när arrayen skapas.

Fermatrix 7841 – Fd. Medlem
Postad: 15 okt 2022 09:26

Du gör farliga saker.

Att endast deklarera en pekare (en array är en pekare) och variabler är farligt. Du får skumma värden eftersom beteendet för variabler som inte är initialiserad är odef. Har du tur så sätter in kompilatorn en pekare till Null, varav du kan få en fatal eftersom du kanske försöker använda NULL som ett värdet. Har du tur är en int =0, men kan likaväl vara vilket värde som helst.

I am Me 720
Postad: 15 okt 2022 09:54 Redigerad: 15 okt 2022 09:54
Dracaena skrev:

Du gör farliga saker.

Att endast deklarera en pekare (en array är en pekare) och variabler är farligt. Du får skumma värden eftersom beteendet för variabler som inte är initialiserad är odef. Har du tur så sätter in kompilatorn en pekare till Null, varav du kan få en fatal eftersom du kanske försöker använda NULL som ett värdet. Har du tur är en int =0, men kan likaväl vara vilket värde som helst.

Hahahaha farliga saker gör jag för att se vad som händer. Ok så om jag förstår dig rätt så man initialisera sina variabler? Här initialiserade jag variabeln/ stegvariabeln "i" men inte variabeln arr[]. 

#include <stdio.h>
int main(void)
{
    const int size= 10;
                       
    int arr [size];
    for (int i=0; i < size; i++) {
        printf("På plats %d i arrayen står det %d \n", i, arr[i]);
       
    }
    return 0;
}

Hoppas att jag inte missuppfattat hela grejen med fält 

 

Fermatrix 7841 – Fd. Medlem
Postad: 15 okt 2022 10:08
I am Me skrev:

#include <stdio.h>
int main(void)
{
    const int size= 10;
                       
    int arr [size] = {5,3,9,0,1,8,7,6,2,4}
   
    return 0;
}

 

Varför det går inte att köra programmet om jag skriver såhär?? Jag har ju deklarerat och skrivit att fältet "arr" har 10 element och inom måsvingarna jag har angett vilka värde varje plats motsvarar. Alltså varför behöver man skriva en loop här??

MVH

Du måste använda en #Define istället för att det ska fungera.

anders_k 237
Postad: 15 okt 2022 10:17 Redigerad: 15 okt 2022 10:19
int arr [size] = {5,3,9,0,1,8,7,6,2,4}

Detta bygger inte pga att "size" är deklarerad som en variabel, även med VLA (variable length array) så kan du inte initialisera arrayen på det sättet. För att det skall fungera måste du ha en literal eller göra om size till en define t.ex.

#define SIZE 10

I C när du deklarerar något som en const så betyder det egentligen inte mycket, du kan fortfarande gå runt "constness".

Det är mer en hjälp för den som läser din kod att förstå hur du tänker.

// fullt lagligt, men kanske inte så smart
const int n = 10;
int* p = (int*)&n;
*p = 5;
Fermatrix 7841 – Fd. Medlem
Postad: 15 okt 2022 10:28 Redigerad: 15 okt 2022 10:30

Detta skulle också kunna fungera. 

#include <stdio.h>
#include <string.h>
int main(void)

{
    int size = 10;
    int a[size];
    if (size > 10) size = 10;
    memcpy(a, (int[]){0,1,2,3,4,5,6,7,8,9}, size*sizeof(int));
        
        
    for (int i = 0; i < size; i++)
        printf("%d\n", a[i]);
    return 0;
}

Men om du vill göra livet enkelt för dig, lär dig om defines.

I am Me 720
Postad: 15 okt 2022 12:04
anders_k skrev:
int arr [size] = {5,3,9,0,1,8,7,6,2,4}

Detta bygger inte pga att "size" är deklarerad som en variabel, även med VLA (variable length array) så kan du inte initialisera arrayen på det sättet. För att det skall fungera måste du ha en literal eller göra om size till en define t.ex.

#define SIZE 10

I C när du deklarerar något som en const så betyder det egentligen inte mycket, du kan fortfarande gå runt "constness".

Det är mer en hjälp för den som läser din kod att förstå hur du tänker.

// fullt lagligt, men kanske inte så smart
const int n = 10;
int* p = (int*)&n;
*p = 5;

Tack för ditt svar. Men jag hänger inte med. 

anders_k 237
Postad: 15 okt 2022 13:30 Redigerad: 15 okt 2022 13:33
I am Me skrev:
anders_k skrev:
int arr [size] = {5,3,9,0,1,8,7,6,2,4}

Detta bygger inte pga att "size" är deklarerad som en variabel, även med VLA (variable length array) så kan du inte initialisera arrayen på det sättet. För att det skall fungera måste du ha en literal eller göra om size till en define t.ex.

#define SIZE 10

I C när du deklarerar något som en const så betyder det egentligen inte mycket, du kan fortfarande gå runt "constness".

Det är mer en hjälp för den som läser din kod att förstå hur du tänker.

// fullt lagligt, men kanske inte så smart
const int n = 10;
int* p = (int*)&n;
*p = 5;

Tack för ditt svar. Men jag hänger inte med. 

för att du skall kunna initialisera arrayen måste storleken vara känd vid kompileringstillfället.

om du använder en variabel som storlek på arrayen så är storleken inte känd eftersom rent tekniskt sätt skulle värdet av variabeln kunna ändra sig under programmets gång - och då när man kommer till initialiseringen blir det fel  - därför tillåter inte kompilatorn detta.

Om du vill använda en variabel för att bestämma storleken på arrayen så måste du initialisera på annat sätt, något som andra redan visat.

 

Svara
Close