hur skickar man hela vektorn av struct från main metod till annan funktion?

Permalänk

hur skickar man hela vektorn av struct från main metod till annan funktion?

Jag försökte fixa problemet typ redan 5~6 timmar men hittar inget lösning.

void slumpa(lottoRad *lottoRad, int antalLottoRad){ int i =0; for(i=0;i<antalLottoRad;i++){ lottoRad++; } //visar 0 printf("size %d :",sizeof(lottoRad)/sizeof(lottoRad[0])); } void main(){ int val; int antalLottoRad; FILE *fp; printf("Ange 1 för skrivning och 2 för läsning"); scanf("%i",&val); switch(val){ case 1: printf("Ange önskat antal lottorader: "); scanf("%i",&antalLottoRad); lottoRad lottoRad[antalLottoRad]; //visar rätt printf("storlek är %d",sizeof(lottoRad)/sizeof(lottoRad[0])); srand(time(NULL)); for(int i = 0; i < antalLottoRad; i++){ slumpa(lottoRad,antalLottoRad); } //skriv(fp,lottoRad); break; //default: printf("välj 1 eller 2!!"); } }

När användaren mattar in 5 i consolen, då printf som finns i main metoden visar 5.
Matar in 10, det visar 10.
Jag har skickat den vektor som parameter till slumpa metoden.
Men i slumpa metoden, printf visar att storleken av vektorn lottoRad är 0.
Det kan jag inte förstå varför är det så.
Jag också försökte att skicka address av vektorn så här

slumpa(&lottoRad,antalLottoRad);

men det också funkar inte. Vilken fel har jag gjort??
Varför slumpa metoden visar storleken av vektorn av struct är 0???

Permalänk
Medlem

sizeof(lottoRad) i funktionen kommer returnera storleken på pekaren, inte arrayen, eftersom funktionen tar en pekare som argument. Givet att du är på en 64-bitars plattform så blir därför sizeof(lottoRad) = 8, och om din lottoRad-struct är större än 8 byte så blir därför resultatet av divisionen 0 p.g.a. att heltalsdivision trunkerar resultatet.

Detta är också hela anledningen till att du måste skicka med storleken på arrayen som argument till funktionen, eftersom funktionen annars inte kan ta reda på hur stor den är.

Försök gärna slå på fler varningar i din C-kompilator, om du använder en vettig kompilator så bör den varna dig för såna här fel.

Permalänk
Skrivet av perost:

sizeof(lottoRad) i funktionen kommer returnera storleken på pekaren, inte arrayen, eftersom funktionen tar en pekare som argument. Givet att du är på en 64-bitars plattform så blir därför sizeof(lottoRad) = 8, och om din lottoRad-struct är större än 8 byte så blir därför resultatet av divisionen 0 p.g.a. att heltalsdivision trunkerar resultatet.

Detta är också hela anledningen till att du måste skicka med storleken på arrayen som argument till funktionen, eftersom funktionen annars inte kan ta reda på hur stor den är.

Försök gärna slå på fler varningar i din C-kompilator, om du använder en vettig kompilator så bör den varna dig för såna här fel.

ok... men har jag skickat vektorn rätt? till exempel
om man vill sätta värde till lottoVektor av platsen i i vektor lottoRad i slumpa metoden,
är det rätt om man gör på det sätt?

for(int i=0;i<antalLottoRad;i++){ lottoRad[i]->lottoVektor[NÅGOT BRA INDEX]=Något värde }

kommer det uppdatera lottoRad?

Permalänk
Skrivet av perost:

sizeof(lottoRad) i funktionen kommer returnera storleken på pekaren, inte arrayen, eftersom funktionen tar en pekare som argument. Givet att du är på en 64-bitars plattform så blir därför sizeof(lottoRad) = 8, och om din lottoRad-struct är större än 8 byte så blir därför resultatet av divisionen 0 p.g.a. att heltalsdivision trunkerar resultatet.

Detta är också hela anledningen till att du måste skicka med storleken på arrayen som argument till funktionen, eftersom funktionen annars inte kan ta reda på hur stor den är.

Försök gärna slå på fler varningar i din C-kompilator, om du använder en vettig kompilator så bör den varna dig för såna här fel.

jag har prövat

lottoRad[0]->LottoVektor={1,2,3,4,5,6,7};

den kod för att ändra innehållet av LottoVektor men visar

error: invalid type argument of '->' (have 'lottoRad' {aka 'struct lotto'})|
error: expected expression before '{' token|

dessutom jag har prövat

lottoRad[0].LottoVektor={1,2,3,4,5,6,7};

men det visar
expected expresion before '{' token

har jag hämtat vektorn fel??

Permalänk
Medlem

@ProgrammeringElev: lottoRad[0] refererar till det första elementet i lottoRad-arrayen, och eftersom det inte är pekare du lagrar i arrayen utan struct-instanser så är det lottoRad[0].LottoVektor som är korrekt.

Däremot kan du inte tilldela en array på det sättet, det fungerar endast när du deklarerar arrayen. Om du vill tilldela en array så får du antingen tilldela varje element var för sig med t.ex. en loop, eller använda memcpy. D.v.s.:

int arr[] = {1, 2, 3}; // ok, deklaration arr = {1, 2, 3}; // inte ok, tilldelning till hela arrayen arr[0] = 1; // ok, tilldelning till första elementet // ok, tilldelning av alla element med en loop for (int i = 0; i < 3; ++i) { arr[i] = i + 1; } // ok, kopiera arr till arr2 med memcpy. int arr2[3]; memcpy(arr2, arr, sizeof(arr));

Med memcpy är det lätt att skjuta sig själv i foten om man inte har koll på vad man gör, så det kanske är bäst att undvika memcpy tills du kommit lite längre i dina studier.

Permalänk
Skrivet av perost:

@ProgrammeringElev: lottoRad[0] refererar till det första elementet i lottoRad-arrayen, och eftersom det inte är pekare du lagrar i arrayen utan struct-instanser så är det lottoRad[0].LottoVektor som är korrekt.

Däremot kan du inte tilldela en array på det sättet, det fungerar endast när du deklarerar arrayen. Om du vill tilldela en array så får du antingen tilldela varje element var för sig med t.ex. en loop, eller använda memcpy. D.v.s.:

int arr[] = {1, 2, 3}; // ok, deklaration arr = {1, 2, 3}; // inte ok, tilldelning till hela arrayen arr[0] = 1; // ok, tilldelning till första elementet // ok, tilldelning av alla element med en loop for (int i = 0; i < 3; ++i) { arr[i] = i + 1; } // ok, kopiera arr till arr2 med memcpy. int arr2[3]; memcpy(arr2, arr, sizeof(arr));

Med memcpy är det lätt att skjuta sig själv i foten om man inte har koll på vad man gör, så det kanske är bäst att undvika memcpy tills du kommit lite längre i dina studier.

tack så mycket för hjälp, jag tror nu jag får någonting i mitt huvud.
Jag har gått igenom din kod nu och ska försöka fixa allt imorn