steffanhalv Skrevet 14. november 2010 Del Skrevet 14. november 2010 (endret) Hei, hvorfor fungerer ikke dette: const int max=100; struct personer { char navn[max]; char etternavn[max]; } person1; når dette fungerer: struct personer { char navn[100]; char etternavn[100]; } person1; Bruker Visual studio 10 som compiler, dette er loggen: 1>------ Build started: Project: test10, Configuration: Debug Win32 ------1>Build started 14.11.2010 01:41:14. 1>InitializeBuildStatus: 1> Creating "Debug\test10.unsuccessfulbuild" because "AlwaysCreate" was specified. 1>ClCompile: 1> test.c 1>c:\users\steffan\documents\visual studio 2010\projects\test10\test10\test.c(29): error C2057: expected constant expression 1>c:\users\steffan\documents\visual studio 2010\projects\test10\test10\test.c(30): error C2057: expected constant expression 1>c:\users\steffan\documents\visual studio 2010\projects\test10\test10\test.c(30): error C2229: struct 'personer' has an illegal zero-sized array 1> 1>Build FAILED. 1> 1>Time Elapsed 00:00:00.35 ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== Å her er hele koden: #include <stdio.h> #include <stdlib.h> #define TRUE 1 #define FALSE 0 ////////////////////////Huske liste: ////////////////////////1. getchar(); må puttes bak/under alle scanf("",); funksjoner hvis du skal pause med getchar seinere. Eller bruk system(PAUSE); ////////////////////////2. system(PAUSE); printer "Press any key to continue...", derfor skal det ikke brukes ////////////////////////3. %s bruker ikke '&' i scanf("",); funksjoner ////////////////////////4. %s bruker '&' i printf("",); istedenfor ////////////////////////5. NULL er allerede definert som 0 i stdio.h ////////////////////////6. Struct må sammen med variabel set int main() { //const int max=100; //variables - Obs! Kan ikke lage eget ' rom ' (rom-navn:) før variabler deklareres. char filnavn[14]="ny.txt"; //path til fil som skal åpnes const int max=100; struct personer { char navn[max]; char etternavn[max]; } person1; FILE *fil; //Pointer av type FILE, lager pointeren 'fil' fil=fopen(filnavn, "w"); /*Peker pointeren på en fil med bruk av fopen Funksjonen: [ FILE*fopen(char*filename, char*mode) ---- åpner fila modes= w (overwrite/create new), a (legger til tekst bakerst i en fil), r (leser en fil), r+ (leser og skriver en fil) ]*/ velkomst: printf("Dette programmet vil lage filen '%s'",&filnavn); check_existens: if (fil==0) { goto no_existens; } else { goto exists; } exists: printf("\n\nFilen er åpnet"); goto add_person; no_existens: printf("\n\nFilen kunne ikke åpnes"); goto end; add_person: scanf("%s",&person1.navn); scanf("%s",&person1.etternavn); getchar(); goto write; write: fprintf( fil, "Navn: %s\nEtternavn: %s",&person1.navn, &person1.etternavn); fclose(fil); //lukker fila goto end; end: printf("\n\nPress any key to exit"); getchar(); //Venter på press any key return 0; } Endret 14. november 2010 av steffanhalv Lenke til kommentar
Hårek Skrevet 14. november 2010 Del Skrevet 14. november 2010 Bruk #define istedet. #define MAX 100 PS: du er på villspor når du bruker 'goto', det gir svært dårlig kode. Stygg uvane lært fra Basic? Lenke til kommentar
GeirGrusom Skrevet 14. november 2010 Del Skrevet 14. november 2010 Ser mer ut som han har lært det fra batch script egentlig... Lenke til kommentar
zotbar1234 Skrevet 14. november 2010 Del Skrevet 14. november 2010 Hei, hvorfor fungerer ikke dette: const int max=100; struct personer { char navn[max]; char etternavn[max]; } person1; Fordi at, paradoksalt nok, er ikke en const int en constant expression. Hvis en array i C (vel, C90) er deklarert med en størrelse, så må denne størrelsen være en constant expression. En variabel (enda den representerer en verdi som ikke skal endres, altså en const) er ikke en constant expression. Derfor klager kompilatoren. I C99 kan du bruke VLA-er. Evt. kan du bruke en #define, slik foreslått alt. 1 Lenke til kommentar
steffanhalv Skrevet 14. november 2010 Forfatter Del Skrevet 14. november 2010 (endret) Hårek: Nei, er ikke fra darkbasic, så bare noen andre gjorde det og syntes det virket veldig oversiktlig. Hvorfor burde jeg ikke bruke det på den måten, og hvordan burde det brukes? Er det bedre med classer som gjør forskjellige ting og kalle på det isteden kansje? #define var ikke så dumt å bruke nei. zotbar1234: Takk for svar, da forstår jeg litt mer hvorfor det ikke fungerer. Dumt at arrayer må være konstant, har brukt gamemaker i flere år hvor jeg kunne ha arrays med variable verdier. Men vet forresten noen om et grafisk bibliotek for C jeg kan laste ned gratis? Kipt, men jeg må holde meg til c og ikke c++ pga. skolen. Å jeg ser liten nytte i å lage programmer jeg ikke kan fremstille grafisk. Det er ikke noe gøy heller, mye morsommere når det er grafikk inn i bildet. Endret 14. november 2010 av steffanhalv Lenke til kommentar
Hårek Skrevet 15. november 2010 Del Skrevet 15. november 2010 Hvis du leser litt om hvordan man skal programmere så tviler jeg på at du finner noen som anbefaler GOTO. Men du finner mange som fraråder det. Et eksempel. http://php.synet.sk/?id=php-5-3-Why-is-GOTO-contraproductive-and-bad-practice Lenke til kommentar
GeirGrusom Skrevet 15. november 2010 Del Skrevet 15. november 2010 zotbar1234: Takk for svar, da forstår jeg litt mer hvorfor det ikke fungerer. Dumt at arrayer må være konstant, har brukt gamemaker i flere år hvor jeg kunne ha arrays med variable verdier. Du kan det i C også, men ikke på samme måten. Lenke til kommentar
snippsat Skrevet 15. november 2010 Del Skrevet 15. november 2010 "Go To Statement Considered Harmful" http://www.u.arizona.edu/~rubinson/copyright_violations/Go_To_Considered_Harmful.html Skrevet av Edsger W. Dijkstra i 1968. Så ikke noe nytt at at "goto" er upopulært. http://en.wikipedia.org/wiki/Considered_harmful Du har overbrukt "goto" i koden din,kunne og burde vært skrevet uten "goto". De språk som har "goto" er det et vektøy som alt annet, det og skjønne hva som er så ille med "goto" er en god start. The goto statement itself can be just as graceful.Just because some people misuse it doesn't make it evil. It's a tool like everything else. Lenke til kommentar
GeirGrusom Skrevet 15. november 2010 Del Skrevet 15. november 2010 Goto kan være grei for å hoppe ut av flere løkker. Lenke til kommentar
TheMaister Skrevet 15. november 2010 Del Skrevet 15. november 2010 goto er veldig bra for å strukturere error handling i C bl.a. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå