Trädvy Permalänk
Medlem
Registrerad
Jan 2013

Problem med array (C)

Hejsan svejsan!

Har skrivit ett program i C där användaren kan fylla en array samt kolla storleken osv. Har ett problem dock. Om man väljer [F]ill och skriver in säg 5 värden, och sedan vill kolla hur många värden som satts in så säger programmet 5 stycken, vilket är sant. Men sedan när man kör [P]rint så finns det två konstiga värden i början, samt att det sista värdet användaren skrev in är borta. Någon här som förstår varför det blir på det viset?

Koden: /* Program lets user fill an already given array, print its size etc. */ #include <stdio.h> #include <stdlib.h> #include <string.h> int* fillArray(int array[], int *size); void sizeArray(int size); void printArray(int *filledArray, int size); int main(void) { int array[1000]; int *filledArray; char val; int size = 0; while (1) { printf("\nMake your choice - "); printf("[F]ill, [E]xit, [S]ize, [P]rint: "); scanf(" %c", &val); switch (val) { case 'F': case 'f': filledArray = fillArray(array, &size); break; case 'S': case 's': sizeArray(size); break; case 'P': case 'p': printArray(filledArray, size); break; case 'E': case 'e': printf("Exiting program!\n"); exit(0); default: printf("Invalid choice\n"); break; } } return 0; } /* Lets the user fill the array */ int* fillArray(int array[], int *size) { int i = *size, e; printf("Choose what integers you wish to insert.\n"); printf("Write -1 to exit.\n"); if ((i =! 0)) { i = i + 1; } do { scanf(" %d", &e); if ((e != -1)) { array[i] = e; i++; ++*size; } } while (e != -1); return array; } /* Prints the size of the array */ void sizeArray(int size) { printf("There is currently %d values inserted.\n", size); } /* Prints the current array */ void printArray(int *filledArray, int size) { printf("This is the current array: {"); for (int i = 0 ; i <= size ; i++) { printf("%d", filledArray[i]); if (i != size) { printf(" ,"); } } printf("}"); }

Trädvy Permalänk
Medlem
Registrerad
Jan 2013

Koden såg bättre ut när jag klistrade in den ;p Säg till ifall det är helt oförståeligt...

EDIT: Laddat upp koden till den här sidan. http://www.filedropper.com/arraywithchoices

Trädvy Permalänk
Medlem
Plats
SweClockers forum
Registrerad
Aug 2012
Skrivet av Kossamu:

Hejsan svejsan!

Har skrivit ett program i C där användaren kan fylla en array samt kolla storleken osv. Har ett problem dock. Om man väljer [F]ill och skriver in säg 5 värden, och sedan vill kolla hur många värden som satts in så säger programmet 5 stycken, vilket är sant. Men sedan när man kör [P]rint så finns det två konstiga värden i början, samt att det sista värdet användaren skrev in är borta. Någon här som förstår varför det blir på det viset?

Koden:

/* Program lets user fill an already given array, print its size etc. */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int* fillArray(int array[], int *size);
void sizeArray(int size);
void printArray(int *filledArray, int size);

int main(void) {

int array[1000];
int *filledArray;
char val;
int size = 0;

while (1) {

printf("\nMake your choice - ");
printf("[F]ill, [E]xit, [S]ize, [P]rint: ");

scanf(" %c", &val);

switch (val) {

case 'F':
case 'f':
filledArray = fillArray(array, &size);
break;

case 'S':
case 's':
sizeArray(size);
break;

case 'P':
case 'p':
printArray(filledArray, size);
break;

case 'E':
case 'e':
printf("Exiting program!\n");
exit(0);

default:
printf("Invalid choice\n");
break;
}

}

return 0;
}

/* Lets the user fill the array */
int* fillArray(int array[], int *size) {

int i = *size, e;

printf("Choose what integers you wish to insert.\n");
printf("Write -1 to exit.\n");

if ((i =! 0)) {

i = i + 1;
}

do {
scanf(" %d", &e);
if ((e != -1)) {
array[i] = e;
i++;
++*size;

}
}

while (e != -1);

return array;
}

/* Prints the size of the array */
void sizeArray(int size) {

printf("There is currently %d values inserted.\n", size);
}

/* Prints the current array */
void printArray(int *filledArray, int size) {

printf("This is the current array: {");
for (int i = 0 ; i <= size ; i++) {

printf("%d", filledArray[i]);
if (i != size) {

printf(" ,");
}
}

printf("}");
}

Jag orkar inte läsa det där. Använd [code][/code]-taggar för att inte indenteringen ska försvinna.

Guide: Roota din HTC - BB-Kod-knappar på Prisjakt

              Min burk - Kvävekyld till 80%
Phenom II X4 965@3900MHz (Sommarklock)
GTX 760@1111MHz

Ibland har jag fel, men då är det någon annans fel.

Trädvy Permalänk
Moderator
Registrerad
Aug 2007

@Kossamu:

Koden här:

if ((i =! 0)) { i = i + 1; } do { scanf(" %d", &e); if ((e != -1)) { array[i] = e; i++; ++*size; } } while (e != -1);

Vad fyller den första if-satsen för funktion?
Vad fyller ++*size; för funktion?
Vad initierar du i till för faktiskt värde?

Använd gilla för att markera nyttiga inlägg!

Trädvy Permalänk
Medlem
Registrerad
Jan 2013
Skrivet av giplet:

@Kossamu:

Koden här:

if ((i =! 0)) { i = i + 1; } do { scanf(" %d", &e); if ((e != -1)) { array[i] = e; i++; ++*size; } } while (e != -1);

Vad fyller den första if-satsen för funktion?
Vad fyller ++*size; för funktion?
Vad initierar du i till för faktiskt värde?

