mboost-dp1

hvad er fejlen i 'C' koden?


Gå til bund
Gravatar #2 - arne_v
24. maj 2010 21:43
#1

char er et enkelt tegn.

Du ønsker sikkert at bruge char[] eller char*.
Gravatar #3 - Qw_freak
24. maj 2010 21:44
ahh, dumme mig! :)

er char* ikke en pointer?
Gravatar #4 - arne_v
24. maj 2010 21:45
#3

Jo, men i en nogen sammenhænge er char[] og char* kompatible,

Gravatar #5 - Qw_freak
24. maj 2010 21:46
det er bare for at skrive en streng så SQL_write ved hvilken column den skal skrive over i.
Gravatar #6 - arne_v
24. maj 2010 21:47
#5

Der kan du sikker bruge begge.
Gravatar #7 - Qw_freak
24. maj 2010 21:50
okay, hvad hedder det: char* , så jeg lige kan google det og læse lidt om hvad det er!


hvis jeg bruger char[] v = "volt"; kan jeg så skrive det sådan?
Gravatar #8 - arne_v
24. maj 2010 21:52
#7

char v1[] = "volt";

char *v2 = "volt";

virker begge.

Men du kan kun modificere v1 ikke v2.
Gravatar #9 - arne_v
24. maj 2010 21:56
Hvis du vil lave opbygge SQL sætninger, så er sprintf ofte nemmere end så meget andet.
Gravatar #10 - Qw_freak
24. maj 2010 21:59
nårh, ja, men det er fordi jeg bruger den samme funktion til at skrive både strøm, spænding og effekt til MySQL databasen, så skal den funktion bare lige vide hvilken column den skal putte datene ind i! :)

tak for hjælpen!
Gravatar #12 - Spiderboy
25. maj 2010 10:26
#11
Godt nok derefererer du C-variablen, men en strengliteral er stadigvæk en char*, så den sammenligner en char (som kan opfattes som heltal) med en char*.

Brug strcmp til at sammenligne strenge i stedet for at dereferere dem, dvs. if (strcmp(C, "volt")==0) { ... }.
Gravatar #13 - Faergemeister
25. maj 2010 10:30
Har du nogensinde hørt om pastebin.com :>
Gravatar #14 - Qw_freak
25. maj 2010 10:57
Faergemeister (13) skrev:
Har du nogensinde hørt om pastebin.com :>


nej? hvad er det?
Gravatar #15 - Qw_freak
25. maj 2010 11:03
Spiderboy (12) skrev:
#11
Godt nok derefererer du C-variablen, men en strengliteral er stadigvæk en char*, så den sammenligner en char (som kan opfattes som heltal) med en char*.

Brug strcmp til at sammenligne strenge i stedet for at dereferere dem, dvs. if (strcmp(C, "volt")==0) { ... }.


hvorfor skal det være ==0, er det fordi der ikke er nogen forskelle?
Gravatar #16 - Qw_freak
25. maj 2010 11:40
hvad er så fejlen her???

http://pastebin.com/Hmywh4ix
Gravatar #17 - Spiderboy
25. maj 2010 11:43
qw_freak (14) skrev:
nej? hvad er det?

Et website, der er beregnet til at paste kildekode ind og kan linkes til, f.eks. til når man skal have have programmeringshjælp i et forum.

qw_freak (15) skrev:
hvorfor skal det være ==0, er det fordi der ikke er nogen forskelle?

Fordi den sammenligner om den ene streng "er større" end den anden. Kan f.eks. bruges til sortering. Hvis de er ens, giver den 0.
Gravatar #18 - Spiderboy
25. maj 2010 11:51
qw_freak (16) skrev:
hvad er så fejlen her???

http://pastebin.com/Hmywh4ix

Fordi din ID er defineret com char ID[20], dvs. en array af 20 chars.

Når du skriver ID[20] refererer du til den 20. char i din array, dvs. du har en char -type på venstre side og en strengliteral dvs. char* på den anden side. Så konverterer den implicit char* til char (eller int? er ikke helt sikker) og det giver warning.

Dine problemer er generelt temmelig pointer-orienterede. Et generelt råd til dig vil nok være at læse lidt op på pointers i C, og så kigge rigtig grundigt efter i kildekoden når det driller. C er et vanskeligt sprog - især hvis man ikke har 100% styr på det.
Gravatar #19 - Spiderboy
25. maj 2010 11:55
Spiderboy (18) skrev:
Når du skriver ID[20] refererer du til den 20. char i din array

En lille rettelse. Da arrays er 0-baseret, refererer du faktisk til den 21. char, dvs. hukommelsesområde uden for den allokerede array, og da C ikke laver tjeks af nogen art, advarer den dig ikke.
Gravatar #20 - Qw_freak
25. maj 2010 12:30
hvis jeg bare vil have lagt strengen ind i variablen, hvad så?
Gravatar #21 - Emil Melgaard
25. maj 2010 12:51
strcpy(ID, "CurVoltage");


Sætter ID til "CurVoltage".
Gravatar #22 - Spiderboy
25. maj 2010 13:16
Nemlig. Men sørg for, at strengen altid kan være derinde, dvs. at længden af strengen ikke er større end størrelsen af din array.

Hvis ikke, så overskriver du hukommelsesområde uden for det allokerede område som i #19, og det kan give meget mystiske fejl. C tjekker intet af sig selv.
Gravatar #23 - arne_v
25. maj 2010 13:28
Man kan bruge:

strncpy(id, "bla bla", sizeof(id));

for at undgå overskrivninger.

Evt.:

strncpy(id, "bla bla", sizeof(id)-1);
id[sizeof(id)-1] = '\0';

