Garanti Skrevet 26. oktober 2007 Del Skrevet 26. oktober 2007 (endret) Får ikke dette til: source.cpp: include <iostream> include <header.h> int main() { std::cout << myFirstVariable; std::cout << "\n"; std::cout << mySecondVariable; std::cout << "\n"; return 0; } header.h: #include <string> std::string myFirstVariable = 'Jalla'; std::string myFirstVariable = 'Snomann'; Feilmelding under kompilering source.cpp source.cpp(1) : error C2143: syntax error : missing ';' before '<' source.cpp(1) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int source.cpp(5) : error C2143: syntax error : missing ';' before '{' source.cpp(5) : error C2447: '{' : missing function header (old-style formal list?) Endret 26. oktober 2007 av garanti Lenke til kommentar
Giddion Skrevet 26. oktober 2007 Del Skrevet 26. oktober 2007 hmmm hva med å prøve #include istede for include i source.cpp Så får du ny feil siden du bruker ' rundt stringen istede for ". Da har du bare en feil igjen og det er at du har to myFirstVariable istede for myFirstVariable og mySecondVariable. Dette går bra, litt mer koding så ser du slike feil lett som bare det. Lykke til Lenke til kommentar
GeirGrusom Skrevet 26. oktober 2007 Del Skrevet 26. oktober 2007 Skal ikke en variabel deklarert i en header fil være deklarert som extern, eller tar jeg feil nå? siden variabler som regel skal deklareres i kodefiler, og ikke headerfiler. Det heter også #include "header.h" og ikke #include <header.h> siden dette er en prosjektheader, og ikke et bibliotekheader. Lenke til kommentar
Emancipate Skrevet 26. oktober 2007 Del Skrevet 26. oktober 2007 (endret) > Skal ikke en variabel deklarert i en header fil være deklarert som extern, eller tar jeg feil nå? Det gjelder bare hvis den er definert et annet sted. (Men det skal den alltid være, variabler definert i header-filer er en dårlig idé.) Endret 26. oktober 2007 av tsg1zzn Lenke til kommentar
Garanti Skrevet 26. oktober 2007 Forfatter Del Skrevet 26. oktober 2007 (endret) Takk for svar! Spesielt Giddion, selv om alle postene ga meg noe. Nuvel, tror jeg nærmer meg nå; bare en warning og to syntax error's... Klarer ikke å se hva som er galt. source.cpp #include <iostream> #include "header.h" int main() { std::cout << myFirstVariable; << "\n"; std::cout << mySecondVariable;<< "\n"; return 0; } header.h #include <string> std::string myFirstVariable = "Jalla"; std::string mySecondVariable = "Snomann"; Melding i compilator: source.cpp C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\xlocale(342) : warning C4530: C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc source.cpp(6) : error C2143: syntax error : missing ';' before '<<' source.cpp(7) : error C2143: syntax error : missing ';' before '<<' EDIT: Fikk det til nå, det var semikolonene mellom myXVariable og <<"\n"; den ikke likte Endret 26. oktober 2007 av garanti Lenke til kommentar
GeirGrusom Skrevet 27. oktober 2007 Del Skrevet 27. oktober 2007 (endret) Semikolon på feil plass Edit: så nå at du løste det selv int main() { std::cout << myFirstVariable; << "\n"; std::cout << mySecondVariable;<< "\n"; return 0; } Du må ikke ha semikolon etter myFirstVariable og mySecondVariable, så korrekt kode er: int main() { std::cout << myFirstVariable << "\n"; std::cout << mySecondVariable << "\n"; return 0; } off-topic må jeg si at jeg synes det er utrolig dårlig gjennomtenkt at cout og cin overrider operator << og >> Endret 27. oktober 2007 av GeirGrusom Lenke til kommentar
Garanti Skrevet 27. oktober 2007 Forfatter Del Skrevet 27. oktober 2007 Kan vel egentlig sløyfe de siste << også? Slik: int main() { std::cout << myFirstVariable "\n"; std::cout << mySecondVariable "\n"; return 0; } Men hva mener du med at "cout og cin overrider operator << og >> "? Lenke til kommentar
GeirGrusom Skrevet 27. oktober 2007 Del Skrevet 27. oktober 2007 1. Du kan ikke sløyfe << << og >> er egentlig bitwise shift Altså b00100 << 1 = b01000, b00100 << 2 = b10000 Men i forhold til cout og cin er funksjonen endret til å bli en slags write og read funksjon. så std::cout::write(myFirstVariable); ville gitt samme resultat. Det gjør jo såklart koden for å skrive mye enklere, men på bekostning av logikk. Men det er off-topic, så det for klare seg med det (ellers sletter moderator inleggene mine ) Lenke til kommentar
Garanti Skrevet 27. oktober 2007 Forfatter Del Skrevet 27. oktober 2007 Vel, fyr løs, dersom du tror du kan forklare det godt nok for en som har holdt på med C++ i tre dager Lenke til kommentar
GeirGrusom Skrevet 28. oktober 2007 Del Skrevet 28. oktober 2007 Ok; + - * / og % er forskjellige matematiske funksjoner du har vært borti, med disse trenger du ikke tenke på at du jobber med binærtall, noe du derimot må tenke på dersom du bruker & | ^ << eller >> som alle er binære operasjoner. << og >> er bitwise shoft, som rett og slett bare flytter alle bits til høyere (>>) eller venstre (<<) Men når man bruker cout eller cin, bytter disse plutselig betydning (operator overloading) noe jeg synes er ganske tåpelig - hvorfor ikke bare bruke funksjoner? I .NET (som jeg jobber med til daglig) heter det BinaryWriter.Write() som er en overloaded funksjon for alle mulige primitive datatyper, jeg synes STL kunne brukt samme løsning, uten å lage et såpass stort forvirringmoment k un for at nybegynnere skulle finne C++ lettere i bruk til å skrive "Hello World!" på skjermen. Men det er min mening da Operator overloading er FY med unntak av svært få tilfeller (som vertex eller matrix, som er det eneste stedet jeg bruker operator overloading, slik at man kan skrive vertex + vertex, og vertex * matrix, eller matrix * matrix) Hvis det ikke har til hensikt å faktisk legge til noe nyttig (noe jeg ikke synes << i count gjør) synes jeg man burde styre unna operator overloading. Men nå er STL forholdsvis.... vel.... kikk på kildekoden, og se om du finner kommentarer. (de er nærmest fraværende) noe som får meg til å tenke at det ikke er så godt gjennomtenkt som det kunne vært. Kanskje noen andre kan ytre sine synspunkter? Mine er oftest ganske ensidig - jeg bruker standard C lib for mye tror jeg. Lenke til kommentar
Giddion Skrevet 28. oktober 2007 Del Skrevet 28. oktober 2007 Vel jeg er stort sett enig i dine meninger jeg syntes printf er bedre enn cout og slikt og jeg bruker nok C for mye jeg også, men printf er jo litt usikker i bruk så man har da muligheten til å lage noe ala det som C# har gjort eller bruke << Jeg kjenner dessverre for lite til C#, men etter det jeg har funnet på nettet "må" du ha en linje pr variabel som sendes, dette kan vel bli oppfattet av noen som litt tungvindt og ikke så enkelt og oversiktelig. Operatore overloading har flere bruksområder enn bare for mattematiske klasser, ta f. eks. == operatoren som kan brukes istedet for memcmp og vil nok ha mindre programmerings feil og være lettere å lese enn memcmp. Det hadde vært artig å hørt fra noen som bruker operatorer mer aktivt enn meg, men det begyner jo å bli ganske off-topic nå så... Lenke til kommentar
GeirGrusom Skrevet 28. oktober 2007 Del Skrevet 28. oktober 2007 I C# kan det være en plage å skrive binærfiler, fordi man ikke kan skrive strukturer rett til en stream (som jeg vet om, utenom Serialize, men den formaterer dataene) Og da må du ha en linje for hver variabel (så lenge det ikke er en string, da kan du bare bruke "Hello " + "World!") Men det blir ihvertfall ikke noen forvirring av det. f.eks. cout << (0x01 << 16); uten parantes får man ikke ønsket resultat. Lenke til kommentar
Emancipate Skrevet 28. oktober 2007 Del Skrevet 28. oktober 2007 cout << (0x01 << 16);uten parantes får man ikke ønsket resultat. De kommer vel an på hva man ønsker, skulle jeg tro. Lenke til kommentar
GeirGrusom Skrevet 28. oktober 2007 Del Skrevet 28. oktober 2007 Joda, bare det at logikken forsvinner, fordi en operator har to VIDT forskjellige funksjoner, avhengig av sammenheng. Lenke til kommentar
Emancipate Skrevet 29. oktober 2007 Del Skrevet 29. oktober 2007 (endret) Jeg er enig. C++; // Makes C bigger and returns the original value Endret 29. oktober 2007 av tsg1zzn Lenke til kommentar
Dead_Rabbit Skrevet 30. oktober 2007 Del Skrevet 30. oktober 2007 Jeg synes operator overlasting generelt sett har mange fordeler, og ser ikke på det som fy-fy-greier i det hele tatt. Det er uten tvil med på å abstrahere koden i større grad, og gir deg også mer fleksibilitet og en bedre logikk i koden. Blir nesten litt vanskelig å si stort mer, da dette egentlig handler mest om smak og behag. GeirGrusom: Kan du utdype hvorfor du mener STL ikke virker gjennomtenkt? Med unntak av helt jævlig forferdelige feilmeldinger, synes jeg STL gjør en god jobb som et standardbibliotek. Lenke til kommentar
GeirGrusom Skrevet 1. november 2007 Del Skrevet 1. november 2007 (endret) Joda, enig at STL stort sett gjør en god jobb, men bortsett fra fraværende kommentarer i kildekoden, og elendige feilmeldinger, så mener jeg at akkurat dette med at << og >> er overloadet i cout og cin gjør koden litt mer abstrakt, siden << og >> har en HELT annen funksjon hvis du bruker dem sammen med tall, hvorfor er ikke funksjoner godt nok i dette tilfellet? Det gjør det enklere for nybegynnere, men skaper litt hodebry for profesjonelle. String kunne dessuten være laget som Unicode-only, som det er i de fleste andre språk, ser ikke helt poenget med å bruke templates her. edit: de som har brukt templates med dll-filer ser fort at inline funksjoner(som alle template funksjoner vanligis er) kan skape litt problemer. edit2: akkurat kommer hjem fra byen, vis litt nåde med meninger og stavekontroll. Endret 1. november 2007 av GeirGrusom Lenke til kommentar
Mr.Garibaldi Skrevet 1. november 2007 Del Skrevet 1. november 2007 Joda, enig at STL stort sett gjør en god jobb, men bortsett fra fraværende kommentarer i kildekoden, og elendige feilmeldinger, så mener jeg at akkurat dette med at << og >> er overloadet i cout og cin gjør koden litt mer abstrakt, siden << og >> har en HELT annen funksjon hvis du bruker dem sammen med tall, hvorfor er ikke funksjoner godt nok i dette tilfellet?Det gjør det enklere for nybegynnere, men skaper litt hodebry for profesjonelle. Hva er det som gjør at dette blir "skaper litt hodebry for profesjonelle"? Det skal da ikke så mye til huske på at om det står "cin"/"cout" på venstre side så bedriver du ikke bit-shifting. Eller er et fordi du foretrekker å foreta operasjonene i utskriftskallet? (Og i så fall kan man jo diskutere hvorvidt det er god koding å lage så kompliserte linjer at du ikke lett ser hva den gjør) Men burde ikke denne diskusjonen egentlig få sin egen tråd istedenfor at vi overtar denne? Lenke til kommentar
GeirGrusom Skrevet 2. november 2007 Del Skrevet 2. november 2007 Hva er det som gjør at dette blir "skaper litt hodebry for profesjonelle"?Det skal da ikke så mye til huske på at om det står "cin"/"cout" på venstre side så bedriver du ikke bit-shifting. Eller er et fordi du foretrekker å foreta operasjonene i utskriftskallet? (Og i så fall kan man jo diskutere hvorvidt det er god koding å lage så kompliserte linjer at du ikke lett ser hva den gjør) Det er jo en idiotisk løsning! det er fullstendig bak mål at man bruker operator overloading til å bytte FULLSTENDIG ut hva << og >> betyr for noe. Dette er bare gjort for at det skal bli enklere for nybegynnere, siden bruken av console forsvinner litt etterhvert som programmene blir mer komplisert (bruker som regel kun dette til debugging av biblioteker) using namespace std; int main() { int i = 100; cout << i >> 2; } Ok, nå har ikke jeg prøvd dette, men hva skjer da? bitshifter den 2 til venstre, eller kræsjer programmet? Derfor skal man ikke bruke operator overloading, ihvertfall ikke hvis du bruker operatorene til noe HELT annet en de gjør i utgangspunktet. Jeg har hørt at operator overloading er noe man skal være forsiktig med, og dette anser jeg som slakting av den regelen. Men hvis man skriver standardbiblioteker kan man visst komme unna med ukommentert kode, og litt drøy operator overloading. Får meg til å tenke på System.XML i .NET, som er helt håpløst skrevet, skjønner ikke at man tillater hva som helst i bibliotekene til språket. Lenke til kommentar
Mr.Garibaldi Skrevet 3. november 2007 Del Skrevet 3. november 2007 Hva er det som gjør at dette blir "skaper litt hodebry for profesjonelle"?Det skal da ikke så mye til huske på at om det står "cin"/"cout" på venstre side så bedriver du ikke bit-shifting. Eller er et fordi du foretrekker å foreta operasjonene i utskriftskallet? (Og i så fall kan man jo diskutere hvorvidt det er god koding å lage så kompliserte linjer at du ikke lett ser hva den gjør) Det er jo en idiotisk løsning! det er fullstendig bak mål at man bruker operator overloading til å bytte FULLSTENDIG ut hva << og >> betyr for noe. Dette er bare gjort for at det skal bli enklere for nybegynnere, siden bruken av console forsvinner litt etterhvert som programmene blir mer komplisert (bruker som regel kun dette til debugging av biblioteker) Poenget mitt er at hvis man er "profesjonell" så skulle det ikke være noe problem å holde styr på om du holder på med bit-shifting eller ikke... Og hvis du ikke bruker console er det jo enda mindre problem... Jeg greier helt ærlig ikke forstå problemet med at de har laget litt syntaktisk sukker for å gjøre det lettere for nybegynnere. Og hvis du ikke kan fordra det, bruk std::cout.write() istedenfor... using namespace std; int main() { int i = 100; cout << i >> 2; } Ok, nå har ikke jeg prøvd dette, men hva skjer da? bitshifter den 2 til venstre, eller kræsjer programmet? Det fungere ikke, naturlig nok siden << og >> binder likt, men om du bruker '(' ')' så får du den bit-shifting du vil ha. 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å