Första frågan: Har tänkt att man ska kunna skriva in 5 värden, sedan lämna funktionen, sedan gå tillbaka igen för att fortsätta fylla på värden. Tanken med if-satsen där är att om den är tom så kommer det att fyllas på från första platsen i arrayen, men om den inte är tom, varav (i != 0), så kommer det att fyllas på med värden efter det sist tillagda värdet i arrayen.

Andra frågan: Size är till för att man ska kunna använda [S]ize-funktionen, samt för det jag nämnde ovan. ++*size ska öka sizevärdet.

Tredje: I main-funktionen så initierar jag size till 0, i tar sedan sizevärdet.

Trädvy Permalänk
Medlem
Plats
SweClockers forum
Registrerad
Aug 2012
Skrivet av Kossamu:

Första frågan: Har tänkt att man ska kunna skriva in 5 värden, sedan lämna funktionen, sedan gå tillbaka igen för att fortsätta fylla på värden. Tanken med if-satsen där är att om den är tom så kommer det att fyllas på från första platsen i arrayen, men om den inte är tom, varav (i != 0), så kommer det att fyllas på med värden efter det sist tillagda värdet i arrayen.

Andra frågan: Size är till för att man ska kunna använda [S]ize-funktionen, samt för det jag nämnde ovan.

Tredje: I main-funktionen så initierar jag size till 0, i tar sedan sizevärdet.

Låt size sköta indexeringen av array. På så vis kan du enkelt lägga till nästa tal med array[size++] = n varje gång.

Dessutom är det meningslöst att returnera array när du fyllt klart eftersom array i fillArray är en pekare till array i main. filledArray är helt meningslös.

Guide: Roota din HTC - BB-Kod-knappar på Prisjakt

              Min burk - Kvävekyld till 80%
Phenom II X4 965@3900MHz (Sommarklock)
GTX 760@1111MHz

Ibland har jag fel, men då är det någon annans fel.

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007

Den här kodsnutten är rätt rolig:

if ((i =! 0)) { i = i + 1; }

Du har nämligen skrivit fel, det ska vara != och inte =!. =! är dock giltig C, men den gör inte vad du vill. Det är samma sak som att skriva så här:

i = !0; if (i) { i = i + 1; }

!0 är 1, så if-villkoret kommet att uppfyllas eftersom 1 är sant i C. Så först tilldelas i värdet 1, och sedan ökas i med 1. Vad din if-sats i själva verket gör är alltså att tilldela i värdet 2, oavsett vad i var innan

Trädvy Permalänk
Medlem
Registrerad
Jan 2013
Skrivet av perost:

Den här kodsnutten är rätt rolig:

if ((i =! 0)) { i = i + 1; }

Du har nämligen skrivit fel, det ska vara != och inte =!. =! är dock giltig C, men den gör inte vad du vill. Det är samma sak som att skriva så här:

i = !0; if (i) { i = i + 1; }

!0 är 1, så if-villkoret kommet att uppfyllas eftersom 1 är sant i C. Så först tilldelas i värdet 1, och sedan ökas i med 1. Vad din if-sats i själva verket gör är alltså att tilldela i värdet 2, oavsett vad i var innan

Jahaaaaa tackar!! Det var en sådan liten rackare som smygit sig in Bra falkögon

Nu är ursprungsfelet borta, dock så dyker det upp en nolla i sluten när man printar arrayen. Någon aning om vad det kan bero på?

Har nu testat att lägga till 5 värden och lämnat funktionen. När jag printar arrayen så dyker nollan upp efter femman. Om jag nu skriver in 4 värden till så dyker det inte upp någon nolla i slutet, men nollan efter femte värdet består.

Trädvy Permalänk
Medlem
Registrerad
Jun 2005
Skrivet av Kossamu:

Jahaaaaa tackar!! Det var en sådan liten rackare som smygit sig in Bra falkögon

Nu är ursprungsfelet borta, dock så dyker det upp en nolla i sluten när man printar arrayen. Någon aning om vad det kan bero på?

Har nu testat att lägga till 5 värden och lämnat funktionen. När jag printar arrayen så dyker nollan upp efter femman. Om jag nu skriver in 4 värden till så dyker det inte upp någon nolla i slutet, men nollan efter femte värdet består.

Skulle nog säga att du överindexerar array:en och hämtar ut ett värde ur array[1000] som är odefinierat (ej satt),
Ändra i loopen från "i <= size" till "i < size".

Trädvy Permalänk
Medlem
Registrerad
Jan 2013
Skrivet av Mazzza:

Skulle nog säga att du överindexerar array:en och hämtar ut ett värde ur array[1000] som är odefinierat (ej satt),
Ändra i loopen från "i <= size" till "i < size".

Jo, jag testade att göra det förut men då blev det så att när jag ville lägga till ytterligare värden och printa ut så printades nollan ut efter dom värden jag satte in första gången, vilket medför att det sista värdet användaren skrev in inte printas ut.

Trädvy Permalänk
Medlem
Registrerad
Jun 2005
Skrivet av Kossamu:

Jo, jag testade att göra det förut men då blev det så att när jag ville lägga till ytterligare värden och printa ut så printades nollan ut efter dom värden jag satte in första gången, vilket medför att det sista värdet användaren skrev in inte printas ut.

I fillArray() så kommer du hoppa över en index när du hoppar in i funktionen andra gången (förutsatt att du fyllde den med något första anropet)

if ((i =! 0)) {
i = i + 1;
}

Det gör att du kommer indexera ett element högre upp än size som är den du tänkt indexera.
Så ta bort det den där if-satsen.

Och det är pga detta som överindexeringen visar "rätt" slutvärde när du fyllt på arrayen en andra gång.