Om jag har en struct vid namn glosa och jag vill deklarera "antal" sådana Du kommer också att missa sista objectet i ditt fält: >> Borde du inte ha: >>Svar nej eftersom ord är en pekare! --------------------Configuration: glostest - Win32 Debug-------------------- >>Men det med pekare och arrayer betyder ju att min metod borde ha funkat, eller? Okej ska kolla det, men är nästan 100% säker att jag valde console!Struktur och tilldelning
så skriver man ju så här:
glosa *ord = new glosa[antal]
sedan när jag ska stoppa in värden i dessa gör jag så här:
for (int i = 0; i < (antal-1); i++){
cin >> ord[i]->sv; //sv är en char[25]
cin >> ord[i]->eng; //eng är en char[25]
}
men VC++ gillar definitivt inte min tilldelning av medlemsvariablerna i strukturen. Den säger att det är en felaktig tilldelning. Någon som vet hur jag ska göra för att komma runt det?
/ CarlSv: Struktur och tilldelning
for (int i = 0; i < (antal-1); i++)
borde vara:
for (int i = 0; i < antal; i++)
eller
for (int i = 0; i <= (antal-1); i++)
Eftersom (antal - 1) är ett index i fältet men om du skriver i < (antal - 1) så kommer den aldrig att gå ända upp till den utan bara till den innan.
//JonasSv: Struktur och tilldelning
>>
>>cin >> ord[i].sv;
>>cin >> ord[i].eng;
Svar nej eftersom ord är en pekare!
>>Du kommer också att missa sista objectet i ditt fält:
>>for (int i = 0; i < (antal-1); i++)
>>
>>borde vara:
>>for (int i = 0; i < antal; i++)
>>eller
>>for (int i = 0; i <= (antal-1); i++)
>>
>>Eftersom (antal - 1) är ett index i fältet men om du skriver i < (antal - >>1) så kommer den aldrig att gå ända upp till den utan bara till den >>innan.
Nej eftersom fältet innehåller "antal" värden och första är 0 och sista blir då "antal - 1".
// CarlSv: Struktur och tilldelning
Jo...
Förklaring:
En pekare och en array är samma sak. Man kan skriva
int a[];
eller
int *a;
det betyder exakt samma sak. Faktum är att kompilatorn direkt översätter a[] till *a. Skälen till att det finns två sätt är flera och jag orkar inte ta upp dem just nu. Om någon är mycket intresserad kanske jag orkar imorrn... Nåväl. För att komma åt element nummer tre i en array skriver du antingen:
a[3];
eller
*(a+3);
en del i en struct fås fram med hjälp av punktoperatorn eller piloperatorn på följande sätt:
EnStruct a, *p=new EnStruct;
cout << a.Medlem;
cout << (*p).medlem;
cout << p->medlem;
Piloperatorn är alltså en förkortning av (*p).
I din funktion skriver du ord[i]->eng;
ord[i] översätts till *(ord+i)
tillsammans med -> ger detta
*(*(ord+i)).eng
** ger en pekare till en pekare (vilket i och för sig kan användas i andra sammanhang).
Hoppas du förstår vad jag menar...
Slutpoängen är i alla fall att du kan skriva
(ord+i)->eng;
eller
ord[i].eng;
Personligen tycker jag att det senare är snyggast, men det finns ändå ett bättre (effektivare och lite elegantare) sätt:
for(glosa *DettaOrd=ord, *SistaOrd=ord+antal; DettaOrd!=SistaOrd; DettaOrd++)
cin << DettaOrd->Eng;
...
>>Nej eftersom fältet innehåller "antal" värden och första är 0 och sista
>>blir då "antal - 1".
Det stämmer. Men for-loopen slutar vid antal-2 eftersom värdet kontrolleras innan övriga loopen utförs. Och värdet är mindre än antal-1 fram till det är just antal-1 - och i det tillfället bryts loopen.
Jag är hundra procent säker på båda ovanstående punkter.
/Niklas Jansson
PS.
Hoppas jag inte låter för arrogant. Det är bara det att jag har en uppsats som skall in i övermorgon och jag har ingen tid i morgon...
så jag skriver så kort jag kan.
DSSv: Struktur och tilldelning
Compiling...
main.cpp
Linking...
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16
Debug/glostest.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
glostest.exe - 2 error(s), 0 warning(s)
Detta är felmeddelandet jag får när jag testade din metod Niklas. Det är förövrigt likadant som felet jag får med min metod.
Okej, jag hade fel ifråga om loopen skulle varit >= istället för > så hade det funkat. Men det med pekare och arrayer betyder ju att min metod borde ha funkat, eller?
/ CarlSv: Struktur och tilldelning
Nej. Du har två alternativ; ord[i].eng och (ord+i)->eng. Ingen skillnad i effektivitet, men den första brukar vara mer lättläst.
Felet du beskriver beror på att du någonstans refererar till en funktion som inte finns (genom att ha stavat fel eller liknande).
I ditt fall är det så att det skall finnas en funktion som heter winmain. Det betyder att du har valt att göra det som ett windowsprogram.
Jag antar att det inte är meningen, så du får skapa ett nytt projekt och välja Win32 Concole Application som projekttyp. Sedan får du överföra alla filer till det nya projektet.
/Niklas JanssonSv: Struktur och tilldelning
/ Carl