for at sikre at der er en terminering.
Gravatar #24 - Qw_freak
25. maj 2010 13:35

int brems;
char result;

atoi(result);
result = brems;


hvorfor kommer den med fejlen:
objects.h:159: warning: assignment makes pointer from integer without a cast
Gravatar #25 - arne_v
25. maj 2010 13:43
#24

char *s = "123";
int v = atoi(s);
Gravatar #26 - arne_v
25. maj 2010 13:43
#25

Igen forskellen på 1 char og mange char.

Plus at du skal bruge output fra atoi.
Gravatar #27 - onetreehell
25. maj 2010 14:00
Jeg vil råde dig til at sætte dig ned med en bog om C. Det virker rimeligt meget som om du er clueless :)
Gravatar #28 - Qw_freak
25. maj 2010 15:00
onetreehell (27) skrev:
Jeg vil råde dig til at sætte dig ned med en bog om C. Det virker rimeligt meget som om du er clueless :)


det har jeg skam gjort, det er bare længe siden! :) kan ikke huske detaljerne! det var dog C++, og der er en stor forskel fra C synes jeg.
Gravatar #29 - Spiderboy
25. maj 2010 15:03
#28
Bestemt. C++ er jo netop ikke bare C med klasser. ;-)

Under alle omstændigheder vil det nok gavne dig lige at få det genopfrisket. Når du har lært det før, kommer det hurtigt tilbage, så det skulle ikke være en omfattende opgave.
Gravatar #30 - arne_v
25. maj 2010 15:04
#28

Næsten al valid C er også valid C++.

Men C++ kode kan være noget anderledes end C kode. Hvis du f.eks. har brugt STL string, så er nul terminerede char arrays lidt af en nedtur.
Gravatar #31 - Spiderboy
25. maj 2010 15:23
#30
Ja, lige netop.
Gravatar #32 - arne_v
25. maj 2010 15:30
#C strings

str funktionerne er:
- ikke intuitive
- risikable
- dårligt performende

Men har man en gang lært dem, så husker man dem. Der er et par generationer af C programmører som kan huske strcpy, strcat, strcmp, strstr, strchr, strncpy etc..
Gravatar #33 - Windcape
25. maj 2010 16:25
arne_v (30) skrev:
Næsten al valid C er også valid C++.
Man skal så huske der er STOR forskel på "valid" og "god" !

Der er intet værre end folk der koder C++ somom det var C.
Gravatar #34 - Spiderboy
25. maj 2010 18:56
#33
Hørt!
Gravatar #35 - onetreehell
25. maj 2010 19:34
#33, 34
Jeg kender da et par stykker der skriver C i C++ udelukkende standardbiblioteket i C++ er bedre/større.
Gravatar #36 - arne_v
25. maj 2010 19:46
#C++

Der er 3 niveauer af C++:

1) C med // kommentarer og erklæringer af variable midt i koden
2) traditionel 80'er stil med masser af arv, masser af new/delete etc.
3) mere moderne stil med STL, templates etc.
Gravatar #37 - Windcape
25. maj 2010 19:49
Og 3) er slet ikke brugt nok i open source projekter og tutorials!

Derudover ville jeg ønske man brugte templates some generics mere.
Gravatar #38 - mazing
25. maj 2010 20:39
arne_v (36) skrev:

1) C med // kommentarer og erklæringer af variable midt i koden

I modsætningen til det her?: http://pastebin.com/theZzHzt
Gravatar #39 - Windcape
25. maj 2010 20:52
#38

globals :(
Gravatar #40 - arne_v
25. maj 2010 20:53
#38

Det er vist C kun med // som kommentar.

Enten smider de det gennem en C++ compiler for kommentarens skyld eller så bruger de C99 hvor // er valid kommentar.
Gravatar #41 - mazing
25. maj 2010 21:00
Jeg tænkte nu mere på den (IMO fæle) liste af variabler i starten af metoden. :)

Det er fra Quake3's kildekode, og ja Windscape, der er skrækkeligt mange globals og alt muligt andet man kan klø sig lidt på hovedet over.. :)
Gravatar #42 - arne_v
25. maj 2010 21:32
#41

Det er ret almindeligt i ældre programmerings sprog at erklæringer sker i toppen ikke blandet med koden.

Fortran, Cobol, C, Pascal ...
Gravatar #43 - onetreehell
25. maj 2010 21:41
#42
Det lærte jeg egentlig også. Det er ikke noget jeg gør, pt... Sikke noget.
Gravatar #44 - arne_v
25. maj 2010 23:43
#43

I de sprog gør du stadig. Det er nemlig syntax fejl andet.

(C skal læses som C89 jævnfør tidligere note)

Gravatar #45 - Qw_freak
27. maj 2010 20:41
Hvor Så er der NetBeans problemer igen. hvorfor vil netbeans ikke se at headerfilerne er der????

Gravatar #46 - Windcape
27. maj 2010 20:56
#45

Fordi netbeans synes du skal bruge Visual Express C++ 2010 !
Gravatar #47 - Qw_freak
27. maj 2010 21:08
a'hvad??
Gravatar #48 - arne_v
27. maj 2010 21:10
#45

Du har vel ikke bedt NB lede i de rigtige dirs.
Gravatar #49 - Qw_freak
27. maj 2010 21:12
burde den ikke selv kunne finde ud af at headerfilerne ligger i samme mappe?
Gravatar #50 - arne_v
27. maj 2010 21:14
#49

Du bør aldrig bruge:

#include "C:\bla\bla\foobar.h"

altid:

#include "foobar.h"

og så bede compileren om at lede i C:\bla\bla efter include filer.
Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login